diff --git a/Mage.Client/src/main/java/mage/client/cards/DragCardGrid.java b/Mage.Client/src/main/java/mage/client/cards/DragCardGrid.java
index 2e611c93cb1..6973fa4ea79 100644
--- a/Mage.Client/src/main/java/mage/client/cards/DragCardGrid.java
+++ b/Mage.Client/src/main/java/mage/client/cards/DragCardGrid.java
@@ -7,7 +7,6 @@ import mage.cards.decks.DeckCardLayout;
import mage.cards.repository.CardCriteria;
import mage.cards.repository.CardInfo;
import mage.cards.repository.CardRepository;
-import mage.client.MageFrame;
import mage.client.constants.Constants;
import mage.client.dialog.PreferencesDialog;
import mage.client.plugins.impl.Plugins;
@@ -1410,38 +1409,36 @@ public class DragCardGrid extends JPanel implements DragCardSource, DragCardTarg
}
}
- String finalInfo = "Found the following quantity of mana costs, mana sources and land types:
";
- for (String qty : qtys.keySet()) {
- int value = qtys.get(qty);
- if (value > 0) {
- finalInfo += "- " + qty + " = " + value;
- }
- }
+ JPanel panel = new JPanel();
+ panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
- for (String source : sourcePips.keySet()) {
- int value = sourcePips.get(source);
- if (value > 0) {
- finalInfo += "
- " + "Mana source " + source + " = " + value;
- }
- }
+ JPanel panel2 = new JPanel();
+ panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));
+ ManaPieChart chart = new ManaPieChart(pips.get("#w}"), pips.get("#u}"), pips.get("#b}"), pips.get("#r}"), pips.get("#g}"), pips.get("#c}"));
+ chart.setMinimumSize(new Dimension(200, 200));
+ panel2.add(new JLabel("Casting Costs found:"));
+ panel2.add(chart);
- for (String pip : pips.keySet()) {
- int value = pips.get(pip);
- if (value > 0) {
- finalInfo += "
- " + pip.toUpperCase() + " mana pip/s = " + value;
- }
- }
+ JPanel panel3 = new JPanel();
+ panel3.setLayout(new BoxLayout(panel3, BoxLayout.Y_AXIS));
+ ManaPieChart chart2 = new ManaPieChart(qtys.get("plains"), qtys.get("island"), qtys.get("swamp"), qtys.get("mountain"), qtys.get("forest"), qtys.get("wastes"));
+ chart2.setMinimumSize(new Dimension(200, 200));
+ panel3.add(new JLabel("Basic Land types found:"));
+ panel3.add(chart2);
- for (String mana : manaCounts.keySet()) {
- int value = manaCounts.get(mana);
- if (value > 0) {
- finalInfo += "
- " + mana.toUpperCase() + " mana sources = " + value;
- }
- }
- finalInfo = finalInfo.replaceAll("#", "\\{");
- finalInfo += "
";
+ JPanel panel4 = new JPanel();
+ panel4.setLayout(new BoxLayout(panel4, BoxLayout.Y_AXIS));
+ ManaPieChart chart3 = new ManaPieChart(manaCounts.get("{W}"), manaCounts.get("{U}"), manaCounts.get("{B}"), manaCounts.get("{R}"), manaCounts.get("{G}"), manaCounts.get("{C}"));
+ chart3.setMinimumSize(new Dimension(200, 200));
+ panel4.add(new JLabel("Mana sources found:"));
+ panel4.add(chart3);
- MageFrame.getInstance().showMessage(finalInfo);
+ panel.add(panel2);
+ panel.add(panel3);
+ panel.add(panel4);
+
+ JFrame frame = new JFrame("JOptionPane showMessageDialog component example");
+ JOptionPane.showMessageDialog(frame, panel, "This is the distribution of colors found", JOptionPane.INFORMATION_MESSAGE);
}
public void blingDeck() {
diff --git a/Mage.Client/src/main/java/mage/client/cards/ManaPieChart.java b/Mage.Client/src/main/java/mage/client/cards/ManaPieChart.java
new file mode 100644
index 00000000000..a8d447e700d
--- /dev/null
+++ b/Mage.Client/src/main/java/mage/client/cards/ManaPieChart.java
@@ -0,0 +1,84 @@
+package mage.client.cards;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Rectangle;
+import java.util.ArrayList;
+
+import javax.swing.JComponent;
+
+class Slice {
+
+ double value;
+ Color color;
+
+ public Slice(double value, Color color) {
+ this.value = value;
+ this.color = color;
+ }
+}
+
+public class ManaPieChart extends JComponent {
+
+ ArrayList slices = new ArrayList();
+
+ ManaPieChart() {
+ }
+
+ ManaPieChart(Integer w, Integer u, Integer b, Integer r, Integer g, Integer c) {
+ if (w != null && w > 0) {
+ slices.add(new Slice(w, Color.WHITE));
+ }
+ if (u != null && u > 0) {
+ slices.add(new Slice(u, Color.BLUE));
+ }
+ if (b != null && b > 0) {
+ slices.add(new Slice(b, Color.BLACK));
+ }
+ if (r != null && r > 0) {
+ slices.add(new Slice(r, Color.RED));
+ }
+ if (g != null && g > 0) {
+ slices.add(new Slice(g, Color.GREEN));
+ }
+ if (c != null && c > 0) {
+ slices.add(new Slice(c, Color.LIGHT_GRAY));
+ }
+ }
+
+ @Override
+ public Dimension getPreferredSize() {
+ Dimension preferred = super.getPreferredSize();
+ Dimension minimum = getMinimumSize();
+ Dimension maximum = getMaximumSize();
+ preferred.width = Math.min(Math.max(preferred.width, minimum.width), maximum.width);
+ preferred.height = Math.min(Math.max(preferred.height, minimum.height), maximum.height);
+ return preferred;
+ }
+
+ public void paint(Graphics g) {
+ drawPie((Graphics2D) g, getBounds(), slices.toArray(new Slice[slices.size()]));
+ }
+
+ void drawPie(Graphics2D g, Rectangle area, Slice[] slices) {
+ double total = 0.0D;
+ for (int i = 0; i < slices.length; i++) {
+ total += slices[i].value;
+ }
+
+ double curValue = 0.0D;
+ int startAngle = 0;
+ int lastAngle = 0;
+ for (int i = 0; i < slices.length; i++) {
+ startAngle = lastAngle;
+ int arcAngle = (int) (slices[i].value * 360 / total);
+
+ g.setColor(slices[i].color);
+ g.fillArc(area.x, area.y, area.width - 20, area.height - 20, startAngle, arcAngle);
+ curValue += slices[i].value;
+ lastAngle += arcAngle;
+ }
+ }
+}
diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.form b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.form
index b3c2a7d1ce0..1cf837043f2 100644
--- a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.form
+++ b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.form
@@ -388,12 +388,7 @@
-
-
-
-
-
-
+
@@ -498,21 +493,25 @@
-
+
-
+
-
+
-
+
-
-
+
+
+
+
+
+
@@ -524,19 +523,26 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -551,6 +557,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -558,11 +587,11 @@
-
+
-
+
@@ -581,24 +610,107 @@
-
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -634,52 +746,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java
index 91c77056289..c2a7c234561 100644
--- a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java
+++ b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java
@@ -33,6 +33,11 @@
*/
package mage.client.deckeditor;
+import java.awt.*;
+import java.awt.event.*;
+import java.util.*;
+import javax.swing.*;
+import javax.swing.table.DefaultTableCellRenderer;
import mage.MageObject;
import mage.ObjectColor;
import mage.cards.Card;
@@ -59,20 +64,13 @@ import mage.filter.predicate.other.ExpansionSetPredicate;
import mage.view.CardView;
import mage.view.CardsView;
-import javax.swing.*;
-import javax.swing.table.DefaultTableCellRenderer;
-import java.awt.*;
-import java.awt.event.*;
-import java.util.*;
-import java.util.List;
-
/**
*
* @author BetaSteward_at_googlemail.com, nantuko
*/
public class CardSelector extends javax.swing.JPanel implements ComponentListener, DragCardTarget {
- private final List cards = new ArrayList<>();
+ private final java.util.List cards = new ArrayList<>();
private BigCard bigCard;
private boolean limited = false;
private final SortSetting sortSetting;
@@ -138,6 +136,9 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
mainTable.setOpaque(false);
cbSortBy.setEnabled(false);
chkPiles.setEnabled(false);
+// chkNames.setEnabled(true);
+// chkTypes.setEnabled(true);
+// chkRules.setEnabled(true);
mainTable.addMouseListener(new MouseAdapter() {
@Override
@@ -194,7 +195,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
this.currentView.drawCards(sortSetting);
}
- public void loadSideboard(List sideboard, BigCard bigCard) {
+ public void loadSideboard(java.util.List sideboard, BigCard bigCard) {
this.bigCard = bigCard;
this.btnBooster.setVisible(false);
this.btnClear.setVisible(false);
@@ -221,7 +222,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
FilterCard filter = new FilterCard();
String name = jTextFieldSearch.getText().trim();
- filter.add(new CardTextPredicate(name));
+ filter.add(new CardTextPredicate(name, chkNames.isSelected(), chkTypes.isSelected(), chkRules.isSelected()));
if (limited) {
ArrayList> predicates = new ArrayList<>();
@@ -321,7 +322,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
if (this.cbExpansionSet.isVisible()) {
String expansionSelection = this.cbExpansionSet.getSelectedItem().toString();
if (!expansionSelection.equals("- All Sets")) {
- List setCodes = ConstructedFormats.getSetsByFormat(expansionSelection);
+ java.util.List setCodes = ConstructedFormats.getSetsByFormat(expansionSelection);
criteria.setCodes(setCodes.toArray(new String[0]));
}
}
@@ -369,7 +370,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
private void filterCards() {
FilterCard filter = buildFilter();
try {
- List filteredCards = new ArrayList<>();
+ java.util.List filteredCards = new ArrayList<>();
setCursor(new Cursor(Cursor.WAIT_CURSOR));
if (limited) {
for (Card card : cards) {
@@ -378,7 +379,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
}
}
} else {
- List foundCards = CardRepository.instance.findCards(buildCriteria());
+ java.util.List foundCards = CardRepository.instance.findCards(buildCriteria());
for (CardInfo cardInfo : foundCards) {
Card card = cardInfo.getMockCard();
if (filter.match(card, null)) {
@@ -400,8 +401,8 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
this.cardCount.setText(String.valueOf(value));
}
- public List getCardGridComponents() {
- List components = new ArrayList<>();
+ public java.util.List getCardGridComponents() {
+ java.util.List components = new ArrayList<>();
components.add(mainModel);
components.add(cardGrid);
return components;
@@ -458,15 +459,17 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
cardSelectorScrollPane = new javax.swing.JScrollPane();
cardSelectorBottomPanel = new javax.swing.JPanel();
jButtonAddToMain = new javax.swing.JButton();
+ jButtonRemoveFromMain = new javax.swing.JButton();
jButtonAddToSideboard = new javax.swing.JButton();
- jLabelSearch = new javax.swing.JLabel();
+ jButtonRemoveFromSideboard = new javax.swing.JButton();
jTextFieldSearch = new javax.swing.JTextField();
+ chkNames = new javax.swing.JCheckBox();
+ chkTypes = new javax.swing.JCheckBox();
+ chkRules = new javax.swing.JCheckBox();
jButtonSearch = new javax.swing.JButton();
jButtonClean = new javax.swing.JButton();
cardCountLabel = new javax.swing.JLabel();
cardCount = new javax.swing.JLabel();
- jButtonRemoveFromMain = new javax.swing.JButton();
- jButtonRemoveFromSideboard = new javax.swing.JButton();
tbColor.setFloatable(false);
tbColor.setRollover(true);
@@ -483,7 +486,11 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
tbRed.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
tbRed.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/color_red.png"))); // NOI18N
tbRed.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
- tbRed.addActionListener(evt -> tbRedActionPerformed(evt));
+ tbRed.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ tbRedActionPerformed(evt);
+ }
+ });
tbColor.add(tbRed);
tbGreen.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/color_green_off.png"))); // NOI18N
@@ -495,7 +502,11 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
tbGreen.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/color_green.png"))); // NOI18N
tbGreen.setVerifyInputWhenFocusTarget(false);
tbGreen.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
- tbGreen.addActionListener(evt -> tbGreenActionPerformed(evt));
+ tbGreen.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ tbGreenActionPerformed(evt);
+ }
+ });
tbColor.add(tbGreen);
tbBlue.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/color_blueOff.png"))); // NOI18N
@@ -506,7 +517,11 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
tbBlue.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
tbBlue.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/color_blue.png"))); // NOI18N
tbBlue.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
- tbBlue.addActionListener(evt -> tbBlueActionPerformed(evt));
+ tbBlue.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ tbBlueActionPerformed(evt);
+ }
+ });
tbColor.add(tbBlue);
tbBlack.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/color_black_off.png"))); // NOI18N
@@ -517,7 +532,11 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
tbBlack.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
tbBlack.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/color_black.png"))); // NOI18N
tbBlack.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
- tbBlack.addActionListener(evt -> tbBlackActionPerformed(evt));
+ tbBlack.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ tbBlackActionPerformed(evt);
+ }
+ });
tbColor.add(tbBlack);
tbWhite.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/color_white_off.png"))); // NOI18N
@@ -528,7 +547,11 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
tbWhite.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
tbWhite.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/color_white.png"))); // NOI18N
tbWhite.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
- tbWhite.addActionListener(evt -> tbWhiteActionPerformed(evt));
+ tbWhite.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ tbWhiteActionPerformed(evt);
+ }
+ });
tbColor.add(tbWhite);
tbColorless.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/colorless_off.png"))); // NOI18N
@@ -539,7 +562,11 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
tbColorless.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
tbColorless.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/colorless.png"))); // NOI18N
tbColorless.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
- tbColorless.addActionListener(evt -> tbColorlessActionPerformed(evt));
+ tbColorless.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ tbColorlessActionPerformed(evt);
+ }
+ });
tbColor.add(tbColorless);
tbColor.add(jSeparator1);
@@ -548,7 +575,11 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
cbExpansionSet.setMinimumSize(new java.awt.Dimension(250, 25));
cbExpansionSet.setName("cbExpansionSet"); // NOI18N
cbExpansionSet.setPreferredSize(new java.awt.Dimension(250, 25));
- cbExpansionSet.addActionListener(evt -> cbExpansionSetActionPerformed(evt));
+ cbExpansionSet.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ cbExpansionSetActionPerformed(evt);
+ }
+ });
tbColor.add(cbExpansionSet);
tbColor.add(jSeparator2);
@@ -557,14 +588,22 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
btnBooster.setFocusable(false);
btnBooster.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
btnBooster.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
- btnBooster.addActionListener(evt -> btnBoosterActionPerformed(evt));
+ btnBooster.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ btnBoosterActionPerformed(evt);
+ }
+ });
tbColor.add(btnBooster);
btnClear.setText("Clear");
btnClear.setFocusable(false);
btnClear.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
btnClear.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
- btnClear.addActionListener(evt -> btnClearActionPerformed(evt));
+ btnClear.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ btnClearActionPerformed(evt);
+ }
+ });
tbColor.add(btnClear);
tbTypes.setFloatable(false);
@@ -580,7 +619,11 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
tbLand.setFocusable(false);
tbLand.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
tbLand.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
- tbLand.addActionListener(evt -> tbLandActionPerformed(evt));
+ tbLand.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ tbLandActionPerformed(evt);
+ }
+ });
tbTypes.add(tbLand);
tbCreatures.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/type_creatures.png"))); // NOI18N
@@ -591,7 +634,11 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
tbCreatures.setFocusable(false);
tbCreatures.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
tbCreatures.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
- tbCreatures.addActionListener(evt -> tbCreaturesActionPerformed(evt));
+ tbCreatures.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ tbCreaturesActionPerformed(evt);
+ }
+ });
tbTypes.add(tbCreatures);
tbArifiacts.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/type_artifact.png"))); // NOI18N
@@ -602,7 +649,11 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
tbArifiacts.setFocusable(false);
tbArifiacts.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
tbArifiacts.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
- tbArifiacts.addActionListener(evt -> tbArifiactsActionPerformed(evt));
+ tbArifiacts.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ tbArifiactsActionPerformed(evt);
+ }
+ });
tbTypes.add(tbArifiacts);
tbSorceries.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/type_sorcery.png"))); // NOI18N
@@ -613,7 +664,11 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
tbSorceries.setFocusable(false);
tbSorceries.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
tbSorceries.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
- tbSorceries.addActionListener(evt -> tbSorceriesActionPerformed(evt));
+ tbSorceries.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ tbSorceriesActionPerformed(evt);
+ }
+ });
tbTypes.add(tbSorceries);
tbInstants.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/type_instant.png"))); // NOI18N
@@ -624,7 +679,11 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
tbInstants.setFocusable(false);
tbInstants.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
tbInstants.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
- tbInstants.addActionListener(evt -> tbInstantsActionPerformed(evt));
+ tbInstants.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ tbInstantsActionPerformed(evt);
+ }
+ });
tbTypes.add(tbInstants);
tbEnchantments.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/type_enchantment.png"))); // NOI18N
@@ -635,7 +694,11 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
tbEnchantments.setFocusable(false);
tbEnchantments.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
tbEnchantments.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
- tbEnchantments.addActionListener(evt -> tbEnchantmentsActionPerformed(evt));
+ tbEnchantments.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ tbEnchantmentsActionPerformed(evt);
+ }
+ });
tbTypes.add(tbEnchantments);
tbPlaneswalkers.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/type_planeswalker.png"))); // NOI18N
@@ -646,7 +709,11 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
tbPlaneswalkers.setFocusable(false);
tbPlaneswalkers.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
tbPlaneswalkers.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
- tbPlaneswalkers.addActionListener(evt -> tbPlaneswalkersActionPerformed(evt));
+ tbPlaneswalkers.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ tbPlaneswalkersActionPerformed(evt);
+ }
+ });
tbTypes.add(tbPlaneswalkers);
tbTypes.add(jSeparator6);
@@ -655,15 +722,22 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
chkPiles.setFocusable(false);
chkPiles.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
chkPiles.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
- chkPiles.addActionListener(evt -> chkPilesActionPerformed(evt));
+ chkPiles.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ chkPilesActionPerformed(evt);
+ }
+ });
tbTypes.add(chkPiles);
tbTypes.add(jSeparator3);
- cbSortBy.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
cbSortBy.setMaximumSize(new java.awt.Dimension(120, 20));
cbSortBy.setMinimumSize(new java.awt.Dimension(120, 20));
cbSortBy.setPreferredSize(new java.awt.Dimension(120, 20));
- cbSortBy.addActionListener(evt -> cbSortByActionPerformed(evt));
+ cbSortBy.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ cbSortByActionPerformed(evt);
+ }
+ });
tbTypes.add(cbSortBy);
tbTypes.add(jSeparator4);
@@ -678,7 +752,11 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
jToggleListView.setMaximumSize(new java.awt.Dimension(37, 22));
jToggleListView.setMinimumSize(new java.awt.Dimension(37, 22));
jToggleListView.setPreferredSize(new java.awt.Dimension(37, 22));
- jToggleListView.addActionListener(evt -> jToggleListViewActionPerformed(evt));
+ jToggleListView.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ jToggleListViewActionPerformed(evt);
+ }
+ });
tbTypes.add(jToggleListView);
bgView.add(jToggleCardView);
@@ -693,7 +771,11 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
jToggleCardView.setName(""); // NOI18N
jToggleCardView.setPreferredSize(new java.awt.Dimension(37, 22));
jToggleCardView.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
- jToggleCardView.addActionListener(evt -> jToggleCardViewActionPerformed(evt));
+ jToggleCardView.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ jToggleCardViewActionPerformed(evt);
+ }
+ });
tbTypes.add(jToggleCardView);
cardSelectorScrollPane.setToolTipText("Double click to add the card to the main deck.
\nALT + Double click to add the card to the sideboard.");
@@ -704,52 +786,118 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
jButtonAddToMain.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/deck_in.png"))); // NOI18N
jButtonAddToMain.setToolTipText("Add selected cards to deck.
\nAlternative: Double click the card in card selector to move a card to the deck.");
jButtonAddToMain.setMargin(null);
- jButtonAddToMain.setMaximumSize(new java.awt.Dimension(42, 23));
- jButtonAddToMain.setMinimumSize(new java.awt.Dimension(42, 23));
- jButtonAddToMain.setPreferredSize(new java.awt.Dimension(40, 28));
- jButtonAddToMain.addActionListener(evt -> jButtonAddToMainActionPerformed(evt));
-
- jButtonAddToSideboard.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/sideboard_in.png"))); // NOI18N
- jButtonAddToSideboard.setToolTipText("Add selected cards to sideboard.
\nAlternative: ALT key + Double click the card in card selector to move a card to the sideboard.");
- jButtonAddToSideboard.setMargin(new java.awt.Insets(2, 0, 2, 0));
- jButtonAddToSideboard.setMaximumSize(new java.awt.Dimension(100, 30));
- jButtonAddToSideboard.setMinimumSize(new java.awt.Dimension(10, 30));
- jButtonAddToSideboard.setPreferredSize(new java.awt.Dimension(40, 28));
- jButtonAddToSideboard.addActionListener(evt -> jButtonAddToSideboardActionPerformed(evt));
-
- jLabelSearch.setText("Search:");
- jLabelSearch.setToolTipText("Searches for card names and in the rule text of the card.");
-
- jTextFieldSearch.setToolTipText("Searches for card names and in the rule text of the card.");
-
- jButtonSearch.setText("Search");
- jButtonSearch.setToolTipText("Performs the search.");
- jButtonSearch.addActionListener(evt -> jButtonSearchActionPerformed(evt));
-
- jButtonClean.setText("Clear");
- jButtonClean.setToolTipText("Clears the search field.");
- jButtonClean.addActionListener(evt -> jButtonCleanActionPerformed(evt));
-
- cardCountLabel.setText("Card count:");
- cardCountLabel.setToolTipText("Number of cards currently shown.");
-
- cardCount.setText("0");
+ jButtonAddToMain.setMaximumSize(new java.awt.Dimension(35, 23));
+ jButtonAddToMain.setMinimumSize(new java.awt.Dimension(35, 23));
+ jButtonAddToMain.setPreferredSize(new java.awt.Dimension(30, 28));
+ jButtonAddToMain.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ jButtonAddToMainActionPerformed(evt);
+ }
+ });
jButtonRemoveFromMain.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/deck_out.png"))); // NOI18N
jButtonRemoveFromMain.setToolTipText("Remove selected cards from deck");
jButtonRemoveFromMain.setMargin(null);
jButtonRemoveFromMain.setMaximumSize(new java.awt.Dimension(42, 23));
jButtonRemoveFromMain.setMinimumSize(new java.awt.Dimension(42, 23));
- jButtonRemoveFromMain.setPreferredSize(new java.awt.Dimension(40, 28));
- jButtonRemoveFromMain.addActionListener(evt -> jButtonRemoveFromMainActionPerformed(evt));
+ jButtonRemoveFromMain.setPreferredSize(new java.awt.Dimension(30, 28));
+ jButtonRemoveFromMain.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ jButtonRemoveFromMainActionPerformed(evt);
+ }
+ });
+
+ jButtonAddToSideboard.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/sideboard_in.png"))); // NOI18N
+ jButtonAddToSideboard.setToolTipText("Add selected cards to sideboard.
\nAlternative: ALT key + Double click the card in card selector to move a card to the sideboard.");
+ jButtonAddToSideboard.setMargin(new java.awt.Insets(2, 0, 2, 0));
+ jButtonAddToSideboard.setMaximumSize(new java.awt.Dimension(100, 30));
+ jButtonAddToSideboard.setMinimumSize(new java.awt.Dimension(10, 30));
+ jButtonAddToSideboard.setPreferredSize(new java.awt.Dimension(30, 28));
+ jButtonAddToSideboard.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ jButtonAddToSideboardActionPerformed(evt);
+ }
+ });
jButtonRemoveFromSideboard.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/sideboard_out.png"))); // NOI18N
jButtonRemoveFromSideboard.setToolTipText("Remove selected cards from sideboard.");
jButtonRemoveFromSideboard.setMargin(new java.awt.Insets(2, 0, 2, 0));
jButtonRemoveFromSideboard.setMaximumSize(new java.awt.Dimension(10, 30));
jButtonRemoveFromSideboard.setMinimumSize(new java.awt.Dimension(100, 30));
- jButtonRemoveFromSideboard.setPreferredSize(new java.awt.Dimension(40, 28));
- jButtonRemoveFromSideboard.addActionListener(evt -> jButtonRemoveFromSideboardActionPerformed(evt));
+ jButtonRemoveFromSideboard.setPreferredSize(new java.awt.Dimension(30, 28));
+ jButtonRemoveFromSideboard.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ jButtonRemoveFromSideboardActionPerformed(evt);
+ }
+ });
+
+ jTextFieldSearch.setToolTipText("Searches for card names and in the rule text of the card.");
+
+ chkNames.setSelected(true);
+ chkNames.setText("Names");
+ chkNames.setToolTipText("Search in card names.");
+ chkNames.setFocusable(false);
+ chkNames.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
+ chkNames.setMaximumSize(new java.awt.Dimension(67, 16));
+ chkNames.setMinimumSize(new java.awt.Dimension(67, 16));
+ chkNames.setPreferredSize(new java.awt.Dimension(67, 16));
+ chkNames.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
+ chkNames.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ chkNamesActionPerformed(evt);
+ }
+ });
+
+ chkTypes.setSelected(true);
+ chkTypes.setText("Types");
+ chkTypes.setToolTipText("Search in card types.");
+ chkTypes.setFocusable(false);
+ chkTypes.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
+ chkTypes.setMaximumSize(new java.awt.Dimension(63, 16));
+ chkTypes.setMinimumSize(new java.awt.Dimension(63, 16));
+ chkTypes.setPreferredSize(new java.awt.Dimension(63, 16));
+ chkTypes.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
+ chkTypes.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ chkTypesActionPerformed(evt);
+ }
+ });
+
+ chkRules.setSelected(true);
+ chkRules.setText("Rules");
+ chkRules.setToolTipText("Search in card rules.");
+ chkRules.setFocusable(false);
+ chkRules.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
+ chkRules.setMaximumSize(new java.awt.Dimension(59, 16));
+ chkRules.setMinimumSize(new java.awt.Dimension(59, 16));
+ chkRules.setPreferredSize(new java.awt.Dimension(59, 16));
+ chkRules.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
+ chkRules.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ chkRulesActionPerformed(evt);
+ }
+ });
+
+ jButtonSearch.setText("Search");
+ jButtonSearch.setToolTipText("Performs the search.");
+ jButtonSearch.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ jButtonSearchActionPerformed(evt);
+ }
+ });
+
+ jButtonClean.setText("Clear");
+ jButtonClean.setToolTipText("Clears the search field.");
+ jButtonClean.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ jButtonCleanActionPerformed(evt);
+ }
+ });
+
+ cardCountLabel.setText("Card count:");
+ cardCountLabel.setToolTipText("Number of cards currently shown.");
+
+ cardCount.setText("0");
javax.swing.GroupLayout cardSelectorBottomPanelLayout = new javax.swing.GroupLayout(cardSelectorBottomPanel);
cardSelectorBottomPanel.setLayout(cardSelectorBottomPanelLayout);
@@ -758,21 +906,25 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
.addGroup(cardSelectorBottomPanelLayout.createSequentialGroup()
.addGap(6, 6, 6)
.addComponent(jButtonAddToMain, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGap(2, 2, 2)
.addComponent(jButtonRemoveFromMain, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGap(1, 1, 1)
.addComponent(jButtonAddToSideboard, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGap(2, 2, 2)
.addComponent(jButtonRemoveFromSideboard, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(jLabelSearch)
+ .addComponent(jTextFieldSearch, javax.swing.GroupLayout.PREFERRED_SIZE, 219, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(jTextFieldSearch, javax.swing.GroupLayout.PREFERRED_SIZE, 135, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addGap(2, 2, 2)
.addComponent(jButtonSearch)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jButtonClean)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(chkNames, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(chkTypes, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(chkRules, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGap(5, 5, 5)
.addComponent(cardCountLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(cardCount, javax.swing.GroupLayout.PREFERRED_SIZE, 48, javax.swing.GroupLayout.PREFERRED_SIZE)
@@ -782,18 +934,23 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
cardSelectorBottomPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(cardSelectorBottomPanelLayout.createSequentialGroup()
.addGap(4, 4, 4)
- .addGroup(cardSelectorBottomPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
- .addComponent(jButtonRemoveFromMain, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jButtonAddToSideboard, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jButtonRemoveFromSideboard, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jLabelSearch)
- .addComponent(jTextFieldSearch, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jButtonSearch)
- .addComponent(jButtonClean)
- .addComponent(cardCountLabel)
- .addComponent(cardCount)
- .addComponent(jButtonAddToMain, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addGap(4, 4, 4))
+ .addGroup(cardSelectorBottomPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(chkTypes, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(chkRules, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(chkNames, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addGroup(cardSelectorBottomPanelLayout.createSequentialGroup()
+ .addGroup(cardSelectorBottomPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jButtonRemoveFromMain, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jButtonAddToSideboard, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jButtonRemoveFromSideboard, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jTextFieldSearch, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jButtonSearch)
+ .addComponent(jButtonClean)
+ .addComponent(cardCount)
+ .addComponent(jButtonAddToMain, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(cardCountLabel))
+ .addGap(0, 0, Short.MAX_VALUE)))
+ .addContainerGap())
);
cardCountLabel.getAccessibleContext().setAccessibleName("cardCountLabel");
@@ -832,7 +989,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
}//GEN-LAST:event_btnClearActionPerformed
private void btnBoosterActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnBoosterActionPerformed
- List sets = ConstructedFormats.getSetsByFormat(this.cbExpansionSet.getSelectedItem().toString());
+ java.util.List sets = ConstructedFormats.getSetsByFormat(this.cbExpansionSet.getSelectedItem().toString());
if (sets.size() == 1) {
if (!this.limited) {
this.limited = true;
@@ -840,7 +997,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
}
ExpansionSet expansionSet = Sets.getInstance().get(sets.get(0));
if (expansionSet != null) {
- List booster = expansionSet.createBooster();
+ java.util.List booster = expansionSet.createBooster();
cards.addAll(booster);
filterCards();
}
@@ -890,7 +1047,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
private void jButtonAddToMainActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonAddToMainActionPerformed
if (mainTable.getSelectedRowCount() > 0) {
int[] n = mainTable.getSelectedRows();
- List indexes = asList(n);
+ java.util.List indexes = asList(n);
Collections.reverse(indexes);
for (Integer index : indexes) {
mainModel.doubleClick(index);
@@ -905,7 +1062,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
private void jButtonAddToSideboardActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonAddToSideboardActionPerformed
if (mainTable.getSelectedRowCount() > 0) {
int[] n = mainTable.getSelectedRows();
- List indexes = asList(n);
+ java.util.List indexes = asList(n);
Collections.reverse(indexes);
for (Integer index : indexes) {
mainModel.altDoubleClick(index);
@@ -986,6 +1143,18 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
filterCardsType(evt.getModifiers(), evt.getActionCommand());
}//GEN-LAST:event_tbLandActionPerformed
+ private void chkNamesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chkNamesActionPerformed
+ // TODO add your handling code here:
+ }//GEN-LAST:event_chkNamesActionPerformed
+
+ private void chkTypesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chkTypesActionPerformed
+ // TODO add your handling code here:
+ }//GEN-LAST:event_chkTypesActionPerformed
+
+ private void chkRulesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chkRulesActionPerformed
+ // TODO add your handling code here:
+ }//GEN-LAST:event_chkRulesActionPerformed
+
private void toggleViewMode() {
if (currentView instanceof CardGrid) {
jToggleListView.setSelected(true);
@@ -1008,8 +1177,8 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
}
}
- public List asList(final int[] is) {
- List list = new ArrayList<>();
+ public java.util.List asList(final int[] is) {
+ java.util.List list = new ArrayList<>();
for (int i : is) {
list.add(i);
}
@@ -1034,14 +1203,16 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
private javax.swing.JScrollPane cardSelectorScrollPane;
private javax.swing.JComboBox cbExpansionSet;
private javax.swing.JComboBox cbSortBy;
+ private javax.swing.JCheckBox chkNames;
private javax.swing.JCheckBox chkPiles;
+ private javax.swing.JCheckBox chkRules;
+ private javax.swing.JCheckBox chkTypes;
private javax.swing.JButton jButtonAddToMain;
private javax.swing.JButton jButtonAddToSideboard;
private javax.swing.JButton jButtonClean;
private javax.swing.JButton jButtonRemoveFromMain;
private javax.swing.JButton jButtonRemoveFromSideboard;
private javax.swing.JButton jButtonSearch;
- private javax.swing.JLabel jLabelSearch;
private javax.swing.JToolBar.Separator jSeparator1;
private javax.swing.JToolBar.Separator jSeparator2;
private javax.swing.JToolBar.Separator jSeparator3;
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 4dcfba71424..cd1fc3dfe8e 100644
--- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java
+++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java
@@ -305,7 +305,7 @@ public final class GamePanel extends javax.swing.JPanel {
this.players.clear();
this.playersWhoLeft.clear();
- if (jLayeredPane!= null) {
+ if (jLayeredPane != null) {
jLayeredPane.remove(abilityPicker);
jLayeredPane.remove(DialogManager.getManager(gameId));
}
@@ -1439,8 +1439,7 @@ public final class GamePanel extends javax.swing.JPanel {
bigCard.setBorder(new LineBorder(Color.black, 1, true));
int c = JComponent.WHEN_IN_FOCUSED_WINDOW;
-
-
+
btnToggleMacro.setContentAreaFilled(false);
btnToggleMacro.setBorder(new EmptyBorder(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE));
btnToggleMacro.setIcon(new ImageIcon(ImageManagerImpl.instance.getToggleRecordMacroButtonImage()));
@@ -1804,24 +1803,24 @@ public final class GamePanel extends javax.swing.JPanel {
pnlReplay.setLayout(gl_pnlReplay);
gl_pnlReplay.setHorizontalGroup(
gl_pnlReplay.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(gl_pnlReplay.createSequentialGroup()
- .addComponent(btnPreviousPlay, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(btnPlay, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addComponent(btnStopReplay, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(btnNextPlay, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(btnSkipForward, javax.swing.GroupLayout.PREFERRED_SIZE, 39, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGroup(gl_pnlReplay.createSequentialGroup()
+ .addComponent(btnPreviousPlay, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(btnPlay, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(btnStopReplay, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(btnNextPlay, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(btnSkipForward, javax.swing.GroupLayout.PREFERRED_SIZE, 39, javax.swing.GroupLayout.PREFERRED_SIZE))
);
gl_pnlReplay.setVerticalGroup(
gl_pnlReplay.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(btnSkipForward, 0, 0, Short.MAX_VALUE)
- .addComponent(btnNextPlay, 0, 0, Short.MAX_VALUE)
- .addComponent(btnStopReplay, 0, 0, Short.MAX_VALUE)
- .addComponent(btnPlay, 0, 0, Short.MAX_VALUE)
- .addComponent(btnPreviousPlay, javax.swing.GroupLayout.PREFERRED_SIZE, 31, Short.MAX_VALUE)
+ .addComponent(btnSkipForward, 0, 0, Short.MAX_VALUE)
+ .addComponent(btnNextPlay, 0, 0, Short.MAX_VALUE)
+ .addComponent(btnStopReplay, 0, 0, Short.MAX_VALUE)
+ .addComponent(btnPlay, 0, 0, Short.MAX_VALUE)
+ .addComponent(btnPreviousPlay, javax.swing.GroupLayout.PREFERRED_SIZE, 31, Short.MAX_VALUE)
);
// Game info panel (buttons on the right panel)
@@ -1837,9 +1836,9 @@ public final class GamePanel extends javax.swing.JPanel {
.addComponent(btnSkipToEndStepBeforeYourTurn)
)
.addGroup(gl_pnlShortCuts.createSequentialGroup()
- .addComponent(btnToggleMacro)
.addComponent(txtHoldPriority)
.addComponent(txtSpellsCast)
+ /* .addComponent(btnToggleMacro)*/
.addComponent(btnSwitchHands)
.addComponent(btnCancelSkip)
.addComponent(btnConcede)
@@ -1935,46 +1934,46 @@ public final class GamePanel extends javax.swing.JPanel {
javax.swing.GroupLayout gl_helperHandButtonsStackArea = new javax.swing.GroupLayout(pnlHelperHandButtonsStackArea);
gl_helperHandButtonsStackArea.setHorizontalGroup(
gl_helperHandButtonsStackArea.createParallelGroup(Alignment.LEADING)
- .addGroup(gl_helperHandButtonsStackArea.createSequentialGroup()
- // .addGap(0)
- .addGroup(gl_helperHandButtonsStackArea.createParallelGroup(Alignment.LEADING)
- .addGroup(gl_helperHandButtonsStackArea.createSequentialGroup()
- .addGroup(gl_helperHandButtonsStackArea.createParallelGroup(Alignment.LEADING)
- .addComponent(helper, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addComponent(handContainer, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addGroup(gl_helperHandButtonsStackArea.createSequentialGroup()
+ // .addGap(0)
+ .addGroup(gl_helperHandButtonsStackArea.createParallelGroup(Alignment.LEADING)
+ .addGroup(gl_helperHandButtonsStackArea.createSequentialGroup()
+ .addGroup(gl_helperHandButtonsStackArea.createParallelGroup(Alignment.LEADING)
+ .addComponent(helper, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(handContainer, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ )
+ .addGroup(gl_helperHandButtonsStackArea.createParallelGroup(Alignment.LEADING)
+ .addComponent(pnlShortCuts, 410, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)
+ .addComponent(stackObjects, 410, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)
+ )
)
- .addGroup(gl_helperHandButtonsStackArea.createParallelGroup(Alignment.LEADING)
- .addComponent(pnlShortCuts, 410, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)
- .addComponent(stackObjects, 410, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)
- )
- )
- .addGap(0)
- //.addComponent(jPhases, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addGroup(gl_helperHandButtonsStackArea.createSequentialGroup()
- .addComponent(pnlBattlefield, GroupLayout.DEFAULT_SIZE, 200, Short.MAX_VALUE)
- .addComponent(phasesContainer, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
- )))
+ .addGap(0)
+ //.addComponent(jPhases, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addGroup(gl_helperHandButtonsStackArea.createSequentialGroup()
+ .addComponent(pnlBattlefield, GroupLayout.DEFAULT_SIZE, 200, Short.MAX_VALUE)
+ .addComponent(phasesContainer, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
+ )))
);
gl_helperHandButtonsStackArea.setVerticalGroup(
gl_helperHandButtonsStackArea.createParallelGroup(Alignment.TRAILING)
- .addGroup(gl_helperHandButtonsStackArea.createSequentialGroup()
- .addGroup(gl_helperHandButtonsStackArea.createParallelGroup(Alignment.LEADING)
- .addComponent(pnlBattlefield, GroupLayout.DEFAULT_SIZE, 200, Short.MAX_VALUE)
- .addComponent(phasesContainer, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
- )
- //.addPreferredGap(ComponentPlacement.RELATED)
- .addGroup(gl_helperHandButtonsStackArea.createParallelGroup(Alignment.LEADING)
- .addGroup(gl_helperHandButtonsStackArea.createSequentialGroup()
- .addGap(2)
- .addComponent(pnlShortCuts, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
- .addComponent(stackObjects, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
+ .addGroup(gl_helperHandButtonsStackArea.createSequentialGroup()
+ .addGroup(gl_helperHandButtonsStackArea.createParallelGroup(Alignment.LEADING)
+ .addComponent(pnlBattlefield, GroupLayout.DEFAULT_SIZE, 200, Short.MAX_VALUE)
+ .addComponent(phasesContainer, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
)
- .addGroup(gl_helperHandButtonsStackArea.createSequentialGroup()
- .addComponent(helper, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
- .addComponent(handContainer, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
+ //.addPreferredGap(ComponentPlacement.RELATED)
+ .addGroup(gl_helperHandButtonsStackArea.createParallelGroup(Alignment.LEADING)
+ .addGroup(gl_helperHandButtonsStackArea.createSequentialGroup()
+ .addGap(2)
+ .addComponent(pnlShortCuts, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
+ .addComponent(stackObjects, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
+ )
+ .addGroup(gl_helperHandButtonsStackArea.createSequentialGroup()
+ .addComponent(helper, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
+ .addComponent(handContainer, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
+ )
)
)
- )
);
pnlHelperHandButtonsStackArea.setLayout(gl_helperHandButtonsStackArea);
@@ -2007,11 +2006,11 @@ public final class GamePanel extends javax.swing.JPanel {
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(jSplitPane0, javax.swing.GroupLayout.DEFAULT_SIZE, 1078, Short.MAX_VALUE)
+ .addComponent(jSplitPane0, javax.swing.GroupLayout.DEFAULT_SIZE, 1078, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(jSplitPane0, javax.swing.GroupLayout.DEFAULT_SIZE, 798, Short.MAX_VALUE)
+ .addComponent(jSplitPane0, javax.swing.GroupLayout.DEFAULT_SIZE, 798, Short.MAX_VALUE)
);
}
@@ -2103,7 +2102,7 @@ public final class GamePanel extends javax.swing.JPanel {
message.setGameId(gameId);
MageFrame.getInstance().showUserRequestDialog(message);
}
-
+
private void btnToggleMacroActionPerformed(java.awt.event.ActionEvent evt) {
SessionHandler.sendPlayerAction(PlayerAction.TOGGLE_RECORD_MACRO, gameId, null);
AudioManager.playOnSkipButton();
diff --git a/Mage.Client/src/main/java/mage/client/util/gui/GuiDisplayUtil.java b/Mage.Client/src/main/java/mage/client/util/gui/GuiDisplayUtil.java
index d2deeea32db..293231595b7 100644
--- a/Mage.Client/src/main/java/mage/client/util/gui/GuiDisplayUtil.java
+++ b/Mage.Client/src/main/java/mage/client/util/gui/GuiDisplayUtil.java
@@ -1,5 +1,8 @@
package mage.client.util.gui;
+import java.awt.*;
+import java.util.ArrayList;
+import javax.swing.*;
import mage.client.MageFrame;
import mage.client.util.GUISizeHelper;
import mage.constants.*;
@@ -10,10 +13,6 @@ import org.jdesktop.swingx.JXPanel;
import org.mage.card.arcane.ManaSymbols;
import org.mage.card.arcane.UI;
-import javax.swing.*;
-import java.awt.*;
-import java.util.ArrayList;
-
public final class GuiDisplayUtil {
private static final Font cardNameFont = new Font("Calibri", Font.BOLD, 15);
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 0f032461e1c..20201a7e306 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
@@ -1122,6 +1122,18 @@ public class ComputerPlayer extends PlayerImpl implements Player {
}
}
}
+ // pay snow covered mana
+ for (ActivatedManaAbilityImpl manaAbility : mageObject.getAbilities().getAvailableActivatedManaAbilities(Zone.BATTLEFIELD, game)) {
+ if (cost instanceof SnowManaCost) {
+ for (Mana netMana : manaAbility.getNetMana(game)) {
+ if (cost.testPay(netMana) || spendAnyMana) {
+ if (activateAbility(manaAbility, game)) {
+ return true;
+ }
+ }
+ }
+ }
+ }
// then pay hybrid
for (ActivatedManaAbilityImpl manaAbility : mageObject.getAbilities().getAvailableActivatedManaAbilities(Zone.BATTLEFIELD, game)) {
if (cost instanceof HybridManaCost) {
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 4e3225cc759..3c46ffe05f1 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
@@ -87,7 +87,6 @@ public class HumanPlayer extends PlayerImpl {
protected static FilterAttackingCreature filterAttack = new FilterAttackingCreature();
protected static FilterBlockingCreature filterBlock = new FilterBlockingCreature();
protected final Choice replacementEffectChoice;
-
private static final Logger logger = Logger.getLogger(HumanPlayer.class);
protected HashSet autoSelectReplacementEffects = new HashSet<>();
@@ -119,9 +118,26 @@ public class HumanPlayer extends PlayerImpl {
public HumanPlayer(final HumanPlayer player) {
super(player);
+ this.replacementEffectChoice = player.replacementEffectChoice;
this.autoSelectReplacementEffects.addAll(autoSelectReplacementEffects);
this.currentlyUnpaidMana = player.currentlyUnpaidMana;
- this.replacementEffectChoice = player.replacementEffectChoice;
+
+ this.triggerAutoOrderAbilityFirst.addAll(player.triggerAutoOrderAbilityFirst);
+ this.triggerAutoOrderAbilityLast.addAll(player.triggerAutoOrderAbilityLast);
+ this.triggerAutoOrderNameFirst.addAll(player.triggerAutoOrderNameFirst);
+ this.triggerAutoOrderNameLast.addAll(player.triggerAutoOrderNameLast);
+
+ this.requestAutoAnswerId.putAll(player.requestAutoAnswerId);
+ this.requestAutoAnswerText.putAll(player.requestAutoAnswerText);
+
+ this.holdingPriority = player.holdingPriority;
+
+ this.actionQueue.addAll(player.actionQueue);
+ this.actionQueueSaved.addAll(player.actionQueueSaved);
+ this.actionIterations = player.actionIterations;
+ this.recordingMacro = player.recordingMacro;
+ this.macroTriggeredSelectionFlag = player.macroTriggeredSelectionFlag;
+ this.activatingMacro = player.activatingMacro;
}
protected boolean isExecutingMacro() {
@@ -134,6 +150,7 @@ public class HumanPlayer extends PlayerImpl {
if (actionQueue.isEmpty() && actionIterations > 0 && !actionQueueSaved.isEmpty()) {
actionQueue = new LinkedList(actionQueueSaved);
actionIterations--;
+// logger.info("MACRO iteration: " + actionIterations);
}
PlayerResponse action = actionQueue.poll();
if (action != null) {
@@ -158,6 +175,11 @@ public class HumanPlayer extends PlayerImpl {
protected void waitForResponse(Game game) {
if (isExecutingMacro()) {
pullResponseFromQueue(game);
+// logger.info("MACRO pull from queue: " + response.toString());
+// try {
+// TimeUnit.MILLISECONDS.sleep(1000);
+// } catch (InterruptedException e) {
+// }
return;
}
response.clear();
@@ -166,7 +188,7 @@ public class HumanPlayer extends PlayerImpl {
synchronized (response) {
try {
response.wait();
- logger.debug("Got response from player: " + getId());
+ logger.info("Got response from player: " + response.toString());
} catch (InterruptedException ex) {
logger.error("Response error for player " + getName() + " gameId: " + game.getId(), ex);
} finally {
@@ -174,7 +196,7 @@ public class HumanPlayer extends PlayerImpl {
}
}
if (recordingMacro && !macroTriggeredSelectionFlag) {
- logger.debug("Adding an action " + response);
+// logger.info("Adding an action " + response);
actionQueueSaved.add(new PlayerResponse(response));
}
}
diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/PlayerResponse.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/PlayerResponse.java
index fc7b27bed87..2f1e5871c29 100644
--- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/PlayerResponse.java
+++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/PlayerResponse.java
@@ -24,8 +24,7 @@
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
-*/
-
+ */
package mage.player.human;
import java.io.Serializable;
@@ -44,29 +43,25 @@ public class PlayerResponse implements Serializable {
private Integer responseInteger;
private ManaType responseManaType;
private UUID responseManaTypePlayerId;
-
+
public PlayerResponse() {
clear();
}
-
+
+ @Override
public String toString() {
- return new StringBuilder((responseString == null) ? "null" : responseString)
- .append(',')
- .append(responseUUID)
- .append(',')
- .append(responseBoolean)
- .append(',')
- .append(responseInteger)
- .append(',')
- .append(responseManaType)
- .append(',')
- .append(responseManaTypePlayerId).toString();
+ return ((responseString == null) ? "null" : responseString)
+ + ',' + responseUUID
+ + ',' + responseBoolean
+ + ',' + responseInteger
+ + ',' + responseManaType
+ + ',' + responseManaTypePlayerId;
}
-
+
public PlayerResponse(PlayerResponse other) {
copy(other);
}
-
+
public void copy(PlayerResponse other) {
responseString = other.responseString;
responseUUID = other.responseUUID;
diff --git a/Mage.Sets/src/mage/cards/a/AdornedPouncer.java b/Mage.Sets/src/mage/cards/a/AdornedPouncer.java
index b0f970b2812..b0de71f33ed 100644
--- a/Mage.Sets/src/mage/cards/a/AdornedPouncer.java
+++ b/Mage.Sets/src/mage/cards/a/AdornedPouncer.java
@@ -47,17 +47,18 @@ public class AdornedPouncer extends CardImpl {
this.power = new MageInt(1);
this.toughness = new MageInt(1);
- //double strike
+ // Double strike
addAbility(DoubleStrikeAbility.getInstance());
- //eternalize 3WW
+ // Eternalize 3WW
addAbility(new EternalizeAbility(new ManaCostsImpl("{3}{W}{W}"), this));
}
- public AdornedPouncer(AdornedPouncer adornedPouncer) {
- super(adornedPouncer);
+ public AdornedPouncer(final AdornedPouncer card) {
+ super(card);
}
+ @Override
public AdornedPouncer copy() {
return new AdornedPouncer(this);
}
diff --git a/Mage.Sets/src/mage/cards/b/Bifurcate.java b/Mage.Sets/src/mage/cards/b/Bifurcate.java
new file mode 100644
index 00000000000..26710436348
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/b/Bifurcate.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are 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.b;
+
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.filter.FilterCard;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.common.FilterPermanentCard;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.NamePredicate;
+import mage.filter.predicate.permanent.TokenPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.target.common.TargetCardInLibrary;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author ciaccona007
+ */
+public class Bifurcate extends CardImpl {
+ private static FilterCreaturePermanent filter = new FilterCreaturePermanent("nontoken creatures");
+
+ static {
+ filter.add(Predicates.not(new TokenPredicate()));
+ }
+
+ public Bifurcate(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{G}");
+
+ // Search your library for a permanent card with the same name as target nontoken creature and put that card onto the battlefield. Then shuffle your library.
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter));
+ this.getSpellAbility().addEffect(new BifurcateEffect());
+ }
+
+ public Bifurcate(final Bifurcate card) {
+ super(card);
+ }
+
+ @Override
+ public Bifurcate copy() {
+ return new Bifurcate(this);
+ }
+}
+
+class BifurcateEffect extends OneShotEffect {
+
+ public BifurcateEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "Search your library for a permanent card with the same name as target nontoken creature and put that card onto the battlefield. Then shuffle your library";
+ }
+
+ public BifurcateEffect(final BifurcateEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public BifurcateEffect copy() {
+ return new BifurcateEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent permanent = game.getPermanent(source.getFirstTarget());
+ FilterCard filter = new FilterPermanentCard();
+ filter.add(new NamePredicate(permanent.getName()));
+ return new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter)).apply(game, source);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/b/BrandOfIllOmen.java b/Mage.Sets/src/mage/cards/b/BrandOfIllOmen.java
new file mode 100644
index 00000000000..ff50756639b
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/b/BrandOfIllOmen.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.cards.b;
+
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.keyword.CumulativeUpkeepAbility;
+import mage.abilities.keyword.EnchantAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.*;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author ciaccona007
+ */
+public class BrandOfIllOmen extends CardImpl {
+
+ public BrandOfIllOmen(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{R}");
+
+ this.subtype.add(SubType.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);
+
+ // Cumulative upkeep {R}
+ this.addAbility(new CumulativeUpkeepAbility(new ManaCostsImpl("{R}")));
+
+ // Enchanted creature's controller can't cast creature spells.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BrandOfIllOmenEffect()));
+
+ }
+
+ public BrandOfIllOmen(final BrandOfIllOmen card) {
+ super(card);
+ }
+
+ @Override
+ public BrandOfIllOmen copy() {
+ return new BrandOfIllOmen(this);
+ }
+}
+
+class BrandOfIllOmenEffect extends ContinuousRuleModifyingEffectImpl {
+
+ public BrandOfIllOmenEffect() {
+ super(Duration.WhileOnBattlefield, Outcome.Detriment);
+ staticText = "Enchanted creature's controller can't cast creature spells";
+ }
+
+ public BrandOfIllOmenEffect(final BrandOfIllOmenEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return true;
+ }
+
+ @Override
+ public BrandOfIllOmenEffect copy() {
+ return new BrandOfIllOmenEffect(this);
+ }
+
+ @Override
+ public String getInfoMessage(Ability source, GameEvent event, Game game) {
+ MageObject mageObject = game.getObject(source.getSourceId());
+ if (mageObject != null) {
+ return "You can't cast creature spells (" + mageObject.getLogName() + " on the battlefield).";
+ }
+ return null;
+ }
+
+ @Override
+ public boolean checksEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.CAST_SPELL;
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ Permanent brand = game.getPermanent(source.getSourceId());
+ if (brand != null && brand.getAttachedTo() != null) {
+ UUID enchantedController = game.getPermanent(brand.getAttachedTo()).getControllerId();
+ if(enchantedController == event.getPlayerId() && game.getObject(event.getSourceId()).isCreature()) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/b/BronzeBombshell.java b/Mage.Sets/src/mage/cards/b/BronzeBombshell.java
index 04fe4e15082..5bdd5d42ee6 100644
--- a/Mage.Sets/src/mage/cards/b/BronzeBombshell.java
+++ b/Mage.Sets/src/mage/cards/b/BronzeBombshell.java
@@ -89,7 +89,8 @@ class LoseControlTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkEventType(GameEvent event, Game game) {
- return (event.getType() == GameEvent.EventType.LOST_CONTROL);
+ return event.getType() == GameEvent.EventType.LOST_CONTROL
+ || event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD;
}
@Override
diff --git a/Mage.Sets/src/mage/cards/c/CartoucheOfAmbition.java b/Mage.Sets/src/mage/cards/c/CartoucheOfAmbition.java
index 57cd01dfb92..459bf7a4789 100644
--- a/Mage.Sets/src/mage/cards/c/CartoucheOfAmbition.java
+++ b/Mage.Sets/src/mage/cards/c/CartoucheOfAmbition.java
@@ -27,7 +27,6 @@
*/
package mage.cards.c;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
@@ -40,16 +39,14 @@ import mage.abilities.keyword.EnchantAbility;
import mage.abilities.keyword.LifelinkAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.AttachmentType;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.counters.CounterType;
import mage.target.TargetPermanent;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.common.TargetCreaturePermanent;
+import java.util.UUID;
+
/**
*
* @author fireshoes
@@ -59,8 +56,7 @@ public class CartoucheOfAmbition extends CardImpl {
public CartoucheOfAmbition(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}");
- this.subtype.add("Aura");
- this.subtype.add("Cartouche");
+ this.subtype.add(SubType.AURA, SubType.CARTOUCHE);
// Enchant creature you control
TargetPermanent auraTarget = new TargetControlledCreaturePermanent();
diff --git a/Mage.Sets/src/mage/cards/c/CartoucheOfKnowledge.java b/Mage.Sets/src/mage/cards/c/CartoucheOfKnowledge.java
index c4b1fa90186..cf0373d6cac 100644
--- a/Mage.Sets/src/mage/cards/c/CartoucheOfKnowledge.java
+++ b/Mage.Sets/src/mage/cards/c/CartoucheOfKnowledge.java
@@ -27,7 +27,6 @@
*/
package mage.cards.c;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
@@ -40,14 +39,12 @@ import mage.abilities.keyword.EnchantAbility;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.AttachmentType;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.target.TargetPermanent;
import mage.target.common.TargetControlledCreaturePermanent;
+import java.util.UUID;
+
/**
*
* @author fireshoes
@@ -57,8 +54,7 @@ public class CartoucheOfKnowledge extends CardImpl {
public CartoucheOfKnowledge(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}");
- this.subtype.add("Aura");
- this.subtype.add("Cartouche");
+ this.subtype.add(SubType.AURA, SubType.CARTOUCHE);
// Enchant creature you control
TargetPermanent auraTarget = new TargetControlledCreaturePermanent();
diff --git a/Mage.Sets/src/mage/cards/c/CartoucheOfSolidarity.java b/Mage.Sets/src/mage/cards/c/CartoucheOfSolidarity.java
index 93af370d16f..2b1d1e39116 100644
--- a/Mage.Sets/src/mage/cards/c/CartoucheOfSolidarity.java
+++ b/Mage.Sets/src/mage/cards/c/CartoucheOfSolidarity.java
@@ -27,7 +27,6 @@
*/
package mage.cards.c;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
@@ -40,15 +39,13 @@ import mage.abilities.keyword.EnchantAbility;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.AttachmentType;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.game.permanent.token.WarriorVigilantToken;
import mage.target.TargetPermanent;
import mage.target.common.TargetControlledCreaturePermanent;
+import java.util.UUID;
+
/**
*
* @author fireshoes
@@ -58,8 +55,7 @@ public class CartoucheOfSolidarity extends CardImpl {
public CartoucheOfSolidarity(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{W}");
- this.subtype.add("Aura");
- this.subtype.add("Cartouche");
+ this.subtype.add(SubType.AURA, SubType.CARTOUCHE);
// Enchant creature you control
TargetPermanent auraTarget = new TargetControlledCreaturePermanent();
diff --git a/Mage.Sets/src/mage/cards/c/CartoucheOfStrength.java b/Mage.Sets/src/mage/cards/c/CartoucheOfStrength.java
index 9a263ff7d05..661797a8710 100644
--- a/Mage.Sets/src/mage/cards/c/CartoucheOfStrength.java
+++ b/Mage.Sets/src/mage/cards/c/CartoucheOfStrength.java
@@ -27,7 +27,6 @@
*/
package mage.cards.c;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@@ -48,6 +47,8 @@ import mage.target.TargetPermanent;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.common.TargetOpponentsCreaturePermanent;
+import java.util.UUID;
+
/**
*
* @author stravant
@@ -57,8 +58,7 @@ public class CartoucheOfStrength extends CardImpl {
public CartoucheOfStrength(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}");
- this.subtype.add("Aura");
- this.subtype.add("Cartouche");
+ this.subtype.add(SubType.AURA, SubType.CARTOUCHE);
// Enchant creature you control
TargetPermanent auraTarget = new TargetControlledCreaturePermanent();
diff --git a/Mage.Sets/src/mage/cards/c/CartoucheOfZeal.java b/Mage.Sets/src/mage/cards/c/CartoucheOfZeal.java
index 086915d55b9..79bdbbc4d0f 100644
--- a/Mage.Sets/src/mage/cards/c/CartoucheOfZeal.java
+++ b/Mage.Sets/src/mage/cards/c/CartoucheOfZeal.java
@@ -27,7 +27,6 @@
*/
package mage.cards.c;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
@@ -40,15 +39,13 @@ import mage.abilities.keyword.EnchantAbility;
import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.AttachmentType;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.Zone;
+import mage.constants.*;
import mage.target.TargetPermanent;
import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.common.TargetCreaturePermanent;
+import java.util.UUID;
+
/**
*
* @author fireshoes
@@ -58,8 +55,7 @@ public class CartoucheOfZeal extends CardImpl {
public CartoucheOfZeal(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{R}");
- this.subtype.add("Aura");
- this.subtype.add("Cartouche");
+ this.subtype.add(SubType.AURA, SubType.CARTOUCHE);
// Enchant creature you control
TargetPermanent auraTarget = new TargetControlledCreaturePermanent();
diff --git a/Mage.Sets/src/mage/cards/c/CommitMemory.java b/Mage.Sets/src/mage/cards/c/CommitMemory.java
index 1ce9ffe6faa..9b3e4c7b683 100644
--- a/Mage.Sets/src/mage/cards/c/CommitMemory.java
+++ b/Mage.Sets/src/mage/cards/c/CommitMemory.java
@@ -72,7 +72,7 @@ public class CommitMemory extends SplitCard {
// Memory
// Aftermath
// Each player shuffles his or her hand and graveyard into his or her library, then draws seven cards.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility());
+ ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
getRightHalfCard().getSpellAbility().addEffect(new MemoryEffect());
Effect effect = new DrawCardAllEffect(7);
effect.setText(", then draws seven cards");
diff --git a/Mage.Sets/src/mage/cards/c/ConsulateDreadnought.java b/Mage.Sets/src/mage/cards/c/ConsulateDreadnought.java
index 2fb443f7d96..606cc51edae 100644
--- a/Mage.Sets/src/mage/cards/c/ConsulateDreadnought.java
+++ b/Mage.Sets/src/mage/cards/c/ConsulateDreadnought.java
@@ -27,12 +27,14 @@
*/
package mage.cards.c;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.keyword.CrewAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
/**
*
@@ -43,7 +45,7 @@ public class ConsulateDreadnought extends CardImpl {
public ConsulateDreadnought(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}");
- this.subtype.add("Vehicle");
+ this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(7);
this.toughness = new MageInt(11);
diff --git a/Mage.Sets/src/mage/cards/c/CultivatorsCaravan.java b/Mage.Sets/src/mage/cards/c/CultivatorsCaravan.java
index d635e10a0eb..88d3c546423 100644
--- a/Mage.Sets/src/mage/cards/c/CultivatorsCaravan.java
+++ b/Mage.Sets/src/mage/cards/c/CultivatorsCaravan.java
@@ -27,13 +27,15 @@
*/
package mage.cards.c;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.keyword.CrewAbility;
import mage.abilities.mana.AnyColorManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
/**
*
@@ -43,7 +45,7 @@ public class CultivatorsCaravan extends CardImpl {
public CultivatorsCaravan(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}");
- this.subtype.add("Vehicle");
+ this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(5);
this.toughness = new MageInt(5);
diff --git a/Mage.Sets/src/mage/cards/c/CutRibbons.java b/Mage.Sets/src/mage/cards/c/CutRibbons.java
index 30abdaf1aaa..ac1e6fa473e 100644
--- a/Mage.Sets/src/mage/cards/c/CutRibbons.java
+++ b/Mage.Sets/src/mage/cards/c/CutRibbons.java
@@ -23,12 +23,12 @@ public class CutRibbons extends SplitCard {
// Cut
// Cut deals 4 damage to target creature.
getLeftHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent());
- getLeftHalfCard().getSpellAbility().addEffect(new DamageTargetEffect(4));
+ getLeftHalfCard().getSpellAbility().addEffect(new DamageTargetEffect(4).setText("Cut deals 4 damage to target creature"));
// to
// Ribbons
// Each opponent loses X life.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility());
+ ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
getRightHalfCard().getSpellAbility().addEffect(new LoseLifeOpponentsEffect(new ManacostVariableValue()));
}
diff --git a/Mage.Sets/src/mage/cards/d/DaredevilDragster.java b/Mage.Sets/src/mage/cards/d/DaredevilDragster.java
index f6cc4f5d961..d07b56a9f61 100644
--- a/Mage.Sets/src/mage/cards/d/DaredevilDragster.java
+++ b/Mage.Sets/src/mage/cards/d/DaredevilDragster.java
@@ -27,7 +27,6 @@
*/
package mage.cards.d;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EndOfCombatTriggeredAbility;
@@ -39,12 +38,15 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
+import mage.constants.SubType;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.watchers.common.AttackedOrBlockedThisCombatWatcher;
+import java.util.UUID;
+
/**
*
* @author spjspj
@@ -54,7 +56,7 @@ public class DaredevilDragster extends CardImpl {
public DaredevilDragster(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
- this.subtype.add("Vehicle");
+ this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
diff --git a/Mage.Sets/src/mage/cards/d/DaruSpiritualist.java b/Mage.Sets/src/mage/cards/d/DaruSpiritualist.java
index 70069012f97..6b1617086dc 100644
--- a/Mage.Sets/src/mage/cards/d/DaruSpiritualist.java
+++ b/Mage.Sets/src/mage/cards/d/DaruSpiritualist.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.cards.d;
import java.util.UUID;
@@ -47,7 +46,6 @@ import mage.game.events.GameEvent.EventType;
import mage.game.permanent.Permanent;
import mage.target.targetpointer.FixedTarget;
-
/**
*
* @author L_J
@@ -55,7 +53,7 @@ import mage.target.targetpointer.FixedTarget;
public class DaruSpiritualist extends CardImpl {
public DaruSpiritualist(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{W}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");
this.subtype.add("Human");
this.subtype.add("Cleric");
@@ -104,12 +102,9 @@ class DaruSpiritualistTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
- UUID targetId = event.getTargetId();
Permanent creature = game.getPermanent(event.getTargetId());
if (creature != null && filter.match(creature, getSourceId(), getControllerId(), game)) {
- for (Effect effect : this.getEffects()) {
- effect.setTargetPointer(new FixedTarget(event.getTargetId()));
- }
+ this.getEffects().setTargetPointer(new FixedTarget(creature, game));
return true;
}
return false;
diff --git a/Mage.Sets/src/mage/cards/d/DemolitionStomper.java b/Mage.Sets/src/mage/cards/d/DemolitionStomper.java
index 4bc7ea26cfa..669f8838969 100644
--- a/Mage.Sets/src/mage/cards/d/DemolitionStomper.java
+++ b/Mage.Sets/src/mage/cards/d/DemolitionStomper.java
@@ -27,7 +27,6 @@
*/
package mage.cards.d;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.SimpleEvasionAbility;
import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect;
@@ -37,9 +36,12 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Duration;
+import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.PowerPredicate;
+import java.util.UUID;
+
/**
*
* @author emerald000
@@ -53,7 +55,7 @@ public class DemolitionStomper extends CardImpl {
public DemolitionStomper(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{6}");
- this.subtype.add("Vehicle");
+ this.subtype.add( SubType.VEHICLE);
this.power = new MageInt(10);
this.toughness = new MageInt(7);
diff --git a/Mage.Sets/src/mage/cards/d/DestinedLead.java b/Mage.Sets/src/mage/cards/d/DestinedLead.java
index 18824517760..af2b2dd4235 100644
--- a/Mage.Sets/src/mage/cards/d/DestinedLead.java
+++ b/Mage.Sets/src/mage/cards/d/DestinedLead.java
@@ -61,7 +61,7 @@ public class DestinedLead extends SplitCard {
// to
// Lead
// All creatures able to block target creature this turn must do so.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility());
+ ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
getRightHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent());
getRightHalfCard().getSpellAbility().addEffect(new MustBeBlockedByAllTargetEffect(Duration.EndOfTurn));
}
diff --git a/Mage.Sets/src/mage/cards/d/DuskDawn.java b/Mage.Sets/src/mage/cards/d/DuskDawn.java
index 247f8a50a0d..92db3e1321d 100644
--- a/Mage.Sets/src/mage/cards/d/DuskDawn.java
+++ b/Mage.Sets/src/mage/cards/d/DuskDawn.java
@@ -69,7 +69,7 @@ public class DuskDawn extends SplitCard {
// Dawn
// Return all creature cards with power less than or equal to 2 from your graveyard to your hand.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility());
+ ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
getRightHalfCard().getSpellAbility().addEffect(new DawnEffect());
}
diff --git a/Mage.Sets/src/mage/cards/f/FailureComply.java b/Mage.Sets/src/mage/cards/f/FailureComply.java
index 8ed7542bf46..4b5663e31df 100644
--- a/Mage.Sets/src/mage/cards/f/FailureComply.java
+++ b/Mage.Sets/src/mage/cards/f/FailureComply.java
@@ -63,7 +63,7 @@ public class FailureComply extends SplitCard {
// to
// Comply
// Choose a card name. Until your next turn, your opponents can't cast spells with the chosen name
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility());
+ ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
Effect effect = new NameACardEffect(NameACardEffect.TypeOfName.ALL);
effect.setText("Choose a card name");
getRightHalfCard().getSpellAbility().addEffect(effect);
diff --git a/Mage.Sets/src/mage/cards/f/FesteringWound.java b/Mage.Sets/src/mage/cards/f/FesteringWound.java
new file mode 100644
index 00000000000..0317ee92559
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/f/FesteringWound.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.cards.f;
+
+import java.util.UUID;
+
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.ChooseOpponentEffect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.cards.Card;
+import mage.constants.*;
+import mage.counters.Counter;
+import mage.counters.CounterType;
+import mage.filter.common.FilterCreatureCard;
+import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.common.TargetCardInHand;
+import mage.target.common.TargetCreaturePermanent;
+import mage.abilities.Ability;
+import mage.abilities.effects.common.AttachEffect;
+import mage.target.TargetPermanent;
+import mage.abilities.keyword.EnchantAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+
+/**
+ *
+ * @author ciaccona007
+ */
+public class FesteringWound extends CardImpl {
+
+ public FesteringWound(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}");
+
+ 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);
+
+ // At the beginning of your upkeep, you may put an infection counter on Festering Wound.
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new AddCountersSourceEffect(CounterType.INFECTION.createInstance(), true), TargetController.YOU, true));
+ // At the beginning of the upkeep of enchanted creature's controller, Festering Wound deals X damage to that player, where X is the number of infection counters on Festering Wound.
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new FesteringWoundEffect(), TargetController.CONTROLLER_ATTACHED_TO, false, true));
+ }
+
+ public FesteringWound(final FesteringWound card) {
+ super(card);
+ }
+
+ @Override
+ public FesteringWound copy() {
+ return new FesteringWound(this);
+ }
+}
+class FesteringWoundEffect extends OneShotEffect {
+
+ public FesteringWoundEffect() {
+ super(Outcome.Detriment);
+ this.staticText = "{this} deals X damage to that player, where X is the number of infection counters on {this}";
+ }
+
+ public FesteringWoundEffect(final FesteringWoundEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public FesteringWoundEffect copy() {
+ return new FesteringWoundEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ UUID sourceId = source.getSourceId();
+ int amount = game.getPermanent(sourceId).getCounters(game).getCount(CounterType.INFECTION);
+ UUID id = this.getTargetPointer().getFirst(game, source);
+ Player player = game.getPlayer(id);
+ if(player != null) {
+ player.damage(amount, source.getSourceId(), game, false, true);
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/f/FleetwheelCruiser.java b/Mage.Sets/src/mage/cards/f/FleetwheelCruiser.java
index b00b16b57fa..e2e32e699b1 100644
--- a/Mage.Sets/src/mage/cards/f/FleetwheelCruiser.java
+++ b/Mage.Sets/src/mage/cards/f/FleetwheelCruiser.java
@@ -27,7 +27,6 @@
*/
package mage.cards.f;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@@ -40,6 +39,9 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
+import mage.constants.SubType;
+
+import java.util.UUID;
/**
*
@@ -49,7 +51,7 @@ public class FleetwheelCruiser extends CardImpl {
public FleetwheelCruiser(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}");
- this.subtype.add("Vehicle");
+ this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(5);
this.toughness = new MageInt(3);
diff --git a/Mage.Sets/src/mage/cards/f/FloodedWoodlands.java b/Mage.Sets/src/mage/cards/f/FloodedWoodlands.java
new file mode 100644
index 00000000000..7e5a16edd15
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/f/FloodedWoodlands.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are 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.f;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.effects.PayCostToAttackBlockEffectImpl;
+import mage.abilities.effects.PayCostToAttackBlockEffectImpl.RestrictType;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledLandPermanent;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+import mage.target.common.TargetControlledPermanent;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class FloodedWoodlands extends CardImpl {
+
+ public FloodedWoodlands(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}{B}");
+
+
+ // Green creatures can't attack unless their controller sacrifices a land for each green creature he or she controls that's attacking.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new FloodedWoodlandsCostToAttackBlockEffect()));
+
+ }
+
+ public FloodedWoodlands(final FloodedWoodlands card) {
+ super(card);
+ }
+
+ @Override
+ public FloodedWoodlands copy() {
+ return new FloodedWoodlands(this);
+ }
+}
+
+class FloodedWoodlandsCostToAttackBlockEffect extends PayCostToAttackBlockEffectImpl {
+
+ FloodedWoodlandsCostToAttackBlockEffect() {
+ super(Duration.WhileOnBattlefield, Outcome.Detriment, RestrictType.ATTACK,
+ new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent("a land"))));
+ staticText = "Green creatures can't attack unless their controller sacrifices a land (This cost is paid as attackers are declared.)";
+ }
+
+ FloodedWoodlandsCostToAttackBlockEffect(FloodedWoodlandsCostToAttackBlockEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ Permanent permanent = game.getPermanent(event.getSourceId());
+ return (permanent != null
+ && permanent.isCreature()
+ && permanent.getColor(game).isGreen());
+ }
+
+ @Override
+ public FloodedWoodlandsCostToAttackBlockEffect copy() {
+ return new FloodedWoodlandsCostToAttackBlockEffect(this);
+ }
+
+}
diff --git a/Mage.Sets/src/mage/cards/h/HeartOfKiran.java b/Mage.Sets/src/mage/cards/h/HeartOfKiran.java
index 6adcd3b0a00..6ef4ab322a4 100644
--- a/Mage.Sets/src/mage/cards/h/HeartOfKiran.java
+++ b/Mage.Sets/src/mage/cards/h/HeartOfKiran.java
@@ -27,7 +27,6 @@
*/
package mage.cards.h;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@@ -49,6 +48,8 @@ import mage.game.permanent.Permanent;
import mage.target.Target;
import mage.target.common.TargetControlledPermanent;
+import java.util.UUID;
+
/**
* @author JRHerlehy
*/
@@ -58,7 +59,7 @@ public class HeartOfKiran extends CardImpl {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}");
addSuperType(SuperType.LEGENDARY);
- this.subtype.add("Vehicle");
+ this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
diff --git a/Mage.Sets/src/mage/cards/h/HeavenEarth.java b/Mage.Sets/src/mage/cards/h/HeavenEarth.java
index 0dff7803efb..6fd3a88d329 100644
--- a/Mage.Sets/src/mage/cards/h/HeavenEarth.java
+++ b/Mage.Sets/src/mage/cards/h/HeavenEarth.java
@@ -1,53 +1,53 @@
-package mage.cards.h;
-
-import java.util.UUID;
-import mage.abilities.dynamicvalue.common.ManacostVariableValue;
-import mage.abilities.effects.common.DamageAllEffect;
-import mage.abilities.keyword.AftermathAbility;
-import mage.abilities.keyword.FlyingAbility;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.cards.SplitCard;
-import mage.constants.CardType;
-import mage.constants.SpellAbilityType;
-import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.predicate.Predicates;
-import mage.filter.predicate.mageobject.AbilityPredicate;
-
-/**
- *
- * @author Styxo
- */
-public class HeavenEarth extends SplitCard {
-
- private static final FilterCreaturePermanent filterFlying = new FilterCreaturePermanent("creature with flying");
- private static final FilterCreaturePermanent filterWithouFlying = new FilterCreaturePermanent("creature without flying");
-
- static {
- filterFlying.add(new AbilityPredicate(FlyingAbility.class));
- filterWithouFlying.add(Predicates.not(new AbilityPredicate(FlyingAbility.class)));
- }
-
- public HeavenEarth(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, new CardType[]{CardType.SORCERY}, "{X}{G}", "{X}{R}{R}", SpellAbilityType.SPLIT_AFTERMATH);
-
- // Falling
- // Falling deals X damage to each creature with flying.
- getLeftHalfCard().getSpellAbility().addEffect(new DamageAllEffect(new ManacostVariableValue(), filterFlying));
-
- // to
- // Earth
- // Earth deals X damage to each creature without flying.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility());
- getRightHalfCard().getSpellAbility().addEffect(new DamageAllEffect(new ManacostVariableValue(), filterWithouFlying));
- }
-
- public HeavenEarth(final HeavenEarth card) {
- super(card);
- }
-
- @Override
- public HeavenEarth copy() {
- return new HeavenEarth(this);
- }
-}
+package mage.cards.h;
+
+import java.util.UUID;
+import mage.abilities.dynamicvalue.common.ManacostVariableValue;
+import mage.abilities.effects.common.DamageAllEffect;
+import mage.abilities.keyword.AftermathAbility;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.cards.SplitCard;
+import mage.constants.CardType;
+import mage.constants.SpellAbilityType;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.AbilityPredicate;
+
+/**
+ *
+ * @author Styxo
+ */
+public class HeavenEarth extends SplitCard {
+
+ private static final FilterCreaturePermanent filterFlying = new FilterCreaturePermanent("creature with flying");
+ private static final FilterCreaturePermanent filterWithouFlying = new FilterCreaturePermanent("creature without flying");
+
+ static {
+ filterFlying.add(new AbilityPredicate(FlyingAbility.class));
+ filterWithouFlying.add(Predicates.not(new AbilityPredicate(FlyingAbility.class)));
+ }
+
+ public HeavenEarth(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, new CardType[]{CardType.SORCERY}, "{X}{G}", "{X}{R}{R}", SpellAbilityType.SPLIT_AFTERMATH);
+
+ // Falling
+ // Falling deals X damage to each creature with flying.
+ getLeftHalfCard().getSpellAbility().addEffect(new DamageAllEffect(new ManacostVariableValue(), filterFlying));
+
+ // to
+ // Earth
+ // Earth deals X damage to each creature without flying.
+ ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
+ getRightHalfCard().getSpellAbility().addEffect(new DamageAllEffect(new ManacostVariableValue(), filterWithouFlying));
+ }
+
+ public HeavenEarth(final HeavenEarth card) {
+ super(card);
+ }
+
+ @Override
+ public HeavenEarth copy() {
+ return new HeavenEarth(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/h/HivisOfTheScale.java b/Mage.Sets/src/mage/cards/h/HivisOfTheScale.java
new file mode 100644
index 00000000000..ce04f521dec
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/h/HivisOfTheScale.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.cards.h;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SkipUntapOptionalAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.condition.common.SourceMatchesFilterCondition;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.continuous.GainControlTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.SubType;
+import mage.constants.SuperType;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.FilterPermanent;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.filter.predicate.permanent.TappedPredicate;
+import mage.target.TargetPermanent;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class HivisOfTheScale extends CardImpl {
+
+ private static final FilterPermanent filter = new FilterPermanent();
+ private static final FilterPermanent filterDragon = new FilterPermanent();
+ private static final String rule = "Gain control of target Dragon for as long as you control Hivis and Hivis remains tapped.";
+
+ static {
+ filter.add(new TappedPredicate());
+ filter.add(new ControllerPredicate(TargetController.YOU));
+ filterDragon.add(new SubtypePredicate(SubType.DRAGON));
+ }
+
+ public HivisOfTheScale(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{R}");
+
+ addSuperType(SuperType.LEGENDARY);
+ this.subtype.add("Viashino");
+ this.subtype.add("Shaman");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(4);
+
+ // You may choose not to untap Hivis of the Scale during your untap step.
+ this.addAbility(new SkipUntapOptionalAbility());
+
+ // {tap}: Gain control of target Dragon for as long as you control Hivis and Hivis remains tapped.
+ Condition condition = new SourceMatchesFilterCondition(filter);
+ Effect effect = new ConditionalContinuousEffect(new GainControlTargetEffect(Duration.Custom), condition, rule);
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new TapSourceCost());
+ ability.addTarget(new TargetPermanent(filterDragon));
+ this.addAbility(ability);
+
+ }
+
+ public HivisOfTheScale(final HivisOfTheScale card) {
+ super(card);
+ }
+
+ @Override
+ public HivisOfTheScale copy() {
+ return new HivisOfTheScale(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/h/HondenOfCleansingFire.java b/Mage.Sets/src/mage/cards/h/HondenOfCleansingFire.java
index 72353e76360..47a46958b5c 100644
--- a/Mage.Sets/src/mage/cards/h/HondenOfCleansingFire.java
+++ b/Mage.Sets/src/mage/cards/h/HondenOfCleansingFire.java
@@ -28,7 +28,6 @@
package mage.cards.h;
-import java.util.UUID;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.GainLifeEffect;
@@ -41,6 +40,8 @@ import mage.constants.TargetController;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
+import java.util.UUID;
+
/**
* @author Loki
*/
@@ -55,7 +56,7 @@ public class HondenOfCleansingFire extends CardImpl {
public HondenOfCleansingFire(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{W}");
addSuperType(SuperType.LEGENDARY);
- this.subtype.add("Shrine");
+ this.subtype.add(SubType.SHRINE);
// At the beginning of your upkeep, you gain 2 life for each Shrine you control.
diff --git a/Mage.Sets/src/mage/cards/h/HondenOfInfiniteRage.java b/Mage.Sets/src/mage/cards/h/HondenOfInfiniteRage.java
index 4c0ce5aa1ce..6f80ac46bc6 100644
--- a/Mage.Sets/src/mage/cards/h/HondenOfInfiniteRage.java
+++ b/Mage.Sets/src/mage/cards/h/HondenOfInfiniteRage.java
@@ -28,7 +28,6 @@
package mage.cards.h;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
@@ -43,6 +42,8 @@ import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.target.common.TargetCreatureOrPlayer;
+import java.util.UUID;
+
/**
*
* @author Loki
@@ -58,7 +59,7 @@ public class HondenOfInfiniteRage extends CardImpl {
public HondenOfInfiniteRage (UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{R}");
addSuperType(SuperType.LEGENDARY);
- this.subtype.add("Shrine");
+ this.subtype.add(SubType.SHRINE);
// At the beginning of your upkeep, Honden of Infinite Rage deals damage to target creature or player equal to the number of Shrines you control.
diff --git a/Mage.Sets/src/mage/cards/h/HondenOfLifesWeb.java b/Mage.Sets/src/mage/cards/h/HondenOfLifesWeb.java
index 326d70dc210..f063eb05ef6 100644
--- a/Mage.Sets/src/mage/cards/h/HondenOfLifesWeb.java
+++ b/Mage.Sets/src/mage/cards/h/HondenOfLifesWeb.java
@@ -28,7 +28,6 @@
package mage.cards.h;
-import java.util.UUID;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.CreateTokenEffect;
@@ -42,6 +41,8 @@ import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.game.permanent.token.SpiritToken;
+import java.util.UUID;
+
/**
* @author Loki
*/
@@ -56,7 +57,7 @@ public class HondenOfLifesWeb extends CardImpl {
public HondenOfLifesWeb(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{4}{G}");
addSuperType(SuperType.LEGENDARY);
- this.subtype.add("Shrine");
+ this.subtype.add(SubType.SHRINE);
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new CreateTokenEffect(new SpiritToken(), new PermanentsOnBattlefieldCount(filter)), TargetController.YOU, false));
}
diff --git a/Mage.Sets/src/mage/cards/h/HondenOfNightsReach.java b/Mage.Sets/src/mage/cards/h/HondenOfNightsReach.java
index e3c4cbffb4f..aa614f163ac 100644
--- a/Mage.Sets/src/mage/cards/h/HondenOfNightsReach.java
+++ b/Mage.Sets/src/mage/cards/h/HondenOfNightsReach.java
@@ -28,7 +28,6 @@
package mage.cards.h;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
@@ -43,6 +42,8 @@ import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.target.common.TargetOpponent;
+import java.util.UUID;
+
/**
* @author Loki
*/
@@ -57,7 +58,7 @@ public class HondenOfNightsReach extends CardImpl {
public HondenOfNightsReach(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{B}");
addSuperType(SuperType.LEGENDARY);
- this.subtype.add("Shrine");
+ this.subtype.add(SubType.SHRINE);
// At the beginning of your upkeep, target opponent discards a card for each Shrine you control.
diff --git a/Mage.Sets/src/mage/cards/h/HondenOfSeeingWinds.java b/Mage.Sets/src/mage/cards/h/HondenOfSeeingWinds.java
index d18f152ea36..36d0e07dde5 100644
--- a/Mage.Sets/src/mage/cards/h/HondenOfSeeingWinds.java
+++ b/Mage.Sets/src/mage/cards/h/HondenOfSeeingWinds.java
@@ -28,7 +28,6 @@
package mage.cards.h;
-import java.util.UUID;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
@@ -41,6 +40,8 @@ import mage.constants.TargetController;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
+import java.util.UUID;
+
/**
* @author Loki
*/
@@ -55,7 +56,7 @@ public class HondenOfSeeingWinds extends CardImpl {
public HondenOfSeeingWinds(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{4}{U}");
addSuperType(SuperType.LEGENDARY);
- this.subtype.add("Shrine");
+ this.subtype.add(SubType.SHRINE);
// At the beginning of your upkeep, draw a card for each Shrine you control.
diff --git a/Mage.Sets/src/mage/cards/i/InsultInjury.java b/Mage.Sets/src/mage/cards/i/InsultInjury.java
index b4721e71740..b4c272be79c 100644
--- a/Mage.Sets/src/mage/cards/i/InsultInjury.java
+++ b/Mage.Sets/src/mage/cards/i/InsultInjury.java
@@ -37,7 +37,7 @@ public class InsultInjury extends SplitCard {
// to
// Injury
// Injury deals 2 damage to target creature and 2 damage to target player.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility());
+ ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
getRightHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent());
getRightHalfCard().getSpellAbility().addTarget(new TargetPlayer());
getRightHalfCard().getSpellAbility().addEffect(new InjuryEffect());
diff --git a/Mage.Sets/src/mage/cards/i/IrontreadCrusher.java b/Mage.Sets/src/mage/cards/i/IrontreadCrusher.java
index 68c6eab10be..1b3cd4fdd56 100644
--- a/Mage.Sets/src/mage/cards/i/IrontreadCrusher.java
+++ b/Mage.Sets/src/mage/cards/i/IrontreadCrusher.java
@@ -27,12 +27,14 @@
*/
package mage.cards.i;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.keyword.CrewAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
/**
*
@@ -43,7 +45,7 @@ public class IrontreadCrusher extends CardImpl {
public IrontreadCrusher(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}");
- this.subtype.add("Vehicle");
+ this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(6);
this.toughness = new MageInt(6);
diff --git a/Mage.Sets/src/mage/cards/k/KalitasBloodchiefOfGhet.java b/Mage.Sets/src/mage/cards/k/KalitasBloodchiefOfGhet.java
index 353bc8682e6..3b1a0392be3 100644
--- a/Mage.Sets/src/mage/cards/k/KalitasBloodchiefOfGhet.java
+++ b/Mage.Sets/src/mage/cards/k/KalitasBloodchiefOfGhet.java
@@ -96,7 +96,12 @@ class KalitasDestroyEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
- if (permanent != null && permanent.destroy(source.getSourceId(), game, false)) { // if not destroyed or moved to other zone (replacement effect) it returns false
+ if (permanent != null && permanent.destroy(source.getSourceId(), game, false)) { // if not destroyed it returns false
+ if (permanent.getZoneChangeCounter(game) + 1 == game.getState().getZoneChangeCounter(permanent.getId())
+ && !game.getState().getZone(permanent.getId()).equals(Zone.GRAVEYARD)) {
+ // A replacement effect has moved the card to another zone as grvayard
+ return true;
+ }
new CreateTokenEffect(new KalitasVampireToken(permanent.getPower().getValue(), permanent.getToughness().getValue())).apply(game, source);
}
return true;
diff --git a/Mage.Sets/src/mage/cards/k/KatabaticWinds.java b/Mage.Sets/src/mage/cards/k/KatabaticWinds.java
new file mode 100644
index 00000000000..f61aeda5c3e
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/k/KatabaticWinds.java
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are 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.k;
+
+import java.util.Optional;
+import java.util.UUID;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
+import mage.abilities.effects.RestrictionEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.keyword.PhasingAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.AbilityPredicate;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class KatabaticWinds extends CardImpl {
+
+ public KatabaticWinds(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}");
+
+ // Phasing
+ this.addAbility(PhasingAbility.getInstance());
+
+ // Creatures with flying can't attack or block, and their activated abilities with {tap} in their costs can't be activated.
+ Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new KatabaticWindsRestrictionEffect());
+ ability.addEffect(new KatabaticWindsRuleModifyingEffect());
+ this.addAbility(ability);
+
+ }
+
+ public KatabaticWinds(final KatabaticWinds card) {
+ super(card);
+ }
+
+ @Override
+ public KatabaticWinds copy() {
+ return new KatabaticWinds(this);
+ }
+}
+
+class KatabaticWindsRestrictionEffect extends RestrictionEffect {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
+
+ static {
+ filter.add(new AbilityPredicate(FlyingAbility.class));
+ }
+
+ public KatabaticWindsRestrictionEffect() {
+ super(Duration.WhileOnBattlefield);
+ staticText = "Creatures with flying can't attack or block";
+ }
+
+ public KatabaticWindsRestrictionEffect(final KatabaticWindsRestrictionEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public KatabaticWindsRestrictionEffect copy() {
+ return new KatabaticWindsRestrictionEffect(this);
+ }
+
+ @Override
+ public boolean canAttack(Game game) {
+ return false;
+ }
+
+ @Override
+ public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) {
+ return false;
+ }
+
+ @Override
+ public boolean applies(Permanent permanent, Ability source, Game game) {
+ return filter.match(permanent, source.getSourceId(), source.getControllerId(), game);
+ }
+}
+
+class KatabaticWindsRuleModifyingEffect extends ContinuousRuleModifyingEffectImpl {
+
+ public KatabaticWindsRuleModifyingEffect() {
+ super(Duration.WhileOnBattlefield, Outcome.Detriment);
+ staticText = ", and their activated abilities with {tap} in their costs can't be activated";
+ }
+
+ public KatabaticWindsRuleModifyingEffect(final KatabaticWindsRuleModifyingEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public KatabaticWindsRuleModifyingEffect copy() {
+ return new KatabaticWindsRuleModifyingEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return true;
+ }
+
+ @Override
+ public boolean checksEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.ACTIVATE_ABILITY;
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ MageObject object = game.getObject(event.getSourceId());
+ Optional ability = game.getAbility(event.getTargetId(), event.getSourceId());
+ if (ability.isPresent()
+ && object != null
+ && object.isCreature()
+ && object.getAbilities().contains(FlyingAbility.getInstance())
+ && game.getState().getPlayersInRange(source.getControllerId(), game).contains(event.getPlayerId())) {
+ if (ability.get().getCosts().stream().anyMatch((cost) -> (cost instanceof TapSourceCost))) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String getInfoMessage(Ability source, GameEvent event, Game game) {
+ return "Creatures with flying can't use their activated abilities that use {tap} in their costs.";
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/k/KindleTheCarnage.java b/Mage.Sets/src/mage/cards/k/KindleTheCarnage.java
index 3a5e8276e56..463e641889a 100644
--- a/Mage.Sets/src/mage/cards/k/KindleTheCarnage.java
+++ b/Mage.Sets/src/mage/cards/k/KindleTheCarnage.java
@@ -1,102 +1,102 @@
-/*
- * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are 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.k;
-
-import java.util.UUID;
-import mage.abilities.Ability;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.DamageAllEffect;
-import mage.cards.Card;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.cards.Cards;
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.filter.common.FilterCreaturePermanent;
-import mage.game.Game;
-import mage.players.Player;
-
-/**
- *
- * @author jeffwadsworth
- */
-public class KindleTheCarnage extends CardImpl {
-
- public KindleTheCarnage(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{R}{R}");
-
- // Discard a card at random. If you do, Kindle the Carnage deals damage equal to that card's converted mana cost to each creature. You may repeat this process any number of times.
- this.getSpellAbility().addEffect(new KindleTheCarnageEffect());
-
- }
-
- public KindleTheCarnage(final KindleTheCarnage card) {
- super(card);
- }
-
- @Override
- public KindleTheCarnage copy() {
- return new KindleTheCarnage(this);
- }
-}
-
-class KindleTheCarnageEffect extends OneShotEffect {
-
- public KindleTheCarnageEffect() {
- super(Outcome.AIDontUseIt);
- this.staticText = "Discard a card at random. If you do, {this} deals damage equal to that card's converted mana cost to each creature. You may repeat this process any number of times";
- }
-
- public KindleTheCarnageEffect(final KindleTheCarnageEffect effect) {
- super(effect);
- }
-
- @Override
- public KindleTheCarnageEffect copy() {
- return new KindleTheCarnageEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player controller = game.getPlayer(source.getControllerId());
- if (controller != null) {
- Cards hand = controller.getHand();
- while (hand != null
- && hand.size() > 0
- && controller.isInGame()
- && controller.chooseUse(Outcome.AIDontUseIt, "Discard a card randomly from your hand?", source, game)) {
- Card discardedCard = controller.discardOne(true, source, game);
- if (discardedCard != null) {
- new DamageAllEffect(discardedCard.getConvertedManaCost(), new FilterCreaturePermanent()).apply(game, source);
- }
- }
- return true;
- }
- return false;
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.cards.k;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DamageAllEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.cards.Cards;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.game.Game;
+import mage.players.Player;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class KindleTheCarnage extends CardImpl {
+
+ public KindleTheCarnage(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{R}{R}");
+
+ // Discard a card at random. If you do, Kindle the Carnage deals damage equal to that card's converted mana cost to each creature. You may repeat this process any number of times.
+ this.getSpellAbility().addEffect(new KindleTheCarnageEffect());
+
+ }
+
+ public KindleTheCarnage(final KindleTheCarnage card) {
+ super(card);
+ }
+
+ @Override
+ public KindleTheCarnage copy() {
+ return new KindleTheCarnage(this);
+ }
+}
+
+class KindleTheCarnageEffect extends OneShotEffect {
+
+ public KindleTheCarnageEffect() {
+ super(Outcome.AIDontUseIt);
+ this.staticText = "Discard a card at random. If you do, {this} deals damage equal to that card's converted mana cost to each creature. You may repeat this process any number of times";
+ }
+
+ public KindleTheCarnageEffect(final KindleTheCarnageEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public KindleTheCarnageEffect copy() {
+ return new KindleTheCarnageEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ Cards hand = controller.getHand();
+ while (hand != null
+ && hand.size() > 0
+ && controller.isInGame()
+ && controller.chooseUse(Outcome.AIDontUseIt, "Discard a card randomly from your hand?", source, game)) {
+ Card discardedCard = controller.discardOne(true, source, game);
+ if (discardedCard != null) {
+ new DamageAllEffect(discardedCard.getConvertedManaCost(), new FilterCreaturePermanent()).apply(game, source);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/k/KormusBell.java b/Mage.Sets/src/mage/cards/k/KormusBell.java
index 241be3129ca..6eee0ad2e39 100644
--- a/Mage.Sets/src/mage/cards/k/KormusBell.java
+++ b/Mage.Sets/src/mage/cards/k/KormusBell.java
@@ -51,6 +51,8 @@ public class KormusBell extends CardImpl {
// All Swamps are 1/1 black creatures that are still lands.
ContinuousEffect effect = new BecomesCreatureAllEffect(new KormusBellToken(), "lands", new FilterPermanent(SubType.SWAMP, "Swamps"), Duration.WhileOnBattlefield);
effect.setDependedToType(DependencyType.BecomeSwamp);
+ effect.addDependedToType(DependencyType.BecomeIsland);
+ effect.addDependedToType(DependencyType.BecomeMountain);
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
}
@@ -71,7 +73,7 @@ class KormusBellToken extends Token {
cardType.add(CardType.CREATURE);
power = new MageInt(1);
toughness = new MageInt(1);
- color.setBlack(true); //Check Oracle, yes they are black
+ color.setBlack(true); // black creatures
}
}
diff --git a/Mage.Sets/src/mage/cards/m/MarchOfTheMachines.java b/Mage.Sets/src/mage/cards/m/MarchOfTheMachines.java
index 28d8fae826b..56ef8afecfb 100644
--- a/Mage.Sets/src/mage/cards/m/MarchOfTheMachines.java
+++ b/Mage.Sets/src/mage/cards/m/MarchOfTheMachines.java
@@ -49,8 +49,7 @@ import mage.game.permanent.Permanent;
public class MarchOfTheMachines extends CardImpl {
public MarchOfTheMachines(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{U}");
-
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}");
// Each noncreature artifact is an artifact creature with power and toughness each equal to its converted mana cost.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new MarchOfTheMachinesEffect()));
@@ -69,13 +68,15 @@ public class MarchOfTheMachines extends CardImpl {
class MarchOfTheMachinesEffect extends ContinuousEffectImpl {
private static final FilterArtifactPermanent filter = new FilterArtifactPermanent();
+
static {
filter.add(Predicates.not(new CardTypePredicate(CardType.CREATURE)));
}
+
public MarchOfTheMachinesEffect() {
super(Duration.WhileOnBattlefield, Outcome.BecomeCreature);
staticText = "Each noncreature artifact is an artifact creature with power and toughness each equal to its converted mana cost";
- dependendToType = DependencyType.ArtifactAddingRemoving;
+ dependendToTypes.add(DependencyType.ArtifactAddingRemoving);
}
public MarchOfTheMachinesEffect(final MarchOfTheMachinesEffect effect) {
@@ -93,8 +94,8 @@ class MarchOfTheMachinesEffect extends ContinuousEffectImpl {
case TypeChangingEffects_4:
if (sublayer == SubLayer.NA) {
affectedObjectList.clear();
- for(Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, game)){
- if(permanent != null){
+ for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, game)) {
+ if (permanent != null) {
affectedObjectList.add(new MageObjectReference(permanent, game));
permanent.addCardType(CardType.CREATURE);
}
@@ -106,7 +107,7 @@ class MarchOfTheMachinesEffect extends ContinuousEffectImpl {
if (sublayer == SubLayer.SetPT_7b) {
for (Iterator it = affectedObjectList.iterator(); it.hasNext();) {
Permanent permanent = it.next().getPermanent(game);
- if (permanent != null){
+ if (permanent != null) {
int manaCost = permanent.getConvertedManaCost();
permanent.getPower().setValue(manaCost);
permanent.getToughness().setValue(manaCost);
@@ -122,7 +123,6 @@ class MarchOfTheMachinesEffect extends ContinuousEffectImpl {
return false;
}
-
@Override
public boolean hasLayer(Layer layer) {
return layer == Layer.PTChangingEffects_7 || layer == Layer.TypeChangingEffects_4;
diff --git a/Mage.Sets/src/mage/cards/m/MobileGarrison.java b/Mage.Sets/src/mage/cards/m/MobileGarrison.java
index b58ccf2482f..d8f41d6fca1 100644
--- a/Mage.Sets/src/mage/cards/m/MobileGarrison.java
+++ b/Mage.Sets/src/mage/cards/m/MobileGarrison.java
@@ -27,7 +27,6 @@
*/
package mage.cards.m;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
@@ -36,12 +35,15 @@ import mage.abilities.keyword.CrewAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SubType;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.filter.predicate.permanent.AnotherPredicate;
import mage.target.common.TargetControlledPermanent;
+import java.util.UUID;
+
/**
*
* @author Styxo
@@ -61,7 +63,7 @@ public class MobileGarrison extends CardImpl {
public MobileGarrison(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
- this.subtype.add("Vehicle");
+ this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(3);
this.toughness = new MageInt(4);
diff --git a/Mage.Sets/src/mage/cards/m/MouthFeed.java b/Mage.Sets/src/mage/cards/m/MouthFeed.java
index 5231431900e..e316d403229 100644
--- a/Mage.Sets/src/mage/cards/m/MouthFeed.java
+++ b/Mage.Sets/src/mage/cards/m/MouthFeed.java
@@ -38,7 +38,7 @@ public class MouthFeed extends SplitCard {
// to
// Feed
// Draw a card for each creature you control with power 3 or greater
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility());
+ ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
Effect draw = new DrawCardSourceControllerEffect(new PermanentsOnBattlefieldCount(filterCreaturesYouControlPower3orGreater));
getRightHalfCard().getSpellAbility().addEffect(draw);
diff --git a/Mage.Sets/src/mage/cards/m/MystifyingMaze.java b/Mage.Sets/src/mage/cards/m/MystifyingMaze.java
index b6bd0b3ac4c..0d2a42ccae2 100644
--- a/Mage.Sets/src/mage/cards/m/MystifyingMaze.java
+++ b/Mage.Sets/src/mage/cards/m/MystifyingMaze.java
@@ -104,7 +104,7 @@ class MystifyingMazeEffect extends OneShotEffect {
if (permanent != null && sourceObject != null) {
if (permanent.moveToExile(source.getSourceId(), sourceObject.getIdName(), source.getSourceId(), game)) {
//create delayed triggered ability
- Effect effect = new ReturnToBattlefieldUnderOwnerControlTargetEffect();
+ Effect effect = new ReturnToBattlefieldUnderOwnerControlTargetEffect(true);
effect.setText("At the beginning of the next end step, return it to the battlefield tapped under its owner's control");
effect.setTargetPointer(new FixedTarget(source.getFirstTarget(), game));
game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect), source);
diff --git a/Mage.Sets/src/mage/cards/n/NemesisMask.java b/Mage.Sets/src/mage/cards/n/NemesisMask.java
index 84eeb2b10f2..19d8af7075c 100644
--- a/Mage.Sets/src/mage/cards/n/NemesisMask.java
+++ b/Mage.Sets/src/mage/cards/n/NemesisMask.java
@@ -28,16 +28,15 @@
package mage.cards.n;
import java.util.UUID;
-import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.GenericManaCost;
-import mage.abilities.effects.common.combat.MustBeBlockedByAllSourceEffect;
-import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
+import mage.abilities.effects.common.combat.MustBeBlockedByAllAttachedEffect;
import mage.abilities.keyword.EquipAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.AttachmentType;
import mage.constants.CardType;
+import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.Zone;
@@ -48,12 +47,12 @@ import mage.constants.Zone;
public class NemesisMask extends CardImpl {
public NemesisMask(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}");
+ super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
this.subtype.add("Equipment");
// All creatures able to block equipped creature do so.
- Ability gainAbility = new SimpleStaticAbility(Zone.BATTLEFIELD, new MustBeBlockedByAllSourceEffect());
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(gainAbility, AttachmentType.EQUIPMENT)));
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD,
+ new MustBeBlockedByAllAttachedEffect(Duration.WhileOnBattlefield, AttachmentType.EQUIPMENT)));
// Equip {3}
this.addAbility(new EquipAbility(Outcome.AddAbility, new GenericManaCost(3)));
diff --git a/Mage.Sets/src/mage/cards/n/NeverReturn.java b/Mage.Sets/src/mage/cards/n/NeverReturn.java
index 3fa5d9af014..fdcd525b9f0 100644
--- a/Mage.Sets/src/mage/cards/n/NeverReturn.java
+++ b/Mage.Sets/src/mage/cards/n/NeverReturn.java
@@ -57,7 +57,7 @@ public class NeverReturn extends SplitCard {
// Return
// Exile target card from a graveyard. Create a 2/2 black Zombie creature token.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility());
+ ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
getRightHalfCard().getSpellAbility().addEffect(new ExileTargetEffect());
getRightHalfCard().getSpellAbility().addTarget(new TargetCardInGraveyard());
getRightHalfCard().getSpellAbility().addEffect(new CreateTokenEffect(new ZombieToken()));
diff --git a/Mage.Sets/src/mage/cards/n/NobleBenefactor.java b/Mage.Sets/src/mage/cards/n/NobleBenefactor.java
new file mode 100644
index 00000000000..0892b9b3a49
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/n/NobleBenefactor.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.cards.n;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.DiesTriggeredAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.common.TargetCardInLibrary;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author ciaccona007
+ */
+public class NobleBenefactor extends CardImpl {
+
+ public NobleBenefactor(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}");
+
+ this.subtype.add("Human");
+ this.subtype.add("Cleric");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // When Noble Benefactor dies, each player may search his or her library for a card and put that card into his or her hand. Then each player who searched his or her library this way shuffles it.
+ this.addAbility(new DiesTriggeredAbility(new NobleBenefactorEffect()));
+ }
+
+ public NobleBenefactor(final NobleBenefactor card) {
+ super(card);
+ }
+
+ @Override
+ public NobleBenefactor copy() {
+ return new NobleBenefactor(this);
+ }
+}
+
+class NobleBenefactorEffect extends OneShotEffect {
+
+ public NobleBenefactorEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "each player may search his or her library for a card and put that card into his or her hand. Then each player who searched his or her library this way shuffles it";
+ }
+
+ public NobleBenefactorEffect(final NobleBenefactorEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public NobleBenefactorEffect copy() {
+ return new NobleBenefactorEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) {
+ Player player = game.getPlayer(playerId);
+ if (player != null) {
+ TargetCardInLibrary target = new TargetCardInLibrary();
+ if (player.chooseUse(Outcome.Benefit, "Search your library for a card to put into your hand?", source, game)) {
+ player.searchLibrary(target, game);
+ for (UUID cardId : target.getTargets()) {
+ Card card = player.getLibrary().getCard(cardId, game);
+ if (card != null) {
+ player.moveCards(card, Zone.HAND, source, game);
+ }
+ }
+ player.shuffleLibrary(source, game);
+ }
+ }
+ }
+ // prevent undo
+ controller.resetStoredBookmark(game);
+ return true;
+ }
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/o/OnwardVictory.java b/Mage.Sets/src/mage/cards/o/OnwardVictory.java
index 4b260fb53e1..51aa05a0aab 100644
--- a/Mage.Sets/src/mage/cards/o/OnwardVictory.java
+++ b/Mage.Sets/src/mage/cards/o/OnwardVictory.java
@@ -56,7 +56,7 @@ public class OnwardVictory extends SplitCard {
// to
// Victory
// Target creature gains double strike until end of turn.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility());
+ ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
Effect effect = new GainAbilityTargetEffect(DoubleStrikeAbility.getInstance(), Duration.EndOfTurn);
getRightHalfCard().getSpellAbility().addEffect(effect);
getRightHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent());
diff --git a/Mage.Sets/src/mage/cards/o/OvalchaseDragster.java b/Mage.Sets/src/mage/cards/o/OvalchaseDragster.java
index ba4fa006e84..cdaae482f9f 100644
--- a/Mage.Sets/src/mage/cards/o/OvalchaseDragster.java
+++ b/Mage.Sets/src/mage/cards/o/OvalchaseDragster.java
@@ -27,7 +27,6 @@
*/
package mage.cards.o;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.keyword.CrewAbility;
import mage.abilities.keyword.HasteAbility;
@@ -35,6 +34,9 @@ import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
/**
*
@@ -44,7 +46,7 @@ public class OvalchaseDragster extends CardImpl {
public OvalchaseDragster(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{4}");
- this.subtype.add("Vehicle");
+ this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(6);
this.toughness = new MageInt(1);
diff --git a/Mage.Sets/src/mage/cards/p/PackHunt.java b/Mage.Sets/src/mage/cards/p/PackHunt.java
new file mode 100644
index 00000000000..5425daadfb6
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/p/PackHunt.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are 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.p;
+
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.filter.FilterCard;
+import mage.filter.common.FilterPermanentCard;
+import mage.filter.predicate.mageobject.NamePredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.target.common.TargetCardInLibrary;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author ciaccona007
+ */
+public class PackHunt extends CardImpl {
+
+ public PackHunt(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{G}");
+
+ // Search your library for up to three cards with the same name as target creature, reveal them, and put them into your hand. Then shuffle your library.
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ this.getSpellAbility().addEffect(new PackHuntEffect());
+ }
+
+ public PackHunt(final PackHunt card) {
+ super(card);
+ }
+
+ @Override
+ public PackHunt copy() {
+ return new PackHunt(this);
+ }
+}
+class PackHuntEffect extends OneShotEffect {
+
+ public PackHuntEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "Search your library for up to three cards with the same name as target creature, reveal them, and put them into your hand. Then shuffle your library";
+ }
+
+ public PackHuntEffect(final PackHuntEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public PackHuntEffect copy() {
+ return new PackHuntEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent permanent = game.getPermanent(source.getFirstTarget());
+ FilterCard filter = new FilterPermanentCard();
+ filter.add(new NamePredicate(permanent.getName()));
+ return new SearchLibraryPutInHandEffect(new TargetCardInLibrary(0,3, filter), true).apply(game, source);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/p/ParadisePlume.java b/Mage.Sets/src/mage/cards/p/ParadisePlume.java
new file mode 100644
index 00000000000..b1a1de9ddae
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/p/ParadisePlume.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are 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.p;
+
+import java.util.UUID;
+import mage.Mana;
+import mage.ObjectColor;
+import mage.abilities.Ability;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.AsEntersBattlefieldAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.common.ChooseColorEffect;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.ManaEffect;
+import mage.abilities.mana.SimpleManaAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.ColoredManaSymbol;
+import mage.constants.Outcome;
+import mage.constants.Zone;
+import mage.filter.FilterSpell;
+import mage.filter.predicate.mageobject.ColorPredicate;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.stack.Spell;
+import mage.players.Player;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class ParadisePlume extends CardImpl {
+
+ public ParadisePlume(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}");
+
+ // As Paradise Plume enters the battlefield, choose a color.
+ this.addAbility(new AsEntersBattlefieldAbility(new ChooseColorEffect(Outcome.Detriment)));
+
+ // Whenever a player casts a spell of the chosen color, you may gain 1 life.
+ this.addAbility(new ParadisePlumeSpellCastTriggeredAbility());
+
+ // {tap}: Add one mana of the chosen color to your mana pool.
+ this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, new ParadisePlumeManaEffect(), new TapSourceCost()));
+
+ }
+
+ public ParadisePlume(final ParadisePlume card) {
+ super(card);
+ }
+
+ @Override
+ public ParadisePlume copy() {
+ return new ParadisePlume(this);
+ }
+}
+
+class ParadisePlumeManaEffect extends ManaEffect {
+
+ public ParadisePlumeManaEffect() {
+ super();
+ staticText = "Add one mana of the chosen color to your mana pool";
+ }
+
+ public ParadisePlumeManaEffect(final ParadisePlumeManaEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ if (player != null) {
+ player.getManaPool().addMana(getMana(game, source), game, source);
+ }
+ return true;
+ }
+
+ @Override
+ public Mana getMana(Game game, Ability source) {
+ ObjectColor color = (ObjectColor) game.getState().getValue(source.getSourceId() + "_color");
+ if (color != null) {
+ return new Mana(ColoredManaSymbol.lookup(color.toString().charAt(0)));
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public ParadisePlumeManaEffect copy() {
+ return new ParadisePlumeManaEffect(this);
+ }
+}
+
+class ParadisePlumeSpellCastTriggeredAbility extends TriggeredAbilityImpl {
+
+ public ParadisePlumeSpellCastTriggeredAbility() {
+ super(Zone.BATTLEFIELD, new GainLifeEffect(1), true);
+ }
+
+ public ParadisePlumeSpellCastTriggeredAbility(final ParadisePlumeSpellCastTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.SPELL_CAST;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ ObjectColor color = (ObjectColor) game.getState().getValue(getSourceId() + "_color");
+ if (color != null) {
+ FilterSpell filter = new FilterSpell();
+ filter.add(new ColorPredicate(color));
+ Spell spell = game.getStack().getSpell(event.getTargetId());
+ return (spell != null
+ && filter.match(spell, getSourceId(), getControllerId(), game));
+ }
+ return false;
+ }
+
+ @Override
+ public ParadisePlumeSpellCastTriggeredAbility copy() {
+ return new ParadisePlumeSpellCastTriggeredAbility(this);
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever a player casts a spell of the chosen color, " + super.getRule();
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/p/PeacewalkerColossus.java b/Mage.Sets/src/mage/cards/p/PeacewalkerColossus.java
index 76a6fcb812d..2026de28a92 100644
--- a/Mage.Sets/src/mage/cards/p/PeacewalkerColossus.java
+++ b/Mage.Sets/src/mage/cards/p/PeacewalkerColossus.java
@@ -27,7 +27,6 @@
*/
package mage.cards.p;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@@ -46,6 +45,8 @@ import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.filter.predicate.permanent.AnotherPredicate;
import mage.target.common.TargetControlledPermanent;
+import java.util.UUID;
+
/**
* @author JRHerlehy
*/
@@ -61,7 +62,7 @@ public class PeacewalkerColossus extends CardImpl {
public PeacewalkerColossus(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
- this.subtype.add("Vehicle");
+ this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(6);
this.toughness = new MageInt(6);
diff --git a/Mage.Sets/src/mage/cards/p/PentarchPaladin.java b/Mage.Sets/src/mage/cards/p/PentarchPaladin.java
new file mode 100644
index 00000000000..b85684c9258
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/p/PentarchPaladin.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are 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.p;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.ObjectColor;
+import mage.abilities.Ability;
+import mage.abilities.common.AsEntersBattlefieldAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.ChooseColorEffect;
+import mage.abilities.keyword.FlankingAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Zone;
+import mage.filter.FilterPermanent;
+import mage.filter.predicate.mageobject.ColorPredicate;
+import mage.game.Game;
+import mage.target.TargetPermanent;
+import mage.abilities.effects.common.DestroyTargetEffect;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class PentarchPaladin extends CardImpl {
+
+ private final UUID originalId;
+ FilterPermanent filter = new FilterPermanent("permanent of the chosen color.");
+
+ public PentarchPaladin(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{W}{W}");
+
+ this.subtype.add("Human");
+ this.subtype.add("Knight");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Flanking
+ this.addAbility(new FlankingAbility());
+
+ // As Pentarch Paladin enters the battlefield, choose a color.
+ this.addAbility(new AsEntersBattlefieldAbility(new ChooseColorEffect(Outcome.Detriment)));
+
+ // {W}{W}, {tap}: Destroy target permanent of the chosen color.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl("{W}{W}"));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetPermanent(filter));
+ originalId = ability.getOriginalId();
+ this.addAbility(ability);
+
+ }
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ ObjectColor color = (ObjectColor) game.getState().getValue(ability.getSourceId() + "_color");
+ if (ability.getOriginalId().equals(originalId)
+ && color != null) {
+ ability.getTargets().clear();
+ FilterPermanent filter = new FilterPermanent("permanent of the chosen color.");
+ filter.add(new ColorPredicate(color));
+ TargetPermanent target = new TargetPermanent(filter);
+ ability.addTarget(target);
+ }
+ }
+
+ public PentarchPaladin(final PentarchPaladin card) {
+ super(card);
+ this.originalId = card.originalId;
+ }
+
+ @Override
+ public PentarchPaladin copy() {
+ return new PentarchPaladin(this);
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/cards/p/PlaneswalkersMischief.java b/Mage.Sets/src/mage/cards/p/PlaneswalkersMischief.java
new file mode 100644
index 00000000000..c148859118d
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/p/PlaneswalkersMischief.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are 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.p;
+
+import java.util.List;
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.DelayedTriggeredAbility;
+import mage.abilities.common.ActivateAsSorceryActivatedAbility;
+import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.effects.AsThoughEffect;
+import mage.abilities.effects.AsThoughEffectImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.ReturnFromExileEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
+import mage.constants.AsThoughEffectType;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.stack.Spell;
+import mage.players.Player;
+import mage.target.common.TargetOpponent;
+import mage.target.targetpointer.FixedTarget;
+import mage.watchers.common.SpellsCastWatcher;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class PlaneswalkersMischief extends CardImpl {
+
+ public PlaneswalkersMischief(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}");
+
+ // {3}{U}: Target opponent reveals a card at random from his or her hand. If it's an instant or sorcery card, exile it. You may cast it without paying its mana cost for as long as it remains exiled. At the beginning of the next end step, if you haven't cast it, return it to its owner's hand. Activate this ability only any time you could cast a sorcery.
+ Ability ability = new ActivateAsSorceryActivatedAbility(Zone.BATTLEFIELD, new PlaneswalkersMischiefEffect(), new ManaCostsImpl("{3}{U}"));
+ ability.addTarget(new TargetOpponent());
+ this.addAbility(ability);
+
+ }
+
+ public PlaneswalkersMischief(final PlaneswalkersMischief card) {
+ super(card);
+ }
+
+ @Override
+ public PlaneswalkersMischief copy() {
+ return new PlaneswalkersMischief(this);
+ }
+}
+
+class PlaneswalkersMischiefEffect extends OneShotEffect {
+
+ public PlaneswalkersMischiefEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "Target opponent reveals a card at random from his or her hand. If it's an instant or sorcery card, exile it. You may cast it without paying its mana cost for as long as it remains exiled. At the beginning of the next end step, if you haven't cast it, return it to its owner's hand.";
+ }
+
+ public PlaneswalkersMischiefEffect(final PlaneswalkersMischiefEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public PlaneswalkersMischiefEffect copy() {
+ return new PlaneswalkersMischiefEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player opponent = game.getPlayer(source.getFirstTarget());
+ if (opponent != null
+ && opponent.getHand().size() > 0) {
+ Card revealedCard = opponent.getHand().getRandom(game);
+ Cards cards = new CardsImpl();
+ cards.add(revealedCard);
+ opponent.revealCards("Planeswalker's Mischief Reveal", cards, game);
+ if (revealedCard.isInstant()
+ || revealedCard.isSorcery()) {
+ opponent.moveCardToExileWithInfo(revealedCard, source.getSourceId(), "Planeswalker's Mischief", source.getSourceId(), game, Zone.HAND, true);
+ AsThoughEffect effect = new PlaneswalkersMischiefCastFromExileEffect();
+ effect.setTargetPointer(new FixedTarget(revealedCard.getId()));
+ game.addEffect(effect, source);
+ OneShotEffect effect2 = new ReturnFromExileEffect(source.getSourceId(), Zone.HAND);
+ Condition condition = new SpellWasNotCastCondition(source.getSourceId(), revealedCard.getId());
+ ConditionalOneShotEffect effect3 = new ConditionalOneShotEffect(effect2, condition, "if you haven't cast it, return it to its owner's hand.");
+ DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(effect3);
+ game.addDelayedTriggeredAbility(delayedAbility, source);
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
+class PlaneswalkersMischiefCastFromExileEffect extends AsThoughEffectImpl {
+
+ PlaneswalkersMischiefCastFromExileEffect() {
+ super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.Custom, Outcome.Benefit);
+ staticText = "You may cast that card without paying its mana cost as long as it remains exiled";
+ }
+
+ PlaneswalkersMischiefCastFromExileEffect(final PlaneswalkersMischiefCastFromExileEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return true;
+ }
+
+ @Override
+ public PlaneswalkersMischiefCastFromExileEffect copy() {
+ return new PlaneswalkersMischiefCastFromExileEffect(this);
+ }
+
+ @Override
+ public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
+ if (targetPointer.getTargets(game, source).contains(objectId)
+ && game.getState().getZone(objectId) == Zone.EXILED) {
+ Player player = game.getPlayer(source.getControllerId());
+ Card card = game.getCard(objectId);
+ if (player != null
+ && card != null) {
+ player.setCastSourceIdWithAlternateMana(objectId, null, card.getSpellAbility().getCosts());
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
+class SpellWasNotCastCondition implements Condition {
+
+ protected UUID exileId;
+ protected UUID cardId;
+
+ public SpellWasNotCastCondition(UUID exileId, UUID cardId) {
+ this.exileId = exileId;
+ this.cardId = cardId;
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ if (!game.getExile().getExileZone(exileId).contains(cardId)) {
+ return false;
+ }
+ SpellsCastWatcher watcher = (SpellsCastWatcher) game.getState().getWatchers().get(SpellsCastWatcher.class.getSimpleName(), source.getSourceId());
+ if (watcher != null) {
+ List spells = watcher.getSpellsCastThisTurn(source.getControllerId());
+ if (spells != null) {
+ for (Spell spell : spells) {
+ if (spell.getSourceId() == cardId) {
+ return false;
+ }
+ }
+ }
+ }
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/p/PrepareFight.java b/Mage.Sets/src/mage/cards/p/PrepareFight.java
index d6bc3413405..07fd0a80951 100644
--- a/Mage.Sets/src/mage/cards/p/PrepareFight.java
+++ b/Mage.Sets/src/mage/cards/p/PrepareFight.java
@@ -75,7 +75,7 @@ public class PrepareFight extends SplitCard {
// to
// Fight
// Target creature you control fights target creature you don't control.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility());
+ ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
getRightHalfCard().getSpellAbility().addEffect(new FightTargetsEffect());
getRightHalfCard().getSpellAbility().addTarget(new TargetControlledCreaturePermanent());
Target target = new TargetCreaturePermanent(filter);
diff --git a/Mage.Sets/src/mage/cards/q/QuicksilverFountain.java b/Mage.Sets/src/mage/cards/q/QuicksilverFountain.java
index 4c2a1f6b8e6..f0801b2df50 100644
--- a/Mage.Sets/src/mage/cards/q/QuicksilverFountain.java
+++ b/Mage.Sets/src/mage/cards/q/QuicksilverFountain.java
@@ -33,6 +33,7 @@ import mage.abilities.common.BeginningOfEndStepTriggeredAbility;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect;
@@ -104,7 +105,9 @@ class QuicksilverFountainEffect extends OneShotEffect {
if (player.choose(Outcome.Neutral, targetNonIslandLand, source.getId(), game)) {
Permanent landChosen = game.getPermanent(targetNonIslandLand.getFirstTarget());
landChosen.addCounters(CounterType.FLOOD.createInstance(), source, game);
- ConditionalContinuousEffect effect = new ConditionalContinuousEffect(new BecomesBasicLandTargetEffect(Duration.OneUse, "Island"), new LandHasFloodCounterCondition(this), staticText);
+ ContinuousEffect becomesBasicLandTargetEffect = new BecomesBasicLandTargetEffect(Duration.OneUse, "Island");
+ becomesBasicLandTargetEffect.addDependencyType(DependencyType.BecomeIsland);
+ ConditionalContinuousEffect effect = new ConditionalContinuousEffect(becomesBasicLandTargetEffect, new LandHasFloodCounterCondition(this), staticText);
this.setTargetPointer(new FixedTarget(landChosen, game));
effect.setTargetPointer(new FixedTarget(landChosen, game));
game.addEffect(effect, source);
@@ -160,7 +163,7 @@ class AllLandsAreSubtypeCondition implements Condition {
int landCount = game.getBattlefield().getAllActivePermanents(CardType.LAND).size();
return game.getBattlefield().getAllActivePermanents(filterLand, game).size() == landCount;
}
-
+
@Override
public String toString() {
return "if all lands on the battlefield are " + subtype + "s";
@@ -178,7 +181,7 @@ class LandHasFloodCounterCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(effect.getTargetPointer().getFirst(game, source));
- return permanent != null
- && permanent.getCounters(game).getCount(CounterType.FLOOD) > 0;
+ return permanent != null
+ && permanent.getCounters(game).getCount(CounterType.FLOOD) > 0;
}
}
diff --git a/Mage.Sets/src/mage/cards/r/RagsRiches.java b/Mage.Sets/src/mage/cards/r/RagsRiches.java
index 2e801390330..b59cc838c87 100644
--- a/Mage.Sets/src/mage/cards/r/RagsRiches.java
+++ b/Mage.Sets/src/mage/cards/r/RagsRiches.java
@@ -32,7 +32,7 @@ public class RagsRiches extends SplitCard {
// to
// Riches
// Each opponent chooses a creature he or she controls. You gain control of each of those creatures.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility());
+ ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
getRightHalfCard().getSpellAbility().addEffect(new RichesEffect());
}
diff --git a/Mage.Sets/src/mage/cards/r/Reclamation.java b/Mage.Sets/src/mage/cards/r/Reclamation.java
new file mode 100644
index 00000000000..8e64a2fcd86
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/r/Reclamation.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are 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.r;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.effects.PayCostToAttackBlockEffectImpl;
+import mage.abilities.effects.PayCostToAttackBlockEffectImpl.RestrictType;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledLandPermanent;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+import mage.target.common.TargetControlledPermanent;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class Reclamation extends CardImpl {
+
+ public Reclamation(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}{W}");
+
+
+ // Black creatures can't attack unless their controller sacrifices a land for each black creature he or she controls that's attacking.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ReclamationCostToAttackBlockEffect()));
+
+ }
+
+ public Reclamation(final Reclamation card) {
+ super(card);
+ }
+
+ @Override
+ public Reclamation copy() {
+ return new Reclamation(this);
+ }
+}
+
+class ReclamationCostToAttackBlockEffect extends PayCostToAttackBlockEffectImpl {
+
+ ReclamationCostToAttackBlockEffect() {
+ super(Duration.WhileOnBattlefield, Outcome.Detriment, RestrictType.ATTACK,
+ new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledLandPermanent("a land"))));
+ staticText = "Black creatures can't attack unless their controller sacrifices a land (This cost is paid as attackers are declared.)";
+ }
+
+ ReclamationCostToAttackBlockEffect(ReclamationCostToAttackBlockEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ Permanent permanent = game.getPermanent(event.getSourceId());
+ return (permanent != null
+ && permanent.isCreature()
+ && permanent.getColor(game).isBlack());
+ }
+
+ @Override
+ public ReclamationCostToAttackBlockEffect copy() {
+ return new ReclamationCostToAttackBlockEffect(this);
+ }
+
+}
diff --git a/Mage.Sets/src/mage/cards/r/ReduceRubble.java b/Mage.Sets/src/mage/cards/r/ReduceRubble.java
index 59541ce56c4..f415afa07ea 100644
--- a/Mage.Sets/src/mage/cards/r/ReduceRubble.java
+++ b/Mage.Sets/src/mage/cards/r/ReduceRubble.java
@@ -58,7 +58,7 @@ public class ReduceRubble extends SplitCard {
// Rubble
// Up to three target lands don't untap during their controller's next untap step.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility());
+ ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
Effect effect = new DontUntapInControllersNextUntapStepTargetEffect();
effect.setText("Up to three target lands don't untap during their controller's next untap step");
getRightHalfCard().getSpellAbility().addEffect(effect);
diff --git a/Mage.Sets/src/mage/cards/r/RenegadeFreighter.java b/Mage.Sets/src/mage/cards/r/RenegadeFreighter.java
index 028fa67e505..2e865c72bd0 100644
--- a/Mage.Sets/src/mage/cards/r/RenegadeFreighter.java
+++ b/Mage.Sets/src/mage/cards/r/RenegadeFreighter.java
@@ -27,7 +27,6 @@
*/
package mage.cards.r;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.TriggeredAbility;
import mage.abilities.common.AttacksTriggeredAbility;
@@ -40,6 +39,9 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
+import mage.constants.SubType;
+
+import java.util.UUID;
/**
*
@@ -49,7 +51,7 @@ public class RenegadeFreighter extends CardImpl {
public RenegadeFreighter(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{3}");
- this.subtype.add("Vehicle");
+ this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(4);
this.toughness = new MageInt(3);
diff --git a/Mage.Sets/src/mage/cards/r/RimescaleDragon.java b/Mage.Sets/src/mage/cards/r/RimescaleDragon.java
new file mode 100644
index 00000000000..2d74abe9553
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/r/RimescaleDragon.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are 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.r;
+
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DontUntapInControllersUntapStepAllEffect;
+import mage.abilities.effects.common.TapTargetEffect;
+import mage.abilities.effects.common.counter.AddCountersTargetEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.*;
+import mage.counters.CounterType;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.CounterPredicate;
+import mage.target.common.TargetCreaturePermanent;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author JRHerlehy
+ */
+public class RimescaleDragon extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures with ice counters");
+
+ static {
+ filter.add(new CounterPredicate(CounterType.ICE));
+ }
+
+ public RimescaleDragon(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{R}{R}");
+
+ this.addSuperType(SuperType.SNOW);
+ this.subtype.add(SubType.DRAGON);
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(5);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // {2}{snow}: Tap target creature and put an ice counter on it.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
+ new TapTargetEffect("target creature"),
+ new ManaCostsImpl("{2}{S}")
+ );
+ Effect effect = new AddCountersTargetEffect(CounterType.ICE.createInstance());
+ effect.setText("and put an ice counter on it");
+ ability.addEffect(effect);
+ ability.addTarget(new TargetCreaturePermanent(1));
+ this.addAbility(ability);
+
+ // Creatures with ice counters on them don't untap during their controllers' untap steps.
+ effect = new DontUntapInControllersUntapStepAllEffect(Duration.WhileOnBattlefield, TargetController.ANY, filter);
+ effect.setText("Creatures with ice counters on them don't untap during their controllers' untap steps");
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
+ }
+
+ public RimescaleDragon(final RimescaleDragon card) {
+ super(card);
+ }
+
+ @Override
+ public RimescaleDragon copy() {
+ return new RimescaleDragon(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/r/RitesOfRefusal.java b/Mage.Sets/src/mage/cards/r/RitesOfRefusal.java
index 65e5727de3f..ad84bcbc779 100644
--- a/Mage.Sets/src/mage/cards/r/RitesOfRefusal.java
+++ b/Mage.Sets/src/mage/cards/r/RitesOfRefusal.java
@@ -1,108 +1,108 @@
-/*
- * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are 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.r;
-
-import java.util.UUID;
-import mage.abilities.Ability;
-import mage.abilities.costs.mana.GenericManaCost;
-import mage.abilities.effects.OneShotEffect;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.cards.Cards;
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.game.Game;
-import mage.game.stack.Spell;
-import mage.players.Player;
-import mage.target.TargetSpell;
-
-/**
- *
- * @author jeffwadsworth
- */
-public class RitesOfRefusal extends CardImpl {
-
- public RitesOfRefusal(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}");
-
- // Discard any number of cards. Counter target spell unless its controller pays {3} for each card discarded this way.
- this.getSpellAbility().addEffect(new RitesOfRefusalEffect());
- this.getSpellAbility().addTarget(new TargetSpell());
-
- }
-
- public RitesOfRefusal(final RitesOfRefusal card) {
- super(card);
- }
-
- @Override
- public RitesOfRefusal copy() {
- return new RitesOfRefusal(this);
- }
-}
-
-class RitesOfRefusalEffect extends OneShotEffect {
-
- RitesOfRefusalEffect() {
- super(Outcome.AIDontUseIt);
- this.staticText = "Discard any number of cards. Counter target spell unless its controller pays {3} for each card discarded this way";
- }
-
- RitesOfRefusalEffect(final RitesOfRefusalEffect effect) {
- super(effect);
- }
-
- @Override
- public RitesOfRefusalEffect copy() {
- return new RitesOfRefusalEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player controller = game.getPlayer(source.getControllerId());
- Spell targetSpell = game.getStack().getSpell(source.getFirstTarget());
- if (targetSpell != null) {
- Player controllerOfTargetedSpell = game.getPlayer(targetSpell.getControllerId());
- if (controller != null
- && controllerOfTargetedSpell != null) {
- int numToDiscard = controller.getAmount(0, controller.getHand().size(), "How many cards do you want to discard?", game);
- Cards discardedCards = controller.discard(numToDiscard, false, source, game);
- int actualNumberDiscarded = discardedCards.size();
- GenericManaCost cost = new GenericManaCost(actualNumberDiscarded * 3);
- if (controllerOfTargetedSpell.chooseUse(Outcome.AIDontUseIt, "Do you want to pay " + cost.convertedManaCost() + " to prevent " + targetSpell.getName() + " from gettting countered?", source, game)
- && cost.pay(source, game, source.getSourceId(), controllerOfTargetedSpell.getId(), false)) {
- return true;
- } else {
- targetSpell.counter(source.getSourceId(), 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.cards.r;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.cards.Cards;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.game.Game;
+import mage.game.stack.Spell;
+import mage.players.Player;
+import mage.target.TargetSpell;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class RitesOfRefusal extends CardImpl {
+
+ public RitesOfRefusal(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}");
+
+ // Discard any number of cards. Counter target spell unless its controller pays {3} for each card discarded this way.
+ this.getSpellAbility().addEffect(new RitesOfRefusalEffect());
+ this.getSpellAbility().addTarget(new TargetSpell());
+
+ }
+
+ public RitesOfRefusal(final RitesOfRefusal card) {
+ super(card);
+ }
+
+ @Override
+ public RitesOfRefusal copy() {
+ return new RitesOfRefusal(this);
+ }
+}
+
+class RitesOfRefusalEffect extends OneShotEffect {
+
+ RitesOfRefusalEffect() {
+ super(Outcome.AIDontUseIt);
+ this.staticText = "Discard any number of cards. Counter target spell unless its controller pays {3} for each card discarded this way";
+ }
+
+ RitesOfRefusalEffect(final RitesOfRefusalEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public RitesOfRefusalEffect copy() {
+ return new RitesOfRefusalEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Spell targetSpell = game.getStack().getSpell(source.getFirstTarget());
+ if (targetSpell != null) {
+ Player controllerOfTargetedSpell = game.getPlayer(targetSpell.getControllerId());
+ if (controller != null
+ && controllerOfTargetedSpell != null) {
+ int numToDiscard = controller.getAmount(0, controller.getHand().size(), "How many cards do you want to discard?", game);
+ Cards discardedCards = controller.discard(numToDiscard, false, source, game);
+ int actualNumberDiscarded = discardedCards.size();
+ GenericManaCost cost = new GenericManaCost(actualNumberDiscarded * 3);
+ if (controllerOfTargetedSpell.chooseUse(Outcome.AIDontUseIt, "Do you want to pay " + cost.convertedManaCost() + " to prevent " + targetSpell.getName() + " from gettting countered?", source, game)
+ && cost.pay(source, game, source.getSourceId(), controllerOfTargetedSpell.getId(), false)) {
+ return true;
+ } else {
+ targetSpell.counter(source.getSourceId(), game);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/s/Seedtime.java b/Mage.Sets/src/mage/cards/s/Seedtime.java
index 992ba5f2cab..434ab9b3ddb 100644
--- a/Mage.Sets/src/mage/cards/s/Seedtime.java
+++ b/Mage.Sets/src/mage/cards/s/Seedtime.java
@@ -1,100 +1,100 @@
-/*
- * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are 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.s;
-
-import java.util.List;
-import java.util.UUID;
-import mage.abilities.Ability;
-import mage.abilities.common.CastOnlyDuringPhaseStepSourceAbility;
-import mage.abilities.condition.Condition;
-import mage.abilities.condition.common.MyTurnCondition;
-import mage.abilities.decorator.ConditionalOneShotEffect;
-import mage.abilities.effects.common.turn.AddExtraTurnControllerEffect;
-import mage.cards.CardImpl;
-import mage.cards.CardSetInfo;
-import mage.constants.CardType;
-import mage.game.Game;
-import mage.game.stack.Spell;
-import mage.watchers.common.SpellsCastWatcher;
-
-/**
- *
- * @author jeffwadsworth
- */
-public class Seedtime extends CardImpl {
-
- private final static String rule = "Cast {this} only during your turn.";
- private final static String rule2 = "Take an extra turn after this one if an opponent cast a blue spell this turn.";
-
- public Seedtime(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}");
-
- // Cast Seedtime only during your turn.
- this.addAbility(new CastOnlyDuringPhaseStepSourceAbility(null, null, MyTurnCondition.instance, rule));
-
- // Take an extra turn after this one if an opponent cast a blue spell this turn.
- this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new AddExtraTurnControllerEffect(), OpponentCastBlueSpellThisTurnCondition.instance, rule2));
- this.getSpellAbility().addWatcher(new SpellsCastWatcher());
-
- }
-
- public Seedtime(final Seedtime card) {
- super(card);
- }
-
- @Override
- public Seedtime copy() {
- return new Seedtime(this);
- }
-}
-
-enum OpponentCastBlueSpellThisTurnCondition implements Condition {
-
- instance;
-
- @Override
- public boolean apply(Game game, Ability source) {
- SpellsCastWatcher watcher = (SpellsCastWatcher) game.getState().getWatchers().get(SpellsCastWatcher.class.getSimpleName());
- if (watcher != null) {
- for (UUID opponentId : game.getOpponents(source.getControllerId())) {
- if (opponentId != null) {
- List spells = watcher.getSpellsCastThisTurn(opponentId);
- if (spells != null) {
- for (Spell spell : spells) {
- if (spell != null
- && spell.getColor(game).isBlue()) {
- return true;
- }
- }
- }
- }
- }
- }
- return false;
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.cards.s;
+
+import java.util.List;
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.CastOnlyDuringPhaseStepSourceAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.condition.common.MyTurnCondition;
+import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.effects.common.turn.AddExtraTurnControllerEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.game.Game;
+import mage.game.stack.Spell;
+import mage.watchers.common.SpellsCastWatcher;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class Seedtime extends CardImpl {
+
+ private final static String rule = "Cast {this} only during your turn.";
+ private final static String rule2 = "Take an extra turn after this one if an opponent cast a blue spell this turn.";
+
+ public Seedtime(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}");
+
+ // Cast Seedtime only during your turn.
+ this.addAbility(new CastOnlyDuringPhaseStepSourceAbility(null, null, MyTurnCondition.instance, rule));
+
+ // Take an extra turn after this one if an opponent cast a blue spell this turn.
+ this.getSpellAbility().addEffect(new ConditionalOneShotEffect(new AddExtraTurnControllerEffect(), OpponentCastBlueSpellThisTurnCondition.instance, rule2));
+ this.getSpellAbility().addWatcher(new SpellsCastWatcher());
+
+ }
+
+ public Seedtime(final Seedtime card) {
+ super(card);
+ }
+
+ @Override
+ public Seedtime copy() {
+ return new Seedtime(this);
+ }
+}
+
+enum OpponentCastBlueSpellThisTurnCondition implements Condition {
+
+ instance;
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ SpellsCastWatcher watcher = (SpellsCastWatcher) game.getState().getWatchers().get(SpellsCastWatcher.class.getSimpleName());
+ if (watcher != null) {
+ for (UUID opponentId : game.getOpponents(source.getControllerId())) {
+ if (opponentId != null) {
+ List spells = watcher.getSpellsCastThisTurn(opponentId);
+ if (spells != null) {
+ for (Spell spell : spells) {
+ if (spell != null
+ && spell.getColor(game).isBlue()) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/s/SkySkiff.java b/Mage.Sets/src/mage/cards/s/SkySkiff.java
index b06feb3b3fe..9310361a9e7 100644
--- a/Mage.Sets/src/mage/cards/s/SkySkiff.java
+++ b/Mage.Sets/src/mage/cards/s/SkySkiff.java
@@ -27,13 +27,15 @@
*/
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.keyword.CrewAbility;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
/**
*
@@ -43,7 +45,7 @@ public class SkySkiff extends CardImpl {
public SkySkiff(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}");
- this.subtype.add("Vehicle");
+ this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(2);
this.toughness = new MageInt(3);
diff --git a/Mage.Sets/src/mage/cards/s/SkysovereignConsulFlagship.java b/Mage.Sets/src/mage/cards/s/SkysovereignConsulFlagship.java
index 1a00f40e9e9..162e6326f84 100644
--- a/Mage.Sets/src/mage/cards/s/SkysovereignConsulFlagship.java
+++ b/Mage.Sets/src/mage/cards/s/SkysovereignConsulFlagship.java
@@ -27,7 +27,6 @@
*/
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
@@ -37,12 +36,15 @@ import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SubType;
import mage.constants.SuperType;
import mage.constants.TargetController;
import mage.filter.common.FilterCreatureOrPlaneswalkerPermanent;
import mage.filter.predicate.permanent.ControllerPredicate;
import mage.target.common.TargetCreatureOrPlaneswalker;
+import java.util.UUID;
+
/**
* @author emerald000
*/
@@ -57,7 +59,7 @@ public class SkysovereignConsulFlagship extends CardImpl {
public SkysovereignConsulFlagship(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{5}");
addSuperType(SuperType.LEGENDARY);
- this.subtype.add("Vehicle");
+ this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(6);
this.toughness = new MageInt(5);
diff --git a/Mage.Sets/src/mage/cards/s/SmugglersCopter.java b/Mage.Sets/src/mage/cards/s/SmugglersCopter.java
index e2f8029a2c0..514748b1fc8 100644
--- a/Mage.Sets/src/mage/cards/s/SmugglersCopter.java
+++ b/Mage.Sets/src/mage/cards/s/SmugglersCopter.java
@@ -27,7 +27,6 @@
*/
package mage.cards.s;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.AttacksOrBlocksTriggeredAbility;
import mage.abilities.effects.Effect;
@@ -37,6 +36,9 @@ import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
/**
*
@@ -46,7 +48,7 @@ public class SmugglersCopter extends CardImpl {
public SmugglersCopter(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}");
- this.subtype.add("Vehicle");
+ this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
diff --git a/Mage.Sets/src/mage/cards/s/SongOfSerenity.java b/Mage.Sets/src/mage/cards/s/SongOfSerenity.java
new file mode 100644
index 00000000000..a2da2f7b823
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/s/SongOfSerenity.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are 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.s;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.RestrictionEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.EnchantedPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class SongOfSerenity extends CardImpl {
+
+ public SongOfSerenity(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}");
+
+ // Creatures that are enchanted can't attack or block.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SongOfSerenityRestrictionEffect()));
+
+ }
+
+ public SongOfSerenity(final SongOfSerenity card) {
+ super(card);
+ }
+
+ @Override
+ public SongOfSerenity copy() {
+ return new SongOfSerenity(this);
+ }
+}
+
+class SongOfSerenityRestrictionEffect extends RestrictionEffect {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
+
+ static {
+ filter.add(new EnchantedPredicate());
+ }
+
+ public SongOfSerenityRestrictionEffect() {
+ super(Duration.WhileOnBattlefield);
+ staticText = "Creatures that are enchanted can't attack or block";
+ }
+
+ public SongOfSerenityRestrictionEffect(final SongOfSerenityRestrictionEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public SongOfSerenityRestrictionEffect copy() {
+ return new SongOfSerenityRestrictionEffect(this);
+ }
+
+ @Override
+ public boolean canAttack(Game game) {
+ return false;
+ }
+
+ @Override
+ public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) {
+ return false;
+ }
+
+ @Override
+ public boolean applies(Permanent permanent, Ability source, Game game) {
+ return filter.match(permanent, source.getSourceId(), source.getControllerId(), game);
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/s/SpringMind.java b/Mage.Sets/src/mage/cards/s/SpringMind.java
index 7b14bbb9bb0..52512b3167e 100644
--- a/Mage.Sets/src/mage/cards/s/SpringMind.java
+++ b/Mage.Sets/src/mage/cards/s/SpringMind.java
@@ -27,6 +27,7 @@
*/
package mage.cards.s;
+import java.util.UUID;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
import mage.abilities.keyword.AftermathAbility;
@@ -38,8 +39,6 @@ import mage.constants.SpellAbilityType;
import mage.filter.StaticFilters;
import mage.target.common.TargetCardInLibrary;
-import java.util.UUID;
-
/**
*
* @author fireshoes
@@ -56,7 +55,7 @@ public class SpringMind extends SplitCard {
// Mind
// Aftermath
// Draw two cards.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility());
+ ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
getRightHalfCard().getSpellAbility().addEffect(new DrawCardSourceControllerEffect(2));
}
diff --git a/Mage.Sets/src/mage/cards/s/StartFinish.java b/Mage.Sets/src/mage/cards/s/StartFinish.java
index 1f467425ca3..90f937e52c5 100644
--- a/Mage.Sets/src/mage/cards/s/StartFinish.java
+++ b/Mage.Sets/src/mage/cards/s/StartFinish.java
@@ -62,7 +62,7 @@ public class StartFinish extends SplitCard {
// Finish
// Aftermath
// As an additional cost to cast Finish, sacrifice a creature. Destroy target creature.
- ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility());
+ ((CardImpl) (getRightHalfCard())).addAbility(new AftermathAbility().setRuleAtTheTop(true));
getRightHalfCard().getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(new FilterControlledCreaturePermanent("a creature"))));
getRightHalfCard().getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature (to destoy)")));
getRightHalfCard().getSpellAbility().addEffect(new DestroyTargetEffect("Destroy target creature"));
diff --git a/Mage.Sets/src/mage/cards/u/UntetheredExpress.java b/Mage.Sets/src/mage/cards/u/UntetheredExpress.java
index fa80c867da4..f931ad24228 100644
--- a/Mage.Sets/src/mage/cards/u/UntetheredExpress.java
+++ b/Mage.Sets/src/mage/cards/u/UntetheredExpress.java
@@ -27,7 +27,6 @@
*/
package mage.cards.u;
-import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
@@ -36,8 +35,11 @@ import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SubType;
import mage.counters.CounterType;
+import java.util.UUID;
+
/**
* @author JRHerlehy
*/
@@ -46,7 +48,7 @@ public class UntetheredExpress extends CardImpl {
public UntetheredExpress(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}");
- this.subtype.add("Vehicle");
+ this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
diff --git a/Mage.Sets/src/mage/cards/u/UrzasFactory.java b/Mage.Sets/src/mage/cards/u/UrzasFactory.java
index c0e88b5dbfa..7c280658daf 100644
--- a/Mage.Sets/src/mage/cards/u/UrzasFactory.java
+++ b/Mage.Sets/src/mage/cards/u/UrzasFactory.java
@@ -27,7 +27,6 @@
*/
package mage.cards.u;
-import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
@@ -37,9 +36,12 @@ import mage.abilities.mana.ColorlessManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.permanent.token.AssemblyWorkerToken;
+import java.util.UUID;
+
/**
*
* @author Loki
@@ -48,7 +50,7 @@ public class UrzasFactory extends CardImpl {
public UrzasFactory(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
- this.subtype.add("Urza's");
+ this.subtype.add(SubType.URZAS);
// {tap}: Add {C} to your mana pool.
this.addAbility(new ColorlessManaAbility());
diff --git a/Mage.Sets/src/mage/cards/u/UrzasMine.java b/Mage.Sets/src/mage/cards/u/UrzasMine.java
index 4e0922734ae..839a1122233 100644
--- a/Mage.Sets/src/mage/cards/u/UrzasMine.java
+++ b/Mage.Sets/src/mage/cards/u/UrzasMine.java
@@ -27,7 +27,6 @@
*/
package mage.cards.u;
-import java.util.UUID;
import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.dynamicvalue.common.UrzaTerrainValue;
@@ -35,6 +34,9 @@ import mage.abilities.mana.DynamicManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
/**
*
@@ -43,8 +45,7 @@ import mage.constants.CardType;
public class UrzasMine extends CardImpl {
public UrzasMine(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.LAND},"");
- this.subtype.add("Urza's");
- this.subtype.add("Mine");
+ this.subtype.add(SubType.URZAS, SubType.MINE);
// {T}: Add {C} to your mana pool. If you control an Urza's Power-Plant and an Urza's Tower, add {C}{C} to your mana pool instead.
Ability urzaManaAbility = new DynamicManaAbility(Mana.ColorlessMana(1), new UrzaTerrainValue(2),
diff --git a/Mage.Sets/src/mage/cards/u/UrzasPowerPlant.java b/Mage.Sets/src/mage/cards/u/UrzasPowerPlant.java
index 8f00d813cc7..950420f4bc4 100644
--- a/Mage.Sets/src/mage/cards/u/UrzasPowerPlant.java
+++ b/Mage.Sets/src/mage/cards/u/UrzasPowerPlant.java
@@ -27,7 +27,6 @@
*/
package mage.cards.u;
-import java.util.UUID;
import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.dynamicvalue.common.UrzaTerrainValue;
@@ -35,6 +34,9 @@ import mage.abilities.mana.DynamicManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
/**
*
@@ -43,8 +45,7 @@ import mage.constants.CardType;
public class UrzasPowerPlant extends CardImpl {
public UrzasPowerPlant(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.LAND},"");
- this.subtype.add("Urza's");
- this.subtype.add("Power-Plant");
+ this.subtype.add(SubType.URZAS, SubType.POWER_PLANT);
// {T}: Add {C} to your mana pool. If you control an Urza's Mine and an Urza's Tower, add {C}{C} to your mana pool instead.
Ability urzaManaAbility = new DynamicManaAbility(Mana.ColorlessMana(1), new UrzaTerrainValue(2),
diff --git a/Mage.Sets/src/mage/cards/u/UrzasTower.java b/Mage.Sets/src/mage/cards/u/UrzasTower.java
index d71f1445895..c1a45965566 100644
--- a/Mage.Sets/src/mage/cards/u/UrzasTower.java
+++ b/Mage.Sets/src/mage/cards/u/UrzasTower.java
@@ -27,7 +27,6 @@
*/
package mage.cards.u;
-import java.util.UUID;
import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.dynamicvalue.common.UrzaTerrainValue;
@@ -35,6 +34,9 @@ import mage.abilities.mana.DynamicManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
+import mage.constants.SubType;
+
+import java.util.UUID;
/**
*
@@ -43,8 +45,7 @@ import mage.constants.CardType;
public class UrzasTower extends CardImpl {
public UrzasTower(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.LAND},"");
- this.subtype.add("Urza's");
- this.subtype.add("Tower");
+ this.subtype.add(SubType.URZAS, SubType.TOWER);
// {T}: Add {C} to your mana pool. If you control an Urza's Mine and an Urza's Power-Plant, add {C}{C}{C} to your mana pool instead.
Ability urzaManaAbility = new DynamicManaAbility(Mana.ColorlessMana(1), new UrzaTerrainValue(3),
diff --git a/Mage.Sets/src/mage/cards/v/VeteranExplorer.java b/Mage.Sets/src/mage/cards/v/VeteranExplorer.java
index 4ea844a8ce8..b6f30d6be42 100644
--- a/Mage.Sets/src/mage/cards/v/VeteranExplorer.java
+++ b/Mage.Sets/src/mage/cards/v/VeteranExplorer.java
@@ -41,7 +41,6 @@ import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.StaticFilters;
-import mage.filter.common.FilterBasicLandCard;
import mage.game.Game;
import mage.players.Player;
import mage.target.common.TargetCardInLibrary;
@@ -53,7 +52,7 @@ import mage.target.common.TargetCardInLibrary;
public class VeteranExplorer extends CardImpl {
public VeteranExplorer(UUID ownerId, CardSetInfo setInfo) {
- super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{G}");
+ super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}");
this.subtype.add("Human");
this.subtype.add("Soldier");
this.subtype.add("Scout");
@@ -74,6 +73,7 @@ public class VeteranExplorer extends CardImpl {
return new VeteranExplorer(this);
}
}
+
class VeteranExplorerEffect extends OneShotEffect {
public VeteranExplorerEffect() {
@@ -96,7 +96,7 @@ class VeteranExplorerEffect extends OneShotEffect {
if (controller != null) {
List usingPlayers = new ArrayList<>();
this.chooseAndSearchLibrary(usingPlayers, controller, source, game);
- for (UUID playerId: game.getState().getPlayersInRange(controller.getId(), game)) {
+ for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) {
if (!playerId.equals(controller.getId())) {
Player player = game.getPlayer(playerId);
if (player != null) {
@@ -104,7 +104,7 @@ class VeteranExplorerEffect extends OneShotEffect {
}
}
}
- for (Player player: usingPlayers) {
+ for (Player player : usingPlayers) {
player.shuffleLibrary(source, game);
}
return true;
@@ -118,7 +118,7 @@ class VeteranExplorerEffect extends OneShotEffect {
TargetCardInLibrary target = new TargetCardInLibrary(0, 2, StaticFilters.FILTER_BASIC_LAND_CARD);
if (player.searchLibrary(target, game)) {
if (!target.getTargets().isEmpty()) {
- for (UUID cardId: (List)target.getTargets()) {
+ for (UUID cardId : (List) target.getTargets()) {
Card card = player.getLibrary().getCard(cardId, game);
if (card != null) {
card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), player.getId());
@@ -128,5 +128,5 @@ class VeteranExplorerEffect extends OneShotEffect {
}
}
}
-
+
}
diff --git a/Mage.Sets/src/mage/cards/w/WordsOfWar.java b/Mage.Sets/src/mage/cards/w/WordsOfWar.java
index cee1668996e..248eb718046 100644
--- a/Mage.Sets/src/mage/cards/w/WordsOfWar.java
+++ b/Mage.Sets/src/mage/cards/w/WordsOfWar.java
@@ -98,12 +98,14 @@ class WordsOfWarEffect extends ReplacementEffectImpl {
Player player = game.getPlayer(targetPointer.getFirst(game, source));
if (player != null) {
player.damage(2, source.getSourceId(), game, false, true);
+ this.used = true;
discard();
return true;
}
Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source));
if (permanent != null) {
permanent.damage(2, source.getSourceId(), game, false, true);
+ this.used = true;
discard();
return true;
}
@@ -118,6 +120,9 @@ class WordsOfWarEffect extends ReplacementEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- return source.getControllerId().equals(event.getPlayerId());
+ if (!this.used) {
+ return source.getControllerId().equals(event.getPlayerId());
+ }
+ return false;
}
}
diff --git a/Mage.Sets/src/mage/cards/w/WordsOfWaste.java b/Mage.Sets/src/mage/cards/w/WordsOfWaste.java
new file mode 100644
index 00000000000..4ec2c978486
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/w/WordsOfWaste.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.cards.w;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.ReplacementEffectImpl;
+import mage.abilities.effects.common.discard.DiscardEachPlayerEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.players.Player;
+
+/**
+ *
+ * @author L_J
+ */
+public class WordsOfWaste extends CardImpl {
+
+ public WordsOfWaste(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}");
+
+ // {1}: The next time you would draw a card this turn, each opponent discards a card instead.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new WordsOfWasteEffect(), new ManaCostsImpl("{1}")));
+ }
+
+ public WordsOfWaste(final WordsOfWaste card) {
+ super(card);
+ }
+
+ @Override
+ public WordsOfWaste copy() {
+ return new WordsOfWaste(this);
+ }
+}
+
+class WordsOfWasteEffect extends ReplacementEffectImpl {
+
+ public WordsOfWasteEffect() {
+ super(Duration.EndOfTurn, Outcome.Discard);
+ staticText = "The next time you would draw a card this turn, each opponent discards a card instead";
+ }
+
+ public WordsOfWasteEffect(final WordsOfWasteEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public WordsOfWasteEffect copy() {
+ return new WordsOfWasteEffect(this);
+ }
+
+ @Override
+ public boolean replaceEvent(GameEvent event, Ability source, Game game) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ new DiscardEachPlayerEffect(TargetController.OPPONENT).apply(game, source);
+ this.discard();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean checksEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.DRAW_CARD;
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ return source.getControllerId().equals(event.getPlayerId());
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/w/WordsOfWilding.java b/Mage.Sets/src/mage/cards/w/WordsOfWilding.java
new file mode 100644
index 00000000000..1975c5b7d23
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/w/WordsOfWilding.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.cards.w;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.ReplacementEffectImpl;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.token.BearToken;
+import mage.players.Player;
+
+/**
+ *
+ * @author L_J
+ */
+public class WordsOfWilding extends CardImpl {
+
+ public WordsOfWilding(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}");
+
+ // {1}: The next time you would draw a card this turn, create a 2/2 green Bear creature token instead.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new WordsOfWildingEffect(), new ManaCostsImpl("{1}")));
+ }
+
+ public WordsOfWilding(final WordsOfWilding card) {
+ super(card);
+ }
+
+ @Override
+ public WordsOfWilding copy() {
+ return new WordsOfWilding(this);
+ }
+}
+
+class WordsOfWildingEffect extends ReplacementEffectImpl {
+
+ public WordsOfWildingEffect() {
+ super(Duration.EndOfTurn, Outcome.PutCreatureInPlay);
+ staticText = "The next time you would draw a card this turn, create a 2/2 green Bear creature token instead";
+ }
+
+ public WordsOfWildingEffect(final WordsOfWildingEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public WordsOfWildingEffect copy() {
+ return new WordsOfWildingEffect(this);
+ }
+
+ @Override
+ public boolean replaceEvent(GameEvent event, Ability source, Game game) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ new CreateTokenEffect(new BearToken()).apply(game, source);
+ discard();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean checksEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.DRAW_CARD;
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ return source.getControllerId().equals(event.getPlayerId());
+ }
+}
diff --git a/Mage.Sets/src/mage/cards/w/WordsOfWind.java b/Mage.Sets/src/mage/cards/w/WordsOfWind.java
index 7ceb6176b54..5d6cd11d2a1 100644
--- a/Mage.Sets/src/mage/cards/w/WordsOfWind.java
+++ b/Mage.Sets/src/mage/cards/w/WordsOfWind.java
@@ -29,16 +29,17 @@ package mage.cards.w;
import java.util.List;
import java.util.UUID;
+
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Zone;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
-import mage.constants.CardType;
import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.Zone;
import mage.filter.common.FilterControlledPermanent;
import mage.game.Game;
import mage.game.events.GameEvent;
@@ -107,6 +108,7 @@ class WordsOfWindEffect extends ReplacementEffectImpl {
}
}
}
+ this.used = true;
discard();
return true;
}
@@ -118,6 +120,9 @@ class WordsOfWindEffect extends ReplacementEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- return source.getControllerId().equals(event.getPlayerId());
+ if (!this.used) {
+ return source.getControllerId().equals(event.getPlayerId());
+ }
+ return false;
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/cards/w/WordsOfWorship.java b/Mage.Sets/src/mage/cards/w/WordsOfWorship.java
index 732215ce0db..2bd7329fcc9 100644
--- a/Mage.Sets/src/mage/cards/w/WordsOfWorship.java
+++ b/Mage.Sets/src/mage/cards/w/WordsOfWorship.java
@@ -92,6 +92,7 @@ class WordsOfWorshipEffect extends ReplacementEffectImpl {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
controller.gainLife(5, game);
+ this.used = true;
discard();
return true;
}
@@ -105,6 +106,9 @@ class WordsOfWorshipEffect extends ReplacementEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- return source.getControllerId().equals(event.getPlayerId());
+ if (!this.used) {
+ return source.getControllerId().equals(event.getPlayerId());
+ }
+ return false;
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/Coldsnap.java b/Mage.Sets/src/mage/sets/Coldsnap.java
index a778326a04b..eb8a34bcc33 100644
--- a/Mage.Sets/src/mage/sets/Coldsnap.java
+++ b/Mage.Sets/src/mage/sets/Coldsnap.java
@@ -97,7 +97,7 @@ public class Coldsnap extends ExpansionSet {
cards.add(new SetCardInfo("Gutless Ghoul", 60, Rarity.COMMON, mage.cards.g.GutlessGhoul.class));
cards.add(new SetCardInfo("Haakon, Stromgald Scourge", 61, Rarity.RARE, mage.cards.h.HaakonStromgaldScourge.class));
cards.add(new SetCardInfo("Heidar, Rimewind Master", 36, Rarity.RARE, mage.cards.h.HeidarRimewindMaster.class));
- cards.add(new SetCardInfo("Herald of Leshrac", 62, Rarity.RARE, mage.cards.h.HeraldOfLeshrac.class));
+ cards.add(new SetCardInfo("Herald of Leshrac", 62, Rarity.RARE, mage.cards.h.HeraldOfLeshrac.class));
cards.add(new SetCardInfo("Hibernation's End", 110, Rarity.RARE, mage.cards.h.HibernationsEnd.class));
cards.add(new SetCardInfo("Highland Weald", 147, Rarity.UNCOMMON, mage.cards.h.HighlandWeald.class));
cards.add(new SetCardInfo("Icefall", 85, Rarity.COMMON, mage.cards.i.Icefall.class));
@@ -136,6 +136,7 @@ public class Coldsnap extends ExpansionSet {
cards.add(new SetCardInfo("Resize", 117, Rarity.UNCOMMON, mage.cards.r.Resize.class));
cards.add(new SetCardInfo("Rimebound Dead", 69, Rarity.COMMON, mage.cards.r.RimeboundDead.class));
cards.add(new SetCardInfo("Rime Transfusion", 68, Rarity.UNCOMMON, mage.cards.r.RimeTransfusion.class));
+ cards.add(new SetCardInfo("Rimescale Dragon", 95, Rarity.RARE, mage.cards.r.RimescaleDragon.class));
cards.add(new SetCardInfo("Rimewind Cryomancer", 43, Rarity.UNCOMMON, mage.cards.r.RimewindCryomancer.class));
cards.add(new SetCardInfo("Rimewind Taskmage", 44, Rarity.COMMON, mage.cards.r.RimewindTaskmage.class));
cards.add(new SetCardInfo("Rite of Flame", 96, Rarity.COMMON, mage.cards.r.RiteOfFlame.class));
@@ -164,7 +165,7 @@ public class Coldsnap extends ExpansionSet {
cards.add(new SetCardInfo("Surging Might", 125, Rarity.COMMON, mage.cards.s.SurgingMight.class));
cards.add(new SetCardInfo("Surging Sentinels", 20, Rarity.COMMON, mage.cards.s.SurgingSentinels.class));
cards.add(new SetCardInfo("Swift Maneuver", 21, Rarity.COMMON, mage.cards.s.SwiftManeuver.class));
- cards.add(new SetCardInfo("Tamanoa", 132, Rarity.RARE, mage.cards.t.Tamanoa.class));
+ cards.add(new SetCardInfo("Tamanoa", 132, Rarity.RARE, mage.cards.t.Tamanoa.class));
cards.add(new SetCardInfo("Thermopod", 100, Rarity.COMMON, mage.cards.t.Thermopod.class));
cards.add(new SetCardInfo("Thrumming Stone", 142, Rarity.RARE, mage.cards.t.ThrummingStone.class));
cards.add(new SetCardInfo("Tresserhorn Sinks", 150, Rarity.UNCOMMON, mage.cards.t.TresserhornSinks.class));
diff --git a/Mage.Sets/src/mage/sets/Exodus.java b/Mage.Sets/src/mage/sets/Exodus.java
index 1f3f2d9d936..0c95c4789d0 100644
--- a/Mage.Sets/src/mage/sets/Exodus.java
+++ b/Mage.Sets/src/mage/sets/Exodus.java
@@ -141,6 +141,7 @@ public class Exodus extends ExpansionSet {
cards.add(new SetCardInfo("Skyshroud Elite", 123, Rarity.UNCOMMON, mage.cards.s.SkyshroudElite.class));
cards.add(new SetCardInfo("Slaughter", 74, Rarity.UNCOMMON, mage.cards.s.Slaughter.class));
cards.add(new SetCardInfo("Soltari Visionary", 20, Rarity.COMMON, mage.cards.s.SoltariVisionary.class));
+ cards.add(new SetCardInfo("Song of Serenity", 125, Rarity.UNCOMMON, mage.cards.s.SongOfSerenity.class));
cards.add(new SetCardInfo("Sonic Burst", 103, Rarity.COMMON, mage.cards.s.SonicBurst.class));
cards.add(new SetCardInfo("Soul Warden", 21, Rarity.COMMON, mage.cards.s.SoulWarden.class));
cards.add(new SetCardInfo("Spellbook", 138, Rarity.UNCOMMON, mage.cards.s.Spellbook.class));
diff --git a/Mage.Sets/src/mage/sets/IceAge.java b/Mage.Sets/src/mage/sets/IceAge.java
index 495f0e145f8..ae7536483e1 100644
--- a/Mage.Sets/src/mage/sets/IceAge.java
+++ b/Mage.Sets/src/mage/sets/IceAge.java
@@ -1,307 +1,310 @@
-/*
- * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are
- * permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are those of the
- * authors and should not be interpreted as representing official policies, either expressed
- * or implied, of BetaSteward_at_googlemail.com.
- */
-package mage.sets;
-
-import mage.cards.CardGraphicInfo;
-import mage.cards.ExpansionSet;
-import mage.constants.Rarity;
-import mage.constants.SetType;
-
-/**
- *
- * @author North
- */
-public class IceAge extends ExpansionSet {
-
- private static final IceAge instance = new IceAge();
-
- public static IceAge getInstance() {
- return instance;
- }
-
- private IceAge() {
- super("Ice Age", "ICE", ExpansionSet.buildDate(1995, 5, 1), SetType.EXPANSION);
- this.blockName = "Ice Age";
- this.hasBoosters = true;
- this.numBoosterLands = 0;
- this.numBoosterCommon = 11;
- this.numBoosterUncommon = 3;
- this.numBoosterRare = 1;
- this.ratioBoosterMythic = 0;
- cards.add(new SetCardInfo("Abyssal Specter", 1, Rarity.UNCOMMON, mage.cards.a.AbyssalSpecter.class));
- cards.add(new SetCardInfo("Adarkar Sentinel", 281, Rarity.UNCOMMON, mage.cards.a.AdarkarSentinel.class));
- cards.add(new SetCardInfo("Adarkar Wastes", 326, Rarity.RARE, mage.cards.a.AdarkarWastes.class));
- cards.add(new SetCardInfo("Aegis of the Meek", 282, Rarity.RARE, mage.cards.a.AegisOfTheMeek.class));
- cards.add(new SetCardInfo("Altar of Bone", 359, Rarity.RARE, mage.cards.a.AltarOfBone.class));
- cards.add(new SetCardInfo("Anarchy", 170, Rarity.UNCOMMON, mage.cards.a.Anarchy.class));
- cards.add(new SetCardInfo("Arenson's Aura", 227, Rarity.COMMON, mage.cards.a.ArensonsAura.class));
- cards.add(new SetCardInfo("Armor of Faith", 228, Rarity.COMMON, mage.cards.a.ArmorOfFaith.class));
- cards.add(new SetCardInfo("Arnjlot's Ascent", 57, Rarity.COMMON, mage.cards.a.ArnjlotsAscent.class));
- cards.add(new SetCardInfo("Aurochs", 113, Rarity.COMMON, mage.cards.a.Aurochs.class));
- cards.add(new SetCardInfo("Balduvian Barbarians", 172, Rarity.COMMON, mage.cards.b.BalduvianBarbarians.class));
- cards.add(new SetCardInfo("Balduvian Bears", 114, Rarity.COMMON, mage.cards.b.BalduvianBears.class));
- cards.add(new SetCardInfo("Barbed Sextant", 287, Rarity.COMMON, mage.cards.b.BarbedSextant.class));
- cards.add(new SetCardInfo("Battle Frenzy", 175, Rarity.COMMON, mage.cards.b.BattleFrenzy.class));
- cards.add(new SetCardInfo("Binding Grasp", 60, Rarity.UNCOMMON, mage.cards.b.BindingGrasp.class));
- cards.add(new SetCardInfo("Black Scarab", 230, Rarity.UNCOMMON, mage.cards.b.BlackScarab.class));
- cards.add(new SetCardInfo("Blessed Wine", 231, Rarity.COMMON, mage.cards.b.BlessedWine.class));
- cards.add(new SetCardInfo("Blinking Spirit", 232, Rarity.RARE, mage.cards.b.BlinkingSpirit.class));
- cards.add(new SetCardInfo("Blue Scarab", 233, Rarity.UNCOMMON, mage.cards.b.BlueScarab.class));
- cards.add(new SetCardInfo("Brainstorm", 61, Rarity.COMMON, mage.cards.b.Brainstorm.class));
- cards.add(new SetCardInfo("Brushland", 327, Rarity.RARE, mage.cards.b.Brushland.class));
- cards.add(new SetCardInfo("Burnt Offering", 4, Rarity.COMMON, mage.cards.b.BurntOffering.class));
- cards.add(new SetCardInfo("Caribou Range", 235, Rarity.RARE, mage.cards.c.CaribouRange.class));
- cards.add(new SetCardInfo("Celestial Sword", 289, Rarity.RARE, mage.cards.c.CelestialSword.class));
- cards.add(new SetCardInfo("Centaur Archer", 360, Rarity.UNCOMMON, mage.cards.c.CentaurArcher.class));
- cards.add(new SetCardInfo("Chub Toad", 117, Rarity.COMMON, mage.cards.c.ChubToad.class));
- cards.add(new SetCardInfo("Circle of Protection: Black", 236, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class));
- cards.add(new SetCardInfo("Circle of Protection: Blue", 237, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class));
- cards.add(new SetCardInfo("Circle of Protection: Green", 238, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class));
- cards.add(new SetCardInfo("Circle of Protection: Red", 239, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class));
- cards.add(new SetCardInfo("Circle of Protection: White", 240, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class));
- cards.add(new SetCardInfo("Clairvoyance", 63, Rarity.COMMON, mage.cards.c.Clairvoyance.class));
- cards.add(new SetCardInfo("Cold Snap", 241, Rarity.UNCOMMON, mage.cards.c.ColdSnap.class));
- cards.add(new SetCardInfo("Conquer", 180, Rarity.UNCOMMON, mage.cards.c.Conquer.class));
- cards.add(new SetCardInfo("Counterspell", 64, Rarity.COMMON, mage.cards.c.Counterspell.class));
- cards.add(new SetCardInfo("Crown of the Ages", 290, Rarity.RARE, mage.cards.c.CrownOfTheAges.class));
- cards.add(new SetCardInfo("Curse of Marit Lage", 181, Rarity.RARE, mage.cards.c.CurseOfMaritLage.class));
- cards.add(new SetCardInfo("Dance of the Dead", 6, Rarity.UNCOMMON, mage.cards.d.DanceOfTheDead.class));
- cards.add(new SetCardInfo("Dark Banishing", 7, Rarity.COMMON, mage.cards.d.DarkBanishing.class));
- cards.add(new SetCardInfo("Dark Ritual", 8, Rarity.COMMON, mage.cards.d.DarkRitual.class));
- cards.add(new SetCardInfo("Death Ward", 243, Rarity.COMMON, mage.cards.d.DeathWard.class));
- cards.add(new SetCardInfo("Deflection", 65, Rarity.RARE, mage.cards.d.Deflection.class));
- cards.add(new SetCardInfo("Demonic Consultation", 9, Rarity.UNCOMMON, mage.cards.d.DemonicConsultation.class));
- cards.add(new SetCardInfo("Despotic Scepter", 291, Rarity.RARE, mage.cards.d.DespoticScepter.class));
- cards.add(new SetCardInfo("Disenchant", 244, Rarity.COMMON, mage.cards.d.Disenchant.class));
- cards.add(new SetCardInfo("Dwarven Armory", 182, Rarity.RARE, mage.cards.d.DwarvenArmory.class));
- cards.add(new SetCardInfo("Elder Druid", 120, Rarity.RARE, mage.cards.e.ElderDruid.class));
- cards.add(new SetCardInfo("Elemental Augury", 364, Rarity.RARE, mage.cards.e.ElementalAugury.class));
- cards.add(new SetCardInfo("Enduring Renewal", 247, Rarity.RARE, mage.cards.e.EnduringRenewal.class));
- cards.add(new SetCardInfo("Enervate", 67, Rarity.COMMON, mage.cards.e.Enervate.class));
- cards.add(new SetCardInfo("Errantry", 183, Rarity.COMMON, mage.cards.e.Errantry.class));
- cards.add(new SetCardInfo("Fanatical Fever", 122, Rarity.UNCOMMON, mage.cards.f.FanaticalFever.class));
- cards.add(new SetCardInfo("Fear", 12, Rarity.COMMON, mage.cards.f.Fear.class));
- cards.add(new SetCardInfo("Fiery Justice", 366, Rarity.RARE, mage.cards.f.FieryJustice.class));
- cards.add(new SetCardInfo("Fire Covenant", 367, Rarity.UNCOMMON, mage.cards.f.FireCovenant.class));
- cards.add(new SetCardInfo("Flame Spirit", 184, Rarity.UNCOMMON, mage.cards.f.FlameSpirit.class));
- cards.add(new SetCardInfo("Flare", 185, Rarity.COMMON, mage.cards.f.Flare.class));
- cards.add(new SetCardInfo("Flow of Maggots", 13, Rarity.RARE, mage.cards.f.FlowOfMaggots.class));
- cards.add(new SetCardInfo("Folk of the Pines", 123, Rarity.COMMON, mage.cards.f.FolkOfThePines.class));
- cards.add(new SetCardInfo("Forbidden Lore", 124, Rarity.RARE, mage.cards.f.ForbiddenLore.class));
- cards.add(new SetCardInfo("Force Void", 70, Rarity.UNCOMMON, mage.cards.f.ForceVoid.class));
- cards.add(new SetCardInfo("Forest", 328, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Forest", 329, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Forest", 330, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Forgotten Lore", 125, Rarity.UNCOMMON, mage.cards.f.ForgottenLore.class));
- cards.add(new SetCardInfo("Foul Familiar", 14, Rarity.COMMON, mage.cards.f.FoulFamiliar.class));
- cards.add(new SetCardInfo("Fumarole", 369, Rarity.UNCOMMON, mage.cards.f.Fumarole.class));
- cards.add(new SetCardInfo("Fyndhorn Bow", 293, Rarity.UNCOMMON, mage.cards.f.FyndhornBow.class));
- cards.add(new SetCardInfo("Fyndhorn Brownie", 130, Rarity.COMMON, mage.cards.f.FyndhornBrownie.class));
- cards.add(new SetCardInfo("Fyndhorn Elder", 131, Rarity.UNCOMMON, mage.cards.f.FyndhornElder.class));
- cards.add(new SetCardInfo("Fyndhorn Elves", 132, Rarity.COMMON, mage.cards.f.FyndhornElves.class));
- cards.add(new SetCardInfo("Game of Chaos", 186, Rarity.RARE, mage.cards.g.GameOfChaos.class));
- cards.add(new SetCardInfo("Gangrenous Zombies", 15, Rarity.COMMON, mage.cards.g.GangrenousZombies.class));
- cards.add(new SetCardInfo("Giant Growth", 134, Rarity.COMMON, mage.cards.g.GiantGrowth.class));
- cards.add(new SetCardInfo("Giant Trap Door Spider", 371, Rarity.UNCOMMON, mage.cards.g.GiantTrapDoorSpider.class));
- cards.add(new SetCardInfo("Glacial Chasm", 331, Rarity.UNCOMMON, mage.cards.g.GlacialChasm.class));
- cards.add(new SetCardInfo("Glacial Crevasses", 187, Rarity.RARE, mage.cards.g.GlacialCrevasses.class));
- cards.add(new SetCardInfo("Glacial Wall", 71, Rarity.UNCOMMON, mage.cards.g.GlacialWall.class));
- cards.add(new SetCardInfo("Goblin Mutant", 188, Rarity.UNCOMMON, mage.cards.g.GoblinMutant.class));
- cards.add(new SetCardInfo("Goblin Snowman", 191, Rarity.UNCOMMON, mage.cards.g.GoblinSnowman.class));
- cards.add(new SetCardInfo("Gorilla Pack", 135, Rarity.COMMON, mage.cards.g.GorillaPack.class));
- cards.add(new SetCardInfo("Gravebind", 17, Rarity.RARE, mage.cards.g.Gravebind.class));
- cards.add(new SetCardInfo("Green Scarab", 252, Rarity.UNCOMMON, mage.cards.g.GreenScarab.class));
- cards.add(new SetCardInfo("Hallowed Ground", 253, Rarity.UNCOMMON, mage.cards.h.HallowedGround.class));
- cards.add(new SetCardInfo("Heal", 254, Rarity.COMMON, mage.cards.h.Heal.class));
- cards.add(new SetCardInfo("Hecatomb", 18, Rarity.RARE, mage.cards.h.Hecatomb.class));
- cards.add(new SetCardInfo("Hematite Talisman", 295, Rarity.UNCOMMON, mage.cards.h.HematiteTalisman.class));
- cards.add(new SetCardInfo("Hoar Shade", 19, Rarity.COMMON, mage.cards.h.HoarShade.class));
- cards.add(new SetCardInfo("Hot Springs", 136, Rarity.RARE, mage.cards.h.HotSprings.class));
- cards.add(new SetCardInfo("Howl from Beyond", 20, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class));
- cards.add(new SetCardInfo("Hurricane", 137, Rarity.UNCOMMON, mage.cards.h.Hurricane.class));
- cards.add(new SetCardInfo("Hyalopterous Lemure", 21, Rarity.UNCOMMON, mage.cards.h.HyalopterousLemure.class));
- cards.add(new SetCardInfo("Hydroblast", 72, Rarity.COMMON, mage.cards.h.Hydroblast.class));
- cards.add(new SetCardInfo("Hymn of Rebirth", 373, Rarity.UNCOMMON, mage.cards.h.HymnOfRebirth.class));
- cards.add(new SetCardInfo("Iceberg", 73, Rarity.UNCOMMON, mage.cards.i.Iceberg.class));
- cards.add(new SetCardInfo("Icequake", 22, Rarity.UNCOMMON, mage.cards.i.Icequake.class));
- cards.add(new SetCardInfo("Icy Manipulator", 297, Rarity.UNCOMMON, mage.cards.i.IcyManipulator.class));
- cards.add(new SetCardInfo("Icy Prison", 74, Rarity.RARE, mage.cards.i.IcyPrison.class));
- cards.add(new SetCardInfo("Illusionary Forces", 75, Rarity.COMMON, mage.cards.i.IllusionaryForces.class));
- cards.add(new SetCardInfo("Illusionary Wall", 78, Rarity.COMMON, mage.cards.i.IllusionaryWall.class));
- cards.add(new SetCardInfo("Illusions of Grandeur", 79, Rarity.RARE, mage.cards.i.IllusionsOfGrandeur.class));
- cards.add(new SetCardInfo("Imposing Visage", 193, Rarity.COMMON, mage.cards.i.ImposingVisage.class));
- cards.add(new SetCardInfo("Incinerate", 194, Rarity.COMMON, mage.cards.i.Incinerate.class));
- cards.add(new SetCardInfo("Infernal Darkness", 23, Rarity.RARE, mage.cards.i.InfernalDarkness.class));
- cards.add(new SetCardInfo("Infuse", 80, Rarity.COMMON, mage.cards.i.Infuse.class));
- cards.add(new SetCardInfo("Island", 334, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Island", 335, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Island", 336, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Jester's Cap", 299, Rarity.RARE, mage.cards.j.JestersCap.class));
- cards.add(new SetCardInfo("Jester's Mask", 300, Rarity.RARE, mage.cards.j.JestersMask.class));
- cards.add(new SetCardInfo("Jeweled Amulet", 301, Rarity.UNCOMMON, mage.cards.j.JeweledAmulet.class));
- cards.add(new SetCardInfo("Johtull Wurm", 138, Rarity.UNCOMMON, mage.cards.j.JohtullWurm.class));
- cards.add(new SetCardInfo("Jokulhaups", 195, Rarity.RARE, mage.cards.j.Jokulhaups.class));
- cards.add(new SetCardInfo("Juniper Order Druid", 139, Rarity.COMMON, mage.cards.j.JuniperOrderDruid.class));
- cards.add(new SetCardInfo("Justice", 256, Rarity.UNCOMMON, mage.cards.j.Justice.class));
- cards.add(new SetCardInfo("Karplusan Forest", 337, Rarity.RARE, mage.cards.k.KarplusanForest.class));
- cards.add(new SetCardInfo("Karplusan Yeti", 197, Rarity.RARE, mage.cards.k.KarplusanYeti.class));
- cards.add(new SetCardInfo("Kjeldoran Dead", 25, Rarity.COMMON, mage.cards.k.KjeldoranDead.class));
- cards.add(new SetCardInfo("Kjeldoran Royal Guard", 262, Rarity.RARE, mage.cards.k.KjeldoranRoyalGuard.class));
- cards.add(new SetCardInfo("Knight of Stromgald", 26, Rarity.UNCOMMON, mage.cards.k.KnightOfStromgald.class));
- cards.add(new SetCardInfo("Krovikan Fetish", 28, Rarity.COMMON, mage.cards.k.KrovikanFetish.class));
- cards.add(new SetCardInfo("Krovikan Sorcerer", 81, Rarity.COMMON, mage.cards.k.KrovikanSorcerer.class));
- cards.add(new SetCardInfo("Land Cap", 338, Rarity.RARE, mage.cards.l.LandCap.class));
- cards.add(new SetCardInfo("Lapis Lazuli Talisman", 302, Rarity.UNCOMMON, mage.cards.l.LapisLazuliTalisman.class));
- cards.add(new SetCardInfo("Lava Tubes", 339, Rarity.RARE, mage.cards.l.LavaTubes.class));
- cards.add(new SetCardInfo("Legions of Lim-Dul", 30, Rarity.COMMON, mage.cards.l.LegionsOfLimDul.class));
- cards.add(new SetCardInfo("Leshrac's Rite", 31, Rarity.UNCOMMON, mage.cards.l.LeshracsRite.class));
- cards.add(new SetCardInfo("Lhurgoyf", 140, Rarity.RARE, mage.cards.l.Lhurgoyf.class));
- cards.add(new SetCardInfo("Lightning Blow", 266, Rarity.RARE, mage.cards.l.LightningBlow.class));
- cards.add(new SetCardInfo("Lure", 141, Rarity.UNCOMMON, mage.cards.l.Lure.class));
- cards.add(new SetCardInfo("Magus of the Unseen", 82, Rarity.RARE, mage.cards.m.MagusOfTheUnseen.class));
- cards.add(new SetCardInfo("Malachite Talisman", 303, Rarity.UNCOMMON, mage.cards.m.MalachiteTalisman.class));
- cards.add(new SetCardInfo("Marton Stromgald", 199, Rarity.RARE, mage.cards.m.MartonStromgald.class));
- cards.add(new SetCardInfo("Merieke Ri Berit", 375, Rarity.RARE, mage.cards.m.MeriekeRiBerit.class));
- cards.add(new SetCardInfo("Mesmeric Trance", 83, Rarity.RARE, mage.cards.m.MesmericTrance.class));
- cards.add(new SetCardInfo("Mind Ravel", 35, Rarity.COMMON, mage.cards.m.MindRavel.class));
- cards.add(new SetCardInfo("Mind Warp", 36, Rarity.UNCOMMON, mage.cards.m.MindWarp.class));
- cards.add(new SetCardInfo("Mole Worms", 40, Rarity.UNCOMMON, mage.cards.m.MoleWorms.class));
- cards.add(new SetCardInfo("Moor Fiend", 41, Rarity.COMMON, mage.cards.m.MoorFiend.class));
- cards.add(new SetCardInfo("Mountain", 340, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Mountain", 341, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Mountain", 342, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Mountain Goat", 203, Rarity.COMMON, mage.cards.m.MountainGoat.class));
- cards.add(new SetCardInfo("Mudslide", 204, Rarity.RARE, mage.cards.m.Mudslide.class));
- cards.add(new SetCardInfo("Mystic Might", 86, Rarity.RARE, mage.cards.m.MysticMight.class));
- cards.add(new SetCardInfo("Mystic Remora", 87, Rarity.COMMON, mage.cards.m.MysticRemora.class));
- cards.add(new SetCardInfo("Nacre Talisman", 304, Rarity.UNCOMMON, mage.cards.n.NacreTalisman.class));
- cards.add(new SetCardInfo("Naked Singularity", 305, Rarity.RARE, mage.cards.n.NakedSingularity.class));
- cards.add(new SetCardInfo("Nature's Lore", 143, Rarity.UNCOMMON, mage.cards.n.NaturesLore.class));
- cards.add(new SetCardInfo("Necropotence", 42, Rarity.RARE, mage.cards.n.Necropotence.class));
- cards.add(new SetCardInfo("Onyx Talisman", 306, Rarity.UNCOMMON, mage.cards.o.OnyxTalisman.class));
- cards.add(new SetCardInfo("Orcish Cannoneers", 205, Rarity.UNCOMMON, mage.cards.o.OrcishCannoneers.class));
- cards.add(new SetCardInfo("Orcish Healer", 208, Rarity.UNCOMMON, mage.cards.o.OrcishHealer.class));
- cards.add(new SetCardInfo("Orcish Librarian", 209, Rarity.RARE, mage.cards.o.OrcishLibrarian.class));
- cards.add(new SetCardInfo("Orcish Lumberjack", 210, Rarity.COMMON, mage.cards.o.OrcishLumberjack.class));
- cards.add(new SetCardInfo("Order of the Sacred Torch", 269, Rarity.RARE, mage.cards.o.OrderOfTheSacredTorch.class));
- cards.add(new SetCardInfo("Order of the White Shield", 270, Rarity.UNCOMMON, mage.cards.o.OrderOfTheWhiteShield.class));
- cards.add(new SetCardInfo("Pale Bears", 144, Rarity.RARE, mage.cards.p.PaleBears.class));
- cards.add(new SetCardInfo("Panic", 212, Rarity.COMMON, mage.cards.p.Panic.class));
- cards.add(new SetCardInfo("Pentagram of the Ages", 307, Rarity.RARE, mage.cards.p.PentagramOfTheAges.class));
- cards.add(new SetCardInfo("Pestilence Rats", 45, Rarity.COMMON, mage.cards.p.PestilenceRats.class));
- cards.add(new SetCardInfo("Pit Trap", 308, Rarity.UNCOMMON, mage.cards.p.PitTrap.class));
- cards.add(new SetCardInfo("Plains", 343, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Plains", 344, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Plains", 345, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Polar Kraken", 89, Rarity.RARE, mage.cards.p.PolarKraken.class));
- cards.add(new SetCardInfo("Portent", 90, Rarity.COMMON, mage.cards.p.Portent.class));
- cards.add(new SetCardInfo("Power Sink", 91, Rarity.COMMON, mage.cards.p.PowerSink.class));
- cards.add(new SetCardInfo("Pox", 46, Rarity.RARE, mage.cards.p.Pox.class));
- cards.add(new SetCardInfo("Pygmy Allosaurus", 145, Rarity.RARE, mage.cards.p.PygmyAllosaurus.class));
- cards.add(new SetCardInfo("Pyknite", 146, Rarity.COMMON, mage.cards.p.Pyknite.class));
- cards.add(new SetCardInfo("Pyroblast", 213, Rarity.COMMON, mage.cards.p.Pyroblast.class));
- cards.add(new SetCardInfo("Pyroclasm", 214, Rarity.UNCOMMON, mage.cards.p.Pyroclasm.class));
- cards.add(new SetCardInfo("Rally", 272, Rarity.COMMON, mage.cards.r.Rally.class));
- cards.add(new SetCardInfo("Ray of Command", 92, Rarity.COMMON, mage.cards.r.RayOfCommand.class));
- cards.add(new SetCardInfo("Ray of Erasure", 93, Rarity.COMMON, mage.cards.r.RayOfErasure.class));
- cards.add(new SetCardInfo("Red Scarab", 273, Rarity.UNCOMMON, mage.cards.r.RedScarab.class));
- cards.add(new SetCardInfo("Regeneration", 147, Rarity.COMMON, mage.cards.r.Regeneration.class));
- cards.add(new SetCardInfo("Rime Dryad", 148, Rarity.COMMON, mage.cards.r.RimeDryad.class));
- cards.add(new SetCardInfo("Ritual of Subdual", 149, Rarity.RARE, mage.cards.r.RitualOfSubdual.class));
- cards.add(new SetCardInfo("River Delta", 346, Rarity.RARE, mage.cards.r.RiverDelta.class));
- cards.add(new SetCardInfo("Sabretooth Tiger", 215, Rarity.COMMON, mage.cards.s.SabretoothTiger.class));
- cards.add(new SetCardInfo("Scaled Wurm", 150, Rarity.COMMON, mage.cards.s.ScaledWurm.class));
- cards.add(new SetCardInfo("Sea Spirit", 95, Rarity.UNCOMMON, mage.cards.s.SeaSpirit.class));
- cards.add(new SetCardInfo("Seizures", 47, Rarity.COMMON, mage.cards.s.Seizures.class));
- cards.add(new SetCardInfo("Shambling Strider", 151, Rarity.COMMON, mage.cards.s.ShamblingStrider.class));
- cards.add(new SetCardInfo("Shatter", 216, Rarity.COMMON, mage.cards.s.Shatter.class));
- cards.add(new SetCardInfo("Shield of the Ages", 310, Rarity.UNCOMMON, mage.cards.s.ShieldOfTheAges.class));
- cards.add(new SetCardInfo("Sibilant Spirit", 97, Rarity.RARE, mage.cards.s.SibilantSpirit.class));
- cards.add(new SetCardInfo("Silver Erne", 98, Rarity.UNCOMMON, mage.cards.s.SilverErne.class));
- cards.add(new SetCardInfo("Skeleton Ship", 379, Rarity.RARE, mage.cards.s.SkeletonShip.class));
- cards.add(new SetCardInfo("Skull Catapult", 311, Rarity.UNCOMMON, mage.cards.s.SkullCatapult.class));
- cards.add(new SetCardInfo("Snow-Covered Forest", 347, Rarity.COMMON, mage.cards.s.SnowCoveredForest.class));
- cards.add(new SetCardInfo("Snow-Covered Island", 348, Rarity.COMMON, mage.cards.s.SnowCoveredIsland.class));
- cards.add(new SetCardInfo("Snow-Covered Mountain", 349, Rarity.COMMON, mage.cards.s.SnowCoveredMountain.class));
- cards.add(new SetCardInfo("Snow-Covered Plains", 350, Rarity.COMMON, mage.cards.s.SnowCoveredPlains.class));
- cards.add(new SetCardInfo("Snow-Covered Swamp", 351, Rarity.COMMON, mage.cards.s.SnowCoveredSwamp.class));
- cards.add(new SetCardInfo("Snow Hound", 277, Rarity.UNCOMMON, mage.cards.s.SnowHound.class));
- cards.add(new SetCardInfo("Soldevi Machinist", 102, Rarity.UNCOMMON, mage.cards.s.SoldeviMachinist.class));
- cards.add(new SetCardInfo("Soldevi Simulacrum", 314, Rarity.UNCOMMON, mage.cards.s.SoldeviSimulacrum.class));
- cards.add(new SetCardInfo("Songs of the Damned", 48, Rarity.COMMON, mage.cards.s.SongsOfTheDamned.class));
- cards.add(new SetCardInfo("Soul Barrier", 103, Rarity.UNCOMMON, mage.cards.s.SoulBarrier.class));
- cards.add(new SetCardInfo("Soul Burn", 361, Rarity.COMMON, mage.cards.s.SoulBurn.class));
- cards.add(new SetCardInfo("Soul Kiss", 50, Rarity.COMMON, mage.cards.s.SoulKiss.class));
- cards.add(new SetCardInfo("Spoils of Evil", 51, Rarity.RARE, mage.cards.s.SpoilsOfEvil.class));
- cards.add(new SetCardInfo("Stampede", 153, Rarity.RARE, mage.cards.s.Stampede.class));
- cards.add(new SetCardInfo("Stonehands", 219, Rarity.COMMON, mage.cards.s.Stonehands.class));
- cards.add(new SetCardInfo("Stone Rain", 217, Rarity.COMMON, mage.cards.s.StoneRain.class));
- cards.add(new SetCardInfo("Stone Spirit", 218, Rarity.UNCOMMON, mage.cards.s.StoneSpirit.class));
- cards.add(new SetCardInfo("Stormbind", 382, Rarity.RARE, mage.cards.s.Stormbind.class));
- cards.add(new SetCardInfo("Storm Spirit", 381, Rarity.RARE, mage.cards.s.StormSpirit.class));
- cards.add(new SetCardInfo("Stromgald Cabal", 54, Rarity.RARE, mage.cards.s.StromgaldCabal.class));
- cards.add(new SetCardInfo("Stunted Growth", 154, Rarity.RARE, mage.cards.s.StuntedGrowth.class));
- cards.add(new SetCardInfo("Sulfurous Springs", 352, Rarity.RARE, mage.cards.s.SulfurousSprings.class));
- cards.add(new SetCardInfo("Sunstone", 316, Rarity.UNCOMMON, mage.cards.s.Sunstone.class));
- cards.add(new SetCardInfo("Swamp", 353, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Swamp", 354, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Swamp", 355, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Swords to Plowshares", 278, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class));
- cards.add(new SetCardInfo("Tarpan", 155, Rarity.COMMON, mage.cards.t.Tarpan.class));
- cards.add(new SetCardInfo("Thermokarst", 156, Rarity.UNCOMMON, mage.cards.t.Thermokarst.class));
- cards.add(new SetCardInfo("Thoughtleech", 157, Rarity.UNCOMMON, mage.cards.t.Thoughtleech.class));
- cards.add(new SetCardInfo("Thunder Wall", 104, Rarity.UNCOMMON, mage.cards.t.ThunderWall.class));
- cards.add(new SetCardInfo("Timberline Ridge", 356, Rarity.RARE, mage.cards.t.TimberlineRidge.class));
- cards.add(new SetCardInfo("Time Bomb", 317, Rarity.RARE, mage.cards.t.TimeBomb.class));
- cards.add(new SetCardInfo("Tinder Wall", 158, Rarity.COMMON, mage.cards.t.TinderWall.class));
- cards.add(new SetCardInfo("Tor Giant", 220, Rarity.COMMON, mage.cards.t.TorGiant.class));
- cards.add(new SetCardInfo("Touch of Death", 55, Rarity.COMMON, mage.cards.t.TouchOfDeath.class));
- cards.add(new SetCardInfo("Underground River", 357, Rarity.RARE, mage.cards.u.UndergroundRiver.class));
- cards.add(new SetCardInfo("Updraft", 105, Rarity.UNCOMMON, mage.cards.u.Updraft.class));
- cards.add(new SetCardInfo("Urza's Bauble", 318, Rarity.UNCOMMON, mage.cards.u.UrzasBauble.class));
- cards.add(new SetCardInfo("Veldt", 358, Rarity.RARE, mage.cards.v.Veldt.class));
- cards.add(new SetCardInfo("Vertigo", 222, Rarity.UNCOMMON, mage.cards.v.Vertigo.class));
- cards.add(new SetCardInfo("Walking Wall", 321, Rarity.UNCOMMON, mage.cards.w.WalkingWall.class));
- cards.add(new SetCardInfo("Wall of Lava", 223, Rarity.UNCOMMON, mage.cards.w.WallOfLava.class));
- cards.add(new SetCardInfo("Wall of Pine Needles", 162, Rarity.UNCOMMON, mage.cards.w.WallOfPineNeedles.class));
- cards.add(new SetCardInfo("War Chariot", 323, Rarity.UNCOMMON, mage.cards.w.WarChariot.class));
- cards.add(new SetCardInfo("Warning", 279, Rarity.COMMON, mage.cards.w.Warning.class));
- cards.add(new SetCardInfo("Whiteout", 163, Rarity.UNCOMMON, mage.cards.w.Whiteout.class));
- cards.add(new SetCardInfo("White Scarab", 280, Rarity.UNCOMMON, mage.cards.w.WhiteScarab.class));
- cards.add(new SetCardInfo("Wild Growth", 165, Rarity.COMMON, mage.cards.w.WildGrowth.class));
- cards.add(new SetCardInfo("Wind Spirit", 106, Rarity.UNCOMMON, mage.cards.w.WindSpirit.class));
- cards.add(new SetCardInfo("Wings of Aesthir", 383, Rarity.UNCOMMON, mage.cards.w.WingsOfAesthir.class));
- cards.add(new SetCardInfo("Word of Blasting", 224, Rarity.UNCOMMON, mage.cards.w.WordOfBlasting.class));
- cards.add(new SetCardInfo("Wrath of Marit Lage", 109, Rarity.RARE, mage.cards.w.WrathOfMaritLage.class));
- cards.add(new SetCardInfo("Yavimaya Gnats", 168, Rarity.UNCOMMON, mage.cards.y.YavimayaGnats.class));
- cards.add(new SetCardInfo("Zuran Enchanter", 110, Rarity.COMMON, mage.cards.z.ZuranEnchanter.class));
- cards.add(new SetCardInfo("Zuran Orb", 325, Rarity.UNCOMMON, mage.cards.z.ZuranOrb.class));
- cards.add(new SetCardInfo("Zuran Spellcaster", 111, Rarity.COMMON, mage.cards.z.ZuranSpellcaster.class));
- cards.add(new SetCardInfo("Zur's Weirding", 112, Rarity.RARE, mage.cards.z.ZursWeirding.class));
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets;
+
+import mage.cards.CardGraphicInfo;
+import mage.cards.ExpansionSet;
+import mage.constants.Rarity;
+import mage.constants.SetType;
+
+/**
+ *
+ * @author North
+ */
+public class IceAge extends ExpansionSet {
+
+ private static final IceAge instance = new IceAge();
+
+ public static IceAge getInstance() {
+ return instance;
+ }
+
+ private IceAge() {
+ super("Ice Age", "ICE", ExpansionSet.buildDate(1995, 5, 1), SetType.EXPANSION);
+ this.blockName = "Ice Age";
+ this.hasBoosters = true;
+ this.numBoosterLands = 0;
+ this.numBoosterCommon = 11;
+ this.numBoosterUncommon = 3;
+ this.numBoosterRare = 1;
+ this.ratioBoosterMythic = 0;
+ cards.add(new SetCardInfo("Abyssal Specter", 1, Rarity.UNCOMMON, mage.cards.a.AbyssalSpecter.class));
+ cards.add(new SetCardInfo("Adarkar Sentinel", 281, Rarity.UNCOMMON, mage.cards.a.AdarkarSentinel.class));
+ cards.add(new SetCardInfo("Adarkar Wastes", 326, Rarity.RARE, mage.cards.a.AdarkarWastes.class));
+ cards.add(new SetCardInfo("Aegis of the Meek", 282, Rarity.RARE, mage.cards.a.AegisOfTheMeek.class));
+ cards.add(new SetCardInfo("Altar of Bone", 359, Rarity.RARE, mage.cards.a.AltarOfBone.class));
+ cards.add(new SetCardInfo("Anarchy", 170, Rarity.UNCOMMON, mage.cards.a.Anarchy.class));
+ cards.add(new SetCardInfo("Arenson's Aura", 227, Rarity.COMMON, mage.cards.a.ArensonsAura.class));
+ cards.add(new SetCardInfo("Armor of Faith", 228, Rarity.COMMON, mage.cards.a.ArmorOfFaith.class));
+ cards.add(new SetCardInfo("Arnjlot's Ascent", 57, Rarity.COMMON, mage.cards.a.ArnjlotsAscent.class));
+ cards.add(new SetCardInfo("Aurochs", 113, Rarity.COMMON, mage.cards.a.Aurochs.class));
+ cards.add(new SetCardInfo("Balduvian Barbarians", 172, Rarity.COMMON, mage.cards.b.BalduvianBarbarians.class));
+ cards.add(new SetCardInfo("Balduvian Bears", 114, Rarity.COMMON, mage.cards.b.BalduvianBears.class));
+ cards.add(new SetCardInfo("Barbed Sextant", 287, Rarity.COMMON, mage.cards.b.BarbedSextant.class));
+ cards.add(new SetCardInfo("Battle Frenzy", 175, Rarity.COMMON, mage.cards.b.BattleFrenzy.class));
+ cards.add(new SetCardInfo("Binding Grasp", 60, Rarity.UNCOMMON, mage.cards.b.BindingGrasp.class));
+ cards.add(new SetCardInfo("Black Scarab", 230, Rarity.UNCOMMON, mage.cards.b.BlackScarab.class));
+ cards.add(new SetCardInfo("Blessed Wine", 231, Rarity.COMMON, mage.cards.b.BlessedWine.class));
+ cards.add(new SetCardInfo("Blinking Spirit", 232, Rarity.RARE, mage.cards.b.BlinkingSpirit.class));
+ cards.add(new SetCardInfo("Blue Scarab", 233, Rarity.UNCOMMON, mage.cards.b.BlueScarab.class));
+ cards.add(new SetCardInfo("Brainstorm", 61, Rarity.COMMON, mage.cards.b.Brainstorm.class));
+ cards.add(new SetCardInfo("Brand of Ill Omen", 177, Rarity.RARE, mage.cards.b.BrandOfIllOmen.class));
+ cards.add(new SetCardInfo("Brushland", 327, Rarity.RARE, mage.cards.b.Brushland.class));
+ cards.add(new SetCardInfo("Burnt Offering", 4, Rarity.COMMON, mage.cards.b.BurntOffering.class));
+ cards.add(new SetCardInfo("Caribou Range", 235, Rarity.RARE, mage.cards.c.CaribouRange.class));
+ cards.add(new SetCardInfo("Celestial Sword", 289, Rarity.RARE, mage.cards.c.CelestialSword.class));
+ cards.add(new SetCardInfo("Centaur Archer", 360, Rarity.UNCOMMON, mage.cards.c.CentaurArcher.class));
+ cards.add(new SetCardInfo("Chub Toad", 117, Rarity.COMMON, mage.cards.c.ChubToad.class));
+ cards.add(new SetCardInfo("Circle of Protection: Black", 236, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class));
+ cards.add(new SetCardInfo("Circle of Protection: Blue", 237, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class));
+ cards.add(new SetCardInfo("Circle of Protection: Green", 238, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class));
+ cards.add(new SetCardInfo("Circle of Protection: Red", 239, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class));
+ cards.add(new SetCardInfo("Circle of Protection: White", 240, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class));
+ cards.add(new SetCardInfo("Clairvoyance", 63, Rarity.COMMON, mage.cards.c.Clairvoyance.class));
+ cards.add(new SetCardInfo("Cold Snap", 241, Rarity.UNCOMMON, mage.cards.c.ColdSnap.class));
+ cards.add(new SetCardInfo("Conquer", 180, Rarity.UNCOMMON, mage.cards.c.Conquer.class));
+ cards.add(new SetCardInfo("Counterspell", 64, Rarity.COMMON, mage.cards.c.Counterspell.class));
+ cards.add(new SetCardInfo("Crown of the Ages", 290, Rarity.RARE, mage.cards.c.CrownOfTheAges.class));
+ cards.add(new SetCardInfo("Curse of Marit Lage", 181, Rarity.RARE, mage.cards.c.CurseOfMaritLage.class));
+ cards.add(new SetCardInfo("Dance of the Dead", 6, Rarity.UNCOMMON, mage.cards.d.DanceOfTheDead.class));
+ cards.add(new SetCardInfo("Dark Banishing", 7, Rarity.COMMON, mage.cards.d.DarkBanishing.class));
+ cards.add(new SetCardInfo("Dark Ritual", 8, Rarity.COMMON, mage.cards.d.DarkRitual.class));
+ cards.add(new SetCardInfo("Death Ward", 243, Rarity.COMMON, mage.cards.d.DeathWard.class));
+ cards.add(new SetCardInfo("Deflection", 65, Rarity.RARE, mage.cards.d.Deflection.class));
+ cards.add(new SetCardInfo("Demonic Consultation", 9, Rarity.UNCOMMON, mage.cards.d.DemonicConsultation.class));
+ cards.add(new SetCardInfo("Despotic Scepter", 291, Rarity.RARE, mage.cards.d.DespoticScepter.class));
+ cards.add(new SetCardInfo("Disenchant", 244, Rarity.COMMON, mage.cards.d.Disenchant.class));
+ cards.add(new SetCardInfo("Dwarven Armory", 182, Rarity.RARE, mage.cards.d.DwarvenArmory.class));
+ cards.add(new SetCardInfo("Elder Druid", 120, Rarity.RARE, mage.cards.e.ElderDruid.class));
+ cards.add(new SetCardInfo("Elemental Augury", 364, Rarity.RARE, mage.cards.e.ElementalAugury.class));
+ cards.add(new SetCardInfo("Enduring Renewal", 247, Rarity.RARE, mage.cards.e.EnduringRenewal.class));
+ cards.add(new SetCardInfo("Enervate", 67, Rarity.COMMON, mage.cards.e.Enervate.class));
+ cards.add(new SetCardInfo("Errantry", 183, Rarity.COMMON, mage.cards.e.Errantry.class));
+ cards.add(new SetCardInfo("Fanatical Fever", 122, Rarity.UNCOMMON, mage.cards.f.FanaticalFever.class));
+ cards.add(new SetCardInfo("Fear", 12, Rarity.COMMON, mage.cards.f.Fear.class));
+ cards.add(new SetCardInfo("Fiery Justice", 366, Rarity.RARE, mage.cards.f.FieryJustice.class));
+ cards.add(new SetCardInfo("Fire Covenant", 367, Rarity.UNCOMMON, mage.cards.f.FireCovenant.class));
+ cards.add(new SetCardInfo("Flame Spirit", 184, Rarity.UNCOMMON, mage.cards.f.FlameSpirit.class));
+ cards.add(new SetCardInfo("Flare", 185, Rarity.COMMON, mage.cards.f.Flare.class));
+ cards.add(new SetCardInfo("Flooded Woodlands", 368, Rarity.RARE, mage.cards.f.FloodedWoodlands.class));
+ cards.add(new SetCardInfo("Flow of Maggots", 13, Rarity.RARE, mage.cards.f.FlowOfMaggots.class));
+ cards.add(new SetCardInfo("Folk of the Pines", 123, Rarity.COMMON, mage.cards.f.FolkOfThePines.class));
+ cards.add(new SetCardInfo("Forbidden Lore", 124, Rarity.RARE, mage.cards.f.ForbiddenLore.class));
+ cards.add(new SetCardInfo("Force Void", 70, Rarity.UNCOMMON, mage.cards.f.ForceVoid.class));
+ cards.add(new SetCardInfo("Forest", 328, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Forest", 329, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Forest", 330, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Forgotten Lore", 125, Rarity.UNCOMMON, mage.cards.f.ForgottenLore.class));
+ cards.add(new SetCardInfo("Foul Familiar", 14, Rarity.COMMON, mage.cards.f.FoulFamiliar.class));
+ cards.add(new SetCardInfo("Fumarole", 369, Rarity.UNCOMMON, mage.cards.f.Fumarole.class));
+ cards.add(new SetCardInfo("Fyndhorn Bow", 293, Rarity.UNCOMMON, mage.cards.f.FyndhornBow.class));
+ cards.add(new SetCardInfo("Fyndhorn Brownie", 130, Rarity.COMMON, mage.cards.f.FyndhornBrownie.class));
+ cards.add(new SetCardInfo("Fyndhorn Elder", 131, Rarity.UNCOMMON, mage.cards.f.FyndhornElder.class));
+ cards.add(new SetCardInfo("Fyndhorn Elves", 132, Rarity.COMMON, mage.cards.f.FyndhornElves.class));
+ cards.add(new SetCardInfo("Game of Chaos", 186, Rarity.RARE, mage.cards.g.GameOfChaos.class));
+ cards.add(new SetCardInfo("Gangrenous Zombies", 15, Rarity.COMMON, mage.cards.g.GangrenousZombies.class));
+ cards.add(new SetCardInfo("Giant Growth", 134, Rarity.COMMON, mage.cards.g.GiantGrowth.class));
+ cards.add(new SetCardInfo("Giant Trap Door Spider", 371, Rarity.UNCOMMON, mage.cards.g.GiantTrapDoorSpider.class));
+ cards.add(new SetCardInfo("Glacial Chasm", 331, Rarity.UNCOMMON, mage.cards.g.GlacialChasm.class));
+ cards.add(new SetCardInfo("Glacial Crevasses", 187, Rarity.RARE, mage.cards.g.GlacialCrevasses.class));
+ cards.add(new SetCardInfo("Glacial Wall", 71, Rarity.UNCOMMON, mage.cards.g.GlacialWall.class));
+ cards.add(new SetCardInfo("Goblin Mutant", 188, Rarity.UNCOMMON, mage.cards.g.GoblinMutant.class));
+ cards.add(new SetCardInfo("Goblin Snowman", 191, Rarity.UNCOMMON, mage.cards.g.GoblinSnowman.class));
+ cards.add(new SetCardInfo("Gorilla Pack", 135, Rarity.COMMON, mage.cards.g.GorillaPack.class));
+ cards.add(new SetCardInfo("Gravebind", 17, Rarity.RARE, mage.cards.g.Gravebind.class));
+ cards.add(new SetCardInfo("Green Scarab", 252, Rarity.UNCOMMON, mage.cards.g.GreenScarab.class));
+ cards.add(new SetCardInfo("Hallowed Ground", 253, Rarity.UNCOMMON, mage.cards.h.HallowedGround.class));
+ cards.add(new SetCardInfo("Heal", 254, Rarity.COMMON, mage.cards.h.Heal.class));
+ cards.add(new SetCardInfo("Hecatomb", 18, Rarity.RARE, mage.cards.h.Hecatomb.class));
+ cards.add(new SetCardInfo("Hematite Talisman", 295, Rarity.UNCOMMON, mage.cards.h.HematiteTalisman.class));
+ cards.add(new SetCardInfo("Hoar Shade", 19, Rarity.COMMON, mage.cards.h.HoarShade.class));
+ cards.add(new SetCardInfo("Hot Springs", 136, Rarity.RARE, mage.cards.h.HotSprings.class));
+ cards.add(new SetCardInfo("Howl from Beyond", 20, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class));
+ cards.add(new SetCardInfo("Hurricane", 137, Rarity.UNCOMMON, mage.cards.h.Hurricane.class));
+ cards.add(new SetCardInfo("Hyalopterous Lemure", 21, Rarity.UNCOMMON, mage.cards.h.HyalopterousLemure.class));
+ cards.add(new SetCardInfo("Hydroblast", 72, Rarity.COMMON, mage.cards.h.Hydroblast.class));
+ cards.add(new SetCardInfo("Hymn of Rebirth", 373, Rarity.UNCOMMON, mage.cards.h.HymnOfRebirth.class));
+ cards.add(new SetCardInfo("Iceberg", 73, Rarity.UNCOMMON, mage.cards.i.Iceberg.class));
+ cards.add(new SetCardInfo("Icequake", 22, Rarity.UNCOMMON, mage.cards.i.Icequake.class));
+ cards.add(new SetCardInfo("Icy Manipulator", 297, Rarity.UNCOMMON, mage.cards.i.IcyManipulator.class));
+ cards.add(new SetCardInfo("Icy Prison", 74, Rarity.RARE, mage.cards.i.IcyPrison.class));
+ cards.add(new SetCardInfo("Illusionary Forces", 75, Rarity.COMMON, mage.cards.i.IllusionaryForces.class));
+ cards.add(new SetCardInfo("Illusionary Wall", 78, Rarity.COMMON, mage.cards.i.IllusionaryWall.class));
+ cards.add(new SetCardInfo("Illusions of Grandeur", 79, Rarity.RARE, mage.cards.i.IllusionsOfGrandeur.class));
+ cards.add(new SetCardInfo("Imposing Visage", 193, Rarity.COMMON, mage.cards.i.ImposingVisage.class));
+ cards.add(new SetCardInfo("Incinerate", 194, Rarity.COMMON, mage.cards.i.Incinerate.class));
+ cards.add(new SetCardInfo("Infernal Darkness", 23, Rarity.RARE, mage.cards.i.InfernalDarkness.class));
+ cards.add(new SetCardInfo("Infuse", 80, Rarity.COMMON, mage.cards.i.Infuse.class));
+ cards.add(new SetCardInfo("Island", 334, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Island", 335, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Island", 336, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Jester's Cap", 299, Rarity.RARE, mage.cards.j.JestersCap.class));
+ cards.add(new SetCardInfo("Jester's Mask", 300, Rarity.RARE, mage.cards.j.JestersMask.class));
+ cards.add(new SetCardInfo("Jeweled Amulet", 301, Rarity.UNCOMMON, mage.cards.j.JeweledAmulet.class));
+ cards.add(new SetCardInfo("Johtull Wurm", 138, Rarity.UNCOMMON, mage.cards.j.JohtullWurm.class));
+ cards.add(new SetCardInfo("Jokulhaups", 195, Rarity.RARE, mage.cards.j.Jokulhaups.class));
+ cards.add(new SetCardInfo("Juniper Order Druid", 139, Rarity.COMMON, mage.cards.j.JuniperOrderDruid.class));
+ cards.add(new SetCardInfo("Justice", 256, Rarity.UNCOMMON, mage.cards.j.Justice.class));
+ cards.add(new SetCardInfo("Karplusan Forest", 337, Rarity.RARE, mage.cards.k.KarplusanForest.class));
+ cards.add(new SetCardInfo("Karplusan Yeti", 197, Rarity.RARE, mage.cards.k.KarplusanYeti.class));
+ cards.add(new SetCardInfo("Kjeldoran Dead", 25, Rarity.COMMON, mage.cards.k.KjeldoranDead.class));
+ cards.add(new SetCardInfo("Kjeldoran Royal Guard", 262, Rarity.RARE, mage.cards.k.KjeldoranRoyalGuard.class));
+ cards.add(new SetCardInfo("Knight of Stromgald", 26, Rarity.UNCOMMON, mage.cards.k.KnightOfStromgald.class));
+ cards.add(new SetCardInfo("Krovikan Fetish", 28, Rarity.COMMON, mage.cards.k.KrovikanFetish.class));
+ cards.add(new SetCardInfo("Krovikan Sorcerer", 81, Rarity.COMMON, mage.cards.k.KrovikanSorcerer.class));
+ cards.add(new SetCardInfo("Land Cap", 338, Rarity.RARE, mage.cards.l.LandCap.class));
+ cards.add(new SetCardInfo("Lapis Lazuli Talisman", 302, Rarity.UNCOMMON, mage.cards.l.LapisLazuliTalisman.class));
+ cards.add(new SetCardInfo("Lava Tubes", 339, Rarity.RARE, mage.cards.l.LavaTubes.class));
+ cards.add(new SetCardInfo("Legions of Lim-Dul", 30, Rarity.COMMON, mage.cards.l.LegionsOfLimDul.class));
+ cards.add(new SetCardInfo("Leshrac's Rite", 31, Rarity.UNCOMMON, mage.cards.l.LeshracsRite.class));
+ cards.add(new SetCardInfo("Lhurgoyf", 140, Rarity.RARE, mage.cards.l.Lhurgoyf.class));
+ cards.add(new SetCardInfo("Lightning Blow", 266, Rarity.RARE, mage.cards.l.LightningBlow.class));
+ cards.add(new SetCardInfo("Lure", 141, Rarity.UNCOMMON, mage.cards.l.Lure.class));
+ cards.add(new SetCardInfo("Magus of the Unseen", 82, Rarity.RARE, mage.cards.m.MagusOfTheUnseen.class));
+ cards.add(new SetCardInfo("Malachite Talisman", 303, Rarity.UNCOMMON, mage.cards.m.MalachiteTalisman.class));
+ cards.add(new SetCardInfo("Marton Stromgald", 199, Rarity.RARE, mage.cards.m.MartonStromgald.class));
+ cards.add(new SetCardInfo("Merieke Ri Berit", 375, Rarity.RARE, mage.cards.m.MeriekeRiBerit.class));
+ cards.add(new SetCardInfo("Mesmeric Trance", 83, Rarity.RARE, mage.cards.m.MesmericTrance.class));
+ cards.add(new SetCardInfo("Mind Ravel", 35, Rarity.COMMON, mage.cards.m.MindRavel.class));
+ cards.add(new SetCardInfo("Mind Warp", 36, Rarity.UNCOMMON, mage.cards.m.MindWarp.class));
+ cards.add(new SetCardInfo("Mole Worms", 40, Rarity.UNCOMMON, mage.cards.m.MoleWorms.class));
+ cards.add(new SetCardInfo("Moor Fiend", 41, Rarity.COMMON, mage.cards.m.MoorFiend.class));
+ cards.add(new SetCardInfo("Mountain", 340, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Mountain", 341, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Mountain", 342, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Mountain Goat", 203, Rarity.COMMON, mage.cards.m.MountainGoat.class));
+ cards.add(new SetCardInfo("Mudslide", 204, Rarity.RARE, mage.cards.m.Mudslide.class));
+ cards.add(new SetCardInfo("Mystic Might", 86, Rarity.RARE, mage.cards.m.MysticMight.class));
+ cards.add(new SetCardInfo("Mystic Remora", 87, Rarity.COMMON, mage.cards.m.MysticRemora.class));
+ cards.add(new SetCardInfo("Nacre Talisman", 304, Rarity.UNCOMMON, mage.cards.n.NacreTalisman.class));
+ cards.add(new SetCardInfo("Naked Singularity", 305, Rarity.RARE, mage.cards.n.NakedSingularity.class));
+ cards.add(new SetCardInfo("Nature's Lore", 143, Rarity.UNCOMMON, mage.cards.n.NaturesLore.class));
+ cards.add(new SetCardInfo("Necropotence", 42, Rarity.RARE, mage.cards.n.Necropotence.class));
+ cards.add(new SetCardInfo("Onyx Talisman", 306, Rarity.UNCOMMON, mage.cards.o.OnyxTalisman.class));
+ cards.add(new SetCardInfo("Orcish Cannoneers", 205, Rarity.UNCOMMON, mage.cards.o.OrcishCannoneers.class));
+ cards.add(new SetCardInfo("Orcish Healer", 208, Rarity.UNCOMMON, mage.cards.o.OrcishHealer.class));
+ cards.add(new SetCardInfo("Orcish Librarian", 209, Rarity.RARE, mage.cards.o.OrcishLibrarian.class));
+ cards.add(new SetCardInfo("Orcish Lumberjack", 210, Rarity.COMMON, mage.cards.o.OrcishLumberjack.class));
+ cards.add(new SetCardInfo("Order of the Sacred Torch", 269, Rarity.RARE, mage.cards.o.OrderOfTheSacredTorch.class));
+ cards.add(new SetCardInfo("Order of the White Shield", 270, Rarity.UNCOMMON, mage.cards.o.OrderOfTheWhiteShield.class));
+ cards.add(new SetCardInfo("Pale Bears", 144, Rarity.RARE, mage.cards.p.PaleBears.class));
+ cards.add(new SetCardInfo("Panic", 212, Rarity.COMMON, mage.cards.p.Panic.class));
+ cards.add(new SetCardInfo("Pentagram of the Ages", 307, Rarity.RARE, mage.cards.p.PentagramOfTheAges.class));
+ cards.add(new SetCardInfo("Pestilence Rats", 45, Rarity.COMMON, mage.cards.p.PestilenceRats.class));
+ cards.add(new SetCardInfo("Pit Trap", 308, Rarity.UNCOMMON, mage.cards.p.PitTrap.class));
+ cards.add(new SetCardInfo("Plains", 343, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Plains", 344, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Plains", 345, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Polar Kraken", 89, Rarity.RARE, mage.cards.p.PolarKraken.class));
+ cards.add(new SetCardInfo("Portent", 90, Rarity.COMMON, mage.cards.p.Portent.class));
+ cards.add(new SetCardInfo("Power Sink", 91, Rarity.COMMON, mage.cards.p.PowerSink.class));
+ cards.add(new SetCardInfo("Pox", 46, Rarity.RARE, mage.cards.p.Pox.class));
+ cards.add(new SetCardInfo("Pygmy Allosaurus", 145, Rarity.RARE, mage.cards.p.PygmyAllosaurus.class));
+ cards.add(new SetCardInfo("Pyknite", 146, Rarity.COMMON, mage.cards.p.Pyknite.class));
+ cards.add(new SetCardInfo("Pyroblast", 213, Rarity.COMMON, mage.cards.p.Pyroblast.class));
+ cards.add(new SetCardInfo("Pyroclasm", 214, Rarity.UNCOMMON, mage.cards.p.Pyroclasm.class));
+ cards.add(new SetCardInfo("Rally", 272, Rarity.COMMON, mage.cards.r.Rally.class));
+ cards.add(new SetCardInfo("Ray of Command", 92, Rarity.COMMON, mage.cards.r.RayOfCommand.class));
+ cards.add(new SetCardInfo("Ray of Erasure", 93, Rarity.COMMON, mage.cards.r.RayOfErasure.class));
+ cards.add(new SetCardInfo("Reclamation", 378, Rarity.RARE, mage.cards.r.Reclamation.class));
+ cards.add(new SetCardInfo("Red Scarab", 273, Rarity.UNCOMMON, mage.cards.r.RedScarab.class));
+ cards.add(new SetCardInfo("Regeneration", 147, Rarity.COMMON, mage.cards.r.Regeneration.class));
+ cards.add(new SetCardInfo("Rime Dryad", 148, Rarity.COMMON, mage.cards.r.RimeDryad.class));
+ cards.add(new SetCardInfo("Ritual of Subdual", 149, Rarity.RARE, mage.cards.r.RitualOfSubdual.class));
+ cards.add(new SetCardInfo("River Delta", 346, Rarity.RARE, mage.cards.r.RiverDelta.class));
+ cards.add(new SetCardInfo("Sabretooth Tiger", 215, Rarity.COMMON, mage.cards.s.SabretoothTiger.class));
+ cards.add(new SetCardInfo("Scaled Wurm", 150, Rarity.COMMON, mage.cards.s.ScaledWurm.class));
+ cards.add(new SetCardInfo("Sea Spirit", 95, Rarity.UNCOMMON, mage.cards.s.SeaSpirit.class));
+ cards.add(new SetCardInfo("Seizures", 47, Rarity.COMMON, mage.cards.s.Seizures.class));
+ cards.add(new SetCardInfo("Shambling Strider", 151, Rarity.COMMON, mage.cards.s.ShamblingStrider.class));
+ cards.add(new SetCardInfo("Shatter", 216, Rarity.COMMON, mage.cards.s.Shatter.class));
+ cards.add(new SetCardInfo("Shield of the Ages", 310, Rarity.UNCOMMON, mage.cards.s.ShieldOfTheAges.class));
+ cards.add(new SetCardInfo("Sibilant Spirit", 97, Rarity.RARE, mage.cards.s.SibilantSpirit.class));
+ cards.add(new SetCardInfo("Silver Erne", 98, Rarity.UNCOMMON, mage.cards.s.SilverErne.class));
+ cards.add(new SetCardInfo("Skeleton Ship", 379, Rarity.RARE, mage.cards.s.SkeletonShip.class));
+ cards.add(new SetCardInfo("Skull Catapult", 311, Rarity.UNCOMMON, mage.cards.s.SkullCatapult.class));
+ cards.add(new SetCardInfo("Snow-Covered Forest", 347, Rarity.COMMON, mage.cards.s.SnowCoveredForest.class));
+ cards.add(new SetCardInfo("Snow-Covered Island", 348, Rarity.COMMON, mage.cards.s.SnowCoveredIsland.class));
+ cards.add(new SetCardInfo("Snow-Covered Mountain", 349, Rarity.COMMON, mage.cards.s.SnowCoveredMountain.class));
+ cards.add(new SetCardInfo("Snow-Covered Plains", 350, Rarity.COMMON, mage.cards.s.SnowCoveredPlains.class));
+ cards.add(new SetCardInfo("Snow-Covered Swamp", 351, Rarity.COMMON, mage.cards.s.SnowCoveredSwamp.class));
+ cards.add(new SetCardInfo("Snow Hound", 277, Rarity.UNCOMMON, mage.cards.s.SnowHound.class));
+ cards.add(new SetCardInfo("Soldevi Machinist", 102, Rarity.UNCOMMON, mage.cards.s.SoldeviMachinist.class));
+ cards.add(new SetCardInfo("Soldevi Simulacrum", 314, Rarity.UNCOMMON, mage.cards.s.SoldeviSimulacrum.class));
+ cards.add(new SetCardInfo("Songs of the Damned", 48, Rarity.COMMON, mage.cards.s.SongsOfTheDamned.class));
+ cards.add(new SetCardInfo("Soul Barrier", 103, Rarity.UNCOMMON, mage.cards.s.SoulBarrier.class));
+ cards.add(new SetCardInfo("Soul Burn", 361, Rarity.COMMON, mage.cards.s.SoulBurn.class));
+ cards.add(new SetCardInfo("Soul Kiss", 50, Rarity.COMMON, mage.cards.s.SoulKiss.class));
+ cards.add(new SetCardInfo("Spoils of Evil", 51, Rarity.RARE, mage.cards.s.SpoilsOfEvil.class));
+ cards.add(new SetCardInfo("Stampede", 153, Rarity.RARE, mage.cards.s.Stampede.class));
+ cards.add(new SetCardInfo("Stonehands", 219, Rarity.COMMON, mage.cards.s.Stonehands.class));
+ cards.add(new SetCardInfo("Stone Rain", 217, Rarity.COMMON, mage.cards.s.StoneRain.class));
+ cards.add(new SetCardInfo("Stone Spirit", 218, Rarity.UNCOMMON, mage.cards.s.StoneSpirit.class));
+ cards.add(new SetCardInfo("Stormbind", 382, Rarity.RARE, mage.cards.s.Stormbind.class));
+ cards.add(new SetCardInfo("Storm Spirit", 381, Rarity.RARE, mage.cards.s.StormSpirit.class));
+ cards.add(new SetCardInfo("Stromgald Cabal", 54, Rarity.RARE, mage.cards.s.StromgaldCabal.class));
+ cards.add(new SetCardInfo("Stunted Growth", 154, Rarity.RARE, mage.cards.s.StuntedGrowth.class));
+ cards.add(new SetCardInfo("Sulfurous Springs", 352, Rarity.RARE, mage.cards.s.SulfurousSprings.class));
+ cards.add(new SetCardInfo("Sunstone", 316, Rarity.UNCOMMON, mage.cards.s.Sunstone.class));
+ cards.add(new SetCardInfo("Swamp", 353, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Swamp", 354, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Swamp", 355, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Swords to Plowshares", 278, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class));
+ cards.add(new SetCardInfo("Tarpan", 155, Rarity.COMMON, mage.cards.t.Tarpan.class));
+ cards.add(new SetCardInfo("Thermokarst", 156, Rarity.UNCOMMON, mage.cards.t.Thermokarst.class));
+ cards.add(new SetCardInfo("Thoughtleech", 157, Rarity.UNCOMMON, mage.cards.t.Thoughtleech.class));
+ cards.add(new SetCardInfo("Thunder Wall", 104, Rarity.UNCOMMON, mage.cards.t.ThunderWall.class));
+ cards.add(new SetCardInfo("Timberline Ridge", 356, Rarity.RARE, mage.cards.t.TimberlineRidge.class));
+ cards.add(new SetCardInfo("Time Bomb", 317, Rarity.RARE, mage.cards.t.TimeBomb.class));
+ cards.add(new SetCardInfo("Tinder Wall", 158, Rarity.COMMON, mage.cards.t.TinderWall.class));
+ cards.add(new SetCardInfo("Tor Giant", 220, Rarity.COMMON, mage.cards.t.TorGiant.class));
+ cards.add(new SetCardInfo("Touch of Death", 55, Rarity.COMMON, mage.cards.t.TouchOfDeath.class));
+ cards.add(new SetCardInfo("Underground River", 357, Rarity.RARE, mage.cards.u.UndergroundRiver.class));
+ cards.add(new SetCardInfo("Updraft", 105, Rarity.UNCOMMON, mage.cards.u.Updraft.class));
+ cards.add(new SetCardInfo("Urza's Bauble", 318, Rarity.UNCOMMON, mage.cards.u.UrzasBauble.class));
+ cards.add(new SetCardInfo("Veldt", 358, Rarity.RARE, mage.cards.v.Veldt.class));
+ cards.add(new SetCardInfo("Vertigo", 222, Rarity.UNCOMMON, mage.cards.v.Vertigo.class));
+ cards.add(new SetCardInfo("Walking Wall", 321, Rarity.UNCOMMON, mage.cards.w.WalkingWall.class));
+ cards.add(new SetCardInfo("Wall of Lava", 223, Rarity.UNCOMMON, mage.cards.w.WallOfLava.class));
+ cards.add(new SetCardInfo("Wall of Pine Needles", 162, Rarity.UNCOMMON, mage.cards.w.WallOfPineNeedles.class));
+ cards.add(new SetCardInfo("War Chariot", 323, Rarity.UNCOMMON, mage.cards.w.WarChariot.class));
+ cards.add(new SetCardInfo("Warning", 279, Rarity.COMMON, mage.cards.w.Warning.class));
+ cards.add(new SetCardInfo("Whiteout", 163, Rarity.UNCOMMON, mage.cards.w.Whiteout.class));
+ cards.add(new SetCardInfo("White Scarab", 280, Rarity.UNCOMMON, mage.cards.w.WhiteScarab.class));
+ cards.add(new SetCardInfo("Wild Growth", 165, Rarity.COMMON, mage.cards.w.WildGrowth.class));
+ cards.add(new SetCardInfo("Wind Spirit", 106, Rarity.UNCOMMON, mage.cards.w.WindSpirit.class));
+ cards.add(new SetCardInfo("Wings of Aesthir", 383, Rarity.UNCOMMON, mage.cards.w.WingsOfAesthir.class));
+ cards.add(new SetCardInfo("Word of Blasting", 224, Rarity.UNCOMMON, mage.cards.w.WordOfBlasting.class));
+ cards.add(new SetCardInfo("Wrath of Marit Lage", 109, Rarity.RARE, mage.cards.w.WrathOfMaritLage.class));
+ cards.add(new SetCardInfo("Yavimaya Gnats", 168, Rarity.UNCOMMON, mage.cards.y.YavimayaGnats.class));
+ cards.add(new SetCardInfo("Zuran Enchanter", 110, Rarity.COMMON, mage.cards.z.ZuranEnchanter.class));
+ cards.add(new SetCardInfo("Zuran Orb", 325, Rarity.UNCOMMON, mage.cards.z.ZuranOrb.class));
+ cards.add(new SetCardInfo("Zuran Spellcaster", 111, Rarity.COMMON, mage.cards.z.ZuranSpellcaster.class));
+ cards.add(new SetCardInfo("Zur's Weirding", 112, Rarity.RARE, mage.cards.z.ZursWeirding.class));
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/MercadianMasques.java b/Mage.Sets/src/mage/sets/MercadianMasques.java
index b504288d704..cc1131be170 100644
--- a/Mage.Sets/src/mage/sets/MercadianMasques.java
+++ b/Mage.Sets/src/mage/sets/MercadianMasques.java
@@ -63,6 +63,7 @@ public class MercadianMasques extends ExpansionSet {
cards.add(new SetCardInfo("Balloon Peddler", 59, Rarity.COMMON, mage.cards.b.BalloonPeddler.class));
cards.add(new SetCardInfo("Battle Rampart", 173, Rarity.COMMON, mage.cards.b.BattleRampart.class));
cards.add(new SetCardInfo("Battle Squadron", 174, Rarity.RARE, mage.cards.b.BattleSquadron.class));
+ cards.add(new SetCardInfo("Bifurcate", 230, Rarity.RARE, mage.cards.b.Bifurcate.class));
cards.add(new SetCardInfo("Black Market", 116, Rarity.RARE, mage.cards.b.BlackMarket.class));
cards.add(new SetCardInfo("Blaster Mage", 175, Rarity.COMMON, mage.cards.b.BlasterMage.class));
cards.add(new SetCardInfo("Blockade Runner", 60, Rarity.COMMON, mage.cards.b.BlockadeRunner.class));
diff --git a/Mage.Sets/src/mage/sets/Mirage.java b/Mage.Sets/src/mage/sets/Mirage.java
index 8689311b769..0988b782eb3 100644
--- a/Mage.Sets/src/mage/sets/Mirage.java
+++ b/Mage.Sets/src/mage/sets/Mirage.java
@@ -155,6 +155,7 @@ public class Mirage extends ExpansionSet {
cards.add(new SetCardInfo("Harmattan Efreet", 69, Rarity.UNCOMMON, mage.cards.h.HarmattanEfreet.class));
cards.add(new SetCardInfo("Hazerider Drake", 328, Rarity.UNCOMMON, mage.cards.h.HazeriderDrake.class));
cards.add(new SetCardInfo("Healing Salve", 224, Rarity.COMMON, mage.cards.h.HealingSalve.class));
+ cards.add(new SetCardInfo("Hivis of the Scale", 182, Rarity.RARE, mage.cards.h.HivisOfTheScale.class));
cards.add(new SetCardInfo("Horrible Hordes", 269, Rarity.UNCOMMON, mage.cards.h.HorribleHordes.class));
cards.add(new SetCardInfo("Igneous Golem", 270, Rarity.UNCOMMON, mage.cards.i.IgneousGolem.class));
cards.add(new SetCardInfo("Illicit Auction", 183, Rarity.RARE, mage.cards.i.IllicitAuction.class));
diff --git a/Mage.Sets/src/mage/sets/Nemesis.java b/Mage.Sets/src/mage/sets/Nemesis.java
index 1a84b91e6eb..61a7be980b3 100644
--- a/Mage.Sets/src/mage/sets/Nemesis.java
+++ b/Mage.Sets/src/mage/sets/Nemesis.java
@@ -103,6 +103,7 @@ public class Nemesis extends ExpansionSet {
cards.add(new SetCardInfo("Oracle's Attendants", 16, Rarity.RARE, mage.cards.o.OraclesAttendants.class));
cards.add(new SetCardInfo("Oraxid", 35, Rarity.COMMON, mage.cards.o.Oraxid.class));
cards.add(new SetCardInfo("Overlaid Terrain", 108, Rarity.RARE, mage.cards.o.OverlaidTerrain.class));
+ cards.add(new SetCardInfo("Pack Hunt", 109, Rarity.RARE, mage.cards.p.PackHunt.class));
cards.add(new SetCardInfo("Parallax Dementia", 62, Rarity.COMMON, mage.cards.p.ParallaxDementia.class));
cards.add(new SetCardInfo("Parallax Inhibitor", 134, Rarity.RARE, mage.cards.p.ParallaxInhibitor.class));
cards.add(new SetCardInfo("Parallax Nexus", 63, Rarity.RARE, mage.cards.p.ParallaxNexus.class));
diff --git a/Mage.Sets/src/mage/sets/Onslaught.java b/Mage.Sets/src/mage/sets/Onslaught.java
index 3f9981c160c..f4f2963c16e 100644
--- a/Mage.Sets/src/mage/sets/Onslaught.java
+++ b/Mage.Sets/src/mage/sets/Onslaught.java
@@ -312,6 +312,8 @@ public class Onslaught extends ExpansionSet {
cards.add(new SetCardInfo("Wirewood Savage", 304, Rarity.COMMON, mage.cards.w.WirewoodSavage.class));
cards.add(new SetCardInfo("Wooded Foothills", 330, Rarity.RARE, mage.cards.w.WoodedFoothills.class, new CardGraphicInfo(new ObjectColor("RG"), null, false)));
cards.add(new SetCardInfo("Words of War", 244, Rarity.RARE, mage.cards.w.WordsOfWar.class));
+ cards.add(new SetCardInfo("Words of Waste", 182, Rarity.RARE, mage.cards.w.WordsOfWaste.class));
+ cards.add(new SetCardInfo("Words of Wilding", 305, Rarity.RARE, mage.cards.w.WordsOfWilding.class));
cards.add(new SetCardInfo("Words of Wind", 122, Rarity.RARE, mage.cards.w.WordsOfWind.class));
cards.add(new SetCardInfo("Words of Worship", 61, Rarity.RARE, mage.cards.w.WordsOfWorship.class));
cards.add(new SetCardInfo("Wretched Anurid", 183, Rarity.COMMON, mage.cards.w.WretchedAnurid.class));
diff --git a/Mage.Sets/src/mage/sets/Planeshift.java b/Mage.Sets/src/mage/sets/Planeshift.java
index 98c1684d1c7..1efee2f61ca 100644
--- a/Mage.Sets/src/mage/sets/Planeshift.java
+++ b/Mage.Sets/src/mage/sets/Planeshift.java
@@ -138,6 +138,7 @@ public class Planeshift extends ExpansionSet {
cards.add(new SetCardInfo("Planeswalker's Favor", 86, Rarity.RARE, mage.cards.p.PlaneswalkersFavor.class));
cards.add(new SetCardInfo("Planeswalker's Fury", 70, Rarity.RARE, mage.cards.p.PlaneswalkersFury.class));
cards.add(new SetCardInfo("Planeswalker's Mirth", 12, Rarity.RARE, mage.cards.p.PlaneswalkersMirth.class));
+ cards.add(new SetCardInfo("Planeswalker's Mischief", 29, Rarity.RARE, mage.cards.p.PlaneswalkersMischief.class));
cards.add(new SetCardInfo("Planeswalker's Scorn", 52, Rarity.RARE, mage.cards.p.PlaneswalkersScorn.class));
cards.add(new SetCardInfo("Pollen Remedy", 13, Rarity.COMMON, mage.cards.p.PollenRemedy.class));
cards.add(new SetCardInfo("Primal Growth", 87, Rarity.COMMON, mage.cards.p.PrimalGrowth.class));
diff --git a/Mage.Sets/src/mage/sets/TimeSpiral.java b/Mage.Sets/src/mage/sets/TimeSpiral.java
index f9e042690f1..fc5cf0319c1 100644
--- a/Mage.Sets/src/mage/sets/TimeSpiral.java
+++ b/Mage.Sets/src/mage/sets/TimeSpiral.java
@@ -1,323 +1,325 @@
-package mage.sets;
-
-import java.util.List;
-import mage.cards.Card;
-import mage.cards.CardGraphicInfo;
-import mage.cards.ExpansionSet;
-import mage.cards.repository.CardCriteria;
-import mage.cards.repository.CardRepository;
-import mage.constants.Rarity;
-import mage.constants.SetType;
-
-public class TimeSpiral extends ExpansionSet {
-
- private static final TimeSpiral instance = new TimeSpiral();
-
- public static TimeSpiral getInstance() {
- return instance;
- }
-
- private TimeSpiral() {
- super("Time Spiral", "TSP", ExpansionSet.buildDate(2006, 9, 9), SetType.EXPANSION);
- this.blockName = "Time Spiral";
- this.hasBoosters = true;
- this.numBoosterLands = 0;
- this.numBoosterCommon = 10;
- this.numBoosterUncommon = 3;
- this.numBoosterRare = 1;
- this.ratioBoosterMythic = 0;
- cards.add(new SetCardInfo("Academy Ruins", 269, Rarity.RARE, mage.cards.a.AcademyRuins.class));
- cards.add(new SetCardInfo("Amrou Scout", 1, Rarity.COMMON, mage.cards.a.AmrouScout.class));
- cards.add(new SetCardInfo("Amrou Seekers", 2, Rarity.COMMON, mage.cards.a.AmrouSeekers.class));
- cards.add(new SetCardInfo("Ancestral Vision", 48, Rarity.RARE, mage.cards.a.AncestralVision.class));
- cards.add(new SetCardInfo("Ancient Grudge", 143, Rarity.COMMON, mage.cards.a.AncientGrudge.class));
- cards.add(new SetCardInfo("Angel's Grace", 3, Rarity.RARE, mage.cards.a.AngelsGrace.class));
- cards.add(new SetCardInfo("Ashcoat Bear", 190, Rarity.COMMON, mage.cards.a.AshcoatBear.class));
- cards.add(new SetCardInfo("Aspect of Mongoose", 191, Rarity.UNCOMMON, mage.cards.a.AspectOfMongoose.class));
- cards.add(new SetCardInfo("Assassinate", 95, Rarity.COMMON, mage.cards.a.Assassinate.class));
- cards.add(new SetCardInfo("Assembly-Worker", 248, Rarity.UNCOMMON, mage.cards.a.AssemblyWorker.class));
- cards.add(new SetCardInfo("Barbed Shocker", 144, Rarity.UNCOMMON, mage.cards.b.BarbedShocker.class));
- cards.add(new SetCardInfo("Basal Sliver", 96, Rarity.COMMON, mage.cards.b.BasalSliver.class));
- cards.add(new SetCardInfo("Basalt Gargoyle", 145, Rarity.UNCOMMON, mage.cards.b.BasaltGargoyle.class));
- cards.add(new SetCardInfo("Benalish Cavalry", 4, Rarity.COMMON, mage.cards.b.BenalishCavalry.class));
- cards.add(new SetCardInfo("Bewilder", 49, Rarity.COMMON, mage.cards.b.Bewilder.class));
- cards.add(new SetCardInfo("Blazing Blade Askari", 146, Rarity.COMMON, mage.cards.b.BlazingBladeAskari.class));
- cards.add(new SetCardInfo("Bogardan Hellkite", 147, Rarity.RARE, mage.cards.b.BogardanHellkite.class));
- cards.add(new SetCardInfo("Bogardan Rager", 148, Rarity.COMMON, mage.cards.b.BogardanRager.class));
- cards.add(new SetCardInfo("Bonesplitter Sliver", 149, Rarity.COMMON, mage.cards.b.BonesplitterSliver.class));
- cards.add(new SetCardInfo("Brass Gnat", 249, Rarity.COMMON, mage.cards.b.BrassGnat.class));
- cards.add(new SetCardInfo("Brine Elemental", 50, Rarity.UNCOMMON, mage.cards.b.BrineElemental.class));
- cards.add(new SetCardInfo("Calciform Pools", 270, Rarity.UNCOMMON, mage.cards.c.CalciformPools.class));
- cards.add(new SetCardInfo("Call to the Netherworld", 97, Rarity.COMMON, mage.cards.c.CallToTheNetherworld.class));
- cards.add(new SetCardInfo("Cancel", 51, Rarity.COMMON, mage.cards.c.Cancel.class));
- cards.add(new SetCardInfo("Candles of Leng", 250, Rarity.RARE, mage.cards.c.CandlesOfLeng.class));
- cards.add(new SetCardInfo("Careful Consideration", 52, Rarity.UNCOMMON, mage.cards.c.CarefulConsideration.class));
- cards.add(new SetCardInfo("Castle Raptors", 5, Rarity.COMMON, mage.cards.c.CastleRaptors.class));
- cards.add(new SetCardInfo("Cavalry Master", 6, Rarity.UNCOMMON, mage.cards.c.CavalryMaster.class));
- cards.add(new SetCardInfo("Celestial Crusader", 7, Rarity.UNCOMMON, mage.cards.c.CelestialCrusader.class));
- cards.add(new SetCardInfo("Children of Korlis", 8, Rarity.COMMON, mage.cards.c.ChildrenOfKorlis.class));
- cards.add(new SetCardInfo("Chromatic Star", 251, Rarity.COMMON, mage.cards.c.ChromaticStar.class));
- cards.add(new SetCardInfo("Chronatog Totem", 252, Rarity.UNCOMMON, mage.cards.c.ChronatogTotem.class));
- cards.add(new SetCardInfo("Chronosavant", 9, Rarity.RARE, mage.cards.c.Chronosavant.class));
- cards.add(new SetCardInfo("Clockspinning", 53, Rarity.COMMON, mage.cards.c.Clockspinning.class));
- cards.add(new SetCardInfo("Clockwork Hydra", 253, Rarity.UNCOMMON, mage.cards.c.ClockworkHydra.class));
- cards.add(new SetCardInfo("Cloudchaser Kestrel", 10, Rarity.COMMON, mage.cards.c.CloudchaserKestrel.class));
- cards.add(new SetCardInfo("Coal Stoker", 150, Rarity.COMMON, mage.cards.c.CoalStoker.class));
- cards.add(new SetCardInfo("Conflagrate", 151, Rarity.UNCOMMON, mage.cards.c.Conflagrate.class));
- cards.add(new SetCardInfo("Coral Trickster", 54, Rarity.COMMON, mage.cards.c.CoralTrickster.class));
- cards.add(new SetCardInfo("Corpulent Corpse", 98, Rarity.COMMON, mage.cards.c.CorpulentCorpse.class));
- cards.add(new SetCardInfo("Crookclaw Transmuter", 55, Rarity.COMMON, mage.cards.c.CrookclawTransmuter.class));
- cards.add(new SetCardInfo("Curse of the Cabal", 99, Rarity.RARE, mage.cards.c.CurseOfTheCabal.class));
- cards.add(new SetCardInfo("Dark Withering", 101, Rarity.COMMON, mage.cards.d.DarkWithering.class));
- cards.add(new SetCardInfo("D'Avenant Healer", 11, Rarity.COMMON, mage.cards.d.DAvenantHealer.class));
- cards.add(new SetCardInfo("Deathspore Thallid", 102, Rarity.COMMON, mage.cards.d.DeathsporeThallid.class));
- cards.add(new SetCardInfo("Deep-Sea Kraken", 56, Rarity.RARE, mage.cards.d.DeepSeaKraken.class));
- cards.add(new SetCardInfo("Dementia Sliver", 236, Rarity.UNCOMMON, mage.cards.d.DementiaSliver.class));
- cards.add(new SetCardInfo("Demonic Collusion", 103, Rarity.RARE, mage.cards.d.DemonicCollusion.class));
- cards.add(new SetCardInfo("Draining Whelk", 57, Rarity.RARE, mage.cards.d.DrainingWhelk.class));
- cards.add(new SetCardInfo("Dralnu, Lich Lord", 237, Rarity.RARE, mage.cards.d.DralnuLichLord.class));
- cards.add(new SetCardInfo("Dread Return", 104, Rarity.UNCOMMON, mage.cards.d.DreadReturn.class));
- cards.add(new SetCardInfo("Dreadship Reef", 271, Rarity.UNCOMMON, mage.cards.d.DreadshipReef.class));
- cards.add(new SetCardInfo("Dream Stalker", 58, Rarity.COMMON, mage.cards.d.DreamStalker.class));
- cards.add(new SetCardInfo("Drifter il-Dal", 59, Rarity.COMMON, mage.cards.d.DrifterIlDal.class));
- cards.add(new SetCardInfo("Drudge Reavers", 105, Rarity.COMMON, mage.cards.d.DrudgeReavers.class));
- cards.add(new SetCardInfo("Durkwood Baloth", 193, Rarity.COMMON, mage.cards.d.DurkwoodBaloth.class));
- cards.add(new SetCardInfo("Duskrider Peregrine", 14, Rarity.UNCOMMON, mage.cards.d.DuskriderPeregrine.class));
- cards.add(new SetCardInfo("Empty the Warrens", 152, Rarity.COMMON, mage.cards.e.EmptyTheWarrens.class));
- cards.add(new SetCardInfo("Endrek Sahr, Master Breeder", 106, Rarity.RARE, mage.cards.e.EndrekSahrMasterBreeder.class));
- cards.add(new SetCardInfo("Errant Doomsayers", 15, Rarity.COMMON, mage.cards.e.ErrantDoomsayers.class));
- cards.add(new SetCardInfo("Errant Ephemeron", 60, Rarity.COMMON, mage.cards.e.ErrantEphemeron.class));
- cards.add(new SetCardInfo("Eternity Snare", 61, Rarity.COMMON, mage.cards.e.EternitySnare.class));
- cards.add(new SetCardInfo("Evangelize", 16, Rarity.RARE, mage.cards.e.Evangelize.class));
- cards.add(new SetCardInfo("Evil Eye of Urborg", 107, Rarity.UNCOMMON, mage.cards.e.EvilEyeOfUrborg.class));
- cards.add(new SetCardInfo("Faceless Devourer", 108, Rarity.UNCOMMON, mage.cards.f.FacelessDevourer.class));
- cards.add(new SetCardInfo("Fallen Ideal", 109, Rarity.UNCOMMON, mage.cards.f.FallenIdeal.class));
- cards.add(new SetCardInfo("Fathom Seer", 62, Rarity.COMMON, mage.cards.f.FathomSeer.class));
- cards.add(new SetCardInfo("Feebleness", 110, Rarity.COMMON, mage.cards.f.Feebleness.class));
- cards.add(new SetCardInfo("Firemaw Kavu", 153, Rarity.UNCOMMON, mage.cards.f.FiremawKavu.class));
- cards.add(new SetCardInfo("Firewake Sliver", 238, Rarity.UNCOMMON, mage.cards.f.FirewakeSliver.class));
- cards.add(new SetCardInfo("Flagstones of Trokair", 272, Rarity.RARE, mage.cards.f.FlagstonesOfTrokair.class));
- cards.add(new SetCardInfo("Flamecore Elemental", 154, Rarity.COMMON, mage.cards.f.FlamecoreElemental.class));
- cards.add(new SetCardInfo("Fledgling Mawcor", 63, Rarity.UNCOMMON, mage.cards.f.FledglingMawcor.class));
- cards.add(new SetCardInfo("Flickering Spirit", 17, Rarity.COMMON, mage.cards.f.FlickeringSpirit.class));
- cards.add(new SetCardInfo("Fool's Demise", 64, Rarity.UNCOMMON, mage.cards.f.FoolsDemise.class));
- cards.add(new SetCardInfo("Forest", 298, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Forest", 299, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Forest", 300, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Forest", 301, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Foriysian Interceptor", 18, Rarity.COMMON, mage.cards.f.ForiysianInterceptor.class));
- cards.add(new SetCardInfo("Foriysian Totem", 254, Rarity.UNCOMMON, mage.cards.f.ForiysianTotem.class));
- cards.add(new SetCardInfo("Fortify", 19, Rarity.COMMON, mage.cards.f.Fortify.class));
- cards.add(new SetCardInfo("Fortune Thief", 156, Rarity.RARE, mage.cards.f.FortuneThief.class));
- cards.add(new SetCardInfo("Fungal Reaches", 273, Rarity.UNCOMMON, mage.cards.f.FungalReaches.class));
- cards.add(new SetCardInfo("Fungus Sliver", 195, Rarity.RARE, mage.cards.f.FungusSliver.class));
- cards.add(new SetCardInfo("Fury Sliver", 157, Rarity.UNCOMMON, mage.cards.f.FurySliver.class));
- cards.add(new SetCardInfo("Gauntlet of Power", 255, Rarity.RARE, mage.cards.g.GauntletOfPower.class));
- cards.add(new SetCardInfo("Gaze of Justice", 20, Rarity.COMMON, mage.cards.g.GazeOfJustice.class));
- cards.add(new SetCardInfo("Gemhide Sliver", 196, Rarity.COMMON, mage.cards.g.GemhideSliver.class));
- cards.add(new SetCardInfo("Gemstone Caverns", 274, Rarity.RARE, mage.cards.g.GemstoneCaverns.class));
- cards.add(new SetCardInfo("Ghitu Firebreathing", 158, Rarity.COMMON, mage.cards.g.GhituFirebreathing.class));
- cards.add(new SetCardInfo("Ghostflame Sliver", 239, Rarity.UNCOMMON, mage.cards.g.GhostflameSliver.class));
- cards.add(new SetCardInfo("Glass Asp", 197, Rarity.COMMON, mage.cards.g.GlassAsp.class));
- cards.add(new SetCardInfo("Goblin Skycutter", 159, Rarity.COMMON, mage.cards.g.GoblinSkycutter.class));
- cards.add(new SetCardInfo("Gorgon Recluse", 111, Rarity.COMMON, mage.cards.g.GorgonRecluse.class));
- cards.add(new SetCardInfo("Grapeshot", 160, Rarity.COMMON, mage.cards.g.Grapeshot.class));
- cards.add(new SetCardInfo("Greater Gargadon", 161, Rarity.RARE, mage.cards.g.GreaterGargadon.class));
- cards.add(new SetCardInfo("Greenseeker", 198, Rarity.COMMON, mage.cards.g.Greenseeker.class));
- cards.add(new SetCardInfo("Griffin Guide", 21, Rarity.UNCOMMON, mage.cards.g.GriffinGuide.class));
- cards.add(new SetCardInfo("Ground Rift", 162, Rarity.COMMON, mage.cards.g.GroundRift.class));
- cards.add(new SetCardInfo("Gustcloak Cavalier", 22, Rarity.UNCOMMON, mage.cards.g.GustcloakCavalier.class));
- cards.add(new SetCardInfo("Harmonic Sliver", 240, Rarity.UNCOMMON, mage.cards.h.HarmonicSliver.class));
- cards.add(new SetCardInfo("Haunting Hymn", 112, Rarity.UNCOMMON, mage.cards.h.HauntingHymn.class));
- cards.add(new SetCardInfo("Havenwood Wurm", 199, Rarity.COMMON, mage.cards.h.HavenwoodWurm.class));
- cards.add(new SetCardInfo("Herd Gnarr", 200, Rarity.COMMON, mage.cards.h.HerdGnarr.class));
- cards.add(new SetCardInfo("Hivestone", 256, Rarity.RARE, mage.cards.h.Hivestone.class));
- cards.add(new SetCardInfo("Hypergenesis", 201, Rarity.RARE, mage.cards.h.Hypergenesis.class));
- cards.add(new SetCardInfo("Ib Halfheart, Goblin Tactician", 163, Rarity.RARE, mage.cards.i.IbHalfheartGoblinTactician.class));
- cards.add(new SetCardInfo("Icatian Crier", 23, Rarity.COMMON, mage.cards.i.IcatianCrier.class));
- cards.add(new SetCardInfo("Ignite Memories", 164, Rarity.UNCOMMON, mage.cards.i.IgniteMemories.class));
- cards.add(new SetCardInfo("Ironclaw Buzzardiers", 165, Rarity.COMMON, mage.cards.i.IronclawBuzzardiers.class));
- cards.add(new SetCardInfo("Island", 286, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Island", 287, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Island", 288, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Island", 289, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Ith, High Arcanist", 241, Rarity.RARE, mage.cards.i.IthHighArcanist.class));
- cards.add(new SetCardInfo("Ivory Giant", 24, Rarity.COMMON, mage.cards.i.IvoryGiant.class));
- cards.add(new SetCardInfo("Ixidron", 65, Rarity.RARE, mage.cards.i.Ixidron.class));
- cards.add(new SetCardInfo("Jaya Ballard, Task Mage", 166, Rarity.RARE, mage.cards.j.JayaBallardTaskMage.class));
- cards.add(new SetCardInfo("Jedit's Dragoons", 25, Rarity.COMMON, mage.cards.j.JeditsDragoons.class));
- cards.add(new SetCardInfo("Jhoira's Timebug", 257, Rarity.COMMON, mage.cards.j.JhoirasTimebug.class));
- cards.add(new SetCardInfo("Kaervek the Merciless", 242, Rarity.RARE, mage.cards.k.KaervekTheMerciless.class));
- cards.add(new SetCardInfo("Keldon Halberdier", 167, Rarity.COMMON, mage.cards.k.KeldonHalberdier.class));
- cards.add(new SetCardInfo("Kher Keep", 275, Rarity.RARE, mage.cards.k.KherKeep.class));
- cards.add(new SetCardInfo("Knight of the Holy Nimbus", 26, Rarity.UNCOMMON, mage.cards.k.KnightOfTheHolyNimbus.class));
- cards.add(new SetCardInfo("Krosan Grip", 202, Rarity.UNCOMMON, mage.cards.k.KrosanGrip.class));
- cards.add(new SetCardInfo("Liege of the Pit", 113, Rarity.RARE, mage.cards.l.LiegeOfThePit.class));
- cards.add(new SetCardInfo("Lightning Axe", 168, Rarity.COMMON, mage.cards.l.LightningAxe.class));
- cards.add(new SetCardInfo("Lim-Dul the Necromancer", 114, Rarity.RARE, mage.cards.l.LimDulTheNecromancer.class));
- cards.add(new SetCardInfo("Living End", 115, Rarity.RARE, mage.cards.l.LivingEnd.class));
- cards.add(new SetCardInfo("Locket of Yesterdays", 258, Rarity.UNCOMMON, mage.cards.l.LocketOfYesterdays.class));
- cards.add(new SetCardInfo("Looter il-Kor", 66, Rarity.COMMON, mage.cards.l.LooterIlKor.class));
- cards.add(new SetCardInfo("Lotus Bloom", 259, Rarity.RARE, mage.cards.l.LotusBloom.class));
- cards.add(new SetCardInfo("Magus of the Candelabra", 203, Rarity.RARE, mage.cards.m.MagusOfTheCandelabra.class));
- cards.add(new SetCardInfo("Magus of the Disk", 27, Rarity.RARE, mage.cards.m.MagusOfTheDisk.class));
- cards.add(new SetCardInfo("Magus of the Jar", 67, Rarity.RARE, mage.cards.m.MagusOfTheJar.class));
- cards.add(new SetCardInfo("Magus of the Mirror", 116, Rarity.RARE, mage.cards.m.MagusOfTheMirror.class));
- cards.add(new SetCardInfo("Magus of the Scroll", 169, Rarity.RARE, mage.cards.m.MagusOfTheScroll.class));
- cards.add(new SetCardInfo("Mana Skimmer", 117, Rarity.COMMON, mage.cards.m.ManaSkimmer.class));
- cards.add(new SetCardInfo("Mangara of Corondor", 28, Rarity.RARE, mage.cards.m.MangaraOfCorondor.class));
- cards.add(new SetCardInfo("Might of Old Krosa", 204, Rarity.UNCOMMON, mage.cards.m.MightOfOldKrosa.class));
- cards.add(new SetCardInfo("Might Sliver", 205, Rarity.UNCOMMON, mage.cards.m.MightSliver.class));
- cards.add(new SetCardInfo("Mindlash Sliver", 118, Rarity.COMMON, mage.cards.m.MindlashSliver.class));
- cards.add(new SetCardInfo("Mindstab", 119, Rarity.COMMON, mage.cards.m.Mindstab.class));
- cards.add(new SetCardInfo("Mishra, Artificer Prodigy", 243, Rarity.RARE, mage.cards.m.MishraArtificerProdigy.class));
- cards.add(new SetCardInfo("Mogg War Marshal", 170, Rarity.COMMON, mage.cards.m.MoggWarMarshal.class));
- cards.add(new SetCardInfo("Molder", 206, Rarity.COMMON, mage.cards.m.Molder.class));
- cards.add(new SetCardInfo("Molten Slagheap", 276, Rarity.UNCOMMON, mage.cards.m.MoltenSlagheap.class));
- cards.add(new SetCardInfo("Momentary Blink", 29, Rarity.COMMON, mage.cards.m.MomentaryBlink.class));
- cards.add(new SetCardInfo("Moonlace", 68, Rarity.RARE, mage.cards.m.Moonlace.class));
- cards.add(new SetCardInfo("Mountain", 294, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Mountain", 295, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Mountain", 296, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Mountain", 297, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Mwonvuli Acid-Moss", 207, Rarity.COMMON, mage.cards.m.MwonvuliAcidMoss.class));
- cards.add(new SetCardInfo("Mystical Teachings", 69, Rarity.COMMON, mage.cards.m.MysticalTeachings.class));
- cards.add(new SetCardInfo("Nantuko Shaman", 208, Rarity.COMMON, mage.cards.n.NantukoShaman.class));
- cards.add(new SetCardInfo("Nether Traitor", 120, Rarity.RARE, mage.cards.n.NetherTraitor.class));
- cards.add(new SetCardInfo("Nightshade Assassin", 121, Rarity.UNCOMMON, mage.cards.n.NightshadeAssassin.class));
- cards.add(new SetCardInfo("Norin the Wary", 171, Rarity.RARE, mage.cards.n.NorinTheWary.class));
- cards.add(new SetCardInfo("Opal Guardian", 30, Rarity.RARE, mage.cards.o.OpalGuardian.class));
- cards.add(new SetCardInfo("Opaline Sliver", 244, Rarity.UNCOMMON, mage.cards.o.OpalineSliver.class));
- cards.add(new SetCardInfo("Ophidian Eye", 70, Rarity.COMMON, mage.cards.o.OphidianEye.class));
- cards.add(new SetCardInfo("Orcish Cannonade", 172, Rarity.COMMON, mage.cards.o.OrcishCannonade.class));
- cards.add(new SetCardInfo("Outrider en-Kor", 31, Rarity.UNCOMMON, mage.cards.o.OutriderEnKor.class));
- cards.add(new SetCardInfo("Paradox Haze", 71, Rarity.UNCOMMON, mage.cards.p.ParadoxHaze.class));
- cards.add(new SetCardInfo("Pardic Dragon", 173, Rarity.RARE, mage.cards.p.PardicDragon.class));
- cards.add(new SetCardInfo("Pendelhaven Elder", 209, Rarity.UNCOMMON, mage.cards.p.PendelhavenElder.class));
- cards.add(new SetCardInfo("Pentarch Ward", 33, Rarity.COMMON, mage.cards.p.PentarchWard.class));
- cards.add(new SetCardInfo("Penumbra Spider", 210, Rarity.COMMON, mage.cards.p.PenumbraSpider.class));
- cards.add(new SetCardInfo("Phantom Wurm", 211, Rarity.UNCOMMON, mage.cards.p.PhantomWurm.class));
- cards.add(new SetCardInfo("Phthisis", 122, Rarity.UNCOMMON, mage.cards.p.Phthisis.class));
- cards.add(new SetCardInfo("Phyrexian Totem", 261, Rarity.UNCOMMON, mage.cards.p.PhyrexianTotem.class));
- cards.add(new SetCardInfo("Pit Keeper", 123, Rarity.COMMON, mage.cards.p.PitKeeper.class));
- cards.add(new SetCardInfo("Plague Sliver", 124, Rarity.RARE, mage.cards.p.PlagueSliver.class));
- cards.add(new SetCardInfo("Plains", 282, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Plains", 283, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Plains", 284, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Plains", 285, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Plunder", 174, Rarity.COMMON, mage.cards.p.Plunder.class));
- cards.add(new SetCardInfo("Primal Forcemage", 212, Rarity.UNCOMMON, mage.cards.p.PrimalForcemage.class));
- cards.add(new SetCardInfo("Prismatic Lens", 262, Rarity.COMMON, mage.cards.p.PrismaticLens.class));
- cards.add(new SetCardInfo("Psionic Sliver", 72, Rarity.RARE, mage.cards.p.PsionicSliver.class));
- cards.add(new SetCardInfo("Psychotic Episode", 126, Rarity.COMMON, mage.cards.p.PsychoticEpisode.class));
- cards.add(new SetCardInfo("Pull from Eternity", 35, Rarity.UNCOMMON, mage.cards.p.PullFromEternity.class));
- cards.add(new SetCardInfo("Pulmonic Sliver", 36, Rarity.RARE, mage.cards.p.PulmonicSliver.class));
- cards.add(new SetCardInfo("Quilled Sliver", 37, Rarity.UNCOMMON, mage.cards.q.QuilledSliver.class));
- cards.add(new SetCardInfo("Reiterate", 175, Rarity.RARE, mage.cards.r.Reiterate.class));
- cards.add(new SetCardInfo("Restore Balance", 38, Rarity.RARE, mage.cards.r.RestoreBalance.class));
- cards.add(new SetCardInfo("Return to Dust", 39, Rarity.UNCOMMON, mage.cards.r.ReturnToDust.class));
- cards.add(new SetCardInfo("Rift Bolt", 176, Rarity.COMMON, mage.cards.r.RiftBolt.class));
- cards.add(new SetCardInfo("Riftwing Cloudskate", 73, Rarity.UNCOMMON, mage.cards.r.RiftwingCloudskate.class));
- cards.add(new SetCardInfo("Saffi Eriksdotter", 245, Rarity.RARE, mage.cards.s.SaffiEriksdotter.class));
- cards.add(new SetCardInfo("Sage of Epityr", 74, Rarity.COMMON, mage.cards.s.SageOfEpityr.class));
- cards.add(new SetCardInfo("Saltcrusted Steppe", 277, Rarity.UNCOMMON, mage.cards.s.SaltcrustedSteppe.class));
- cards.add(new SetCardInfo("Sangrophage", 127, Rarity.COMMON, mage.cards.s.Sangrophage.class));
- cards.add(new SetCardInfo("Sarpadian Empires, Vol. VII", 263, Rarity.RARE, mage.cards.s.SarpadianEmpiresVolVii.class));
- cards.add(new SetCardInfo("Savage Thallid", 213, Rarity.COMMON, mage.cards.s.SavageThallid.class));
- cards.add(new SetCardInfo("Scarwood Treefolk", 214, Rarity.COMMON, mage.cards.s.ScarwoodTreefolk.class));
- cards.add(new SetCardInfo("Scion of the Ur-Dragon", 246, Rarity.RARE, mage.cards.s.ScionOfTheUrDragon.class));
- cards.add(new SetCardInfo("Screeching Sliver", 75, Rarity.COMMON, mage.cards.s.ScreechingSliver.class));
- cards.add(new SetCardInfo("Scryb Ranger", 215, Rarity.UNCOMMON, mage.cards.s.ScrybRanger.class));
- cards.add(new SetCardInfo("Search for Tomorrow", 216, Rarity.COMMON, mage.cards.s.SearchForTomorrow.class));
- cards.add(new SetCardInfo("Sedge Sliver", 177, Rarity.RARE, mage.cards.s.SedgeSliver.class));
- cards.add(new SetCardInfo("Sengir Nosferatu", 128, Rarity.RARE, mage.cards.s.SengirNosferatu.class));
- cards.add(new SetCardInfo("Serra Avenger", 40, Rarity.RARE, mage.cards.s.SerraAvenger.class));
- cards.add(new SetCardInfo("Shadow Sliver", 76, Rarity.COMMON, mage.cards.s.ShadowSliver.class));
- cards.add(new SetCardInfo("Sidewinder Sliver", 41, Rarity.COMMON, mage.cards.s.SidewinderSliver.class));
- cards.add(new SetCardInfo("Skittering Monstrosity", 129, Rarity.UNCOMMON, mage.cards.s.SkitteringMonstrosity.class));
- cards.add(new SetCardInfo("Skulking Knight", 130, Rarity.COMMON, mage.cards.s.SkulkingKnight.class));
- cards.add(new SetCardInfo("Slipstream Serpent", 77, Rarity.COMMON, mage.cards.s.SlipstreamSerpent.class));
- cards.add(new SetCardInfo("Smallpox", 131, Rarity.UNCOMMON, mage.cards.s.Smallpox.class));
- cards.add(new SetCardInfo("Snapback", 78, Rarity.COMMON, mage.cards.s.Snapback.class));
- cards.add(new SetCardInfo("Spectral Force", 217, Rarity.RARE, mage.cards.s.SpectralForce.class));
- cards.add(new SetCardInfo("Spell Burst", 79, Rarity.UNCOMMON, mage.cards.s.SpellBurst.class));
- cards.add(new SetCardInfo("Spiketail Drakeling", 80, Rarity.COMMON, mage.cards.s.SpiketailDrakeling.class));
- cards.add(new SetCardInfo("Spinneret Sliver", 219, Rarity.COMMON, mage.cards.s.SpinneretSliver.class));
- cards.add(new SetCardInfo("Spirit Loop", 42, Rarity.UNCOMMON, mage.cards.s.SpiritLoop.class));
- cards.add(new SetCardInfo("Sporesower Thallid", 220, Rarity.UNCOMMON, mage.cards.s.SporesowerThallid.class));
- cards.add(new SetCardInfo("Sprite Noble", 81, Rarity.RARE, mage.cards.s.SpriteNoble.class));
- cards.add(new SetCardInfo("Sprout", 221, Rarity.COMMON, mage.cards.s.Sprout.class));
- cards.add(new SetCardInfo("Squall Line", 222, Rarity.RARE, mage.cards.s.SquallLine.class));
- cards.add(new SetCardInfo("Stonebrow, Krosan Hero", 247, Rarity.RARE, mage.cards.s.StonebrowKrosanHero.class));
- cards.add(new SetCardInfo("Stonewood Invocation", 223, Rarity.RARE, mage.cards.s.StonewoodInvocation.class));
- cards.add(new SetCardInfo("Stormcloud Djinn", 82, Rarity.UNCOMMON, mage.cards.s.StormcloudDjinn.class));
- cards.add(new SetCardInfo("Strangling Soot", 132, Rarity.COMMON, mage.cards.s.StranglingSoot.class));
- cards.add(new SetCardInfo("Strength in Numbers", 224, Rarity.COMMON, mage.cards.s.StrengthInNumbers.class));
- cards.add(new SetCardInfo("Stronghold Overseer", 133, Rarity.RARE, mage.cards.s.StrongholdOverseer.class));
- cards.add(new SetCardInfo("Stuffy Doll", 264, Rarity.RARE, mage.cards.s.StuffyDoll.class));
- cards.add(new SetCardInfo("Subterranean Shambler", 178, Rarity.COMMON, mage.cards.s.SubterraneanShambler.class));
- cards.add(new SetCardInfo("Sudden Death", 134, Rarity.UNCOMMON, mage.cards.s.SuddenDeath.class));
- cards.add(new SetCardInfo("Sudden Shock", 179, Rarity.UNCOMMON, mage.cards.s.SuddenShock.class));
- cards.add(new SetCardInfo("Sudden Spoiling", 135, Rarity.RARE, mage.cards.s.SuddenSpoiling.class));
- cards.add(new SetCardInfo("Sulfurous Blast", 180, Rarity.UNCOMMON, mage.cards.s.SulfurousBlast.class));
- cards.add(new SetCardInfo("Swamp", 290, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Swamp", 291, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Swamp", 292, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Swamp", 293, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true)));
- cards.add(new SetCardInfo("Swarmyard", 278, Rarity.RARE, mage.cards.s.Swarmyard.class));
- cards.add(new SetCardInfo("Tectonic Fiend", 181, Rarity.UNCOMMON, mage.cards.t.TectonicFiend.class));
- cards.add(new SetCardInfo("Teferi, Mage of Zhalfir", 83, Rarity.RARE, mage.cards.t.TeferiMageOfZhalfir.class));
- cards.add(new SetCardInfo("Telekinetic Sliver", 84, Rarity.UNCOMMON, mage.cards.t.TelekineticSliver.class));
- cards.add(new SetCardInfo("Temporal Eddy", 85, Rarity.COMMON, mage.cards.t.TemporalEddy.class));
- cards.add(new SetCardInfo("Temporal Isolation", 43, Rarity.COMMON, mage.cards.t.TemporalIsolation.class));
- cards.add(new SetCardInfo("Tendrils of Corruption", 136, Rarity.COMMON, mage.cards.t.TendrilsOfCorruption.class));
- cards.add(new SetCardInfo("Terramorphic Expanse", 279, Rarity.COMMON, mage.cards.t.TerramorphicExpanse.class));
- cards.add(new SetCardInfo("Thallid Germinator", 225, Rarity.COMMON, mage.cards.t.ThallidGerminator.class));
- cards.add(new SetCardInfo("Thallid Shell-Dweller", 226, Rarity.COMMON, mage.cards.t.ThallidShellDweller.class));
- cards.add(new SetCardInfo("Thelonite Hermit", 228, Rarity.RARE, mage.cards.t.TheloniteHermit.class));
- cards.add(new SetCardInfo("Thelon of Havenwood", 227, Rarity.RARE, mage.cards.t.ThelonOfHavenwood.class));
- cards.add(new SetCardInfo("Think Twice", 86, Rarity.COMMON, mage.cards.t.ThinkTwice.class));
- cards.add(new SetCardInfo("Thrill of the Hunt", 229, Rarity.COMMON, mage.cards.t.ThrillOfTheHunt.class));
- cards.add(new SetCardInfo("Thunder Totem", 265, Rarity.UNCOMMON, mage.cards.t.ThunderTotem.class));
- cards.add(new SetCardInfo("Tivadar of Thorn", 44, Rarity.RARE, mage.cards.t.TivadarOfThorn.class));
- cards.add(new SetCardInfo("Tolarian Sentinel", 87, Rarity.COMMON, mage.cards.t.TolarianSentinel.class));
- cards.add(new SetCardInfo("Traitor's Clutch", 137, Rarity.COMMON, mage.cards.t.TraitorsClutch.class));
- cards.add(new SetCardInfo("Trespasser il-Vec", 138, Rarity.COMMON, mage.cards.t.TrespasserIlVec.class));
- cards.add(new SetCardInfo("Trickbind", 88, Rarity.RARE, mage.cards.t.Trickbind.class));
- cards.add(new SetCardInfo("Triskelavus", 266, Rarity.RARE, mage.cards.t.Triskelavus.class));
- cards.add(new SetCardInfo("Tromp the Domains", 230, Rarity.UNCOMMON, mage.cards.t.TrompTheDomains.class));
- cards.add(new SetCardInfo("Two-Headed Sliver", 183, Rarity.COMMON, mage.cards.t.TwoHeadedSliver.class));
- cards.add(new SetCardInfo("Undying Rage", 184, Rarity.UNCOMMON, mage.cards.u.UndyingRage.class));
- cards.add(new SetCardInfo("Unyaro Bees", 231, Rarity.RARE, mage.cards.u.UnyaroBees.class));
- cards.add(new SetCardInfo("Urborg Syphon-Mage", 139, Rarity.COMMON, mage.cards.u.UrborgSyphonMage.class));
- cards.add(new SetCardInfo("Urza's Factory", 280, Rarity.UNCOMMON, mage.cards.u.UrzasFactory.class));
- cards.add(new SetCardInfo("Vampiric Sliver", 140, Rarity.UNCOMMON, mage.cards.v.VampiricSliver.class));
- cards.add(new SetCardInfo("Venser's Sliver", 267, Rarity.COMMON, mage.cards.v.VensersSliver.class));
- cards.add(new SetCardInfo("Verdant Embrace", 232, Rarity.RARE, mage.cards.v.VerdantEmbrace.class));
- cards.add(new SetCardInfo("Vesuva", 281, Rarity.RARE, mage.cards.v.Vesuva.class));
- cards.add(new SetCardInfo("Vesuvan Shapeshifter", 90, Rarity.RARE, mage.cards.v.VesuvanShapeshifter.class));
- cards.add(new SetCardInfo("Viashino Bladescout", 185, Rarity.COMMON, mage.cards.v.ViashinoBladescout.class));
- cards.add(new SetCardInfo("Viscerid Deepwalker", 91, Rarity.COMMON, mage.cards.v.VisceridDeepwalker.class));
- cards.add(new SetCardInfo("Viscid Lemures", 141, Rarity.COMMON, mage.cards.v.ViscidLemures.class));
- cards.add(new SetCardInfo("Voidmage Husher", 92, Rarity.UNCOMMON, mage.cards.v.VoidmageHusher.class));
- cards.add(new SetCardInfo("Volcanic Awakening", 186, Rarity.UNCOMMON, mage.cards.v.VolcanicAwakening.class));
- cards.add(new SetCardInfo("Walk the Aeons", 93, Rarity.RARE, mage.cards.w.WalkTheAeons.class));
- cards.add(new SetCardInfo("Watcher Sliver", 45, Rarity.COMMON, mage.cards.w.WatcherSliver.class));
- cards.add(new SetCardInfo("Wheel of Fate", 187, Rarity.RARE, mage.cards.w.WheelOfFate.class));
- cards.add(new SetCardInfo("Wipe Away", 94, Rarity.UNCOMMON, mage.cards.w.WipeAway.class));
- cards.add(new SetCardInfo("Word of Seizing", 188, Rarity.RARE, mage.cards.w.WordOfSeizing.class));
- cards.add(new SetCardInfo("Wormwood Dryad", 233, Rarity.COMMON, mage.cards.w.WormwoodDryad.class));
- cards.add(new SetCardInfo("Wurmcalling", 234, Rarity.RARE, mage.cards.w.Wurmcalling.class));
- cards.add(new SetCardInfo("Yavimaya Dryad", 235, Rarity.UNCOMMON, mage.cards.y.YavimayaDryad.class));
- cards.add(new SetCardInfo("Zealot il-Vec", 47, Rarity.COMMON, mage.cards.z.ZealotIlVec.class));
- }
-
- @Override
- public List createBooster() {
- List booster = super.createBooster();
- CardCriteria criteria = new CardCriteria();
- criteria.rarities(Rarity.SPECIAL).setCodes("TSB");
- addToBooster(booster, CardRepository.instance.findCards(criteria));
- return booster;
- }
-}
+package mage.sets;
+
+import java.util.List;
+import mage.cards.Card;
+import mage.cards.CardGraphicInfo;
+import mage.cards.ExpansionSet;
+import mage.cards.repository.CardCriteria;
+import mage.cards.repository.CardRepository;
+import mage.constants.Rarity;
+import mage.constants.SetType;
+
+public class TimeSpiral extends ExpansionSet {
+
+ private static final TimeSpiral instance = new TimeSpiral();
+
+ public static TimeSpiral getInstance() {
+ return instance;
+ }
+
+ private TimeSpiral() {
+ super("Time Spiral", "TSP", ExpansionSet.buildDate(2006, 9, 9), SetType.EXPANSION);
+ this.blockName = "Time Spiral";
+ this.hasBoosters = true;
+ this.numBoosterLands = 0;
+ this.numBoosterCommon = 10;
+ this.numBoosterUncommon = 3;
+ this.numBoosterRare = 1;
+ this.ratioBoosterMythic = 0;
+ cards.add(new SetCardInfo("Academy Ruins", 269, Rarity.RARE, mage.cards.a.AcademyRuins.class));
+ cards.add(new SetCardInfo("Amrou Scout", 1, Rarity.COMMON, mage.cards.a.AmrouScout.class));
+ cards.add(new SetCardInfo("Amrou Seekers", 2, Rarity.COMMON, mage.cards.a.AmrouSeekers.class));
+ cards.add(new SetCardInfo("Ancestral Vision", 48, Rarity.RARE, mage.cards.a.AncestralVision.class));
+ cards.add(new SetCardInfo("Ancient Grudge", 143, Rarity.COMMON, mage.cards.a.AncientGrudge.class));
+ cards.add(new SetCardInfo("Angel's Grace", 3, Rarity.RARE, mage.cards.a.AngelsGrace.class));
+ cards.add(new SetCardInfo("Ashcoat Bear", 190, Rarity.COMMON, mage.cards.a.AshcoatBear.class));
+ cards.add(new SetCardInfo("Aspect of Mongoose", 191, Rarity.UNCOMMON, mage.cards.a.AspectOfMongoose.class));
+ cards.add(new SetCardInfo("Assassinate", 95, Rarity.COMMON, mage.cards.a.Assassinate.class));
+ cards.add(new SetCardInfo("Assembly-Worker", 248, Rarity.UNCOMMON, mage.cards.a.AssemblyWorker.class));
+ cards.add(new SetCardInfo("Barbed Shocker", 144, Rarity.UNCOMMON, mage.cards.b.BarbedShocker.class));
+ cards.add(new SetCardInfo("Basal Sliver", 96, Rarity.COMMON, mage.cards.b.BasalSliver.class));
+ cards.add(new SetCardInfo("Basalt Gargoyle", 145, Rarity.UNCOMMON, mage.cards.b.BasaltGargoyle.class));
+ cards.add(new SetCardInfo("Benalish Cavalry", 4, Rarity.COMMON, mage.cards.b.BenalishCavalry.class));
+ cards.add(new SetCardInfo("Bewilder", 49, Rarity.COMMON, mage.cards.b.Bewilder.class));
+ cards.add(new SetCardInfo("Blazing Blade Askari", 146, Rarity.COMMON, mage.cards.b.BlazingBladeAskari.class));
+ cards.add(new SetCardInfo("Bogardan Hellkite", 147, Rarity.RARE, mage.cards.b.BogardanHellkite.class));
+ cards.add(new SetCardInfo("Bogardan Rager", 148, Rarity.COMMON, mage.cards.b.BogardanRager.class));
+ cards.add(new SetCardInfo("Bonesplitter Sliver", 149, Rarity.COMMON, mage.cards.b.BonesplitterSliver.class));
+ cards.add(new SetCardInfo("Brass Gnat", 249, Rarity.COMMON, mage.cards.b.BrassGnat.class));
+ cards.add(new SetCardInfo("Brine Elemental", 50, Rarity.UNCOMMON, mage.cards.b.BrineElemental.class));
+ cards.add(new SetCardInfo("Calciform Pools", 270, Rarity.UNCOMMON, mage.cards.c.CalciformPools.class));
+ cards.add(new SetCardInfo("Call to the Netherworld", 97, Rarity.COMMON, mage.cards.c.CallToTheNetherworld.class));
+ cards.add(new SetCardInfo("Cancel", 51, Rarity.COMMON, mage.cards.c.Cancel.class));
+ cards.add(new SetCardInfo("Candles of Leng", 250, Rarity.RARE, mage.cards.c.CandlesOfLeng.class));
+ cards.add(new SetCardInfo("Careful Consideration", 52, Rarity.UNCOMMON, mage.cards.c.CarefulConsideration.class));
+ cards.add(new SetCardInfo("Castle Raptors", 5, Rarity.COMMON, mage.cards.c.CastleRaptors.class));
+ cards.add(new SetCardInfo("Cavalry Master", 6, Rarity.UNCOMMON, mage.cards.c.CavalryMaster.class));
+ cards.add(new SetCardInfo("Celestial Crusader", 7, Rarity.UNCOMMON, mage.cards.c.CelestialCrusader.class));
+ cards.add(new SetCardInfo("Children of Korlis", 8, Rarity.COMMON, mage.cards.c.ChildrenOfKorlis.class));
+ cards.add(new SetCardInfo("Chromatic Star", 251, Rarity.COMMON, mage.cards.c.ChromaticStar.class));
+ cards.add(new SetCardInfo("Chronatog Totem", 252, Rarity.UNCOMMON, mage.cards.c.ChronatogTotem.class));
+ cards.add(new SetCardInfo("Chronosavant", 9, Rarity.RARE, mage.cards.c.Chronosavant.class));
+ cards.add(new SetCardInfo("Clockspinning", 53, Rarity.COMMON, mage.cards.c.Clockspinning.class));
+ cards.add(new SetCardInfo("Clockwork Hydra", 253, Rarity.UNCOMMON, mage.cards.c.ClockworkHydra.class));
+ cards.add(new SetCardInfo("Cloudchaser Kestrel", 10, Rarity.COMMON, mage.cards.c.CloudchaserKestrel.class));
+ cards.add(new SetCardInfo("Coal Stoker", 150, Rarity.COMMON, mage.cards.c.CoalStoker.class));
+ cards.add(new SetCardInfo("Conflagrate", 151, Rarity.UNCOMMON, mage.cards.c.Conflagrate.class));
+ cards.add(new SetCardInfo("Coral Trickster", 54, Rarity.COMMON, mage.cards.c.CoralTrickster.class));
+ cards.add(new SetCardInfo("Corpulent Corpse", 98, Rarity.COMMON, mage.cards.c.CorpulentCorpse.class));
+ cards.add(new SetCardInfo("Crookclaw Transmuter", 55, Rarity.COMMON, mage.cards.c.CrookclawTransmuter.class));
+ cards.add(new SetCardInfo("Curse of the Cabal", 99, Rarity.RARE, mage.cards.c.CurseOfTheCabal.class));
+ cards.add(new SetCardInfo("Dark Withering", 101, Rarity.COMMON, mage.cards.d.DarkWithering.class));
+ cards.add(new SetCardInfo("D'Avenant Healer", 11, Rarity.COMMON, mage.cards.d.DAvenantHealer.class));
+ cards.add(new SetCardInfo("Deathspore Thallid", 102, Rarity.COMMON, mage.cards.d.DeathsporeThallid.class));
+ cards.add(new SetCardInfo("Deep-Sea Kraken", 56, Rarity.RARE, mage.cards.d.DeepSeaKraken.class));
+ cards.add(new SetCardInfo("Dementia Sliver", 236, Rarity.UNCOMMON, mage.cards.d.DementiaSliver.class));
+ cards.add(new SetCardInfo("Demonic Collusion", 103, Rarity.RARE, mage.cards.d.DemonicCollusion.class));
+ cards.add(new SetCardInfo("Draining Whelk", 57, Rarity.RARE, mage.cards.d.DrainingWhelk.class));
+ cards.add(new SetCardInfo("Dralnu, Lich Lord", 237, Rarity.RARE, mage.cards.d.DralnuLichLord.class));
+ cards.add(new SetCardInfo("Dread Return", 104, Rarity.UNCOMMON, mage.cards.d.DreadReturn.class));
+ cards.add(new SetCardInfo("Dreadship Reef", 271, Rarity.UNCOMMON, mage.cards.d.DreadshipReef.class));
+ cards.add(new SetCardInfo("Dream Stalker", 58, Rarity.COMMON, mage.cards.d.DreamStalker.class));
+ cards.add(new SetCardInfo("Drifter il-Dal", 59, Rarity.COMMON, mage.cards.d.DrifterIlDal.class));
+ cards.add(new SetCardInfo("Drudge Reavers", 105, Rarity.COMMON, mage.cards.d.DrudgeReavers.class));
+ cards.add(new SetCardInfo("Durkwood Baloth", 193, Rarity.COMMON, mage.cards.d.DurkwoodBaloth.class));
+ cards.add(new SetCardInfo("Duskrider Peregrine", 14, Rarity.UNCOMMON, mage.cards.d.DuskriderPeregrine.class));
+ cards.add(new SetCardInfo("Empty the Warrens", 152, Rarity.COMMON, mage.cards.e.EmptyTheWarrens.class));
+ cards.add(new SetCardInfo("Endrek Sahr, Master Breeder", 106, Rarity.RARE, mage.cards.e.EndrekSahrMasterBreeder.class));
+ cards.add(new SetCardInfo("Errant Doomsayers", 15, Rarity.COMMON, mage.cards.e.ErrantDoomsayers.class));
+ cards.add(new SetCardInfo("Errant Ephemeron", 60, Rarity.COMMON, mage.cards.e.ErrantEphemeron.class));
+ cards.add(new SetCardInfo("Eternity Snare", 61, Rarity.COMMON, mage.cards.e.EternitySnare.class));
+ cards.add(new SetCardInfo("Evangelize", 16, Rarity.RARE, mage.cards.e.Evangelize.class));
+ cards.add(new SetCardInfo("Evil Eye of Urborg", 107, Rarity.UNCOMMON, mage.cards.e.EvilEyeOfUrborg.class));
+ cards.add(new SetCardInfo("Faceless Devourer", 108, Rarity.UNCOMMON, mage.cards.f.FacelessDevourer.class));
+ cards.add(new SetCardInfo("Fallen Ideal", 109, Rarity.UNCOMMON, mage.cards.f.FallenIdeal.class));
+ cards.add(new SetCardInfo("Fathom Seer", 62, Rarity.COMMON, mage.cards.f.FathomSeer.class));
+ cards.add(new SetCardInfo("Feebleness", 110, Rarity.COMMON, mage.cards.f.Feebleness.class));
+ cards.add(new SetCardInfo("Firemaw Kavu", 153, Rarity.UNCOMMON, mage.cards.f.FiremawKavu.class));
+ cards.add(new SetCardInfo("Firewake Sliver", 238, Rarity.UNCOMMON, mage.cards.f.FirewakeSliver.class));
+ cards.add(new SetCardInfo("Flagstones of Trokair", 272, Rarity.RARE, mage.cards.f.FlagstonesOfTrokair.class));
+ cards.add(new SetCardInfo("Flamecore Elemental", 154, Rarity.COMMON, mage.cards.f.FlamecoreElemental.class));
+ cards.add(new SetCardInfo("Fledgling Mawcor", 63, Rarity.UNCOMMON, mage.cards.f.FledglingMawcor.class));
+ cards.add(new SetCardInfo("Flickering Spirit", 17, Rarity.COMMON, mage.cards.f.FlickeringSpirit.class));
+ cards.add(new SetCardInfo("Fool's Demise", 64, Rarity.UNCOMMON, mage.cards.f.FoolsDemise.class));
+ cards.add(new SetCardInfo("Forest", 298, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Forest", 299, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Forest", 300, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Forest", 301, Rarity.LAND, mage.cards.basiclands.Forest.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Foriysian Interceptor", 18, Rarity.COMMON, mage.cards.f.ForiysianInterceptor.class));
+ cards.add(new SetCardInfo("Foriysian Totem", 254, Rarity.UNCOMMON, mage.cards.f.ForiysianTotem.class));
+ cards.add(new SetCardInfo("Fortify", 19, Rarity.COMMON, mage.cards.f.Fortify.class));
+ cards.add(new SetCardInfo("Fortune Thief", 156, Rarity.RARE, mage.cards.f.FortuneThief.class));
+ cards.add(new SetCardInfo("Fungal Reaches", 273, Rarity.UNCOMMON, mage.cards.f.FungalReaches.class));
+ cards.add(new SetCardInfo("Fungus Sliver", 195, Rarity.RARE, mage.cards.f.FungusSliver.class));
+ cards.add(new SetCardInfo("Fury Sliver", 157, Rarity.UNCOMMON, mage.cards.f.FurySliver.class));
+ cards.add(new SetCardInfo("Gauntlet of Power", 255, Rarity.RARE, mage.cards.g.GauntletOfPower.class));
+ cards.add(new SetCardInfo("Gaze of Justice", 20, Rarity.COMMON, mage.cards.g.GazeOfJustice.class));
+ cards.add(new SetCardInfo("Gemhide Sliver", 196, Rarity.COMMON, mage.cards.g.GemhideSliver.class));
+ cards.add(new SetCardInfo("Gemstone Caverns", 274, Rarity.RARE, mage.cards.g.GemstoneCaverns.class));
+ cards.add(new SetCardInfo("Ghitu Firebreathing", 158, Rarity.COMMON, mage.cards.g.GhituFirebreathing.class));
+ cards.add(new SetCardInfo("Ghostflame Sliver", 239, Rarity.UNCOMMON, mage.cards.g.GhostflameSliver.class));
+ cards.add(new SetCardInfo("Glass Asp", 197, Rarity.COMMON, mage.cards.g.GlassAsp.class));
+ cards.add(new SetCardInfo("Goblin Skycutter", 159, Rarity.COMMON, mage.cards.g.GoblinSkycutter.class));
+ cards.add(new SetCardInfo("Gorgon Recluse", 111, Rarity.COMMON, mage.cards.g.GorgonRecluse.class));
+ cards.add(new SetCardInfo("Grapeshot", 160, Rarity.COMMON, mage.cards.g.Grapeshot.class));
+ cards.add(new SetCardInfo("Greater Gargadon", 161, Rarity.RARE, mage.cards.g.GreaterGargadon.class));
+ cards.add(new SetCardInfo("Greenseeker", 198, Rarity.COMMON, mage.cards.g.Greenseeker.class));
+ cards.add(new SetCardInfo("Griffin Guide", 21, Rarity.UNCOMMON, mage.cards.g.GriffinGuide.class));
+ cards.add(new SetCardInfo("Ground Rift", 162, Rarity.COMMON, mage.cards.g.GroundRift.class));
+ cards.add(new SetCardInfo("Gustcloak Cavalier", 22, Rarity.UNCOMMON, mage.cards.g.GustcloakCavalier.class));
+ cards.add(new SetCardInfo("Harmonic Sliver", 240, Rarity.UNCOMMON, mage.cards.h.HarmonicSliver.class));
+ cards.add(new SetCardInfo("Haunting Hymn", 112, Rarity.UNCOMMON, mage.cards.h.HauntingHymn.class));
+ cards.add(new SetCardInfo("Havenwood Wurm", 199, Rarity.COMMON, mage.cards.h.HavenwoodWurm.class));
+ cards.add(new SetCardInfo("Herd Gnarr", 200, Rarity.COMMON, mage.cards.h.HerdGnarr.class));
+ cards.add(new SetCardInfo("Hivestone", 256, Rarity.RARE, mage.cards.h.Hivestone.class));
+ cards.add(new SetCardInfo("Hypergenesis", 201, Rarity.RARE, mage.cards.h.Hypergenesis.class));
+ cards.add(new SetCardInfo("Ib Halfheart, Goblin Tactician", 163, Rarity.RARE, mage.cards.i.IbHalfheartGoblinTactician.class));
+ cards.add(new SetCardInfo("Icatian Crier", 23, Rarity.COMMON, mage.cards.i.IcatianCrier.class));
+ cards.add(new SetCardInfo("Ignite Memories", 164, Rarity.UNCOMMON, mage.cards.i.IgniteMemories.class));
+ cards.add(new SetCardInfo("Ironclaw Buzzardiers", 165, Rarity.COMMON, mage.cards.i.IronclawBuzzardiers.class));
+ cards.add(new SetCardInfo("Island", 286, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Island", 287, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Island", 288, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Island", 289, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Ith, High Arcanist", 241, Rarity.RARE, mage.cards.i.IthHighArcanist.class));
+ cards.add(new SetCardInfo("Ivory Giant", 24, Rarity.COMMON, mage.cards.i.IvoryGiant.class));
+ cards.add(new SetCardInfo("Ixidron", 65, Rarity.RARE, mage.cards.i.Ixidron.class));
+ cards.add(new SetCardInfo("Jaya Ballard, Task Mage", 166, Rarity.RARE, mage.cards.j.JayaBallardTaskMage.class));
+ cards.add(new SetCardInfo("Jedit's Dragoons", 25, Rarity.COMMON, mage.cards.j.JeditsDragoons.class));
+ cards.add(new SetCardInfo("Jhoira's Timebug", 257, Rarity.COMMON, mage.cards.j.JhoirasTimebug.class));
+ cards.add(new SetCardInfo("Kaervek the Merciless", 242, Rarity.RARE, mage.cards.k.KaervekTheMerciless.class));
+ cards.add(new SetCardInfo("Keldon Halberdier", 167, Rarity.COMMON, mage.cards.k.KeldonHalberdier.class));
+ cards.add(new SetCardInfo("Kher Keep", 275, Rarity.RARE, mage.cards.k.KherKeep.class));
+ cards.add(new SetCardInfo("Knight of the Holy Nimbus", 26, Rarity.UNCOMMON, mage.cards.k.KnightOfTheHolyNimbus.class));
+ cards.add(new SetCardInfo("Krosan Grip", 202, Rarity.UNCOMMON, mage.cards.k.KrosanGrip.class));
+ cards.add(new SetCardInfo("Liege of the Pit", 113, Rarity.RARE, mage.cards.l.LiegeOfThePit.class));
+ cards.add(new SetCardInfo("Lightning Axe", 168, Rarity.COMMON, mage.cards.l.LightningAxe.class));
+ cards.add(new SetCardInfo("Lim-Dul the Necromancer", 114, Rarity.RARE, mage.cards.l.LimDulTheNecromancer.class));
+ cards.add(new SetCardInfo("Living End", 115, Rarity.RARE, mage.cards.l.LivingEnd.class));
+ cards.add(new SetCardInfo("Locket of Yesterdays", 258, Rarity.UNCOMMON, mage.cards.l.LocketOfYesterdays.class));
+ cards.add(new SetCardInfo("Looter il-Kor", 66, Rarity.COMMON, mage.cards.l.LooterIlKor.class));
+ cards.add(new SetCardInfo("Lotus Bloom", 259, Rarity.RARE, mage.cards.l.LotusBloom.class));
+ cards.add(new SetCardInfo("Magus of the Candelabra", 203, Rarity.RARE, mage.cards.m.MagusOfTheCandelabra.class));
+ cards.add(new SetCardInfo("Magus of the Disk", 27, Rarity.RARE, mage.cards.m.MagusOfTheDisk.class));
+ cards.add(new SetCardInfo("Magus of the Jar", 67, Rarity.RARE, mage.cards.m.MagusOfTheJar.class));
+ cards.add(new SetCardInfo("Magus of the Mirror", 116, Rarity.RARE, mage.cards.m.MagusOfTheMirror.class));
+ cards.add(new SetCardInfo("Magus of the Scroll", 169, Rarity.RARE, mage.cards.m.MagusOfTheScroll.class));
+ cards.add(new SetCardInfo("Mana Skimmer", 117, Rarity.COMMON, mage.cards.m.ManaSkimmer.class));
+ cards.add(new SetCardInfo("Mangara of Corondor", 28, Rarity.RARE, mage.cards.m.MangaraOfCorondor.class));
+ cards.add(new SetCardInfo("Might of Old Krosa", 204, Rarity.UNCOMMON, mage.cards.m.MightOfOldKrosa.class));
+ cards.add(new SetCardInfo("Might Sliver", 205, Rarity.UNCOMMON, mage.cards.m.MightSliver.class));
+ cards.add(new SetCardInfo("Mindlash Sliver", 118, Rarity.COMMON, mage.cards.m.MindlashSliver.class));
+ cards.add(new SetCardInfo("Mindstab", 119, Rarity.COMMON, mage.cards.m.Mindstab.class));
+ cards.add(new SetCardInfo("Mishra, Artificer Prodigy", 243, Rarity.RARE, mage.cards.m.MishraArtificerProdigy.class));
+ cards.add(new SetCardInfo("Mogg War Marshal", 170, Rarity.COMMON, mage.cards.m.MoggWarMarshal.class));
+ cards.add(new SetCardInfo("Molder", 206, Rarity.COMMON, mage.cards.m.Molder.class));
+ cards.add(new SetCardInfo("Molten Slagheap", 276, Rarity.UNCOMMON, mage.cards.m.MoltenSlagheap.class));
+ cards.add(new SetCardInfo("Momentary Blink", 29, Rarity.COMMON, mage.cards.m.MomentaryBlink.class));
+ cards.add(new SetCardInfo("Moonlace", 68, Rarity.RARE, mage.cards.m.Moonlace.class));
+ cards.add(new SetCardInfo("Mountain", 294, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Mountain", 295, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Mountain", 296, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Mountain", 297, Rarity.LAND, mage.cards.basiclands.Mountain.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Mwonvuli Acid-Moss", 207, Rarity.COMMON, mage.cards.m.MwonvuliAcidMoss.class));
+ cards.add(new SetCardInfo("Mystical Teachings", 69, Rarity.COMMON, mage.cards.m.MysticalTeachings.class));
+ cards.add(new SetCardInfo("Nantuko Shaman", 208, Rarity.COMMON, mage.cards.n.NantukoShaman.class));
+ cards.add(new SetCardInfo("Nether Traitor", 120, Rarity.RARE, mage.cards.n.NetherTraitor.class));
+ cards.add(new SetCardInfo("Nightshade Assassin", 121, Rarity.UNCOMMON, mage.cards.n.NightshadeAssassin.class));
+ cards.add(new SetCardInfo("Norin the Wary", 171, Rarity.RARE, mage.cards.n.NorinTheWary.class));
+ cards.add(new SetCardInfo("Opal Guardian", 30, Rarity.RARE, mage.cards.o.OpalGuardian.class));
+ cards.add(new SetCardInfo("Opaline Sliver", 244, Rarity.UNCOMMON, mage.cards.o.OpalineSliver.class));
+ cards.add(new SetCardInfo("Ophidian Eye", 70, Rarity.COMMON, mage.cards.o.OphidianEye.class));
+ cards.add(new SetCardInfo("Orcish Cannonade", 172, Rarity.COMMON, mage.cards.o.OrcishCannonade.class));
+ cards.add(new SetCardInfo("Outrider en-Kor", 31, Rarity.UNCOMMON, mage.cards.o.OutriderEnKor.class));
+ cards.add(new SetCardInfo("Paradise Plume", 260, Rarity.UNCOMMON, mage.cards.p.ParadisePlume.class));
+ cards.add(new SetCardInfo("Paradox Haze", 71, Rarity.UNCOMMON, mage.cards.p.ParadoxHaze.class));
+ cards.add(new SetCardInfo("Pardic Dragon", 173, Rarity.RARE, mage.cards.p.PardicDragon.class));
+ cards.add(new SetCardInfo("Pendelhaven Elder", 209, Rarity.UNCOMMON, mage.cards.p.PendelhavenElder.class));
+ cards.add(new SetCardInfo("Pentarch Paladin", 32, Rarity.RARE, mage.cards.p.PentarchPaladin.class));
+ cards.add(new SetCardInfo("Pentarch Ward", 33, Rarity.COMMON, mage.cards.p.PentarchWard.class));
+ cards.add(new SetCardInfo("Penumbra Spider", 210, Rarity.COMMON, mage.cards.p.PenumbraSpider.class));
+ cards.add(new SetCardInfo("Phantom Wurm", 211, Rarity.UNCOMMON, mage.cards.p.PhantomWurm.class));
+ cards.add(new SetCardInfo("Phthisis", 122, Rarity.UNCOMMON, mage.cards.p.Phthisis.class));
+ cards.add(new SetCardInfo("Phyrexian Totem", 261, Rarity.UNCOMMON, mage.cards.p.PhyrexianTotem.class));
+ cards.add(new SetCardInfo("Pit Keeper", 123, Rarity.COMMON, mage.cards.p.PitKeeper.class));
+ cards.add(new SetCardInfo("Plague Sliver", 124, Rarity.RARE, mage.cards.p.PlagueSliver.class));
+ cards.add(new SetCardInfo("Plains", 282, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Plains", 283, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Plains", 284, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Plains", 285, Rarity.LAND, mage.cards.basiclands.Plains.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Plunder", 174, Rarity.COMMON, mage.cards.p.Plunder.class));
+ cards.add(new SetCardInfo("Primal Forcemage", 212, Rarity.UNCOMMON, mage.cards.p.PrimalForcemage.class));
+ cards.add(new SetCardInfo("Prismatic Lens", 262, Rarity.COMMON, mage.cards.p.PrismaticLens.class));
+ cards.add(new SetCardInfo("Psionic Sliver", 72, Rarity.RARE, mage.cards.p.PsionicSliver.class));
+ cards.add(new SetCardInfo("Psychotic Episode", 126, Rarity.COMMON, mage.cards.p.PsychoticEpisode.class));
+ cards.add(new SetCardInfo("Pull from Eternity", 35, Rarity.UNCOMMON, mage.cards.p.PullFromEternity.class));
+ cards.add(new SetCardInfo("Pulmonic Sliver", 36, Rarity.RARE, mage.cards.p.PulmonicSliver.class));
+ cards.add(new SetCardInfo("Quilled Sliver", 37, Rarity.UNCOMMON, mage.cards.q.QuilledSliver.class));
+ cards.add(new SetCardInfo("Reiterate", 175, Rarity.RARE, mage.cards.r.Reiterate.class));
+ cards.add(new SetCardInfo("Restore Balance", 38, Rarity.RARE, mage.cards.r.RestoreBalance.class));
+ cards.add(new SetCardInfo("Return to Dust", 39, Rarity.UNCOMMON, mage.cards.r.ReturnToDust.class));
+ cards.add(new SetCardInfo("Rift Bolt", 176, Rarity.COMMON, mage.cards.r.RiftBolt.class));
+ cards.add(new SetCardInfo("Riftwing Cloudskate", 73, Rarity.UNCOMMON, mage.cards.r.RiftwingCloudskate.class));
+ cards.add(new SetCardInfo("Saffi Eriksdotter", 245, Rarity.RARE, mage.cards.s.SaffiEriksdotter.class));
+ cards.add(new SetCardInfo("Sage of Epityr", 74, Rarity.COMMON, mage.cards.s.SageOfEpityr.class));
+ cards.add(new SetCardInfo("Saltcrusted Steppe", 277, Rarity.UNCOMMON, mage.cards.s.SaltcrustedSteppe.class));
+ cards.add(new SetCardInfo("Sangrophage", 127, Rarity.COMMON, mage.cards.s.Sangrophage.class));
+ cards.add(new SetCardInfo("Sarpadian Empires, Vol. VII", 263, Rarity.RARE, mage.cards.s.SarpadianEmpiresVolVii.class));
+ cards.add(new SetCardInfo("Savage Thallid", 213, Rarity.COMMON, mage.cards.s.SavageThallid.class));
+ cards.add(new SetCardInfo("Scarwood Treefolk", 214, Rarity.COMMON, mage.cards.s.ScarwoodTreefolk.class));
+ cards.add(new SetCardInfo("Scion of the Ur-Dragon", 246, Rarity.RARE, mage.cards.s.ScionOfTheUrDragon.class));
+ cards.add(new SetCardInfo("Screeching Sliver", 75, Rarity.COMMON, mage.cards.s.ScreechingSliver.class));
+ cards.add(new SetCardInfo("Scryb Ranger", 215, Rarity.UNCOMMON, mage.cards.s.ScrybRanger.class));
+ cards.add(new SetCardInfo("Search for Tomorrow", 216, Rarity.COMMON, mage.cards.s.SearchForTomorrow.class));
+ cards.add(new SetCardInfo("Sedge Sliver", 177, Rarity.RARE, mage.cards.s.SedgeSliver.class));
+ cards.add(new SetCardInfo("Sengir Nosferatu", 128, Rarity.RARE, mage.cards.s.SengirNosferatu.class));
+ cards.add(new SetCardInfo("Serra Avenger", 40, Rarity.RARE, mage.cards.s.SerraAvenger.class));
+ cards.add(new SetCardInfo("Shadow Sliver", 76, Rarity.COMMON, mage.cards.s.ShadowSliver.class));
+ cards.add(new SetCardInfo("Sidewinder Sliver", 41, Rarity.COMMON, mage.cards.s.SidewinderSliver.class));
+ cards.add(new SetCardInfo("Skittering Monstrosity", 129, Rarity.UNCOMMON, mage.cards.s.SkitteringMonstrosity.class));
+ cards.add(new SetCardInfo("Skulking Knight", 130, Rarity.COMMON, mage.cards.s.SkulkingKnight.class));
+ cards.add(new SetCardInfo("Slipstream Serpent", 77, Rarity.COMMON, mage.cards.s.SlipstreamSerpent.class));
+ cards.add(new SetCardInfo("Smallpox", 131, Rarity.UNCOMMON, mage.cards.s.Smallpox.class));
+ cards.add(new SetCardInfo("Snapback", 78, Rarity.COMMON, mage.cards.s.Snapback.class));
+ cards.add(new SetCardInfo("Spectral Force", 217, Rarity.RARE, mage.cards.s.SpectralForce.class));
+ cards.add(new SetCardInfo("Spell Burst", 79, Rarity.UNCOMMON, mage.cards.s.SpellBurst.class));
+ cards.add(new SetCardInfo("Spiketail Drakeling", 80, Rarity.COMMON, mage.cards.s.SpiketailDrakeling.class));
+ cards.add(new SetCardInfo("Spinneret Sliver", 219, Rarity.COMMON, mage.cards.s.SpinneretSliver.class));
+ cards.add(new SetCardInfo("Spirit Loop", 42, Rarity.UNCOMMON, mage.cards.s.SpiritLoop.class));
+ cards.add(new SetCardInfo("Sporesower Thallid", 220, Rarity.UNCOMMON, mage.cards.s.SporesowerThallid.class));
+ cards.add(new SetCardInfo("Sprite Noble", 81, Rarity.RARE, mage.cards.s.SpriteNoble.class));
+ cards.add(new SetCardInfo("Sprout", 221, Rarity.COMMON, mage.cards.s.Sprout.class));
+ cards.add(new SetCardInfo("Squall Line", 222, Rarity.RARE, mage.cards.s.SquallLine.class));
+ cards.add(new SetCardInfo("Stonebrow, Krosan Hero", 247, Rarity.RARE, mage.cards.s.StonebrowKrosanHero.class));
+ cards.add(new SetCardInfo("Stonewood Invocation", 223, Rarity.RARE, mage.cards.s.StonewoodInvocation.class));
+ cards.add(new SetCardInfo("Stormcloud Djinn", 82, Rarity.UNCOMMON, mage.cards.s.StormcloudDjinn.class));
+ cards.add(new SetCardInfo("Strangling Soot", 132, Rarity.COMMON, mage.cards.s.StranglingSoot.class));
+ cards.add(new SetCardInfo("Strength in Numbers", 224, Rarity.COMMON, mage.cards.s.StrengthInNumbers.class));
+ cards.add(new SetCardInfo("Stronghold Overseer", 133, Rarity.RARE, mage.cards.s.StrongholdOverseer.class));
+ cards.add(new SetCardInfo("Stuffy Doll", 264, Rarity.RARE, mage.cards.s.StuffyDoll.class));
+ cards.add(new SetCardInfo("Subterranean Shambler", 178, Rarity.COMMON, mage.cards.s.SubterraneanShambler.class));
+ cards.add(new SetCardInfo("Sudden Death", 134, Rarity.UNCOMMON, mage.cards.s.SuddenDeath.class));
+ cards.add(new SetCardInfo("Sudden Shock", 179, Rarity.UNCOMMON, mage.cards.s.SuddenShock.class));
+ cards.add(new SetCardInfo("Sudden Spoiling", 135, Rarity.RARE, mage.cards.s.SuddenSpoiling.class));
+ cards.add(new SetCardInfo("Sulfurous Blast", 180, Rarity.UNCOMMON, mage.cards.s.SulfurousBlast.class));
+ cards.add(new SetCardInfo("Swamp", 290, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Swamp", 291, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Swamp", 292, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Swamp", 293, Rarity.LAND, mage.cards.basiclands.Swamp.class, new CardGraphicInfo(null, true)));
+ cards.add(new SetCardInfo("Swarmyard", 278, Rarity.RARE, mage.cards.s.Swarmyard.class));
+ cards.add(new SetCardInfo("Tectonic Fiend", 181, Rarity.UNCOMMON, mage.cards.t.TectonicFiend.class));
+ cards.add(new SetCardInfo("Teferi, Mage of Zhalfir", 83, Rarity.RARE, mage.cards.t.TeferiMageOfZhalfir.class));
+ cards.add(new SetCardInfo("Telekinetic Sliver", 84, Rarity.UNCOMMON, mage.cards.t.TelekineticSliver.class));
+ cards.add(new SetCardInfo("Temporal Eddy", 85, Rarity.COMMON, mage.cards.t.TemporalEddy.class));
+ cards.add(new SetCardInfo("Temporal Isolation", 43, Rarity.COMMON, mage.cards.t.TemporalIsolation.class));
+ cards.add(new SetCardInfo("Tendrils of Corruption", 136, Rarity.COMMON, mage.cards.t.TendrilsOfCorruption.class));
+ cards.add(new SetCardInfo("Terramorphic Expanse", 279, Rarity.COMMON, mage.cards.t.TerramorphicExpanse.class));
+ cards.add(new SetCardInfo("Thallid Germinator", 225, Rarity.COMMON, mage.cards.t.ThallidGerminator.class));
+ cards.add(new SetCardInfo("Thallid Shell-Dweller", 226, Rarity.COMMON, mage.cards.t.ThallidShellDweller.class));
+ cards.add(new SetCardInfo("Thelonite Hermit", 228, Rarity.RARE, mage.cards.t.TheloniteHermit.class));
+ cards.add(new SetCardInfo("Thelon of Havenwood", 227, Rarity.RARE, mage.cards.t.ThelonOfHavenwood.class));
+ cards.add(new SetCardInfo("Think Twice", 86, Rarity.COMMON, mage.cards.t.ThinkTwice.class));
+ cards.add(new SetCardInfo("Thrill of the Hunt", 229, Rarity.COMMON, mage.cards.t.ThrillOfTheHunt.class));
+ cards.add(new SetCardInfo("Thunder Totem", 265, Rarity.UNCOMMON, mage.cards.t.ThunderTotem.class));
+ cards.add(new SetCardInfo("Tivadar of Thorn", 44, Rarity.RARE, mage.cards.t.TivadarOfThorn.class));
+ cards.add(new SetCardInfo("Tolarian Sentinel", 87, Rarity.COMMON, mage.cards.t.TolarianSentinel.class));
+ cards.add(new SetCardInfo("Traitor's Clutch", 137, Rarity.COMMON, mage.cards.t.TraitorsClutch.class));
+ cards.add(new SetCardInfo("Trespasser il-Vec", 138, Rarity.COMMON, mage.cards.t.TrespasserIlVec.class));
+ cards.add(new SetCardInfo("Trickbind", 88, Rarity.RARE, mage.cards.t.Trickbind.class));
+ cards.add(new SetCardInfo("Triskelavus", 266, Rarity.RARE, mage.cards.t.Triskelavus.class));
+ cards.add(new SetCardInfo("Tromp the Domains", 230, Rarity.UNCOMMON, mage.cards.t.TrompTheDomains.class));
+ cards.add(new SetCardInfo("Two-Headed Sliver", 183, Rarity.COMMON, mage.cards.t.TwoHeadedSliver.class));
+ cards.add(new SetCardInfo("Undying Rage", 184, Rarity.UNCOMMON, mage.cards.u.UndyingRage.class));
+ cards.add(new SetCardInfo("Unyaro Bees", 231, Rarity.RARE, mage.cards.u.UnyaroBees.class));
+ cards.add(new SetCardInfo("Urborg Syphon-Mage", 139, Rarity.COMMON, mage.cards.u.UrborgSyphonMage.class));
+ cards.add(new SetCardInfo("Urza's Factory", 280, Rarity.UNCOMMON, mage.cards.u.UrzasFactory.class));
+ cards.add(new SetCardInfo("Vampiric Sliver", 140, Rarity.UNCOMMON, mage.cards.v.VampiricSliver.class));
+ cards.add(new SetCardInfo("Venser's Sliver", 267, Rarity.COMMON, mage.cards.v.VensersSliver.class));
+ cards.add(new SetCardInfo("Verdant Embrace", 232, Rarity.RARE, mage.cards.v.VerdantEmbrace.class));
+ cards.add(new SetCardInfo("Vesuva", 281, Rarity.RARE, mage.cards.v.Vesuva.class));
+ cards.add(new SetCardInfo("Vesuvan Shapeshifter", 90, Rarity.RARE, mage.cards.v.VesuvanShapeshifter.class));
+ cards.add(new SetCardInfo("Viashino Bladescout", 185, Rarity.COMMON, mage.cards.v.ViashinoBladescout.class));
+ cards.add(new SetCardInfo("Viscerid Deepwalker", 91, Rarity.COMMON, mage.cards.v.VisceridDeepwalker.class));
+ cards.add(new SetCardInfo("Viscid Lemures", 141, Rarity.COMMON, mage.cards.v.ViscidLemures.class));
+ cards.add(new SetCardInfo("Voidmage Husher", 92, Rarity.UNCOMMON, mage.cards.v.VoidmageHusher.class));
+ cards.add(new SetCardInfo("Volcanic Awakening", 186, Rarity.UNCOMMON, mage.cards.v.VolcanicAwakening.class));
+ cards.add(new SetCardInfo("Walk the Aeons", 93, Rarity.RARE, mage.cards.w.WalkTheAeons.class));
+ cards.add(new SetCardInfo("Watcher Sliver", 45, Rarity.COMMON, mage.cards.w.WatcherSliver.class));
+ cards.add(new SetCardInfo("Wheel of Fate", 187, Rarity.RARE, mage.cards.w.WheelOfFate.class));
+ cards.add(new SetCardInfo("Wipe Away", 94, Rarity.UNCOMMON, mage.cards.w.WipeAway.class));
+ cards.add(new SetCardInfo("Word of Seizing", 188, Rarity.RARE, mage.cards.w.WordOfSeizing.class));
+ cards.add(new SetCardInfo("Wormwood Dryad", 233, Rarity.COMMON, mage.cards.w.WormwoodDryad.class));
+ cards.add(new SetCardInfo("Wurmcalling", 234, Rarity.RARE, mage.cards.w.Wurmcalling.class));
+ cards.add(new SetCardInfo("Yavimaya Dryad", 235, Rarity.UNCOMMON, mage.cards.y.YavimayaDryad.class));
+ cards.add(new SetCardInfo("Zealot il-Vec", 47, Rarity.COMMON, mage.cards.z.ZealotIlVec.class));
+ }
+
+ @Override
+ public List createBooster() {
+ List booster = super.createBooster();
+ CardCriteria criteria = new CardCriteria();
+ criteria.rarities(Rarity.SPECIAL).setCodes("TSB");
+ addToBooster(booster, CardRepository.instance.findCards(criteria));
+ return booster;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/UrzasDestiny.java b/Mage.Sets/src/mage/sets/UrzasDestiny.java
index 0ccf844f029..42e434817a1 100644
--- a/Mage.Sets/src/mage/sets/UrzasDestiny.java
+++ b/Mage.Sets/src/mage/sets/UrzasDestiny.java
@@ -86,6 +86,7 @@ public class UrzasDestiny extends ExpansionSet {
cards.add(new SetCardInfo("Eradicate", 60, Rarity.UNCOMMON, mage.cards.e.Eradicate.class));
cards.add(new SetCardInfo("Extruder", 130, Rarity.UNCOMMON, mage.cards.e.Extruder.class));
cards.add(new SetCardInfo("False Prophet", 6, Rarity.RARE, mage.cards.f.FalseProphet.class));
+ cards.add(new SetCardInfo("Festering Wound", 61, Rarity.UNCOMMON, mage.cards.f.FesteringWound.class));
cards.add(new SetCardInfo("Field Surgeon", 8, Rarity.COMMON, mage.cards.f.FieldSurgeon.class));
cards.add(new SetCardInfo("Flame Jet", 81, Rarity.COMMON, mage.cards.f.FlameJet.class));
cards.add(new SetCardInfo("Fledgling Osprey", 33, Rarity.COMMON, mage.cards.f.FledglingOsprey.class));
diff --git a/Mage.Sets/src/mage/sets/Visions.java b/Mage.Sets/src/mage/sets/Visions.java
index 8a7d95848cf..f4f5d16e3bc 100644
--- a/Mage.Sets/src/mage/sets/Visions.java
+++ b/Mage.Sets/src/mage/sets/Visions.java
@@ -70,7 +70,7 @@ public class Visions extends ExpansionSet {
cards.add(new SetCardInfo("Creeping Mold", 53, Rarity.UNCOMMON, mage.cards.c.CreepingMold.class));
cards.add(new SetCardInfo("Crypt Rats", 5, Rarity.COMMON, mage.cards.c.CryptRats.class));
cards.add(new SetCardInfo("Daraja Griffin", 102, Rarity.UNCOMMON, mage.cards.d.DarajaGriffin.class));
- cards.add(new SetCardInfo("Dark Privilege", 6, Rarity.COMMON, mage.cards.d.DarkPrivilege.class));
+ cards.add(new SetCardInfo("Dark Privilege", 6, Rarity.COMMON, mage.cards.d.DarkPrivilege.class));
cards.add(new SetCardInfo("Death Watch", 7, Rarity.COMMON, mage.cards.d.DeathWatch.class));
cards.add(new SetCardInfo("Desertion", 30, Rarity.RARE, mage.cards.d.Desertion.class));
cards.add(new SetCardInfo("Diamond Kaleidoscope", 143, Rarity.RARE, mage.cards.d.DiamondKaleidoscope.class));
@@ -107,6 +107,7 @@ public class Visions extends ExpansionSet {
cards.add(new SetCardInfo("Jungle Basin", 164, Rarity.UNCOMMON, mage.cards.j.JungleBasin.class));
cards.add(new SetCardInfo("Kaervek's Spite", 13, Rarity.RARE, mage.cards.k.KaerveksSpite.class));
cards.add(new SetCardInfo("Karoo", 165, Rarity.UNCOMMON, mage.cards.k.Karoo.class));
+ cards.add(new SetCardInfo("Katabatic Winds", 59, Rarity.RARE, mage.cards.k.KatabaticWinds.class));
cards.add(new SetCardInfo("Keeper of Kookus", 85, Rarity.COMMON, mage.cards.k.KeeperOfKookus.class));
cards.add(new SetCardInfo("King Cheetah", 60, Rarity.COMMON, mage.cards.k.KingCheetah.class));
cards.add(new SetCardInfo("Knight of Valor", 111, Rarity.COMMON, mage.cards.k.KnightOfValor.class));
diff --git a/Mage.Sets/src/mage/sets/Weatherlight.java b/Mage.Sets/src/mage/sets/Weatherlight.java
index 741d85df345..1db6ab52f35 100644
--- a/Mage.Sets/src/mage/sets/Weatherlight.java
+++ b/Mage.Sets/src/mage/sets/Weatherlight.java
@@ -145,6 +145,7 @@ public class Weatherlight extends ExpansionSet {
cards.add(new SetCardInfo("Nature's Kiss", 78, Rarity.COMMON, mage.cards.n.NaturesKiss.class));
cards.add(new SetCardInfo("Nature's Resurgence", 79, Rarity.RARE, mage.cards.n.NaturesResurgence.class));
cards.add(new SetCardInfo("Necratog", 18, Rarity.UNCOMMON, mage.cards.n.Necratog.class));
+ cards.add(new SetCardInfo("Noble Benefactor", 44, Rarity.UNCOMMON, mage.cards.n.NobleBenefactor.class));
cards.add(new SetCardInfo("Null Rod", 154, Rarity.RARE, mage.cards.n.NullRod.class));
cards.add(new SetCardInfo("Odylic Wraith", 19, Rarity.UNCOMMON, mage.cards.o.OdylicWraith.class));
cards.add(new SetCardInfo("Ophidian", 45, Rarity.COMMON, mage.cards.o.Ophidian.class));
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/AfflictTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/AfflictTest.java
index 05296b70f8d..ae8ec571197 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/AfflictTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/AfflictTest.java
@@ -7,14 +7,14 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
public class AfflictTest extends CardTestPlayerBase {
- private String khenra = "Khenra Eternal";
- private String elves = "Llanowar Elves";
+ private final String khenra = "Khenra Eternal";
+ private final String elves = "Llanowar Elves";
@Test
- public void testBecomesBlocked(){
+ public void testBecomesBlocked() {
addCard(Zone.BATTLEFIELD, playerA, khenra);
- addCard(Zone.BATTLEFIELD, playerB, elves );
+ addCard(Zone.BATTLEFIELD, playerB, elves);
attack(1, playerA, khenra);
block(1, playerB, elves, khenra);
@@ -27,10 +27,10 @@ public class AfflictTest extends CardTestPlayerBase {
}
@Test
- public void testNotBlocked(){
+ public void testNotBlocked() {
addCard(Zone.BATTLEFIELD, playerA, khenra);
- addCard(Zone.BATTLEFIELD, playerB, elves );
+ addCard(Zone.BATTLEFIELD, playerB, elves);
attack(1, playerA, khenra);
@@ -40,4 +40,36 @@ public class AfflictTest extends CardTestPlayerBase {
assertLife(playerB, 18);
}
+
+ // My afflict didn't come through after using Endless Sands on my own creature. The afflict ability was on the stack already.
+ @Test
+ public void testRemoveAfflictCreatureAfterAfflictIsOnTheStack() {
+
+ addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2);
+ // Afflict 2 (Whenever this creature becomes blocked, defending player loses 2 life.)
+ // {1}{R}: Frontline Devastator gets +1/+0 until end of turn.
+ addCard(Zone.BATTLEFIELD, playerA, "Frontline Devastator");
+
+ // {T}: Add {C} to your mana pool.
+ // {2}, {T}: Exile target creature you control.
+ // {4}, {T}, Sacrifice Endless Sands: Return each creature card exiled with Endless Sands to the battlefield under its ownerās control.
+ addCard(Zone.BATTLEFIELD, playerA, "Endless Sands");
+
+ // Deathtouch
+ // When Ruin Rat dies, exile target card from an opponent's graveyard.
+ addCard(Zone.BATTLEFIELD, playerB, "Ruin Rat"); // Creature 1/1
+
+ attack(1, playerA, "Frontline Devastator");
+ block(1, playerB, "Ruin Rat", "Frontline Devastator");
+
+ activateAbility(1, PhaseStep.DECLARE_BLOCKERS, playerA, "{2},", "Frontline Devastator");
+ setStopAt(1, PhaseStep.POSTCOMBAT_MAIN);
+ execute();
+
+ assertExileCount(playerA, "Frontline Devastator", 1);
+ assertPermanentCount(playerB, "Ruin Rat", 1);
+
+ assertLife(playerB, 18);
+
+ }
}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/EternalizeTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/EternalizeTest.java
index ff359987285..608c27c9837 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/EternalizeTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/EternalizeTest.java
@@ -8,7 +8,11 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
public class EternalizeTest extends CardTestPlayerBase {
- private String sentinel = "Steadfast Sentinel";
+ // Creature - Human Cleric {3}{W} 2/3
+ // Vigilance
+ // Eternalize ({4}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it,
+ // except it's a 4/4 black Zombie Human Cleric with no mana cost. Eternalize only as a sorcery.)
+ private final String sentinel = "Steadfast Sentinel";
@Test
public void testEternalize() {
@@ -22,4 +26,26 @@ public class EternalizeTest extends CardTestPlayerBase {
assertPowerToughness(playerA, sentinel, 4, 4);
assertAbility(playerA, sentinel, VigilanceAbility.getInstance(), true);
}
+
+ @Test
+ public void testEternalizeAndFatalPush() {
+ addCard(Zone.GRAVEYARD, playerA, sentinel, 1);
+ addCard(Zone.BATTLEFIELD, playerA, "Plains", 10);
+
+ // Destroy target creature if it has converted mana cost 2 or less.
+ // Revolt - Destroy that creature if it has converted mana cost 4 or less
+ // instead if a permanent you controlled left the battlefield this turn.
+ addCard(Zone.HAND, playerB, "Fatal Push"); // Instant {B}
+ addCard(Zone.BATTLEFIELD, playerB, "Swamp", 1);
+
+ activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Eternalize");
+ castSpell(1, PhaseStep.BEGIN_COMBAT, playerB, "Fatal Push", sentinel);
+ setStopAt(1, PhaseStep.POSTCOMBAT_MAIN);
+ execute();
+
+ assertGraveyardCount(playerB, "Fatal Push", 1);
+
+ assertPermanentCount(playerA, sentinel, 0);
+ assertExileCount(playerA, sentinel, 1);
+ }
}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/FlashbackTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/FlashbackTest.java
index 2c1d1fd4c34..e63d71f56b7 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/FlashbackTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/FlashbackTest.java
@@ -381,8 +381,9 @@ public class FlashbackTest extends CardTestPlayerBase {
assertPermanentCount(playerA, "Snapcaster Mage", 1);
assertGraveyardCount(playerA, "Whispers of the Muse", 0);
- assertHandCount(playerA, 1);
assertExileCount("Whispers of the Muse", 1);
+ assertHandCount(playerA, 1);
+
}
/**
@@ -418,7 +419,7 @@ public class FlashbackTest extends CardTestPlayerBase {
Sorcery
Create X 1/1 red Elemental Cat creature tokens with haste. Exile them at the beginning of the next end step.
Flashbackā{R}{R}, Sacrifice X Mountains.
- */
+ */
String fCatBlitz = "Firecat Blitz";
String mountain = "Mountain";
@@ -434,7 +435,7 @@ public class FlashbackTest extends CardTestPlayerBase {
execute();
assertExileCount(playerA, fCatBlitz, 1);
- assertPermanentCount(playerA, "Elemental Cat", 1);
+ assertPermanentCount(playerA, "Elemental Cat", 1);
assertGraveyardCount(playerA, mountain, 1);
}
@@ -506,7 +507,7 @@ public class FlashbackTest extends CardTestPlayerBase {
execute();
assertGraveyardCount(playerA, eVanguard, 1);
- assertGraveyardCount(playerA,yOx, 1);
+ assertGraveyardCount(playerA, yOx, 1);
assertGraveyardCount(playerA, memnite, 1);
assertExileCount(playerA, dReturn, 1);
assertPermanentCount(playerA, bSable, 1);
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/continuous/LandTypeChangingEffectsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/continuous/LandTypeChangingEffectsTest.java
index 091484c1128..ec0ec0888be 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/continuous/LandTypeChangingEffectsTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/continuous/LandTypeChangingEffectsTest.java
@@ -30,8 +30,11 @@ package org.mage.test.cards.continuous;
import mage.abilities.mana.AnyColorManaAbility;
import mage.constants.CardType;
import mage.constants.PhaseStep;
+import mage.constants.SubType;
import mage.constants.Zone;
import mage.counters.CounterType;
+import mage.filter.StaticFilters;
+import mage.game.permanent.Permanent;
import org.junit.Assert;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
@@ -130,14 +133,14 @@ public class LandTypeChangingEffectsTest extends CardTestPlayerBase {
assertType("Forbidding Watchtower", CardType.LAND, "Island");
assertPowerToughness(playerB, "Forbidding Watchtower", 1, 5);
}
-
+
String urborgtoy = "Urborg, Tomb of Yawgmoth";
String bloodmoon = "Blood Moon";
String canopyvista = "Canopy Vista";
/*
NOTE: this test is currently failing due to bug in code. See issue #3072
- */
+ */
@Test
public void testBloodMoonBeforeUrborg() {
// Blood Moon 2R
@@ -146,14 +149,14 @@ public class LandTypeChangingEffectsTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, bloodmoon);
// Each land is a Swamp in addition to its other land types.
addCard(Zone.HAND, playerA, urborgtoy);
-
+
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3);
addCard(Zone.BATTLEFIELD, playerB, canopyvista, 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, bloodmoon);
playLand(1, PhaseStep.POSTCOMBAT_MAIN, playerA, urborgtoy);
-
+
setStopAt(2, PhaseStep.PRECOMBAT_MAIN);
execute();
@@ -169,7 +172,7 @@ public class LandTypeChangingEffectsTest extends CardTestPlayerBase {
/*
NOTE: this test is currently failing due to bug in code. See issue #3072
- */
+ */
@Test
public void testBloodMoonAfterUrborg() {
// Blood Moon 2R
@@ -178,14 +181,14 @@ public class LandTypeChangingEffectsTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, bloodmoon);
// Each land is a Swamp in addition to its other land types.
addCard(Zone.HAND, playerA, urborgtoy);
-
+
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3);
addCard(Zone.BATTLEFIELD, playerB, canopyvista, 1);
playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, urborgtoy);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, bloodmoon);
-
+
setStopAt(2, PhaseStep.PRECOMBAT_MAIN);
execute();
@@ -199,4 +202,66 @@ public class LandTypeChangingEffectsTest extends CardTestPlayerBase {
Assert.assertTrue("The mana the land can produce should be [{R}] but it's " + playerB.getManaAvailable(currentGame).toString(), playerB.getManaAvailable(currentGame).toString().equals("[{R}]"));
}
+ /*
+ I had Kormus Bell (all swamps are 1/1s) and Urborg, Tomb of Yawgmoth (all lands are swamps) and only basic lands (swamps) otherwise.
+ Opponent had Quicksilver Fountain (put a flood counter on non-island land).
+ In terms of time-stamp order, Urborg was down first, then Kormus Bell, then Quicksilver.
+ When I put a flood counter on a basic swamp, it would become a 0/0 instead of a 1/1 and die.
+ */
+ @Test
+ public void testCormusBellAfterUrborg() {
+ // Land - Legendary
+ // Each land is a Swamp in addition to its other land types.
+ addCard(Zone.HAND, playerA, urborgtoy);
+
+ // All Swamps are 1/1 black creatures that are still lands.
+ addCard(Zone.HAND, playerA, "Kormus Bell"); // Artifact {4}
+
+ addCard(Zone.BATTLEFIELD, playerA, "Mountain", 4);
+
+ // At the beginning of each player's upkeep, that player puts a flood counter on target non-Island land he or she controls of his or her choice.
+ // That land is an Island for as long as it has a flood counter on it.
+ // At the beginning of each end step, if all lands on the battlefield are Islands, remove all flood counters from them.
+ addCard(Zone.HAND, playerB, "Quicksilver Fountain", 1); // Artifact {3}
+ addCard(Zone.BATTLEFIELD, playerB, "Forest", 3);
+
+ playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, urborgtoy);
+ castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Kormus Bell");
+
+ castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Quicksilver Fountain");
+ addTarget(playerA, "Mountain");
+
+ setStopAt(3, PhaseStep.POSTCOMBAT_MAIN);
+ execute();
+
+ assertPermanentCount(playerA, urborgtoy, 1);
+ assertPermanentCount(playerA, "Kormus Bell", 1);
+ assertPermanentCount(playerB, "Quicksilver Fountain", 1);
+
+ assertGraveyardCount(playerA, "Mountain", 0);
+
+ int islandTypes = 0;
+ int swampTypes = 0;
+ int mountainTypes = 0;
+ int creatures = 0;
+ for (Permanent permanent : currentGame.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_LAND, playerA.getId(), currentGame)) {
+ if (permanent.getSubtype(currentGame).contains(SubType.ISLAND)) {
+ islandTypes++;
+ }
+ if (permanent.getSubtype(currentGame).contains(SubType.MOUNTAIN)) {
+ mountainTypes++;
+ }
+ if (permanent.getSubtype(currentGame).contains(SubType.SWAMP)) {
+ swampTypes++;
+ }
+ if (permanent.isCreature()) {
+ creatures++;
+ }
+ }
+ Assert.assertTrue("1 land has to be of island type", islandTypes == 1);
+ Assert.assertTrue("3 lands have to be of mountain type", mountainTypes == 3);
+ Assert.assertTrue("4 lands have to be of swamp type", swampTypes == 4);
+ Assert.assertTrue("4 lands have to be creatures but there are " + creatures, creatures == 4);
+ }
+
}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/control/BronzeBombshellTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/control/BronzeBombshellTest.java
new file mode 100644
index 00000000000..9130c50c4d8
--- /dev/null
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/control/BronzeBombshellTest.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 org.mage.test.cards.control;
+
+import mage.constants.PhaseStep;
+import mage.constants.Zone;
+import org.junit.Test;
+import org.mage.test.serverside.base.CardTestPlayerBase;
+
+/**
+ *
+ * @author LevelX
+ */
+public class BronzeBombshellTest extends CardTestPlayerBase {
+
+ @Test
+ public void testEndlessWhispers() {
+ // When a player other than Bronze Bombshell's owner controls it, that player sacrifices it.
+ // If the player does, Bronze Bombshell deals 7 damage to him or her.
+ addCard(Zone.BATTLEFIELD, playerA, "Bronze Bombshell", 1);
+
+ // Each creature has "When this creature dies, choose target opponent.
+ // That player puts this card from its owner's graveyard onto the battlefield
+ // under his or her control at the beginning of the next end step."
+ addCard(Zone.BATTLEFIELD, playerA, "Endless Whispers", 1);
+
+ addCard(Zone.BATTLEFIELD, playerA, "Swamp", 3);
+ // Destroy target creature or planeswalker..
+ addCard(Zone.HAND, playerA, "Hero's Downfall"); // {1}{B}{B}
+
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Hero's Downfall", "Bronze Bombshell");
+ addTarget(playerA, playerB);
+
+ setStopAt(2, PhaseStep.UPKEEP);
+ execute();
+
+ assertGraveyardCount(playerA, "Hero's Downfall", 1);
+ assertGraveyardCount(playerA, "Bronze Bombshell", 1);
+
+ assertLife(playerA, 20);
+ assertLife(playerB, 13);
+
+ }
+
+}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/replacement/DrawEffectsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/DrawEffectsTest.java
index 59a07848015..90d6463d701 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/replacement/DrawEffectsTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/DrawEffectsTest.java
@@ -110,4 +110,24 @@ public class DrawEffectsTest extends CardTestPlayerBase {
assertHandCount(playerA, 14);
assertHandCount(playerB, 0);
}
+
+ @Test
+ public void WordsOfWilding() {
+ addCard(Zone.BATTLEFIELD, playerA, "Island", 4);
+ // {1}: The next time you would draw a card this turn, create a 2/2 green Bear creature token instead.
+ addCard(Zone.BATTLEFIELD, playerA, "Words of Wilding", 1);
+
+ // Draw two cards.
+ addCard(Zone.HAND, playerA, "Counsel of the Soratami", 1); // Sorcery {2}{U}
+
+ activateAbility(1, PhaseStep.UPKEEP, playerA, "{1}");
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Counsel of the Soratami");
+
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertGraveyardCount(playerA, "Counsel of the Soratami", 1);
+ assertPermanentCount(playerA, "Bear", 1);
+ assertHandCount(playerA, 1);
+ }
}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/KalitasBloodchiefOfGhetTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/KalitasBloodchiefOfGhetTest.java
new file mode 100644
index 00000000000..ea8217863b9
--- /dev/null
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/KalitasBloodchiefOfGhetTest.java
@@ -0,0 +1,30 @@
+package org.mage.test.cards.single;
+
+import mage.constants.PhaseStep;
+import mage.constants.Zone;
+import org.junit.Test;
+import org.mage.test.serverside.base.CardTestPlayerBase;
+
+public class KalitasBloodchiefOfGhetTest extends CardTestPlayerBase {
+
+ @Test
+ public void testTokenCreatedOnlyIfTargetDies() {
+ // {B}{B}{B}, {T}: Destroy target creature. If that creature dies this way, create a black Vampire creature token.
+ // Its power is equal to that creature's power and its toughness is equal to that creature's toughness.
+ addCard(Zone.BATTLEFIELD, playerA, "Kalitas, Bloodchief of Ghet", 1);
+ addCard(Zone.BATTLEFIELD, playerA, "Swamp", 3);
+
+ // When Rest in Peace enters the battlefield, exile all cards from all graveyards.
+ // If a card or token would be put into a graveyard from anywhere, exile it instead.
+ addCard(Zone.BATTLEFIELD, playerA, "Rest in Peace", 1); // Enchantment
+
+ addCard(Zone.BATTLEFIELD, playerB, "Gray Ogre", 1); // Creature - Ogre 2/2
+
+ activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{B}{B}{B}", "Gray Ogre");
+ setStopAt(3, PhaseStep.BEGIN_COMBAT);
+
+ execute();
+
+ assertPermanentCount(playerA, "Vampire", 0);
+ }
+}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/RimescaleDragonTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/RimescaleDragonTest.java
new file mode 100644
index 00000000000..b9f0a8b0471
--- /dev/null
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/RimescaleDragonTest.java
@@ -0,0 +1,69 @@
+package org.mage.test.cards.single;
+
+import mage.constants.PhaseStep;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import org.junit.Test;
+import org.mage.test.serverside.base.CardTestPlayerBase;
+
+/**
+ * @author JRHerlehy Created on 7/27/17.
+ */
+public class RimescaleDragonTest extends CardTestPlayerBase {
+
+ // Flying
+ // {2}{S}: Tap target creature and put an ice counter on it.
+ // Creatures with ice counters on them don't untap during their controllers' untap steps.
+ private final String dragon = "Rimescale Dragon";
+ private final String snowMountain = "Snow-Covered Mountain";
+ private final String thopter = "Ornithopter";
+ private final String terror = "Terror";
+
+ private final String ability = "{2}{S}: Tap target";
+
+ @Test
+ public void testActivatedAbility() {
+ this.setupTest();
+
+ this.setStopAt(1, PhaseStep.POSTCOMBAT_MAIN);
+ this.execute();
+
+ this.assertTapped(thopter, true);
+ this.assertCounterCount(thopter, CounterType.ICE, 1);
+ }
+
+ @Test
+ public void testStaticAbility() {
+ this.setupTest();
+
+ this.setStopAt(2, PhaseStep.UPKEEP);
+ this.execute();
+
+ this.assertTapped(thopter, true);
+ this.assertCounterCount(thopter, CounterType.ICE, 1);
+ }
+
+ @Test
+ public void testStaticAbilityEnded() {
+ this.setupTest();
+
+ this.castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, terror, dragon);
+
+ this.setStopAt(2, PhaseStep.UPKEEP);
+ this.execute();
+
+ this.assertTapped(thopter, false);
+ this.assertCounterCount(thopter, CounterType.ICE, 1);
+ }
+
+ private void setupTest() {
+ this.addCard(Zone.BATTLEFIELD, playerA, dragon);
+ this.addCard(Zone.BATTLEFIELD, playerA, snowMountain, 3);
+
+ this.addCard(Zone.BATTLEFIELD, playerB, thopter);
+ this.addCard(Zone.BATTLEFIELD, playerB, "Swamp", 2);
+ this.addCard(Zone.HAND, playerB, terror);
+
+ this.activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, ability, thopter);
+ }
+}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/ZurTheEnchanterTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/ZurTheEnchanterTest.java
index b5a57a73b26..d5462cb059e 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/ZurTheEnchanterTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/ZurTheEnchanterTest.java
@@ -45,8 +45,8 @@ public class ZurTheEnchanterTest extends CardTestPlayerBase {
* shroud (Lightning Greaves, Diplomatic Immunity, Greater Auramancy + an
* aura on him, etc.) and when his ability triggers searching for an aura
* (in this case, Empyrial Armor) and trying to attach it to Zur himself.
- * The game won't allow you to attach it him, even though it should, since
- * the enchantment is put onto the battlefield and not cast, hence, no
+ * The game won't allow you to attach it to him, even though it should,
+ * since the enchantment is put onto the battlefield and not cast, hence, no
* targeting is done. The rulings page for Zur itself say it so on Gatherer:
*
* Shroud shouldn't stop Empyrial Armor from attaching to Zur, only
@@ -55,7 +55,8 @@ public class ZurTheEnchanterTest extends CardTestPlayerBase {
@Test
public void testAuraToBattlefieldDoesNotTarget() {
// Flying
- // Whenever Zur the Enchanter attacks, you may search your library for an enchantment card with converted mana cost 3 or less and put it onto the battlefield. If you do, shuffle your library.
+ // Whenever Zur the Enchanter attacks, you may search your library for an enchantment card
+ // with converted mana cost 3 or less and put it onto the battlefield. If you do, shuffle your library.
addCard(Zone.BATTLEFIELD, playerB, "Zur the Enchanter"); // 1/4
addCard(Zone.BATTLEFIELD, playerB, "Island", 2);
diff --git a/Mage.Tests/src/test/java/org/mage/test/game/ends/GameIsADrawTest.java b/Mage.Tests/src/test/java/org/mage/test/game/ends/GameIsADrawTest.java
index 5ffde49c858..824d247ebaf 100644
--- a/Mage.Tests/src/test/java/org/mage/test/game/ends/GameIsADrawTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/game/ends/GameIsADrawTest.java
@@ -1,7 +1,29 @@
/*
- * 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.
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation 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.game.ends;
diff --git a/Mage.Tests/src/test/java/org/mage/test/game/ends/PhageTheUntouchableTest.java b/Mage.Tests/src/test/java/org/mage/test/game/ends/PhageTheUntouchableTest.java
new file mode 100644
index 00000000000..933e1334ac4
--- /dev/null
+++ b/Mage.Tests/src/test/java/org/mage/test/game/ends/PhageTheUntouchableTest.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 org.mage.test.game.ends;
+
+import mage.constants.PhaseStep;
+import mage.constants.TurnPhase;
+import mage.constants.Zone;
+import org.junit.Assert;
+import org.junit.Test;
+import org.mage.test.serverside.base.CardTestPlayerBase;
+
+/**
+ *
+ * @author LeveƶX
+ */
+public class PhageTheUntouchableTest extends CardTestPlayerBase {
+
+ @Test
+ public void TestWithEndlessWhispers() {
+ // Each creature has "When this creature dies, choose target opponent.
+ // That player puts this card from its owner's graveyard onto the battlefield
+ // under his or her control at the beginning of the next end step."
+ addCard(Zone.BATTLEFIELD, playerA, "Endless Whispers");
+
+ // Destroy target creature or planeswalker..
+ addCard(Zone.HAND, playerA, "Hero's Downfall"); // {1}{B}{B}
+
+ // When Phage the Untouchable enters the battlefield, if you didn't cast it from your hand, you lose the game.
+ // Whenever Phage deals combat damage to a creature, destroy that creature. It can't be regenerated.
+ // Whenever Phage deals combat damage to a player, that player loses the game.
+ addCard(Zone.HAND, playerA, "Phage the Untouchable"); // Creature {3}{B}{B}{B}{B} 4/4
+ addCard(Zone.BATTLEFIELD, playerA, "Swamp", 10);
+
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Phage the Untouchable");
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Hero's Downfall", "Phage the Untouchable");
+
+ setStopAt(2, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertLife(playerA, 20);
+ assertLife(playerB, 20);
+
+ assertGraveyardCount(playerA, "Hero's Downfall", 1);
+ assertPermanentCount(playerB, "Phage the Untouchable", 1);
+
+ Assert.assertTrue("Game has ended.", currentGame.hasEnded());
+ Assert.assertTrue("Player A has won.", playerA.hasWon());
+ Assert.assertTrue("Game ist At end phase", currentGame.getPhase().getType().equals(TurnPhase.END));
+
+ }
+
+}
diff --git a/Mage/src/main/java/mage/abilities/common/AttackedByCreatureTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/AttackedByCreatureTriggeredAbility.java
index 9f3fc3ef004..5469b289b16 100644
--- a/Mage/src/main/java/mage/abilities/common/AttackedByCreatureTriggeredAbility.java
+++ b/Mage/src/main/java/mage/abilities/common/AttackedByCreatureTriggeredAbility.java
@@ -74,21 +74,16 @@ public class AttackedByCreatureTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
- UUID playerId = game.getCombat().getDefendingPlayerId(event.getSourceId(), game);
+ UUID defendingPlayer = game.getCombat().getDefendingPlayerId(event.getSourceId(), game);
Permanent attackingCreature = game.getPermanent(event.getSourceId());
- if (getControllerId().equals(playerId) && attackingCreature != null) {
- if (setTargetPointer != SetTargetPointer.NONE) {
- for (Effect effect : this.getEffects()) {
- switch (setTargetPointer) {
- case PERMANENT:
- effect.setTargetPointer(new FixedTarget(attackingCreature.getId()));
- break;
- case PLAYER:
- effect.setTargetPointer(new FixedTarget(attackingCreature.getControllerId()));
- break;
- }
-
- }
+ if (getControllerId().equals(defendingPlayer) && attackingCreature != null) {
+ switch (setTargetPointer) {
+ case PERMANENT:
+ this.getEffects().setTargetPointer(new FixedTarget(attackingCreature, game));
+ break;
+ case PLAYER:
+ this.getEffects().setTargetPointer(new FixedTarget(attackingCreature.getControllerId()));
+ break;
}
return true;
}
diff --git a/Mage/src/main/java/mage/abilities/common/AttacksCreatureYouControlTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/AttacksCreatureYouControlTriggeredAbility.java
index 8331b338615..2445b391bb9 100644
--- a/Mage/src/main/java/mage/abilities/common/AttacksCreatureYouControlTriggeredAbility.java
+++ b/Mage/src/main/java/mage/abilities/common/AttacksCreatureYouControlTriggeredAbility.java
@@ -24,8 +24,7 @@
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
-*/
-
+ */
package mage.abilities.common;
import mage.abilities.TriggeredAbilityImpl;
@@ -84,9 +83,7 @@ public class AttacksCreatureYouControlTriggeredAbility extends TriggeredAbilityI
Permanent sourcePermanent = game.getPermanent(event.getSourceId());
if (sourcePermanent != null && filter.match(sourcePermanent, sourceId, controllerId, game)) {
if (setTargetPointer) {
- for (Effect effect : this.getEffects()) {
- effect.setTargetPointer(new FixedTarget(event.getSourceId()));
- }
+ this.getEffects().setTargetPointer(new FixedTarget(event.getSourceId()));
}
return true;
}
diff --git a/Mage/src/main/java/mage/abilities/common/BecomesBlockedAllTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BecomesBlockedAllTriggeredAbility.java
index 58a00f4543c..ec977c8aa57 100644
--- a/Mage/src/main/java/mage/abilities/common/BecomesBlockedAllTriggeredAbility.java
+++ b/Mage/src/main/java/mage/abilities/common/BecomesBlockedAllTriggeredAbility.java
@@ -71,9 +71,7 @@ public class BecomesBlockedAllTriggeredAbility extends TriggeredAbilityImpl {
Permanent permanent = game.getPermanent(event.getTargetId());
if (permanent != null && filter.match(permanent, getSourceId(), getControllerId(), game)) {
if (setTargetPointer) {
- for (Effect effect : this.getEffects()) {
- effect.setTargetPointer(new FixedTarget(event.getTargetId()));
- }
+ this.getEffects().setTargetPointer(new FixedTarget(event.getTargetId()));
}
return true;
}
diff --git a/Mage/src/main/java/mage/abilities/common/BecomesBlockedByCreatureTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BecomesBlockedByCreatureTriggeredAbility.java
index 8fbb14821a3..3f56eaad44f 100644
--- a/Mage/src/main/java/mage/abilities/common/BecomesBlockedByCreatureTriggeredAbility.java
+++ b/Mage/src/main/java/mage/abilities/common/BecomesBlockedByCreatureTriggeredAbility.java
@@ -68,9 +68,7 @@ public class BecomesBlockedByCreatureTriggeredAbility extends TriggeredAbilityIm
if (event.getTargetId().equals(this.getSourceId())) {
Permanent blocker = game.getPermanent(event.getSourceId());
if (filter.match(blocker, game)) {
- for (Effect effect : this.getEffects()) {
- effect.setTargetPointer(new FixedTarget(event.getSourceId()));
- }
+ this.getEffects().setTargetPointer(new FixedTarget(blocker, game));
return true;
}
}
diff --git a/Mage/src/main/java/mage/abilities/common/BecomesMonstrousTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BecomesMonstrousTriggeredAbility.java
index 452adbba588..41ddae73ad1 100644
--- a/Mage/src/main/java/mage/abilities/common/BecomesMonstrousTriggeredAbility.java
+++ b/Mage/src/main/java/mage/abilities/common/BecomesMonstrousTriggeredAbility.java
@@ -8,7 +8,6 @@ package mage.abilities.common;
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;
import mage.game.permanent.Permanent;
@@ -20,8 +19,6 @@ import mage.target.targetpointer.FixedTarget;
*/
public class BecomesMonstrousTriggeredAbility extends TriggeredAbilityImpl {
- protected FilterCreaturePermanent filter = new FilterCreaturePermanent();
-
public BecomesMonstrousTriggeredAbility(Effect effect) {
super(Zone.BATTLEFIELD, effect, false);
}
@@ -43,11 +40,9 @@ public class BecomesMonstrousTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
Permanent permanent = game.getPermanent(event.getTargetId());
- if (filter.match(permanent, sourceId, controllerId, game)
- && (permanent.getControllerId().equals(this.controllerId))) {
- for (Effect effect : this.getEffects()) {
- effect.setTargetPointer(new FixedTarget(event.getTargetId()));
- }
+ if (permanent != null && permanent.isCreature()
+ && (permanent.getControllerId().equals(getControllerId()))) {
+ this.getEffects().setTargetPointer(new FixedTarget(permanent, game));
return true;
}
return false;
@@ -55,6 +50,6 @@ public class BecomesMonstrousTriggeredAbility extends TriggeredAbilityImpl {
@Override
public String getRule() {
- return "Whenever " + filter.getMessage() + " becomes monstrous, " + super.getRule();
+ return "Whenever a creature you control becomes monstrous, " + super.getRule();
}
}
diff --git a/Mage/src/main/java/mage/abilities/common/BeginningOfDrawTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BeginningOfDrawTriggeredAbility.java
index 34b7a0af99a..80b03b2c871 100644
--- a/Mage/src/main/java/mage/abilities/common/BeginningOfDrawTriggeredAbility.java
+++ b/Mage/src/main/java/mage/abilities/common/BeginningOfDrawTriggeredAbility.java
@@ -25,7 +25,6 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-
package mage.abilities.common;
import mage.abilities.TriggeredAbilityImpl;
@@ -38,14 +37,16 @@ import mage.game.permanent.Permanent;
import mage.target.targetpointer.FixedTarget;
public class BeginningOfDrawTriggeredAbility extends TriggeredAbilityImpl {
+
private TargetController targetController;
/**
- * The Ability sets if no target is defined the target pointer to the active player of the current draw phase
- *
+ * The Ability sets if no target is defined the target pointer to the active
+ * player of the current draw phase
+ *
* @param effect
* @param targetController
- * @param isOptional
+ * @param isOptional
*/
public BeginningOfDrawTriggeredAbility(Effect effect, TargetController targetController, boolean isOptional) {
this(Zone.BATTLEFIELD, effect, targetController, isOptional);
@@ -78,18 +79,14 @@ public class BeginningOfDrawTriggeredAbility extends TriggeredAbilityImpl {
boolean yours = event.getPlayerId().equals(this.controllerId);
if (yours) {
if (getTargets().isEmpty()) {
- for (Effect effect : this.getEffects()) {
- effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
- }
+ this.getEffects().setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
return yours;
case OPPONENT:
if (game.getPlayer(this.controllerId).hasOpponent(event.getPlayerId(), game)) {
if (getTargets().isEmpty()) {
- for (Effect effect : this.getEffects()) {
- effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
- }
+ this.getEffects().setTargetPointer(new FixedTarget(event.getPlayerId()));
}
return true;
}
@@ -97,9 +94,7 @@ public class BeginningOfDrawTriggeredAbility extends TriggeredAbilityImpl {
case NOT_YOU:
if (!this.controllerId.equals(event.getPlayerId())) {
if (getTargets().isEmpty()) {
- for (Effect effect : this.getEffects()) {
- effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
- }
+ this.getEffects().setTargetPointer(new FixedTarget(event.getPlayerId()));
}
return true;
}
@@ -110,9 +105,7 @@ public class BeginningOfDrawTriggeredAbility extends TriggeredAbilityImpl {
Permanent attachedTo = game.getPermanent(attachment.getAttachedTo());
if (attachedTo != null && attachedTo.getControllerId().equals(event.getPlayerId())) {
if (getTargets().isEmpty()) {
- for (Effect effect : this.getEffects()) {
- effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
- }
+ this.getEffects().setTargetPointer(new FixedTarget(event.getPlayerId()));
}
return true;
}
@@ -120,9 +113,7 @@ public class BeginningOfDrawTriggeredAbility extends TriggeredAbilityImpl {
break;
case ANY:
if (getTargets().isEmpty()) {
- for (Effect effect : this.getEffects()) {
- effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
- }
+ this.getEffects().setTargetPointer(new FixedTarget(event.getPlayerId()));
}
return true;
}
diff --git a/Mage/src/main/java/mage/abilities/decorator/ConditionalContinuousEffect.java b/Mage/src/main/java/mage/abilities/decorator/ConditionalContinuousEffect.java
index 7f0ac802695..5a22141369e 100644
--- a/Mage/src/main/java/mage/abilities/decorator/ConditionalContinuousEffect.java
+++ b/Mage/src/main/java/mage/abilities/decorator/ConditionalContinuousEffect.java
@@ -1,5 +1,6 @@
package mage.abilities.decorator;
+import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
@@ -10,6 +11,7 @@ import mage.abilities.condition.FixedCondition;
import mage.abilities.condition.LockedInCondition;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.ContinuousEffectImpl;
+import mage.constants.DependencyType;
import mage.constants.Duration;
import mage.constants.Layer;
import mage.constants.SubLayer;
@@ -137,6 +139,14 @@ public class ConditionalContinuousEffect extends ContinuousEffectImpl {
return new ConditionalContinuousEffect(this);
}
+ @Override
+ public EnumSet getDependencyTypes() {
+ if (effect != null) {
+ return effect.getDependencyTypes();
+ }
+ return super.getDependencyTypes();
+ }
+
@Override
public Set isDependentTo(List allEffectsInLayer) {
if (effect != null) {
diff --git a/Mage/src/main/java/mage/abilities/effects/ContinuousEffect.java b/Mage/src/main/java/mage/abilities/effects/ContinuousEffect.java
index 13cd406e9df..51df5b855d2 100644
--- a/Mage/src/main/java/mage/abilities/effects/ContinuousEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/ContinuousEffect.java
@@ -27,6 +27,7 @@
*/
package mage.abilities.effects;
+import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
@@ -74,12 +75,14 @@ public interface ContinuousEffect extends Effect {
Set isDependentTo(List allEffectsInLayer);
- Set getDependencyTypes();
+ EnumSet getDependencyTypes();
void addDependencyType(DependencyType dependencyType);
void setDependedToType(DependencyType dependencyType);
+ void addDependedToType(DependencyType dependencyType);
+
@Override
void newId();
diff --git a/Mage/src/main/java/mage/abilities/effects/ContinuousEffectImpl.java b/Mage/src/main/java/mage/abilities/effects/ContinuousEffectImpl.java
index 52cb239bd22..ac2720a3932 100644
--- a/Mage/src/main/java/mage/abilities/effects/ContinuousEffectImpl.java
+++ b/Mage/src/main/java/mage/abilities/effects/ContinuousEffectImpl.java
@@ -33,8 +33,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
-import java.util.stream.Collectors;
-
import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.MageSingleton;
@@ -67,7 +65,7 @@ public abstract class ContinuousEffectImpl extends EffectImpl implements Continu
protected List affectedObjectList = new ArrayList<>();
protected boolean temporary = false;
protected EnumSet dependencyTypes; // this effect has the dependencyTypes defined here
- protected DependencyType dependendToType; // this effect is dependent to this type
+ protected EnumSet dependendToTypes; // this effect is dependent to this types
/*
A Characteristic Defining Ability (CDA) is an ability that defines a characteristic of a card or token.
There are 3 specific rules that distinguish a CDA from other abilities.
@@ -87,7 +85,7 @@ public abstract class ContinuousEffectImpl extends EffectImpl implements Continu
this.order = 0;
this.effectType = EffectType.CONTINUOUS;
this.dependencyTypes = EnumSet.noneOf(DependencyType.class);
- this.dependendToType = null;
+ this.dependendToTypes = EnumSet.noneOf(DependencyType.class);
}
public ContinuousEffectImpl(Duration duration, Layer layer, SubLayer sublayer, Outcome outcome) {
@@ -110,7 +108,7 @@ public abstract class ContinuousEffectImpl extends EffectImpl implements Continu
this.startingTurn = effect.startingTurn;
this.startingControllerId = effect.startingControllerId;
this.dependencyTypes = effect.dependencyTypes;
- this.dependendToType = effect.dependendToType;
+ this.dependendToTypes = effect.dependendToTypes;
this.characterDefining = effect.characterDefining;
}
@@ -165,6 +163,7 @@ public abstract class ContinuousEffectImpl extends EffectImpl implements Continu
*/
@Override
public void discard() {
+ this.used = true; // to prevent further usage before effect is removed
this.discarded = true;
}
@@ -271,14 +270,28 @@ public abstract class ContinuousEffectImpl extends EffectImpl implements Continu
@Override
public Set isDependentTo(List allEffectsInLayer) {
- if (dependendToType != null) {
+ Set dependentToEffects = new HashSet();
+ if (dependendToTypes != null) {
+ for (ContinuousEffect effect : allEffectsInLayer) {
+ if (!effect.getId().equals(this.getId())) {
+ for (DependencyType dependencyType : effect.getDependencyTypes()) {
+ if (dependendToTypes.contains(dependencyType)) {
+ dependentToEffects.add(effect.getId());
+ break;
+ }
+ }
+ }
+ }
+ }
+ return dependentToEffects;
+ /*
return allEffectsInLayer.stream()
- .filter(effect -> effect.getDependencyTypes().contains(dependendToType))
+ .filter(effect -> effect.getDependencyTypes().contains(dependendToTypes))
.map(Effect::getId)
.collect(Collectors.toSet());
}
- return new HashSet<>();
+ return new HashSet<>();*/
}
@Override
@@ -293,7 +306,13 @@ public abstract class ContinuousEffectImpl extends EffectImpl implements Continu
@Override
public void setDependedToType(DependencyType dependencyType) {
- dependendToType = dependencyType;
+ dependendToTypes.clear();
+ dependendToTypes.add(dependencyType);
+ }
+
+ @Override
+ public void addDependedToType(DependencyType dependencyType) {
+ dependendToTypes.add(dependencyType);
}
}
diff --git a/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java b/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java
index 1299a3666f8..e1ac2ffa005 100644
--- a/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java
+++ b/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java
@@ -355,7 +355,7 @@ public class ContinuousEffects implements Serializable {
for (Ability ability : abilities) {
// for replacment effects of static abilities do not use LKI to check if to apply
if (ability.getAbilityType() != AbilityType.STATIC || ability.isInUseableZone(game, null, event)) {
- if (effect.getDuration() != Duration.OneUse || !effect.isUsed()) {
+ if (!effect.isUsed()) {
if (!game.getScopeRelevant()
|| effect.hasSelfScope()
|| !event.getTargetId().equals(ability.getSourceId())) {
diff --git a/Mage/src/main/java/mage/abilities/effects/Effects.java b/Mage/src/main/java/mage/abilities/effects/Effects.java
index f479863bfbd..5598970061e 100644
--- a/Mage/src/main/java/mage/abilities/effects/Effects.java
+++ b/Mage/src/main/java/mage/abilities/effects/Effects.java
@@ -24,8 +24,7 @@
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
-*/
-
+ */
package mage.abilities.effects;
import java.util.ArrayList;
@@ -34,6 +33,7 @@ import java.util.List;
import java.util.Set;
import mage.abilities.Mode;
import mage.constants.Outcome;
+import mage.target.targetpointer.TargetPointer;
/**
*
@@ -41,10 +41,11 @@ import mage.constants.Outcome;
*/
public class Effects extends ArrayList {
- public Effects() {}
+ public Effects() {
+ }
public Effects(final Effects effects) {
- for (Effect effect: effects) {
+ for (Effect effect : effects) {
this.add(effect.copy());
}
}
@@ -64,7 +65,7 @@ public class Effects extends ArrayList {
public String getText(Mode mode) {
StringBuilder sbText = new StringBuilder();
String lastRule = null;
- for (Effect effect: this) {
+ for (Effect effect : this) {
String endString = "";
String nextRule = effect.getText(mode);
if (nextRule != null) {
@@ -72,7 +73,7 @@ public class Effects extends ArrayList {
endString = " ";
} else if (nextRule.startsWith(",") || nextRule.startsWith(" ")) {
endString = "";
- } else if (lastRule != null && lastRule.length()> 3) {
+ } else if (lastRule != null && lastRule.length() > 3) {
if (!lastRule.endsWith(".") && !lastRule.endsWith("
")) {
endString = ". ";
}
@@ -84,19 +85,19 @@ public class Effects extends ArrayList {
}
lastRule = nextRule;
}
- if (lastRule != null && lastRule.length()> 3 &&
- !lastRule.endsWith(".") &&
- !lastRule.endsWith("\"") &&
- !lastRule.startsWith("Level ") &&
- !lastRule.endsWith(".)") &&
- !lastRule.endsWith("") ) {
+ if (lastRule != null && lastRule.length() > 3
+ && !lastRule.endsWith(".")
+ && !lastRule.endsWith("\"")
+ && !lastRule.startsWith("Level ")
+ && !lastRule.endsWith(".)")
+ && !lastRule.endsWith("")) {
sbText.append('.');
}
return sbText.toString();
}
public boolean hasOutcome(Outcome outcome) {
- for (Effect effect: this) {
+ for (Effect effect : this) {
if (effect.getOutcome() == outcome) {
return true;
}
@@ -106,7 +107,7 @@ public class Effects extends ArrayList {
public List getOutcomes() {
Set outcomes = new HashSet<>();
- for (Effect effect: this) {
+ for (Effect effect : this) {
outcomes.add(effect.getOutcome());
}
return new ArrayList<>(outcomes);
@@ -114,11 +115,10 @@ public class Effects extends ArrayList {
public int getOutcomeTotal() {
int total = 0;
- for (Effect effect: this) {
+ for (Effect effect : this) {
if (effect.getOutcome().isGood()) {
total++;
- }
- else {
+ } else {
total--;
}
}
@@ -126,8 +126,18 @@ public class Effects extends ArrayList {
}
public void newId() {
- for (Effect effect: this) {
+ for (Effect effect : this) {
effect.newId();
}
}
+
+ public void setTargetPointer(TargetPointer targetPointer) {
+ if (targetPointer == null) {
+ return;
+ }
+ for (Effect effect : this) {
+ effect.setTargetPointer(targetPointer.copy());
+ }
+ }
+
}
diff --git a/Mage/src/main/java/mage/abilities/effects/common/LoseLifeDefendingPlayerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/LoseLifeDefendingPlayerEffect.java
index d5296bb901e..1d2fca57b26 100644
--- a/Mage/src/main/java/mage/abilities/effects/common/LoseLifeDefendingPlayerEffect.java
+++ b/Mage/src/main/java/mage/abilities/effects/common/LoseLifeDefendingPlayerEffect.java
@@ -73,7 +73,7 @@ public class LoseLifeDefendingPlayerEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- Player defender = null;
+ Player defender;
if (attackerIsSource) {
defender = game.getPlayer(game.getCombat().getDefendingPlayerId(source.getSourceId(), game));
} else {
diff --git a/Mage/src/main/java/mage/abilities/keyword/AfflictAbility.java b/Mage/src/main/java/mage/abilities/keyword/AfflictAbility.java
index a97e4474a75..2e8feb1ceef 100644
--- a/Mage/src/main/java/mage/abilities/keyword/AfflictAbility.java
+++ b/Mage/src/main/java/mage/abilities/keyword/AfflictAbility.java
@@ -1,11 +1,15 @@
package mage.abilities.keyword;
+import java.util.UUID;
import mage.abilities.common.BecomesBlockedTriggeredAbility;
-import mage.abilities.effects.common.LoseLifeDefendingPlayerEffect;
+import mage.abilities.effects.common.LoseLifeTargetEffect;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.target.targetpointer.FixedTarget;
public class AfflictAbility extends BecomesBlockedTriggeredAbility {
- private int lifeLoss;
+ private final int lifeLoss;
@Override
public AfflictAbility copy() {
@@ -13,11 +17,23 @@ public class AfflictAbility extends BecomesBlockedTriggeredAbility {
}
public AfflictAbility(int amount) {
- super(new LoseLifeDefendingPlayerEffect(amount, true)
+ super(new LoseLifeTargetEffect(amount)
.setText("Afflict " + amount + " (Whenever this creature becomes blocked, defending player loses " + amount + " life.)"), false);
lifeLoss = amount;
}
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ if (super.checkTrigger(event, game)) {
+ UUID defenderId = game.getCombat().getDefendingPlayerId(getSourceId(), game);
+ if (defenderId != null) {
+ this.getEffects().setTargetPointer(new FixedTarget(defenderId));
+ return true;
+ }
+ }
+ return false;
+ }
+
public AfflictAbility(final AfflictAbility afflictAbility) {
super(afflictAbility);
lifeLoss = afflictAbility.lifeLoss;
diff --git a/Mage/src/main/java/mage/abilities/keyword/AftermathAbility.java b/Mage/src/main/java/mage/abilities/keyword/AftermathAbility.java
index 59dccbb040d..35b374f513c 100644
--- a/Mage/src/main/java/mage/abilities/keyword/AftermathAbility.java
+++ b/Mage/src/main/java/mage/abilities/keyword/AftermathAbility.java
@@ -31,14 +31,11 @@ import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.*;
+import mage.abilities.effects.common.ExileSpellEffect;
import mage.cards.Card;
-import mage.cards.SplitCardHalf;
import mage.constants.*;
import mage.game.Game;
import mage.game.events.GameEvent;
-import mage.game.events.ZoneChangeEvent;
-import mage.game.stack.Spell;
-import mage.players.Player;
/**
* Aftermath
@@ -55,7 +52,7 @@ public class AftermathAbility extends SimpleStaticAbility {
public AftermathAbility() {
super(Zone.ALL, new AftermathCastFromGraveyard());
addEffect(new AftermathCantCastFromHand());
- addEffect(new AftermathExileAsResolvesFromGraveyard());
+ addEffect(ExileSpellEffect.getInstance());
}
public AftermathAbility(final AftermathAbility ability) {
@@ -68,12 +65,8 @@ public class AftermathAbility extends SimpleStaticAbility {
}
@Override
- public String getRule(boolean all) {
- if (all) {
- return "Aftermath (Cast this card only from your graveyard. Exile it afterwards.)";
- } else {
- return "Aftermath";
- }
+ public String getRule() {
+ return "Aftermath (Cast this spell only from your graveyard. Then exile it.)";
}
}
@@ -81,7 +74,6 @@ class AftermathCastFromGraveyard extends AsThoughEffectImpl {
public AftermathCastFromGraveyard() {
super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfGame, Outcome.Benefit);
- staticText = "Cast {this} from your graveyard";
}
public AftermathCastFromGraveyard(final AftermathCastFromGraveyard effect) {
@@ -98,10 +90,6 @@ class AftermathCastFromGraveyard extends AsThoughEffectImpl {
return new AftermathCastFromGraveyard(this);
}
- private static String msb(UUID id) {
- return Integer.toUnsignedString((int) id.getMostSignificantBits(), 16);
- }
-
@Override
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
if (objectId.equals(source.getSourceId())
@@ -153,75 +141,3 @@ class AftermathCantCastFromHand extends ContinuousRuleModifyingEffectImpl {
return false;
}
}
-
-class AftermathExileAsResolvesFromGraveyard extends ReplacementEffectImpl {
-
- AftermathExileAsResolvesFromGraveyard() {
- super(Duration.WhileOnStack, Outcome.Detriment);
- this.staticText = "Exile it afterwards.";
- }
-
- AftermathExileAsResolvesFromGraveyard(AftermathExileAsResolvesFromGraveyard effect) {
- super(effect);
- }
-
- @Override
- public boolean checksEventType(GameEvent event, Game game) {
- return event.getType() == GameEvent.EventType.ZONE_CHANGE;
- }
-
- @Override
- public boolean applies(GameEvent evt, Ability source, Game game) {
- ZoneChangeEvent event = (ZoneChangeEvent) evt;
- if (event.getFromZone() == Zone.STACK && event.getToZone() != Zone.EXILED) {
- // Moving something from stack to somewhere else
-
- // Get the source id, getting the whole split card's ID, because
- // that's the card that is changing zones in the event, but
- // source.getSourceId is only the split card half.
- // If branch so that we also support putting Aftermath on
- // non-split cards for... whatever reason, in case somebody
- // wants to do that in the future.
- UUID sourceId = source.getSourceId();
- Card sourceCard = game.getCard(source.getSourceId());
- if (sourceCard != null && sourceCard instanceof SplitCardHalf) {
- sourceCard = ((SplitCardHalf) sourceCard).getParentCard();
- sourceId = sourceCard.getId();
- }
-
- if (event.getTargetId() == sourceId) {
- // Moving this spell from stack to yard
- Spell spell = game.getStack().getSpell(source.getSourceId());
- if (spell != null && spell.getFromZone() == Zone.GRAVEYARD) {
- // And this spell was cast from the graveyard, so we need to exile it
- return true;
- }
- }
- }
- return false;
- }
-
- @Override
- public boolean replaceEvent(GameEvent event, Ability source, Game game) {
- UUID sourceId = source.getSourceId();
- Card sourceCard = game.getCard(source.getSourceId());
- if (sourceCard != null && sourceCard instanceof SplitCardHalf) {
- sourceCard = ((SplitCardHalf) sourceCard).getParentCard();
- sourceId = sourceCard.getId();
- }
-
- if (sourceCard != null) {
- Player player = game.getPlayer(sourceCard.getOwnerId());
- if (player != null) {
- return player.moveCardToExileWithInfo(sourceCard, null, "", sourceId, game, ((ZoneChangeEvent) event).getFromZone(), true);
- }
- }
- return false;
- }
-
- @Override
- public AftermathExileAsResolvesFromGraveyard copy() {
- return new AftermathExileAsResolvesFromGraveyard(this);
- }
-
-}
diff --git a/Mage/src/main/java/mage/abilities/keyword/FlashbackAbility.java b/Mage/src/main/java/mage/abilities/keyword/FlashbackAbility.java
index cb3e10fd157..c05f20118f5 100644
--- a/Mage/src/main/java/mage/abilities/keyword/FlashbackAbility.java
+++ b/Mage/src/main/java/mage/abilities/keyword/FlashbackAbility.java
@@ -267,6 +267,7 @@ class FlashbackReplacementEffect extends ReplacementEffectImpl {
if (controller != null) {
Card card = game.getCard(event.getTargetId());
if (card != null) {
+ discard();
return controller.moveCards(
card, Zone.EXILED, source, game, false, false, false, event.getAppliedEffects());
}
@@ -284,7 +285,7 @@ class FlashbackReplacementEffect extends ReplacementEffectImpl {
if (event.getTargetId().equals(source.getSourceId())
&& ((ZoneChangeEvent) event).getFromZone() == Zone.STACK
&& ((ZoneChangeEvent) event).getToZone() != Zone.EXILED) {
- discard();
+
int zcc = game.getState().getZoneChangeCounter(source.getSourceId());
if (((FixedTarget) getTargetPointer()).getZoneChangeCounter() == zcc) {
return true;
diff --git a/Mage/src/main/java/mage/cards/SplitCard.java b/Mage/src/main/java/mage/cards/SplitCard.java
index b3869e6beae..9e57f04b9fc 100644
--- a/Mage/src/main/java/mage/cards/SplitCard.java
+++ b/Mage/src/main/java/mage/cards/SplitCard.java
@@ -27,6 +27,9 @@
*/
package mage.cards;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
import mage.abilities.Abilities;
import mage.abilities.AbilitiesImpl;
import mage.abilities.Ability;
@@ -36,10 +39,6 @@ import mage.constants.SpellAbilityType;
import mage.constants.Zone;
import mage.game.Game;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
/**
*
* @author LevelX2
diff --git a/Mage/src/main/java/mage/cards/repository/CardInfo.java b/Mage/src/main/java/mage/cards/repository/CardInfo.java
index 87a6d5b9d8c..1600f5b82ad 100644
--- a/Mage/src/main/java/mage/cards/repository/CardInfo.java
+++ b/Mage/src/main/java/mage/cards/repository/CardInfo.java
@@ -30,6 +30,8 @@ package mage.cards.repository;
import com.j256.ormlite.field.DataType;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
+import java.util.*;
+import java.util.stream.Collectors;
import mage.ObjectColor;
import mage.abilities.Ability;
import mage.abilities.SpellAbility;
@@ -41,16 +43,13 @@ import mage.constants.*;
import mage.util.SubTypeList;
import org.apache.log4j.Logger;
-import java.util.*;
-import java.util.stream.Collectors;
-
/**
* @author North
*/
@DatabaseTable(tableName = "card")
public class CardInfo {
- private static final int MAX_RULE_LENGTH = 700;
+ private static final int MAX_RULE_LENGTH = 750;
private static final String SEPARATOR = "@@@";
@DatabaseField(indexName = "name_index")
@@ -157,13 +156,30 @@ public class CardInfo {
this.setManaCosts(card.getManaCost().getSymbols());
int length = 0;
- for (String rule : card.getRules()) {
- length += rule.length();
+ List rulesList = new ArrayList<>();
+ if (card instanceof SplitCard) {
+ for (String rule : ((SplitCard) card).getLeftHalfCard().getRules()) {
+ length += rule.length();
+ rulesList.add(rule);
+ }
+ for (String rule : ((SplitCard) card).getRightHalfCard().getRules()) {
+ length += rule.length();
+ rulesList.add(rule);
+ }
+ for (String rule : card.getRules()) {
+ length += rule.length();
+ rulesList.add(rule);
+ }
+ } else {
+ for (String rule : card.getRules()) {
+ length += rule.length();
+ rulesList.add(rule);
+ }
}
if (length > MAX_RULE_LENGTH) {
length = 0;
ArrayList shortRules = new ArrayList<>();
- for (String rule : card.getRules()) {
+ for (String rule : rulesList) {
if (length + rule.length() + 3 <= MAX_RULE_LENGTH) {
shortRules.add(rule);
length += rule.length() + 3;
@@ -175,7 +191,7 @@ public class CardInfo {
Logger.getLogger(CardInfo.class).warn("Card rule text was cut - cardname: " + card.getName());
this.setRules(shortRules);
} else {
- this.setRules(card.getRules());
+ this.setRules(rulesList);
}
SpellAbility spellAbility = card.getSpellAbility();
@@ -306,7 +322,7 @@ public class CardInfo {
public final SubTypeList getSubTypes() {
SubTypeList sl = new SubTypeList();
- if(subtypes.trim().isEmpty()){
+ if (subtypes.trim().isEmpty()) {
return sl;
}
for (String s : subtypes.split(SEPARATOR)) {
diff --git a/Mage/src/main/java/mage/counters/CounterType.java b/Mage/src/main/java/mage/counters/CounterType.java
index 915d1452580..24fcd178b21 100644
--- a/Mage/src/main/java/mage/counters/CounterType.java
+++ b/Mage/src/main/java/mage/counters/CounterType.java
@@ -72,6 +72,7 @@ public enum CounterType {
HOOFPRINT("hoofprint"),
HOUR("hour"),
ICE("ice"),
+ INFECTION("infection"),
INTERVENTION("intervention"),
JAVELIN("javelin"),
KI("ki"),
diff --git a/Mage/src/main/java/mage/filter/predicate/other/CardTextPredicate.java b/Mage/src/main/java/mage/filter/predicate/other/CardTextPredicate.java
index c6603f41566..36cf356ce4f 100644
--- a/Mage/src/main/java/mage/filter/predicate/other/CardTextPredicate.java
+++ b/Mage/src/main/java/mage/filter/predicate/other/CardTextPredicate.java
@@ -28,7 +28,9 @@
package mage.filter.predicate.other;
import mage.cards.Card;
+import mage.cards.SplitCard;
import mage.constants.SubType;
+import mage.constants.SuperType;
import mage.filter.predicate.Predicate;
import mage.game.Game;
@@ -39,9 +41,15 @@ import mage.game.Game;
public class CardTextPredicate implements Predicate {
private final String text;
+ private final boolean inNames;
+ private final boolean inTypes;
+ private final boolean inRules;
- public CardTextPredicate(String text) {
+ public CardTextPredicate(String text, boolean inNames, boolean inTypes, boolean inRules) {
this.text = text;
+ this.inNames = inNames;
+ this.inTypes = inTypes;
+ this.inRules = inRules;
}
@Override
@@ -50,7 +58,7 @@ public class CardTextPredicate implements Predicate {
return true;
}
// first check in card name
- if (input.getName().toLowerCase().contains(text.toLowerCase())) {
+ if (inNames && input.getName().toLowerCase().contains(text.toLowerCase())) {
return true;
}
@@ -60,17 +68,40 @@ public class CardTextPredicate implements Predicate {
boolean found = false;
if (!token.isEmpty()) {
// then try to find in rules
- for (String rule : input.getRules(game)) {
- if (rule.toLowerCase().contains(token)) {
- found = true;
- break;
+ if (inRules) {
+ if (input.isSplitCard()) {
+ for (String rule : ((SplitCard) input).getLeftHalfCard().getRules(game)) {
+ if (rule.toLowerCase().contains(token)) {
+ found = true;
+ break;
+ }
+ }
+ for (String rule : ((SplitCard) input).getRightHalfCard().getRules(game)) {
+ if (rule.toLowerCase().contains(token)) {
+ found = true;
+ break;
+ }
+ }
+ }
+ for (String rule : input.getRules(game)) {
+ if (rule.toLowerCase().contains(token)) {
+ found = true;
+ break;
+ }
}
}
-
- for (SubType subType : input.getSubtype(game)) {
- if (subType.toString().equalsIgnoreCase(token)) {
- found = true;
- break;
+ if (inTypes) {
+ for (SubType subType : input.getSubtype(game)) {
+ if (subType.toString().equalsIgnoreCase(token)) {
+ found = true;
+ break;
+ }
+ }
+ for (SuperType superType : input.getSuperType()) {
+ if (superType.toString().equalsIgnoreCase(token)) {
+ found = true;
+ break;
+ }
}
}
}
diff --git a/Mage/src/main/java/mage/game/command/emblems/DarettiScrapSavantEmblem.java b/Mage/src/main/java/mage/game/command/emblems/DarettiScrapSavantEmblem.java
index 1e37bf8c611..3ee5593a902 100644
--- a/Mage/src/main/java/mage/game/command/emblems/DarettiScrapSavantEmblem.java
+++ b/Mage/src/main/java/mage/game/command/emblems/DarettiScrapSavantEmblem.java
@@ -55,7 +55,6 @@ public class DarettiScrapSavantEmblem extends Emblem {
setName("Emblem Daretti");
this.setExpansionSetCodeForImage("C14");
-
this.getAbilities().add(new DarettiScrapSavantTriggeredAbility());
}
}
@@ -87,9 +86,7 @@ class DarettiScrapSavantTriggeredAbility extends TriggeredAbilityImpl {
&& zEvent.getFromZone() == Zone.BATTLEFIELD
&& zEvent.getTarget().isArtifact()
&& zEvent.getTarget().getOwnerId().equals(this.controllerId)) {
- for (Effect effect : this.getEffects()) {
- effect.setTargetPointer(new FixedTarget(zEvent.getTargetId()));
- }
+ this.getEffects().setTargetPointer(new FixedTarget(zEvent.getTargetId()));
return true;
}
return false;