master #15

Merged
Failure merged 166 commits from External/mage:master into master 2025-01-31 09:13:03 -08:00
269 changed files with 16916 additions and 4603 deletions

View file

@ -180,7 +180,6 @@
</Component>
<Component class="javax.swing.JLabel" name="lblForestIcon">
<Properties>
<Property name="toolTipText" type="java.lang.String" value=""/>
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[22, 20]"/>
</Property>

View file

@ -271,7 +271,6 @@ public class AddLandDialog extends MageDialog {
spnForest.setModel(new javax.swing.SpinnerNumberModel(0, 0, null, 1));
lblForestIcon.setToolTipText("");
lblForestIcon.setMaximumSize(new java.awt.Dimension(22, 20));
lblForestIcon.setMinimumSize(new java.awt.Dimension(22, 20));
lblForestIcon.setPreferredSize(new java.awt.Dimension(22, 20));

View file

@ -35,7 +35,6 @@
<MenuItem class="javax.swing.JMenuItem" name="menuLoadSettingsLast">
<Properties>
<Property name="text" type="java.lang.String" value="Load from last time"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="menuLoadSettingsLastActionPerformed"/>
@ -46,7 +45,6 @@
<MenuItem class="javax.swing.JMenuItem" name="menuLoadSettings1">
<Properties>
<Property name="text" type="java.lang.String" value="Load from config 1"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="menuLoadSettings1ActionPerformed"/>
@ -65,7 +63,6 @@
<MenuItem class="javax.swing.JMenuItem" name="menuLoadSettingsDefault">
<Properties>
<Property name="text" type="java.lang.String" value="Load default settings"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="menuLoadSettingsDefaultActionPerformed"/>
@ -391,7 +388,6 @@
<Component class="javax.swing.JLabel" name="lblSkillLevel">
<Properties>
<Property name="text" type="java.lang.String" value="Skill Level:"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
</Properties>
</Component>
<Component class="javax.swing.JComboBox" name="cbSkillLevel">

View file

@ -150,7 +150,6 @@ public class NewTableDialog extends MageDialog {
popupSaveSettings.add(menuSaveSettings2);
menuLoadSettingsLast.setText("Load from last time");
menuLoadSettingsLast.setToolTipText("");
menuLoadSettingsLast.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
menuLoadSettingsLastActionPerformed(evt);
@ -160,7 +159,6 @@ public class NewTableDialog extends MageDialog {
popupLoadSettings.add(separator1);
menuLoadSettings1.setText("Load from config 1");
menuLoadSettings1.setToolTipText("");
menuLoadSettings1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
menuLoadSettings1ActionPerformed(evt);
@ -178,7 +176,6 @@ public class NewTableDialog extends MageDialog {
popupLoadSettings.add(separator2);
menuLoadSettingsDefault.setText("Load default settings");
menuLoadSettingsDefault.setToolTipText("");
menuLoadSettingsDefault.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
menuLoadSettingsDefaultActionPerformed(evt);
@ -228,7 +225,6 @@ public class NewTableDialog extends MageDialog {
});
lblSkillLevel.setText("Skill Level:");
lblSkillLevel.setToolTipText("");
cbSkillLevel.setToolTipText("<HTML>This option can be used to make it easier to find matches<br>\nwith opponents of the appropriate skill level.");

View file

@ -35,7 +35,6 @@
<MenuItem class="javax.swing.JMenuItem" name="menuLoadSettingsLast">
<Properties>
<Property name="text" type="java.lang.String" value="Load from last time"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="menuLoadSettingsLastActionPerformed"/>
@ -46,7 +45,6 @@
<MenuItem class="javax.swing.JMenuItem" name="menuLoadSettings1">
<Properties>
<Property name="text" type="java.lang.String" value="Load from config 1"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="menuLoadSettings1ActionPerformed"/>
@ -65,7 +63,6 @@
<MenuItem class="javax.swing.JMenuItem" name="menuLoadSettingsDefault">
<Properties>
<Property name="text" type="java.lang.String" value="Load default settings"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="menuLoadSettingsDefaultActionPerformed"/>
@ -663,7 +660,6 @@
<EtchetBorder/>
</Border>
</Property>
<Property name="toolTipText" type="java.lang.String" value=""/>
</Properties>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBoxLayout">
@ -677,7 +673,6 @@
</Component>
<Component class="javax.swing.JSpinner" name="spnQuitRatio">
<Properties>
<Property name="toolTipText" type="java.lang.String" value=""/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblMinimumRating">

View file

@ -203,7 +203,6 @@ public class NewTournamentDialog extends MageDialog {
popupSaveSettings.add(menuSaveSettings2);
menuLoadSettingsLast.setText("Load from last time");
menuLoadSettingsLast.setToolTipText("");
menuLoadSettingsLast.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
menuLoadSettingsLastActionPerformed(evt);
@ -213,7 +212,6 @@ public class NewTournamentDialog extends MageDialog {
popupLoadSettings.add(separator1);
menuLoadSettings1.setText("Load from config 1");
menuLoadSettings1.setToolTipText("");
menuLoadSettings1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
menuLoadSettings1ActionPerformed(evt);
@ -231,7 +229,6 @@ public class NewTournamentDialog extends MageDialog {
popupLoadSettings.add(separator2);
menuLoadSettingsDefault.setText("Load default settings");
menuLoadSettingsDefault.setToolTipText("");
menuLoadSettingsDefault.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
menuLoadSettingsDefaultActionPerformed(evt);
@ -411,13 +408,10 @@ public class NewTournamentDialog extends MageDialog {
});
pnlRandomPacks.setBorder(javax.swing.BorderFactory.createEtchedBorder());
pnlRandomPacks.setToolTipText("");
pnlRandomPacks.setLayout(new javax.swing.BoxLayout(pnlRandomPacks, javax.swing.BoxLayout.Y_AXIS));
lblQuitRatio.setText("Allowed quit %");
spnQuitRatio.setToolTipText("");
lblMinimumRating.setText("Minimum rating:");
lblMinimumRating.setToolTipText("Players with rating less than this value can't join this table");

View file

@ -2010,7 +2010,6 @@
<Properties>
<Property name="horizontalAlignment" type="int" value="2"/>
<Property name="text" type="java.lang.String" value="GUI color style:"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
<Property name="horizontalTextPosition" type="int" value="10"/>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[110, 16]"/>
@ -2616,7 +2615,6 @@
<Properties>
<Property name="selected" type="boolean" value="true"/>
<Property name="text" type="java.lang.String" value="STOP skips on declare attackers if attackers are available"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
<Property name="actionCommand" type="java.lang.String" value=""/>
</Properties>
</Component>
@ -2624,21 +2622,18 @@
<Properties>
<Property name="selected" type="boolean" value="true"/>
<Property name="text" type="java.lang.String" value="STOP skips on declare blockers if ANY blockers are available"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
<Property name="actionCommand" type="java.lang.String" value=""/>
</Properties>
</Component>
<Component class="javax.swing.JCheckBox" name="cbStopBlockWithZero">
<Properties>
<Property name="text" type="java.lang.String" value="STOP skips on declare blockers if ZERO blockers are available"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
<Property name="actionCommand" type="java.lang.String" value=""/>
</Properties>
</Component>
<Component class="javax.swing.JCheckBox" name="cbStopOnNewStackObjects">
<Properties>
<Property name="text" type="java.lang.String" value="Skip to STACK resolved (F10): stop on new objects added (on) or stop until empty (off)"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
<Property name="actionCommand" type="java.lang.String" value=""/>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[300, 25]"/>
@ -2648,14 +2643,12 @@
<Component class="javax.swing.JCheckBox" name="cbStopOnAllMain">
<Properties>
<Property name="text" type="java.lang.String" value="Skip to MAIN step (F7): stop on any main steps (on) or stop on your main step (off)"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
<Property name="actionCommand" type="java.lang.String" value=""/>
</Properties>
</Component>
<Component class="javax.swing.JCheckBox" name="cbStopOnAllEnd">
<Properties>
<Property name="text" type="java.lang.String" value="Skip to END step (F5): stop on any end steps (on) or stop on opponents end step (off)"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
<Property name="actionCommand" type="java.lang.String" value=""/>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[300, 25]"/>
@ -3128,7 +3121,6 @@
<Component class="javax.swing.JLabel" name="jLabel16">
<Properties>
<Property name="text" type="java.lang.String" value="Playing from folder:"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
</Properties>
</Component>
<Component class="javax.swing.JTextField" name="txtBattlefieldIBGMPath">

View file

@ -2108,7 +2108,6 @@ public class PreferencesDialog extends javax.swing.JDialog {
lbSelectLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
lbSelectLabel.setText("GUI color style:");
lbSelectLabel.setToolTipText("");
lbSelectLabel.setHorizontalTextPosition(javax.swing.SwingConstants.LEADING);
lbSelectLabel.setPreferredSize(new java.awt.Dimension(110, 16));
lbSelectLabel.setVerticalTextPosition(javax.swing.SwingConstants.TOP);
@ -2391,34 +2390,28 @@ public class PreferencesDialog extends javax.swing.JDialog {
cbStopAttack.setSelected(true);
cbStopAttack.setText("STOP skips on declare attackers if attackers are available");
cbStopAttack.setToolTipText("");
cbStopAttack.setActionCommand("");
phases_stopSettings.add(cbStopAttack);
cbStopBlockWithAny.setSelected(true);
cbStopBlockWithAny.setText("STOP skips on declare blockers if ANY blockers are available");
cbStopBlockWithAny.setToolTipText("");
cbStopBlockWithAny.setActionCommand("");
phases_stopSettings.add(cbStopBlockWithAny);
cbStopBlockWithZero.setText("STOP skips on declare blockers if ZERO blockers are available");
cbStopBlockWithZero.setToolTipText("");
cbStopBlockWithZero.setActionCommand("");
phases_stopSettings.add(cbStopBlockWithZero);
cbStopOnNewStackObjects.setText("Skip to STACK resolved (F10): stop on new objects added (on) or stop until empty (off)");
cbStopOnNewStackObjects.setToolTipText("");
cbStopOnNewStackObjects.setActionCommand("");
cbStopOnNewStackObjects.setPreferredSize(new java.awt.Dimension(300, 25));
phases_stopSettings.add(cbStopOnNewStackObjects);
cbStopOnAllMain.setText("Skip to MAIN step (F7): stop on any main steps (on) or stop on your main step (off)");
cbStopOnAllMain.setToolTipText("");
cbStopOnAllMain.setActionCommand("");
phases_stopSettings.add(cbStopOnAllMain);
cbStopOnAllEnd.setText("Skip to END step (F5): stop on any end steps (on) or stop on opponents end step (off)");
cbStopOnAllEnd.setToolTipText("");
cbStopOnAllEnd.setActionCommand("");
cbStopOnAllEnd.setPreferredSize(new java.awt.Dimension(300, 25));
phases_stopSettings.add(cbStopOnAllEnd);
@ -2743,7 +2736,6 @@ public class PreferencesDialog extends javax.swing.JDialog {
});
jLabel16.setText("Playing from folder:");
jLabel16.setToolTipText("");
btnBattlefieldBGMBrowse.setText("Browse...");
btnBattlefieldBGMBrowse.addActionListener(new java.awt.event.ActionListener() {

View file

@ -165,7 +165,6 @@
</Component>
<Component class="javax.swing.JLabel" name="lblStatus">
<Properties>
<Property name="toolTipText" type="java.lang.String" value=""/>
</Properties>
</Component>
<Component class="javax.swing.JTextField" name="txtServer">
@ -212,7 +211,6 @@
<ComponentRef name="txtEmail"/>
</Property>
<Property name="text" type="java.lang.String" value="(used for password reset)"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
</Properties>
</Component>
</SubComponents>

View file

@ -87,8 +87,6 @@ public class RegisterUserDialog extends MageDialog {
btnCancel.setText("Cancel");
btnCancel.addActionListener(evt -> btnCancelActionPerformed(evt));
lblStatus.setToolTipText("");
lblPasswordConfirmation.setLabelFor(txtPasswordConfirmation);
lblPasswordConfirmation.setText("Password:");
@ -102,7 +100,6 @@ public class RegisterUserDialog extends MageDialog {
lblEmailReasoning.setFont(new java.awt.Font("Lucida Grande", 0, 10)); // NOI18N
lblEmailReasoning.setLabelFor(txtEmail);
lblEmailReasoning.setText("(used for password reset and sending initial password)");
lblEmailReasoning.setToolTipText("");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);

View file

@ -94,7 +94,6 @@
<Property name="dividerLocation" type="int" value="300"/>
<Property name="dividerSize" type="int" value="3"/>
<Property name="resizeWeight" type="double" value="1.0"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
</Properties>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>

View file

@ -207,7 +207,6 @@ public class TableWaitingDialog extends MageDialog {
jSplitPane1.setDividerLocation(300);
jSplitPane1.setDividerSize(3);
jSplitPane1.setResizeWeight(1.0);
jSplitPane1.setToolTipText("");
jTableSeats.setModel(tableWaitModel);
jTableSeats.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);

View file

@ -300,7 +300,6 @@
<StringItem index="0" value="loading..."/>
</StringArray>
</Property>
<Property name="toolTipText" type="java.lang.String" value=""/>
</Properties>
<Events>
<EventHandler event="itemStateChanged" listener="java.awt.event.ItemListener" parameters="java.awt.event.ItemEvent" handler="comboCardColorItemStateChanged"/>
@ -382,7 +381,6 @@
<StringItem index="2" value="Dead"/>
</StringArray>
</Property>
<Property name="toolTipText" type="java.lang.String" value=""/>
<Property name="alignmentX" type="float" value="0.0"/>
</Properties>
<Events>

View file

@ -736,7 +736,6 @@ public class TestCardRenderDialog extends MageDialog {
labelCardColor.setText("Card color:");
comboCardColor.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "loading..." }));
comboCardColor.setToolTipText("");
comboCardColor.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
comboCardColorItemStateChanged(evt);
@ -774,7 +773,6 @@ public class TestCardRenderDialog extends MageDialog {
playerOptions.add(checkPlayerSmallMode);
comboPlayerStatus.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Active", "Inactive", "Dead" }));
comboPlayerStatus.setToolTipText("");
comboPlayerStatus.setAlignmentX(0.0F);
comboPlayerStatus.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {

View file

@ -343,7 +343,6 @@
</Property>
<Property name="horizontalAlignment" type="int" value="4"/>
<Property name="text" type="java.lang.String" value="player 2"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
<Property name="alignmentX" type="float" value="1.0"/>
<Property name="alignmentY" type="float" value="0.0"/>
<Property name="focusable" type="boolean" value="false"/>
@ -523,7 +522,6 @@
</Property>
<Property name="horizontalAlignment" type="int" value="2"/>
<Property name="text" type="java.lang.String" value="player 12"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
<Property name="focusable" type="boolean" value="false"/>
<Property name="requestFocusEnabled" type="boolean" value="false"/>
<Property name="verifyInputWhenFocusTarget" type="boolean" value="false"/>

View file

@ -773,7 +773,6 @@
labelPlayer02.setFont(new java.awt.Font("Tahoma", 0, 10)); // NOI18N
labelPlayer02.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
labelPlayer02.setText("player 2");
labelPlayer02.setToolTipText("");
labelPlayer02.setAlignmentX(1.0F);
labelPlayer02.setAlignmentY(0.0F);
labelPlayer02.setFocusable(false);
@ -887,7 +886,6 @@
labelPlayer12.setFont(new java.awt.Font("Tahoma", 0, 10)); // NOI18N
labelPlayer12.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
labelPlayer12.setText("player 12");
labelPlayer12.setToolTipText("");
labelPlayer12.setFocusable(false);
labelPlayer12.setRequestFocusEnabled(false);
labelPlayer12.setVerifyInputWhenFocusTarget(false);

View file

@ -273,7 +273,6 @@
<Container class="javax.swing.JSplitPane" name="jSplitPane2">
<Properties>
<Property name="resizeWeight" type="double" value="1.0"/>
<Property name="toolTipText" type="java.lang.String" value=""/>
</Properties>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>

View file

@ -444,7 +444,6 @@ public class TournamentPanel extends javax.swing.JPanel {
);
jSplitPane2.setResizeWeight(1.0);
jSplitPane2.setToolTipText("");
jSplitPane1.setDividerLocation(230);
jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);

View file

@ -145,7 +145,7 @@ public class ScryfallImageSupportCards {
add("PAL06"); // Arena League 2006
//add("PMPS06"); // Magic Premiere Shop 2006
add("PHUK"); // Hachette UK
add("PDCI"); // DCI Promos
add("DCI"); // DCI Promos
add("P06"); // Magic Player Rewards 2006
add("G06"); // Judge Gift Cards 2006
add("F06"); // Friday Night Magic 2006
@ -190,7 +190,6 @@ public class ScryfallImageSupportCards {
add("P09"); // Magic Player Rewards 2009
add("G09"); // Judge Gift Cards 2009
add("F09"); // Friday Night Magic 2009
add("PBOOK"); // Miscellaneous Book Promos
add("CON"); // Conflux
add("DDC"); // Duel Decks: Divine vs. Demonic
add("ARB"); // Alara Reborn
@ -405,7 +404,7 @@ public class ScryfallImageSupportCards {
add("XANA"); // Arena New Player Experience Extras
add("OANA"); // Arena New Player Experience Cards
add("PS18"); // San Diego Comic-Con 2018
add("PH17"); // Heroes of the Realm 2017
add("PH17"); // 2017 Heroes of the Realm
add("C18"); // Commander 2018
add("PGRN"); // Guilds of Ravnica Promos
add("PRWK"); // GRN Ravnica Weekend
@ -457,7 +456,7 @@ public class ScryfallImageSupportCards {
//add("FMB1"); // Mystery Booster Retail Edition Foils
add("HA2"); // Historic Anthology 2
add("SLD"); // Secret Lair Drop
add("PMEI"); // Magazine Inserts
add("PMEI"); // Media and Collaboration Promos
add("SLU"); // Secret Lair: Ultimate Edition
add("SS3"); // Signature Spellbook: Chandra
add("HA3"); // Historic Anthology 3
@ -467,7 +466,7 @@ public class ScryfallImageSupportCards {
// add("DD3"); // Duel Decks Anthology
// add("PZ1"); // Legendary Cube
add("IKO"); // Ikoria: Lair of Behemoths
add("C20"); // Commander 2020 Edition
add("C20"); // Commander 2020
add("M21"); // Core Set 2021
add("JMP"); // Jumpstart
add("PH19"); // 2019 Heroes of the Realm
@ -488,7 +487,7 @@ public class ScryfallImageSupportCards {
add("STA"); // Strixhaven Mystical Archive
add("HA4"); // Historic Anthology 4
add("HA5"); // Historic Anthology 5
add("C21"); // Commander 2021 Edition
add("C21"); // Commander 2021
add("MH2"); // Modern Horizons 2
add("H1R"); // Modern Horizons 1 Timeshifts
add("PLG21"); // Love Your LGS 2021
@ -514,7 +513,7 @@ public class ScryfallImageSupportCards {
add("DMU"); // Dominaria United
add("DMC"); // Dominaria United Commander
add("YDMU"); // Alchemy: Dominaria
add("40K"); // Warhammer 40,000
add("40K"); // Warhammer 40,000 Commander
add("UNF"); // Unfinity
add("GN3"); // Game Night: Free-for-All
add("BRO"); // The Brothers' War
@ -529,12 +528,14 @@ public class ScryfallImageSupportCards {
add("ONC"); // Phyrexia: All Will Be One Commander
add("PL23"); // Year of the Rabbit 2023
add("DA1"); // Unknown Event
add("SIS"); // Shadows of the Past
add("SIR"); // Shadows over Innistrad Remastered
add("SLP"); // Secret Lair Showdown
add("MOM"); // March of the Machine
add("MOC"); // March of the Machine Commander
add("MAT"); // March of the Machine: The Aftermath
add("MUL"); // Multiverse Legends
add("30A"); // Thirtieth Anniversary Edition
add("30A"); // 30th Anniversary Edition
add("LTR"); // The Lord of the Rings: Tales of Middle-Earth
add("LTC"); // Tales of Middle-Earth Commander
add("CMM"); // Commander Masters
@ -543,7 +544,7 @@ public class ScryfallImageSupportCards {
add("WOT"); // Wilds of Eldraine: Enchanting Tales
add("WOC"); // Wilds of Eldraine Commander
add("LCI"); // The Lost Caverns of Ixalan
add("LCC"); // The Lost Caverns of Ixalan Commander
add("LCC"); // The The Lost Caverns of Ixalan Commander
add("REX"); // Jurassic World Collection
add("SPG"); // Special Guests
add("RVR"); // Ravnica Remastered
@ -565,6 +566,7 @@ public class ScryfallImageSupportCards {
add("DSC"); // Duskmourn: House of Horror Commander
add("FDN"); // Foundations
add("J25"); // Foundations Jumpstart
add("PIO"); // Pioneer Masters
add("INR"); // Innistrad Remastered
add("DFT"); // Aetherdrift
add("DRC"); // Aetherdrift Commander
@ -624,6 +626,8 @@ public class ScryfallImageSupportCards {
put("SLD/Darksteel Colossus/1081b", "https://api.scryfall.com/cards/sld/1081/en?format=image&face=back");
put("SLD/Death Baron/1458b", "https://api.scryfall.com/cards/sld/1458/en?format=image&face=back");
put("SLD/Doubling Cube/1080b", "https://api.scryfall.com/cards/sld/1080/en?format=image&face=back");
put("SLD/Estrid's Invocation/1325b", "https://api.scryfall.com/cards/sld/1325/en?format=image&face=back");
put("SLD/Estrid, the Masked/1327b", "https://api.scryfall.com/cards/sld/1327/en?format=image&face=back");
put("SLD/Etali, Primal Storm/1123b", "https://api.scryfall.com/cards/sld/1123/en?format=image&face=back");
put("SLD/Garruk Wildspeaker/749b", "https://api.scryfall.com/cards/sld/749/en?format=image&face=back");
put("SLD/Garruk Wildspeaker/1457b", "https://api.scryfall.com/cards/sld/1457/en?format=image&face=back");
@ -649,8 +653,10 @@ public class ScryfallImageSupportCards {
put("SLD/Rin and Seri, Inseparable/1554b", "https://api.scryfall.com/cards/sld/1554/en?format=image&face=back");
put("SLD/Sakashima of a Thousand Faces/1541b", "https://api.scryfall.com/cards/sld/1541/en?format=image&face=back");
put("SLD/Sol Ring/1512b", "https://api.scryfall.com/cards/sld/1512/en?format=image&face=back");
put("SLD/Steely Resolve/1326b", "https://api.scryfall.com/cards/sld/1326/en?format=image&face=back");
put("SLD/Stitch in Time/382b", "https://api.scryfall.com/cards/sld/382/en?format=image&face=back");
put("SLD/Terror/750b", "https://api.scryfall.com/cards/sld/750/en?format=image&face=back");
put("SLD/Tuvasa the Sunlit/1328b", "https://api.scryfall.com/cards/sld/1328/en?format=image&face=back");
put("SLD/Ulamog, the Ceaseless Hunger/1122b", "https://api.scryfall.com/cards/sld/1122/en?format=image&face=back");
put("SLD/Unholy Grotto/1462b", "https://api.scryfall.com/cards/sld/1462/en?format=image&face=back");
put("SLD/Yargle, Glutton of Urborg/1542b", "https://api.scryfall.com/cards/sld/1542/en?format=image&face=back");

View file

@ -282,7 +282,7 @@ public enum WizardCardsImageSource implements CardImageSource {
setsAliases.put("BOK", "Betrayers of Kamigawa");
setsAliases.put("BRB", "Battle Royale Box Set");
setsAliases.put("BTD", "Beatdown Box Set");
setsAliases.put("C13", "Commander 2013 Edition");
setsAliases.put("C13", "Commander 2013");
setsAliases.put("C14", "Commander 2014");
setsAliases.put("C15", "Commander 2015");
setsAliases.put("C16", "Commander 2016");
@ -365,7 +365,7 @@ public enum WizardCardsImageSource implements CardImageSource {
setsAliases.put("M13", "Magic 2013");
setsAliases.put("M14", "Magic 2014");
setsAliases.put("M15", "Magic 2015");
setsAliases.put("PMEI", "Media Inserts");
setsAliases.put("PMEI", "Media and Collaboration Promos");
setsAliases.put("MBS", "Mirrodin Besieged");
setsAliases.put("ME2", "Masters Edition II");
setsAliases.put("ME3", "Masters Edition III");
@ -386,7 +386,7 @@ public enum WizardCardsImageSource implements CardImageSource {
setsAliases.put("ODY", "Odyssey");
setsAliases.put("ONS", "Onslaught");
setsAliases.put("ORI", "Magic Origins");
setsAliases.put("PC2", "Planechase 2012 Edition");
setsAliases.put("PC2", "Planechase 2012");
setsAliases.put("PCY", "Prophecy");
setsAliases.put("PD2", "Premium Deck Series: Fire and Lightning");
setsAliases.put("PLC", "Planar Chaos");
@ -409,7 +409,7 @@ public enum WizardCardsImageSource implements CardImageSource {
setsAliases.put("TMP", "Tempest");
setsAliases.put("TOR", "Torment");
setsAliases.put("TPR", "Tempest Remastered");
setsAliases.put("TSB", "Time Spiral \"Timeshifted\"");
setsAliases.put("TSB", "Time Spiral Timeshifted");
setsAliases.put("TSP", "Time Spiral");
setsAliases.put("UDS", "Urza's Destiny");
setsAliases.put("UGL", "Unglued");

View file

@ -2,6 +2,7 @@ package mage.client.util;
import mage.client.remote.XmageURLConnection;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import javax.imageio.ImageIO;
@ -62,6 +63,7 @@ public class DownloaderTest {
}
@Test
@Ignore // TODO: enable after gatherer server maintenance done
public void test_DownloadFromWindowsServers() throws IOException {
// symbols download from gatherer website
// error example: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

View file

@ -0,0 +1,64 @@
package mage.cards.a;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.LoseLifeOpponentsEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SuperType;
import mage.counters.CounterType;
import mage.filter.FilterCard;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.game.permanent.token.InsectToken;
import mage.constants.SubType;
/**
*
* @author jackd149
*/
public final class AatchikEmeraldRadian extends CardImpl {
private static final FilterCard filter1 = new FilterCard("artifact and/or creature card");
private static final FilterControlledPermanent filter2 = new FilterControlledPermanent(SubType.INSECT, "another Insect you control");
private static final CardsInControllerGraveyardCount count = new CardsInControllerGraveyardCount(filter1);
static {
filter1.add(Predicates.or(CardType.ARTIFACT.getPredicate(), CardType.CREATURE.getPredicate()));
filter2.add(AnotherPredicate.instance);
}
public AatchikEmeraldRadian(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}{B}{G}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.INSECT);
this.subtype.add(SubType.DRUID);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
// When Aatchik, Emerald Radian enters, create a 1/1 green Insect creature token for each actifact and/or creature card in your graveyard.
this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new InsectToken(), count)));
// Whenever another insect you control dies, put a +1/+1 counter on Aatchik. Each opponent loses 1 life.
DiesCreatureTriggeredAbility otherInsectDiesAbility = new DiesCreatureTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false, filter2);
otherInsectDiesAbility.addEffect(new LoseLifeOpponentsEffect(1));
this.addAbility(otherInsectDiesAbility);
}
private AatchikEmeraldRadian(final AatchikEmeraldRadian card) {
super(card);
}
@Override
public AatchikEmeraldRadian copy() {
return new AatchikEmeraldRadian(this);
}
}

View file

@ -0,0 +1,50 @@
package mage.cards.a;
import mage.abilities.Ability;
import mage.abilities.common.DrawCardControllerTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.MillCardsEachPlayerEffect;
import mage.abilities.effects.common.continuous.MaxSpeedGainAbilityEffect;
import mage.abilities.keyword.StartYourEnginesAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.TargetController;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class AetherSyphon extends CardImpl {
public AetherSyphon(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{U}{U}");
// Start your engines!
this.addAbility(new StartYourEnginesAbility());
// {2}, {T}: Draw a card.
Ability ability = new SimpleActivatedAbility(new DrawCardSourceControllerEffect(1), new GenericManaCost(2));
ability.addCost(new TapSourceCost());
this.addAbility(ability);
// Max speed -- Whenever you draw a card, each opponent mills two cards.
this.addAbility(new SimpleStaticAbility(new MaxSpeedGainAbilityEffect(new DrawCardControllerTriggeredAbility(
new MillCardsEachPlayerEffect(2, TargetController.OPPONENT), false
))));
}
private AetherSyphon(final AetherSyphon card) {
super(card);
}
@Override
public AetherSyphon copy() {
return new AetherSyphon(this);
}
}

View file

@ -0,0 +1,63 @@
package mage.cards.a;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterArtifactPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class Aetherjacket extends CardImpl {
private static final FilterPermanent filter = new FilterArtifactPermanent("another target artifact");
static {
filter.add(AnotherPredicate.instance);
}
public Aetherjacket(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}");
this.subtype.add(SubType.THOPTER);
this.power = new MageInt(2);
this.toughness = new MageInt(1);
// Flying
this.addAbility(FlyingAbility.getInstance());
// Vigilance
this.addAbility(VigilanceAbility.getInstance());
// {2}, {T}, Sacrifice this creature: Destroy another target artifact. Activate only as a sorcery.
Ability ability = new ActivateAsSorceryActivatedAbility(new DestroyTargetEffect(), new GenericManaCost(2));
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeSourceCost());
ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability);
}
private Aetherjacket(final Aetherjacket card) {
super(card);
}
@Override
public Aetherjacket copy() {
return new Aetherjacket(this);
}
}

View file

@ -0,0 +1,70 @@
package mage.cards.a;
import mage.MageInt;
import mage.abilities.common.ActivateAbilityTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.ExhaustAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SetTargetPointer;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.filter.FilterStackObject;
import mage.filter.predicate.Predicate;
import mage.game.Game;
import mage.game.stack.StackObject;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class AfterburnerExpert extends CardImpl {
private static final FilterStackObject filter = new FilterStackObject("an exhaust ability");
static {
filter.add(AfterburnerExpertPredicate.instance);
}
public AfterburnerExpert(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}");
this.subtype.add(SubType.GOBLIN);
this.subtype.add(SubType.ARTIFICER);
this.power = new MageInt(4);
this.toughness = new MageInt(2);
// Exhaust -- {2}{G}{G}: Put two +1/+1 counters on this creature.
this.addAbility(new ExhaustAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance(2)), new ManaCostsImpl<>("{2}{G}{G}")
));
// Whenever you activate an exhaust ability, return this card from your graveyard to the battlefield.
this.addAbility(new ActivateAbilityTriggeredAbility(
Zone.GRAVEYARD, new ReturnSourceFromGraveyardToBattlefieldEffect(), filter, SetTargetPointer.NONE
));
}
private AfterburnerExpert(final AfterburnerExpert card) {
super(card);
}
@Override
public AfterburnerExpert copy() {
return new AfterburnerExpert(this);
}
}
enum AfterburnerExpertPredicate implements Predicate<StackObject> {
instance;
@Override
public boolean apply(StackObject input, Game game) {
return input.getStackAbility() instanceof ExhaustAbility;
}
}

View file

@ -0,0 +1,66 @@
package mage.cards.a;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.CycleTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.abilities.keyword.CyclingAbility;
import mage.abilities.keyword.IndestructibleAbility;
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 mage.filter.FilterPermanent;
import mage.filter.predicate.Predicates;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class AgonasaurRex extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("creature or Vehicle");
static {
filter.add(Predicates.or(
CardType.CREATURE.getPredicate(),
SubType.VEHICLE.getPredicate()
));
}
public AgonasaurRex(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}{G}");
this.subtype.add(SubType.DINOSAUR);
this.power = new MageInt(8);
this.toughness = new MageInt(8);
// Trample
this.addAbility(TrampleAbility.getInstance());
// Cycling {2}{G}
this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{2}{G}")));
// When you cycle this card, put two +1/+1 counters on up to one target creature or Vehicle. It gains trample and indestructible until end of turn.
Ability ability = new CycleTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance(2)));
ability.addEffect(new GainAbilityTargetEffect(TrampleAbility.getInstance()).setText("it gains trample"));
ability.addEffect(new GainAbilityTargetEffect(IndestructibleAbility.getInstance()).setText("and indestructible until end of turn"));
ability.addTarget(new TargetPermanent(0, 1, filter));
this.addAbility(ability);
}
private AgonasaurRex(final AgonasaurRex card) {
super(card);
}
@Override
public AgonasaurRex copy() {
return new AgonasaurRex(this);
}
}

View file

@ -78,7 +78,7 @@ class AminatousAuguryEffect extends OneShotEffect {
}
// move cards from library to exile
controller.moveCardsToExile(controller.getLibrary().getTopCards(game, 8), source, game, true, source.getSourceId(), CardUtil.createObjectRealtedWindowTitle(source, game, null));
controller.moveCardsToExile(controller.getLibrary().getTopCards(game, 8), source, game, true, source.getSourceId(), CardUtil.createObjectRelatedWindowTitle(source, game, null));
ExileZone auguryExileZone = game.getExile().getExileZone(source.getSourceId());
if (auguryExileZone == null) {
return true;

View file

@ -0,0 +1,47 @@
package mage.cards.a;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.common.continuous.MaxSpeedGainAbilityEffect;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.StartYourEnginesAbility;
import mage.abilities.mana.ColorlessManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class AmonkhetRaceway extends CardImpl {
public AmonkhetRaceway(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
// Start your engines!
this.addAbility(new StartYourEnginesAbility());
// {T}: Add {C}.
this.addAbility(new ColorlessManaAbility());
// Max speed -- {T}: Target creature gains haste until end of turn.
Ability ability = new SimpleActivatedAbility(new GainAbilityTargetEffect(HasteAbility.getInstance()), new TapSourceCost());
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(new SimpleStaticAbility(new MaxSpeedGainAbilityEffect(ability)));
}
private AmonkhetRaceway(final AmonkhetRaceway card) {
super(card);
}
@Override
public AmonkhetRaceway copy() {
return new AmonkhetRaceway(this);
}
}

View file

@ -144,7 +144,7 @@ class AnzragsRampageEffect extends OneShotEffect {
controller.moveCardsToExile(
cards.getCards(game), source, game, true,
CardUtil.getExileZoneId(game, source),
CardUtil.createObjectRealtedWindowTitle(source, game, null));
CardUtil.createObjectRelatedWindowTitle(source, game, null));
// You may put a creature card exiled this way onto the battlefield.
TargetCard targetCard = new TargetCardInExile(

View file

@ -0,0 +1,59 @@
package mage.cards.a;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.common.combat.CantBeBlockedTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.CrewAbility;
import mage.abilities.keyword.LifelinkAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.mageobject.PowerPredicate;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class ApocalypseRunner extends CardImpl {
private static final FilterPermanent filter = new FilterControlledCreaturePermanent("creature you control with power 2 or less");
static {
filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, 3));
}
public ApocalypseRunner(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{B}{R}");
this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(6);
this.toughness = new MageInt(5);
// {T}: Target creature you control with power 2 or less gains lifelink until end of turn and can't be blocked this turn.
Ability ability = new SimpleActivatedAbility(new GainAbilityTargetEffect(LifelinkAbility.getInstance()), new TapSourceCost());
ability.addEffect(new CantBeBlockedTargetEffect().setText("and can't be blocked this turn"));
ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability);
// Crew 3
this.addAbility(new CrewAbility(3));
}
private ApocalypseRunner(final ApocalypseRunner card) {
super(card);
}
@Override
public ApocalypseRunner copy() {
return new ApocalypseRunner(this);
}
}

View file

@ -92,7 +92,7 @@ class AsmodeusTheArchfiendReplacementEffect extends ReplacementEffectImpl {
Card card = controller.getLibrary().getFromTop(game);
if (card != null) {
UUID exileZoneId = CardUtil.getExileZoneId(game, sourcePermanent.getId(), sourcePermanent.getZoneChangeCounter(game));
String exileName = CardUtil.createObjectRealtedWindowTitle(source, game, null);
String exileName = CardUtil.createObjectRelatedWindowTitle(source, game, null);
controller.moveCardsToExile(card, source, game, false, exileZoneId, exileName);
card.setFaceDown(true, game);
}

View file

@ -0,0 +1,48 @@
package mage.cards.a;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.DiscardCardCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.continuous.MaxSpeedGainAbilityEffect;
import mage.abilities.keyword.StartYourEnginesAbility;
import mage.abilities.mana.ColorlessManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class AvishkarRaceway extends CardImpl {
public AvishkarRaceway(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
// Start your engines!
this.addAbility(new StartYourEnginesAbility());
// {T}: Add {C}.
this.addAbility(new ColorlessManaAbility());
// Max speed -- {3}, {T}, Discard a card: Draw a card.
Ability ability = new SimpleActivatedAbility(new DrawCardSourceControllerEffect(1), new GenericManaCost(3));
ability.addCost(new TapSourceCost());
ability.addCost(new DiscardCardCost());
this.addAbility(new SimpleStaticAbility(new MaxSpeedGainAbilityEffect(ability)));
}
private AvishkarRaceway(final AvishkarRaceway card) {
super(card);
}
@Override
public AvishkarRaceway copy() {
return new AvishkarRaceway(this);
}
}

View file

@ -0,0 +1,47 @@
package mage.cards.b;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.FilterCard;
import mage.filter.predicate.Predicates;
import mage.game.permanent.token.PilotSaddleCrewToken;
import mage.target.common.TargetCardInYourGraveyard;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class BackOnTrack extends CardImpl {
private static final FilterCard filter = new FilterCard("creature or Vehicle card from your graveyard");
static {
filter.add(Predicates.or(
CardType.CREATURE.getPredicate(),
SubType.VEHICLE.getPredicate()
));
}
public BackOnTrack(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{B}");
// Return target creature or Vehicle card from your graveyard to the battlefield. Create a 1/1 colorless Pilot creature token with "This token saddles Mounts and crews Vehicles as though its power were 2 greater."
this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect());
this.getSpellAbility().addEffect(new CreateTokenEffect(new PilotSaddleCrewToken()));
this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(filter));
}
private BackOnTrack(final BackOnTrack card) {
super(card);
}
@Override
public BackOnTrack copy() {
return new BackOnTrack(this);
}
}

View file

@ -0,0 +1,69 @@
package mage.cards.b;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.CycleTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.ExertSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.CyclingAbility;
import mage.abilities.keyword.HexproofAbility;
import mage.abilities.keyword.IndestructibleAbility;
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.filter.FilterPermanent;
import mage.game.permanent.token.CatToken2;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class BasriTomorrowsChampion extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent(SubType.CAT, "");
public BasriTomorrowsChampion(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.KNIGHT);
this.power = new MageInt(2);
this.toughness = new MageInt(1);
// {W}, {T}, Exert Basri: Create a 1/1 white Cat creature token with lifelink.
Ability ability = new SimpleActivatedAbility(new CreateTokenEffect(new CatToken2()), new ManaCostsImpl<>("{W}"));
ability.addCost(new TapSourceCost());
ability.addCost(new ExertSourceCost());
this.addAbility(ability);
// Cycling {2}{W}
this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{2}{W}")));
// When you cycle this card, Cats you control gain hexproof and indestructible until end of turn.
ability = new CycleTriggeredAbility(new GainAbilityControlledEffect(
HexproofAbility.getInstance(), Duration.EndOfTurn, filter
).setText("Cats you control gain hexproof"));
ability.addEffect(new GainAbilityControlledEffect(
IndestructibleAbility.getInstance(), Duration.EndOfTurn, filter
).setText("and indestructible until end of turn"));
this.addAbility(ability);
}
private BasriTomorrowsChampion(final BasriTomorrowsChampion card) {
super(card);
}
@Override
public BasriTomorrowsChampion copy() {
return new BasriTomorrowsChampion(this);
}
}

View file

@ -0,0 +1,43 @@
package mage.cards.b;
import mage.MageInt;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.PutCards;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class BeastriderVanguard extends CardImpl {
public BeastriderVanguard(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.KNIGHT);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
// {4}{G}: Look at the top three cards of your library. You may reveal a permanent card from among them and put it into your hand. Put the rest on the bottom of your library in any order.
this.addAbility(new SimpleActivatedAbility(new LookLibraryAndPickControllerEffect(
3, 1, StaticFilters.FILTER_CARD_A_PERMANENT, PutCards.HAND, PutCards.BOTTOM_ANY
), new ManaCostsImpl<>("{4}{G}")));
}
private BeastriderVanguard(final BeastriderVanguard card) {
super(card);
}
@Override
public BeastriderVanguard copy() {
return new BeastriderVanguard(this);
}
}

View file

@ -27,9 +27,9 @@ import java.util.UUID;
/**
* @author notgreat
*/
public final class BehemothOfVault extends CardImpl {
public final class BehemothOfVault0 extends CardImpl {
public BehemothOfVault(UUID ownerId, CardSetInfo setInfo) {
public BehemothOfVault0(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{6}");
this.subtype.add(SubType.ROBOT);
@ -49,13 +49,13 @@ public final class BehemothOfVault extends CardImpl {
this.addAbility(ability);
}
private BehemothOfVault(final BehemothOfVault card) {
private BehemothOfVault0(final BehemothOfVault0 card) {
super(card);
}
@Override
public BehemothOfVault copy() {
return new BehemothOfVault(this);
public BehemothOfVault0 copy() {
return new BehemothOfVault0(this);
}
}

View file

@ -0,0 +1,40 @@
package mage.cards.b;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class BestowGreatness extends CardImpl {
public BestowGreatness(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{G}");
// Target creature gets +4/+4 and gains trample until end of turn.
this.getSpellAbility().addEffect(new BoostTargetEffect(
4, 4, Duration.EndOfTurn
).setText("Target creature gets +4/+4"));
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(
TrampleAbility.getInstance(), Duration.EndOfTurn
).setText("and gains trample until end of turn"));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
}
private BestowGreatness(final BestowGreatness card) {
super(card);
}
@Override
public BestowGreatness copy() {
return new BestowGreatness(this);
}
}

View file

@ -0,0 +1,66 @@
package mage.cards.b;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.effects.common.cost.AbilitiesCostReductionControllerEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.ExhaustAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.filter.FilterPermanent;
import mage.filter.predicate.Predicates;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class BoomScholar extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("creatures and Vehicles");
static {
filter.add(Predicates.or(
CardType.CREATURE.getPredicate(),
SubType.VEHICLE.getPredicate()
));
}
public BoomScholar(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{G}");
this.subtype.add(SubType.GOBLIN);
this.subtype.add(SubType.ADVISOR);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
// Exhaust abilities of other permanents you control cost {2} less to activate.
this.addAbility(new SimpleStaticAbility(new AbilitiesCostReductionControllerEffect(
ExhaustAbility.class, "", 2, true
).setText("exhaust abilities of other permanents you control cost {2} less to activate")));
// Exhaust -- {4}{R}{G}: Creatures and Vehicles you control gain trample until end of turn. Put two +1/+1 counters on this creature.
Ability ability = new ExhaustAbility(new GainAbilityControlledEffect(
TrampleAbility.getInstance(), Duration.EndOfTurn, filter
), new ManaCostsImpl<>("{4}{R}{G}"));
ability.addEffect(new AddCountersSourceEffect(CounterType.P1P1.createInstance(2)));
this.addAbility(ability);
}
private BoomScholar(final BoomScholar card) {
super(card);
}
@Override
public BoomScholar copy() {
return new BoomScholar(this);
}
}

View file

@ -22,7 +22,7 @@ import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import mage.game.permanent.token.PilotToken;
import mage.game.permanent.token.PilotCrewToken;
import mage.target.TargetPermanent;
import java.util.UUID;
@ -63,7 +63,7 @@ public final class BornToDrive extends CardImpl {
)).addHint(hint));
// Channel {2}{W}, Discard Born to Drive: Create two 1/1 colorless Pilot creature tokens with "This creature crews Vehicles as though its power were 2 greater."
this.addAbility(new ChannelAbility("{2}{W}", new CreateTokenEffect(new PilotToken(), 2)));
this.addAbility(new ChannelAbility("{2}{W}", new CreateTokenEffect(new PilotCrewToken(), 2)));
}
private BornToDrive(final BornToDrive card) {

View file

@ -0,0 +1,44 @@
package mage.cards.b;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.predicate.Predicates;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class BounceOff extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("creature or Vehicle");
static {
filter.add(Predicates.or(
CardType.CREATURE.getPredicate(),
SubType.VEHICLE.getPredicate()
));
}
public BounceOff(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{U}");
// Return target creature or Vehicle to its owner's hand.
this.getSpellAbility().addEffect(new ReturnToHandTargetEffect());
this.getSpellAbility().addTarget(new TargetPermanent(filter));
}
private BounceOff(final BounceOff card) {
super(card);
}
@Override
public BounceOff copy() {
return new BounceOff(this);
}
}

View file

@ -0,0 +1,56 @@
package mage.cards.b;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksWhileSaddledTriggeredAbility;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.SaddleAbility;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class BrightfieldGlider extends CardImpl {
public BrightfieldGlider(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}");
this.subtype.add(SubType.POSSUM);
this.subtype.add(SubType.MOUNT);
this.power = new MageInt(1);
this.toughness = new MageInt(1);
// Vigilance
this.addAbility(VigilanceAbility.getInstance());
// Whenever this creature attacks while saddled, it gets +1/+2 and gains flying until end of turn.
Ability ability = new AttacksWhileSaddledTriggeredAbility(new BoostSourceEffect(
1, 2, Duration.EndOfTurn
).setText("it gets +1/+2"));
ability.addEffect(new GainAbilitySourceEffect(
FlyingAbility.getInstance(), Duration.EndOfTurn
).setText("and gains flying until end of turn"));
this.addAbility(ability);
// Saddle 3
this.addAbility(new SaddleAbility(3));
}
private BrightfieldGlider(final BrightfieldGlider card) {
super(card);
}
@Override
public BrightfieldGlider copy() {
return new BrightfieldGlider(this);
}
}

View file

@ -0,0 +1,47 @@
package mage.cards.b;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksWhileSaddledTriggeredAbility;
import mage.abilities.effects.common.UntapSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.SaddleAbility;
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 TheElk801
*/
public final class BrightfieldMustang extends CardImpl {
public BrightfieldMustang(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}");
this.subtype.add(SubType.HORSE);
this.subtype.add(SubType.MOUNT);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
// Whenever this creature attacks while saddled, untap it and put a +1/+1 counter on it.
Ability ability = new AttacksWhileSaddledTriggeredAbility(new UntapSourceEffect().setText("untap it"));
ability.addEffect(new AddCountersSourceEffect(CounterType.P1P1.createInstance()));
this.addAbility(ability);
// Saddle 1
this.addAbility(new SaddleAbility(1));
}
private BrightfieldMustang(final BrightfieldMustang card) {
super(card);
}
@Override
public BrightfieldMustang copy() {
return new BrightfieldMustang(this);
}
}

View file

@ -0,0 +1,62 @@
package mage.cards.b;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksWhileSaddledTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.abilities.keyword.HexproofAbility;
import mage.abilities.keyword.IndestructibleAbility;
import mage.abilities.keyword.SaddleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class BulwarkOx extends CardImpl {
public BulwarkOx(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");
this.subtype.add(SubType.OX);
this.subtype.add(SubType.MOUNT);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
// Whenever this creature attacks while saddled, put a +1/+1 counter on target creature.
Ability ability = new AttacksWhileSaddledTriggeredAbility(new AddCountersTargetEffect(CounterType.P1P1.createInstance()));
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
// Sacrifice this creature: Creatures you control with counters on them gain hexproof and indestructible until end of turn.
ability = new SimpleActivatedAbility(new GainAbilityControlledEffect(
HexproofAbility.getInstance(), Duration.EndOfTurn
).setText("creatures you control with counters on them gain hexproof"), new SacrificeSourceCost());
ability.addEffect(new GainAbilityControlledEffect(
IndestructibleAbility.getInstance(), Duration.EndOfTurn
).setText("and indestructible until end of turn"));
this.addAbility(ability);
// Saddle 1
this.addAbility(new SaddleAbility(1));
}
private BulwarkOx(final BulwarkOx card) {
super(card);
}
@Override
public BulwarkOx copy() {
return new BulwarkOx(this);
}
}

View file

@ -0,0 +1,57 @@
package mage.cards.b;
import mage.MageInt;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.effects.common.continuous.MaxSpeedGainAbilityEffect;
import mage.abilities.keyword.DoubleStrikeAbility;
import mage.abilities.keyword.MenaceAbility;
import mage.abilities.keyword.StartYourEnginesAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class BurnoutBashtronaut extends CardImpl {
public BurnoutBashtronaut(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}");
this.subtype.add(SubType.GOBLIN);
this.subtype.add(SubType.WARRIOR);
this.power = new MageInt(1);
this.toughness = new MageInt(1);
// Menace
this.addAbility(new MenaceAbility());
// Start your engines!
this.addAbility(new StartYourEnginesAbility());
// {2}: This creature gets +1/+0 until end of turn.
this.addAbility(new SimpleActivatedAbility(
new BoostSourceEffect(2, 0, Duration.EndOfTurn), new GenericManaCost(2)
));
// Max speed -- This creature has double strike.
this.addAbility(new SimpleStaticAbility(new MaxSpeedGainAbilityEffect(new GainAbilitySourceEffect(DoubleStrikeAbility.getInstance()))));
}
private BurnoutBashtronaut(final BurnoutBashtronaut card) {
super(card);
}
@Override
public BurnoutBashtronaut copy() {
return new BurnoutBashtronaut(this);
}
}

View file

@ -0,0 +1,34 @@
package mage.cards.c;
import mage.MageInt;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class CaelornaCoralTyrant extends CardImpl {
public CaelornaCoralTyrant(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.OCTOPUS);
this.power = new MageInt(0);
this.toughness = new MageInt(8);
}
private CaelornaCoralTyrant(final CaelornaCoralTyrant card) {
super(card);
}
@Override
public CaelornaCoralTyrant copy() {
return new CaelornaCoralTyrant(this);
}
}

View file

@ -0,0 +1,67 @@
package mage.cards.c;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.replacement.ModifyCountersAddedEffect;
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.counters.CounterType;
import mage.filter.FilterCard;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class CaradoraHeartOfAlacria extends CardImpl {
private static final FilterCard filter = new FilterCard("Mount or Vehicle card");
private static final FilterPermanent filter2 = new FilterControlledPermanent("creature or Vehicle you control");
static {
filter.add(Predicates.or(
SubType.MOUNT.getPredicate(),
SubType.VEHICLE.getPredicate()
));
filter2.add(Predicates.or(
CardType.CREATURE.getPredicate(),
SubType.VEHICLE.getPredicate()
));
}
public CaradoraHeartOfAlacria(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{W}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.KNIGHT);
this.power = new MageInt(4);
this.toughness = new MageInt(2);
// When Caradora enters, you may search your library for a Mount or Vehicle card, reveal it, put it into your hand, then shuffle.
this.addAbility(new EntersBattlefieldTriggeredAbility(
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true)
));
// If one or more +1/+1 counters would be put on a creature or Vehicle you control, that many plus one +1/+1 counters are put on it instead.
this.addAbility(new SimpleStaticAbility(new ModifyCountersAddedEffect(filter2, CounterType.P1P1)));
}
private CaradoraHeartOfAlacria(final CaradoraHeartOfAlacria card) {
super(card);
}
@Override
public CaradoraHeartOfAlacria copy() {
return new CaradoraHeartOfAlacria(this);
}
}

View file

@ -56,7 +56,7 @@ public final class CaretakersTalent extends CardImpl {
this.addAbility(ability);
// {3}{W}: Level 3
this.addAbility(new ClassLevelAbility(3, "{2}{W}"));
this.addAbility(new ClassLevelAbility(3, "{3}{W}"));
// Creature tokens you control get +2/+2.
this.addAbility(new SimpleStaticAbility(new GainClassAbilitySourceEffect(new BoostControlledEffect(

View file

@ -0,0 +1,45 @@
package mage.cards.c;
import mage.MageInt;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.keyword.CrewAbility;
import mage.abilities.keyword.CyclingAbility;
import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class ClamorousIronclad extends CardImpl {
public ClamorousIronclad(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}{R}");
this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(6);
this.toughness = new MageInt(3);
// Menace
this.addAbility(new MenaceAbility());
// Crew 3
this.addAbility(new CrewAbility(3));
// Cycling {R}
this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{R}")));
}
private ClamorousIronclad(final ClamorousIronclad card) {
super(card);
}
@Override
public ClamorousIronclad copy() {
return new ClamorousIronclad(this);
}
}

View file

@ -73,7 +73,7 @@ class CloneShellEffect extends OneShotEffect {
Card card = cards.get(target1.getFirstTarget(), game);
if (card != null) {
cards.remove(card);
controller.moveCardsToExile(card, source, game, false, CardUtil.getCardExileZoneId(game, source), CardUtil.createObjectRealtedWindowTitle(source, game, "(Imprint)"));
controller.moveCardsToExile(card, source, game, false, CardUtil.getCardExileZoneId(game, source), CardUtil.createObjectRelatedWindowTitle(source, game, "(Imprint)"));
card.setFaceDown(true, game);
Permanent permanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
if (permanent != null) {

View file

@ -0,0 +1,54 @@
package mage.cards.c;
import mage.MageInt;
import mage.abilities.common.CrewSaddleIncreasedPowerAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class CloudspireCaptain extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Mounts and Vehicles");
static {
filter.add(Predicates.or(
SubType.MOUNT.getPredicate(),
SubType.VEHICLE.getPredicate()
));
}
public CloudspireCaptain(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.PILOT);
this.power = new MageInt(2);
this.toughness = new MageInt(3);
// Mounts and Vehicles you control get +1/+1.
this.addAbility(new SimpleStaticAbility(new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield, filter)));
// This creature saddles Mounts and crews Vehicles as though its power were 2 greater.
this.addAbility(new CrewSaddleIncreasedPowerAbility());
}
private CloudspireCaptain(final CloudspireCaptain card) {
super(card);
}
@Override
public CloudspireCaptain copy() {
return new CloudspireCaptain(this);
}
}

View file

@ -73,7 +73,7 @@ class ColfenorsPlansExileEffect extends OneShotEffect {
Cards toExile = new CardsImpl(controller.getLibrary().getTopCards(game, 7));
UUID exileId = CardUtil.getCardExileZoneId(game, source);
controller.moveCardsToExile(toExile.getCards(game), source, game, false,
exileId, CardUtil.createObjectRealtedWindowTitle(source, game, null));
exileId, CardUtil.createObjectRelatedWindowTitle(source, game, null));
ExileZone exileZone = game.getExile().getExileZone(exileId);
if (exileZone != null) {
for (Card card : exileZone.getCards(game)) {

View file

@ -0,0 +1,61 @@
package mage.cards.c;
import mage.abilities.Mode;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.hint.Hint;
import mage.abilities.hint.ValueHint;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import mage.target.common.TargetArtifactPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class CollisionCourse extends CardImpl {
private static final FilterPermanent filter
= new FilterControlledPermanent("permanents you control that are creatures and/or Vehicles");
static {
filter.add(Predicates.or(
CardType.CREATURE.getPredicate(),
SubType.VEHICLE.getPredicate()
));
}
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter, null);
private static final Hint hint = new ValueHint("Creatures and Vehicles you control", xValue);
public CollisionCourse(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{W}");
// Choose one --
// * Collision Course deals X damage to target creature, where X is the number of permanents you control that are creatures and/or Vehicles.
this.getSpellAbility().addEffect(new DamageTargetEffect(xValue));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
this.getSpellAbility().addHint(hint);
// * Destroy target artifact.
this.getSpellAbility().addMode(new Mode(new DestroyTargetEffect()).addTarget(new TargetArtifactPermanent()));
}
private CollisionCourse(final CollisionCourse card) {
super(card);
}
@Override
public CollisionCourse copy() {
return new CollisionCourse(this);
}
}

View file

@ -0,0 +1,32 @@
package mage.cards.c;
import mage.abilities.effects.common.ExileTopXMayPlayUntilEffect;
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class CountOnLuck extends CardImpl {
public CountOnLuck(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{R}{R}{R}");
// At the beginning of your upkeep, exile the top card of your library. You may play that card this turn.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new ExileTopXMayPlayUntilEffect(1, Duration.EndOfTurn)));
}
private CountOnLuck(final CountOnLuck card) {
super(card);
}
@Override
public CountOnLuck copy() {
return new CountOnLuck(this);
}
}

View file

@ -0,0 +1,66 @@
package mage.cards.c;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.EntersBattlefieldTappedUnlessAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.mana.WhiteManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import mage.game.permanent.token.PilotSaddleCrewToken;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class CountryRoads extends CardImpl {
private static final FilterPermanent filter = new FilterControlledPermanent("you control a Mount or Vehicle");
static {
filter.add(Predicates.or(
SubType.MOUNT.getPredicate(),
SubType.VEHICLE.getPredicate()
));
}
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter);
public CountryRoads(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
// This land enters tapped unless you control a Mount or Vehicle.
this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition));
// {T}: Add {W}.
this.addAbility(new WhiteManaAbility());
// {1}{W}, {T}, Sacrifice this land: Create a 1/1 colorless Pilot creature token with "This token saddles Mounts and crews Vehicles as though its power were 2 greater." Activate only as a sorcery.
Ability ability = new ActivateAsSorceryActivatedAbility(
new CreateTokenEffect(new PilotSaddleCrewToken()), new ManaCostsImpl<>("{1}{W}")
);
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
}
private CountryRoads(final CountryRoads card) {
super(card);
}
@Override
public CountryRoads copy() {
return new CountryRoads(this);
}
}

View file

@ -0,0 +1,43 @@
package mage.cards.c;
import mage.abilities.Mode;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreatureOrPlaneswalker;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class CrashAndBurn extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent(SubType.VEHICLE, "Vehicle");
public CrashAndBurn(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{R}");
// Choose one --
// * Destroy target Vehicle.
this.getSpellAbility().addEffect(new DestroyTargetEffect());
this.getSpellAbility().addTarget(new TargetPermanent(filter));
// * Crash and Burn deals 6 damage to target creature or planeswalker.
this.getSpellAbility().addMode(new Mode(new DamageTargetEffect(6)).addTarget(new TargetCreatureOrPlaneswalker()));
}
private CrashAndBurn(final CrashAndBurn card) {
super(card);
}
@Override
public CrashAndBurn copy() {
return new CrashAndBurn(this);
}
}

View file

@ -0,0 +1,57 @@
package mage.cards.d;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.filter.FilterPermanent;
import mage.filter.predicate.Predicates;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class DaringMechanic extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("Mount or Vehicle");
static {
filter.add(Predicates.or(
SubType.MOUNT.getPredicate(),
SubType.VEHICLE.getPredicate()
));
}
public DaringMechanic(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.ARTIFICER);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
// {3}{W}: Put a +1/+1 counter on target Mount or Vehicle.
Ability ability = new SimpleActivatedAbility(
new AddCountersTargetEffect(CounterType.P1P1.createInstance()), new ManaCostsImpl<>("{3}{W}")
);
ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability);
}
private DaringMechanic(final DaringMechanic card) {
super(card);
}
@Override
public DaringMechanic copy() {
return new DaringMechanic(this);
}
}

View file

@ -0,0 +1,46 @@
package mage.cards.d;
import mage.MageInt;
import mage.abilities.common.CrewSaddleIncreasedPowerAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class DeathlessPilot extends CardImpl {
public DeathlessPilot(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");
this.subtype.add(SubType.ZOMBIE);
this.subtype.add(SubType.PILOT);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
// This creature saddles Mounts and crews Vehicles as though its power were 2 greater.
this.addAbility(new CrewSaddleIncreasedPowerAbility());
// {3}{B}: Return this card from your graveyard to your hand.
this.addAbility(new SimpleActivatedAbility(
Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), new ManaCostsImpl<>("{3}{B}")
));
}
private DeathlessPilot(final DeathlessPilot card) {
super(card);
}
@Override
public DeathlessPilot copy() {
return new DeathlessPilot(this);
}
}

View file

@ -0,0 +1,49 @@
package mage.cards.d;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.LoseLifeOpponentsEffect;
import mage.abilities.keyword.CrewAbility;
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;
/**
* @author TheElk801
*/
public final class DebrisBeetle extends CardImpl {
public DebrisBeetle(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{B}{G}");
this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(6);
this.toughness = new MageInt(6);
// Trample
this.addAbility(TrampleAbility.getInstance());
// When this Vehicle enters, each opponent loses 3 life and you gain 3 life.
Ability ability = new EntersBattlefieldTriggeredAbility(new LoseLifeOpponentsEffect(3));
ability.addEffect(new GainLifeEffect(3).concatBy("and"));
this.addAbility(ability);
// Crew 2
this.addAbility(new CrewAbility(2));
}
private DebrisBeetle(final DebrisBeetle card) {
super(card);
}
@Override
public DebrisBeetle copy() {
return new DebrisBeetle(this);
}
}

View file

@ -86,11 +86,12 @@ class DecoyGambitEffect extends OneShotEffect {
continue;
}
if (player.chooseUse(outcome, "Have " + controller.getName() + " draw a card? If you don't, "
+ permanent.getName() + " will be returned to its owner's hand.", source, game)) {
+ permanent.getLogName() + " will be returned to its owner's hand.", source, game)) {
game.informPlayers(player.getLogName() + " chose to have " + controller.getName() + " draw a card.");
numberOfCardsToDraw += 1;
} else {
game.informPlayers(player.getLogName() + " chose to have their creature returned to their hand.");
game.informPlayers(player.getLogName() + " chose to have their creature " + permanent.getLogName()
+ " returned to their hand.");
permanentToHand.add(permanent);
}
}

View file

@ -0,0 +1,44 @@
package mage.cards.d;
import mage.abilities.Mode;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.HexproofAbility;
import mage.abilities.keyword.IndestructibleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.game.permanent.token.PilotSaddleCrewToken;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class DefendTheRider extends CardImpl {
public DefendTheRider(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{G}");
// Choose one --
// * Target permanent you control gains hexproof and indestructible until end of turn.
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(HexproofAbility.getInstance())
.setText("target permanent you control gains hexproof"));
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(IndestructibleAbility.getInstance())
.setText("and indestructible until end of turn"));
this.getSpellAbility().addTarget(new TargetPermanent());
// * Create a 1/1 colorless Pilot creature token with "This token saddles Mounts and crews Vehicles as though its power were 2 greater."
this.getSpellAbility().addMode(new Mode(new CreateTokenEffect(new PilotSaddleCrewToken())));
}
private DefendTheRider(final DefendTheRider card) {
super(card);
}
@Override
public DefendTheRider copy() {
return new DefendTheRider(this);
}
}

View file

@ -0,0 +1,51 @@
package mage.cards.d;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.ExileUntilSourceLeavesEffect;
import mage.abilities.keyword.CrewAbility;
import mage.abilities.keyword.CyclingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class DetentionChariot extends CardImpl {
public DetentionChariot(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}{W}{W}");
this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(6);
this.toughness = new MageInt(6);
// When this Vehicle enters, exile target artifact or creature an opponent controls until this Vehicle leaves the battlefield.
Ability ability = new EntersBattlefieldTriggeredAbility(new ExileUntilSourceLeavesEffect());
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_OPPONENTS_PERMANENT_ARTIFACT_OR_CREATURE));
this.addAbility(ability);
// Crew 3
this.addAbility(new CrewAbility(3));
// Cycling {W}
this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{W}")));
}
private DetentionChariot(final DetentionChariot card) {
super(card);
}
@Override
public DetentionChariot copy() {
return new DetentionChariot(this);
}
}

View file

@ -0,0 +1,119 @@
package mage.cards.d;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.stream.Collectors;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.*;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.filter.common.FilterLandCard;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.Target;
import mage.target.TargetPermanent;
import mage.target.common.TargetCardInLibrary;
import mage.target.targetadjustment.ForEachOpponentTargetsAdjuster;
/**
*
* @author Grath
*/
public final class DisorientingChoice extends CardImpl {
public DisorientingChoice(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{G}");
// For each opponent, choose up to one target artifact or enchantment that player controls. For each permanent chosen this way, its controller may exile it. Then if one or more of the chosen permanents are still on the battlefield, you search your library for up to that many land cards, put them onto the battlefield tapped, then shuffle.
this.getSpellAbility().addEffect(new DisorientingChoiceEffect());
this.getSpellAbility().addTarget(new TargetPermanent(0,1, StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT));
this.getSpellAbility().setTargetAdjuster(new ForEachOpponentTargetsAdjuster());
}
private DisorientingChoice(final DisorientingChoice card) {
super(card);
}
@Override
public DisorientingChoice copy() {
return new DisorientingChoice(this);
}
}
class DisorientingChoiceEffect extends OneShotEffect {
DisorientingChoiceEffect() {
super(Outcome.Benefit);
staticText = "For each opponent, choose up to one target artifact or enchantment that player controls. "
+ "For each permanent chosen this way, its controller may exile it. Then if one or more of the "
+ "chosen permanents are still on the battlefield, you search your library for up to that many "
+ "land cards, put them onto the battlefield tapped, then shuffle.";
}
private DisorientingChoiceEffect(final DisorientingChoiceEffect effect) {
super(effect);
}
@Override
public DisorientingChoiceEffect copy() {
return new DisorientingChoiceEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
Cards permanentsToExile = new CardsImpl();
int numberOfLandsToFetch = 0;
if (controller == null) {
return false;
}
List<Permanent> permanents = source
.getTargets()
.stream()
.map(Target::getTargets)
.flatMap(Collection::stream)
.map(game::getPermanent)
.filter(Objects::nonNull)
.collect(Collectors.toList());
for (Permanent permanent : permanents) {
Player player = game.getPlayer(permanent.getControllerId());
if (player == null) {
continue;
}
if (player.chooseUse(outcome, "Exile " + permanent.getLogName() + "? If you don't, "
+ controller.getName() + " will get a land from their library.", source, game)) {
game.informPlayers(player.getLogName() + " chose to have their " + permanent.getLogName() + " exiled.");
permanentsToExile.add(permanent);
} else {
game.informPlayers(player.getLogName() + " chose to have " + controller.getName() + " get a land.");
numberOfLandsToFetch += 1;
}
}
/*
When Disorienting Choice resolves, the next opponent in turn order that controls a permanent chosen with
Disorienting Choice decides whether or not to exile that permanent. Then each other opponent in turn order
does the same. Then all appropriate permanents are exiled simultaneously. Opponents will know what choices
opponents earlier in the turn order made.
*/
controller.moveCards(permanentsToExile, Zone.EXILED, source, game);
if (numberOfLandsToFetch > 0) {
TargetCardInLibrary target = new TargetCardInLibrary(0, numberOfLandsToFetch, new FilterLandCard());
if (controller.searchLibrary(target, source, game)) {
for (UUID cardId : target.getTargets()) {
Card card = game.getCard(cardId);
if (card != null) {
controller.moveCards(card, Zone.BATTLEFIELD, source, game);
}
}
}
}
return true;
}
}

View file

@ -0,0 +1,64 @@
package mage.cards.d;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksWhileSaddledTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.RemoveCountersSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.SaddleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.target.common.TargetArtifactPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class DistrictMascot extends CardImpl {
public DistrictMascot(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}");
this.subtype.add(SubType.DOG);
this.subtype.add(SubType.MOUNT);
this.power = new MageInt(0);
this.toughness = new MageInt(0);
// This creature enters with a +1/+1 counter on it.
this.addAbility(new EntersBattlefieldAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance(1)),
"with a +1/+1 counter on it"
));
// {1}{G}, Remove two +1/+1 counters from this creature: Destroy target artifact.
Ability ability = new SimpleActivatedAbility(new DestroyTargetEffect(), new ManaCostsImpl<>("{1}{G}"));
ability.addCost(new RemoveCountersSourceCost(CounterType.P1P1.createInstance(2)));
ability.addTarget(new TargetArtifactPermanent());
this.addAbility(ability);
// Whenever this creature attacks while saddled, put a +1/+1 counter on it.
this.addAbility(new AttacksWhileSaddledTriggeredAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance()).setText("put a +1/+1 counter on it")
));
// Saddle 1
this.addAbility(new SaddleAbility(1));
}
private DistrictMascot(final DistrictMascot card) {
super(card);
}
@Override
public DistrictMascot copy() {
return new DistrictMascot(this);
}
}

View file

@ -0,0 +1,52 @@
package mage.cards.d;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CounterUnlessPaysEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.target.TargetSpell;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class DiversionUnit extends CardImpl {
public DiversionUnit(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{1}{U}");
this.subtype.add(SubType.ROBOT);
this.power = new MageInt(2);
this.toughness = new MageInt(1);
// Flying
this.addAbility(FlyingAbility.getInstance());
// {U}, Sacrifice this creature: Counter target instant or sorcery spell unless its controller pays {3}.
Ability ability = new SimpleActivatedAbility(
new CounterUnlessPaysEffect(new GenericManaCost(3)), new ManaCostsImpl<>("{U}")
);
ability.addCost(new SacrificeSourceCost());
ability.addTarget(new TargetSpell(StaticFilters.FILTER_SPELL_INSTANT_OR_SORCERY));
this.addAbility(ability);
}
private DiversionUnit(final DiversionUnit card) {
super(card);
}
@Override
public DiversionUnit copy() {
return new DiversionUnit(this);
}
}

View file

@ -0,0 +1,55 @@
package mage.cards.d;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.ExhaustAbility;
import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import mage.game.permanent.token.DinDragonToken;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class DraconauticsEngineer extends CardImpl {
public DraconauticsEngineer(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
this.subtype.add(SubType.GOBLIN);
this.subtype.add(SubType.ARTIFICER);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
// Exhaust -- {R}: Other creatures you control gain haste until end of turn. Put a +1/+1 counter on this creature.
Ability ability = new ExhaustAbility(new GainAbilityControlledEffect(
HasteAbility.getInstance(), Duration.EndOfTurn,
StaticFilters.FILTER_PERMANENT_CREATURES, true
), new ManaCostsImpl<>("{R}"));
ability.addEffect(new AddCountersSourceEffect(CounterType.P1P1.createInstance()));
this.addAbility(ability);
// Exhaust -- {3}{R}: Create a 4/4 red Dinosaur Dragon creature token with flying.
this.addAbility(new ExhaustAbility(new CreateTokenEffect(new DinDragonToken()), new ManaCostsImpl<>("{3}{R}")));
}
private DraconauticsEngineer(final DraconauticsEngineer card) {
super(card);
}
@Override
public DraconauticsEngineer copy() {
return new DraconauticsEngineer(this);
}
}

View file

@ -0,0 +1,55 @@
package mage.cards.d;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksWhileSaddledTriggeredAbility;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.SaddleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.target.common.TargetAnyTarget;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class DracosaurAuxiliary extends CardImpl {
public DracosaurAuxiliary(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R}{R}");
this.subtype.add(SubType.DINOSAUR);
this.subtype.add(SubType.DRAGON);
this.subtype.add(SubType.MOUNT);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
// Flying
this.addAbility(FlyingAbility.getInstance());
// Haste
this.addAbility(HasteAbility.getInstance());
// Whenever this creature attacks while saddled, it deals 2 damage to any target.
Ability ability = new AttacksWhileSaddledTriggeredAbility(new DamageTargetEffect(2, "it"));
ability.addTarget(new TargetAnyTarget());
this.addAbility(ability);
// Saddle 3
this.addAbility(new SaddleAbility(3));
}
private DracosaurAuxiliary(final DracosaurAuxiliary card) {
super(card);
}
@Override
public DracosaurAuxiliary copy() {
return new DracosaurAuxiliary(this);
}
}

View file

@ -0,0 +1,53 @@
package mage.cards.d;
import mage.abilities.common.CardsLeaveGraveyardTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.MillThenPutInHandEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.FilterCard;
import mage.filter.predicate.Predicates;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class DredgersInsight extends CardImpl {
private static final FilterCard filter = new FilterCard("artifact and/or creature cards");
private static final FilterCard filter2 = new FilterCard("an artifact, creature, or land card");
static {
filter.add(Predicates.or(
CardType.ARTIFACT.getPredicate(),
CardType.CREATURE.getPredicate()
));
filter2.add(Predicates.or(
CardType.ARTIFACT.getPredicate(),
CardType.CREATURE.getPredicate(),
CardType.LAND.getPredicate()
));
}
public DredgersInsight(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}");
// Whenever one or more artifact and/or creature cards leave your graveyard, you gain 1 life.
this.addAbility(new CardsLeaveGraveyardTriggeredAbility(new GainLifeEffect(1), filter));
// When this enchantment enters, mill four cards. You may put an artifact, creature, or land card from among the milled cards into your hand.
this.addAbility(new EntersBattlefieldTriggeredAbility(new MillThenPutInHandEffect(4, filter2)));
}
private DredgersInsight(final DredgersInsight card) {
super(card);
}
@Override
public DredgersInsight copy() {
return new DredgersInsight(this);
}
}

View file

@ -11,7 +11,6 @@ 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.players.Player;
import mage.util.CardUtil;
@ -64,7 +63,7 @@ class ElkinBottleExileEffect extends OneShotEffect {
if (controller != null) {
Card card = controller.getLibrary().getFromTop(game);
if (card != null) {
controller.moveCardsToExile(card, source, game, true, source.getSourceId(), CardUtil.createObjectRealtedWindowTitle(source, game, null));
controller.moveCardsToExile(card, source, game, true, source.getSourceId(), CardUtil.createObjectRelatedWindowTitle(source, game, null));
CardUtil.makeCardPlayable(game, source, card, false, Duration.UntilYourNextUpkeepStep, false);
}
return true;

View file

@ -0,0 +1,57 @@
package mage.cards.e;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.DiesCreatureTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.LoseLifeOpponentsEffect;
import mage.abilities.effects.common.continuous.MaxSpeedGainAbilityEffect;
import mage.abilities.keyword.StartYourEnginesAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import mage.game.permanent.token.ZombieToken;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class EmbalmedAscendant extends CardImpl {
public EmbalmedAscendant(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}{B}");
this.subtype.add(SubType.ZOMBIE);
this.power = new MageInt(1);
this.toughness = new MageInt(2);
// Start your engines!
this.addAbility(new StartYourEnginesAbility());
// When this creature enters, create a 2/2 black Zombie creature token.
this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ZombieToken())));
// Max speed--Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life.
Ability ability = new DiesCreatureTriggeredAbility(
new LoseLifeOpponentsEffect(1), false,
StaticFilters.FILTER_CONTROLLED_A_CREATURE
);
ability.addEffect(new GainLifeEffect(1).concatBy("and"));
this.addAbility(new SimpleStaticAbility(new MaxSpeedGainAbilityEffect(ability)));
}
private EmbalmedAscendant(final EmbalmedAscendant card) {
super(card);
}
@Override
public EmbalmedAscendant copy() {
return new EmbalmedAscendant(this);
}
}

View file

@ -0,0 +1,48 @@
package mage.cards.e;
import mage.MageInt;
import mage.Mana;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.common.continuous.MaxSpeedGainAbilityEffect;
import mage.abilities.keyword.StartYourEnginesAbility;
import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class EndriderCatalyzer extends CardImpl {
public EndriderCatalyzer(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WARRIOR);
this.power = new MageInt(3);
this.toughness = new MageInt(1);
// Start your engines!
this.addAbility(new StartYourEnginesAbility());
// Max speed -- {T}: Add {R}{R}.
this.addAbility(new SimpleStaticAbility(new MaxSpeedGainAbilityEffect(
new SimpleManaAbility(Zone.BATTLEFIELD, Mana.GreenMana(2), new TapSourceCost())
)));
}
private EndriderCatalyzer(final EndriderCatalyzer card) {
super(card);
}
@Override
public EndriderCatalyzer copy() {
return new EndriderCatalyzer(this);
}
}

View file

@ -0,0 +1,105 @@
package mage.cards.e;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.DiesSourceTriggeredAbility;
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.costs.Cost;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.dynamicvalue.common.SourcePermanentPowerValue;
import mage.abilities.effects.common.DamagePlayersEffect;
import mage.abilities.effects.common.DoWhenCostPaid;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.LifelinkAbility;
import mage.constants.*;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.counters.CounterType;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.permanent.Permanent;
/**
*
* @author Grath
*/
public final class EverethViceroyOfPlunder extends CardImpl {
public EverethViceroyOfPlunder(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.VAMPIRE);
this.subtype.add(SubType.SOLDIER);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
// Flying
this.addAbility(FlyingAbility.getInstance());
// Sacrifice another creature or artifact: Put a +1/+1 counter on Evereth, Viceroy of Plunder. If the sacrificed permanent was a Treasure, Evereth gains lifelink until end of turn. Activate only as a sorcery.
Ability ability = new ActivateAsSorceryActivatedAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance()),
new SacrificeTargetCost(StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE_OR_ARTIFACT)
);
ability.addEffect(new ConditionalContinuousEffect(new GainAbilitySourceEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn),
EverethViceroyOfPlunderCondition.instance,
"If the sacrificed permanent was a Treasure, Evereth gains lifelink until end of turn."
));
this.addAbility(ability);
// When Evereth dies, you may pay {1}{B/R}. When you do, Evereth deals damage equal to its power to each opponent.
this.addAbility(new DiesSourceTriggeredAbility(
new DoWhenCostPaid(new ReflexiveTriggeredAbility(
new DamagePlayersEffect(SourcePermanentPowerValue.NOT_NEGATIVE, TargetController.OPPONENT),
false, "{this} deals damage equal to its power to each opponent"
), new ManaCostsImpl<>("{1}{B/R}"), "Pay {1}{B/R}?")
));
}
private EverethViceroyOfPlunder(final EverethViceroyOfPlunder card) {
super(card);
}
@Override
public EverethViceroyOfPlunder copy() {
return new EverethViceroyOfPlunder(this);
}
}
enum EverethViceroyOfPlunderCondition implements Condition {
instance;
private static final FilterPermanent filter = new FilterPermanent("a treasure");
static {
filter.add(SubType.TREASURE.getPredicate());
}
@Override
public boolean apply(Game game, Ability source) {
for (Cost cost : source.getCosts()) {
if (cost instanceof SacrificeTargetCost) {
for (Permanent permanent : ((SacrificeTargetCost) cost).getPermanents()) {
if (filter.match(permanent, source.getControllerId(), source, game)) {
return true;
}
}
}
}
return false;
}
@Override
public String toString() {
return "the sacrificed permanent was a Treasure";
}
}

View file

@ -0,0 +1,120 @@
package mage.cards.f;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksWithCreaturesTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.effects.common.DrawDiscardControllerEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.constants.WatcherScope;
import mage.filter.FilterPermanent;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.watchers.Watcher;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class FearlessSwashbuckler extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent(SubType.VEHICLE, "Vehicles");
public FearlessSwashbuckler(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{R}");
this.subtype.add(SubType.FISH);
this.subtype.add(SubType.PIRATE);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
// Haste
this.addAbility(HasteAbility.getInstance());
// Vehicles you control have haste.
this.addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
HasteAbility.getInstance(), Duration.WhileOnBattlefield, filter
)));
// Whenever you attack, if a Pirate and a Vehicle attacked this combat, draw three cards, then discard two cards.
this.addAbility(new AttacksWithCreaturesTriggeredAbility(
new DrawDiscardControllerEffect(3, 2), 1
).withInterveningIf(FearlessSwashbucklerCondition.instance), new FearlessSwashbucklerWatcher());
}
private FearlessSwashbuckler(final FearlessSwashbuckler card) {
super(card);
}
@Override
public FearlessSwashbuckler copy() {
return new FearlessSwashbuckler(this);
}
}
enum FearlessSwashbucklerCondition implements Condition {
instance;
@Override
public boolean apply(Game game, Ability source) {
return game.getState().getWatcher(FearlessSwashbucklerWatcher.class).check();
}
@Override
public String toString() {
return "if a Pirate and a Vehicle attacked this combat";
}
}
class FearlessSwashbucklerWatcher extends Watcher {
private boolean pirateAttacked = false;
private boolean vehicleAttacked = false;
FearlessSwashbucklerWatcher() {
super(WatcherScope.GAME);
}
@Override
public void watch(GameEvent event, Game game) {
switch (event.getType()) {
case ATTACKER_DECLARED:
break;
case COMBAT_PHASE_POST:
pirateAttacked = false;
vehicleAttacked = false;
default:
return;
}
Permanent permanent = game.getPermanent(event.getSourceId());
if (permanent == null) {
return;
}
if (permanent.hasSubtype(SubType.PIRATE, game)) {
pirateAttacked = true;
}
if (permanent.hasSubtype(SubType.VEHICLE, game)) {
vehicleAttacked = true;
}
}
@Override
public void reset() {
super.reset();
pirateAttacked = false;
vehicleAttacked = false;
}
boolean check() {
return pirateAttacked && vehicleAttacked;
}
}

View file

@ -74,7 +74,7 @@ class FeatherTheRedeemedTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.SPELL_CAST;
return (event.getType() == GameEvent.EventType.SPELL_CAST);
}
@Override
@ -83,7 +83,7 @@ class FeatherTheRedeemedTriggeredAbility extends TriggeredAbilityImpl {
return false;
}
Spell spell = game.getStack().getSpell(event.getTargetId());
if (spell == null) {
if ((spell == null) || !spell.isInstantOrSorcery(game)) {
return false;
}
SpellAbility sa = spell.getSpellAbility();
@ -95,7 +95,7 @@ class FeatherTheRedeemedTriggeredAbility extends TriggeredAbilityImpl {
if (permanent != null && permanent.isCreature(game)
&& permanent.isControlledBy(getControllerId())) {
this.getEffects().clear();
this.addEffect(new FeatherTheRedeemedEffect(new MageObjectReference(spell, game)));
this.addEffect(new FeatherTheRedeemedEffect(new MageObjectReference(spell.getCard(), game)));
return true;
}
}
@ -106,7 +106,7 @@ class FeatherTheRedeemedTriggeredAbility extends TriggeredAbilityImpl {
if (permanent != null && permanent.isCreature(game)
&& permanent.isControlledBy(getControllerId())) {
this.getEffects().clear();
this.addEffect(new FeatherTheRedeemedEffect(new MageObjectReference(spell, game)));
this.addEffect(new FeatherTheRedeemedEffect(new MageObjectReference(spell.getCard(), game)));
return true;
}
}
@ -126,9 +126,9 @@ class FeatherTheRedeemedTriggeredAbility extends TriggeredAbilityImpl {
class FeatherTheRedeemedEffect extends ReplacementEffectImpl {
private final MageObjectReference mor;
FeatherTheRedeemedEffect(MageObjectReference mor) {
super(Duration.WhileOnStack, Outcome.Benefit);
super(Duration.OneUse, Outcome.Benefit);
this.mor = mor;
}
@ -166,15 +166,14 @@ class FeatherTheRedeemedEffect extends ReplacementEffectImpl {
|| zEvent.getToZone() != Zone.GRAVEYARD
|| event.getSourceId() == null
|| !event.getSourceId().equals(event.getTargetId())
|| mor.getZoneChangeCounter() != game.getState().getZoneChangeCounter(event.getSourceId())) {
return false;
|| !mor.equals(new MageObjectReference(event.getTargetId(), game))) {
return false;
}
Spell spell = game.getStack().getSpell(mor.getSourceId());
return spell != null && spell.isInstantOrSorcery(game);
}
return true;
}
@Override
public FeatherTheRedeemedEffect copy() {
return new FeatherTheRedeemedEffect(this);
}
}
}

View file

@ -77,7 +77,7 @@ class FlamesOfRemembranceExileEffect extends OneShotEffect {
if (controller != null) {
Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, amount.calculate(game, source, this)));
if (!cards.isEmpty()) {
controller.moveCardsToExile(cards.getCards(game), source, game, true, source.getSourceId(), CardUtil.createObjectRealtedWindowTitle(source, game, ""));
controller.moveCardsToExile(cards.getCards(game), source, game, true, source.getSourceId(), CardUtil.createObjectRelatedWindowTitle(source, game, ""));
ContinuousEffect effect = new FlamesOfRemembranceMayPlayExiledEffect();
effect.setTargetPointer(new FixedTargets(cards, game));
game.addEffect(effect, source);

View file

@ -0,0 +1,66 @@
package mage.cards.f;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.EntersBattlefieldTappedUnlessAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.mana.BlackManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
import mage.game.permanent.token.PilotSaddleCrewToken;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class FoulRoads extends CardImpl {
private static final FilterPermanent filter = new FilterControlledPermanent("you control a Mount or Vehicle");
static {
filter.add(Predicates.or(
SubType.MOUNT.getPredicate(),
SubType.VEHICLE.getPredicate()
));
}
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter);
public FoulRoads(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
// This land enters tapped unless you control a Mount or Vehicle.
this.addAbility(new EntersBattlefieldTappedUnlessAbility(condition));
// {T}: Add {B}.
this.addAbility(new BlackManaAbility());
// {1}{B}, {T}, Sacrifice this land: Create a 1/1 colorless Pilot creature token with "This token saddles Mounts and crews Vehicles as though its power were 2 greater." Activate only as a sorcery.
Ability ability = new ActivateAsSorceryActivatedAbility(
new CreateTokenEffect(new PilotSaddleCrewToken()), new ManaCostsImpl<>("{1}{B}")
);
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
}
private FoulRoads(final FoulRoads card) {
super(card);
}
@Override
public FoulRoads copy() {
return new FoulRoads(this);
}
}

View file

@ -0,0 +1,36 @@
package mage.cards.f;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DamageAllEffect;
import mage.abilities.keyword.CyclingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class FuelTheFlames extends CardImpl {
public FuelTheFlames(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{R}");
// Fuel the Flames deals 2 damage to each creature.
this.getSpellAbility().addEffect(new DamageAllEffect(2, StaticFilters.FILTER_PERMANENT_CREATURE));
// Cycling {2}
this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{2}")));
}
private FuelTheFlames(final FuelTheFlames card) {
super(card);
}
@Override
public FuelTheFlames copy() {
return new FuelTheFlames(this);
}
}

View file

@ -0,0 +1,145 @@
package mage.cards.g;
import mage.MageInt;
import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.effects.common.continuous.GainSuspendEffect;
import mage.abilities.keyword.SuspendAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.counters.CounterType;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
import mage.game.stack.Spell;
import mage.players.Player;
import java.util.UUID;
/**
* @author PurpleCrowbar
*/
public final class GandalfOfTheSecretFire extends CardImpl {
public GandalfOfTheSecretFire(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{R}{W}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.AVATAR, SubType.WIZARD);
this.power = new MageInt(3);
this.toughness = new MageInt(4);
// Whenever you cast an instant or sorcery spell from your hand during an opponent's turn, exile that card with three time counters on it instead of putting it into your graveyard as it resolves. Then if the exiled card doesn't have suspend, it gains suspend.
this.addAbility(new GandalfOfTheSecretFireTriggeredAbility());
}
private GandalfOfTheSecretFire(final GandalfOfTheSecretFire card) {
super(card);
}
@Override
public GandalfOfTheSecretFire copy() {
return new GandalfOfTheSecretFire(this);
}
}
class GandalfOfTheSecretFireTriggeredAbility extends TriggeredAbilityImpl {
GandalfOfTheSecretFireTriggeredAbility() {
super(Zone.BATTLEFIELD, null, false);
}
private GandalfOfTheSecretFireTriggeredAbility(final GandalfOfTheSecretFireTriggeredAbility ability) {
super(ability);
}
@Override
public GandalfOfTheSecretFireTriggeredAbility copy() {
return new GandalfOfTheSecretFireTriggeredAbility(this);
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.SPELL_CAST;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (!isControlledBy(event.getPlayerId()) || getControllerId().equals(game.getActivePlayerId())) {
return false;
}
Spell spell = game.getStack().getSpell(event.getTargetId());
if (spell == null || !spell.isInstantOrSorcery(game) || !Zone.HAND.equals(spell.getFromZone())) {
return false;
}
this.getEffects().clear();
this.addEffect(new GandalfOfTheSecretFireEffect(spell, game));
return true;
}
@Override
public String getRule() {
return "Whenever you cast an instant or sorcery spell from your hand during an opponent's turn, exile that " +
"card with three time counters on it instead of putting it into your graveyard as it resolves. " +
"Then if the exiled card doesn't have suspend, it gains suspend.";
}
}
class GandalfOfTheSecretFireEffect extends ReplacementEffectImpl {
private final MageObjectReference mor;
GandalfOfTheSecretFireEffect(Spell spell, Game game) {
super(Duration.OneUse, Outcome.Benefit);
this.mor = new MageObjectReference(spell.getCard(), game);
}
private GandalfOfTheSecretFireEffect(final GandalfOfTheSecretFireEffect effect) {
super(effect);
this.mor = effect.mor;
}
@Override
public GandalfOfTheSecretFireEffect copy() {
return new GandalfOfTheSecretFireEffect(this);
}
@Override
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
Player controller = game.getPlayer(source.getControllerId());
Spell sourceSpell = game.getStack().getSpell(event.getTargetId());
if (controller == null || sourceSpell == null || sourceSpell.isCopy()) {
return false;
}
UUID exileId = SuspendAbility.getSuspendExileId(controller.getId(), game);
if (controller.moveCardsToExile(sourceSpell, source, game, true, exileId, "Suspended cards of " + controller.getName())) {
sourceSpell.addCounters(CounterType.TIME.createInstance(3), controller.getId(), source, game);
game.informPlayers(controller.getLogName() + " exiles " + sourceSpell.getLogName() + " with 3 time counters on it");
}
if (!sourceSpell.getAbilities(game).containsClass(SuspendAbility.class)) {
game.addEffect(new GainSuspendEffect(new MageObjectReference(sourceSpell.getCard(), game)), source);
}
return true;
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ZONE_CHANGE;
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
ZoneChangeEvent zEvent = ((ZoneChangeEvent) event);
if (zEvent.getFromZone() != Zone.STACK
|| zEvent.getToZone() != Zone.GRAVEYARD
|| event.getSourceId() == null
|| !event.getSourceId().equals(event.getTargetId())
|| !mor.equals(new MageObjectReference(event.getTargetId(), game))) {
return false;
}
Spell spell = game.getStack().getSpell(mor.getSourceId());
return spell != null && spell.isInstantOrSorcery(game);
}
}

View file

@ -0,0 +1,67 @@
package mage.cards.g;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.costs.common.DiscardCardCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.ReturnSourceFromGraveyardToBattlefieldWithCounterEffect;
import mage.abilities.effects.common.continuous.AddCardTypeSourceEffect;
import mage.abilities.keyword.CrewAbility;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.counters.CounterType;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class GastalThrillroller extends CardImpl {
public GastalThrillroller(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}{R}");
this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(4);
this.toughness = new MageInt(2);
// Trample
this.addAbility(TrampleAbility.getInstance());
// Haste
this.addAbility(HasteAbility.getInstance());
// When this Vehicle enters, it becomes an artifact creature until end of turn.
this.addAbility(new EntersBattlefieldTriggeredAbility(new AddCardTypeSourceEffect(
Duration.EndOfTurn, CardType.ARTIFACT, CardType.CREATURE
).setText("it becomes an artifact creature until end of turn")));
// Crew 2
this.addAbility(new CrewAbility(2));
// {2}{R}, Discard a card: Return this card from your graveyard to the battlefield with a finality counter on it. Activate only as a sorcery.
Ability ability = new ActivateAsSorceryActivatedAbility(
new ReturnSourceFromGraveyardToBattlefieldWithCounterEffect(
CounterType.FINALITY.createInstance(), false
), new ManaCostsImpl<>("{2}{R}")
);
ability.addCost(new DiscardCardCost());
this.addAbility(ability);
}
private GastalThrillroller(final GastalThrillroller card) {
super(card);
}
@Override
public GastalThrillroller copy() {
return new GastalThrillroller(this);
}
}

View file

@ -0,0 +1,43 @@
package mage.cards.g;
import mage.MageInt;
import mage.abilities.common.AttacksWhileSaddledTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.keyword.SaddleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.game.permanent.token.TreasureToken;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class GildedGhoda extends CardImpl {
public GildedGhoda(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
this.subtype.add(SubType.HORSE);
this.subtype.add(SubType.MOUNT);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
// Whenever this creature attacks while saddled, create a Treasure token.
this.addAbility(new AttacksWhileSaddledTriggeredAbility(new CreateTokenEffect(new TreasureToken())));
// Saddle 1
this.addAbility(new SaddleAbility(1));
}
private GildedGhoda(final GildedGhoda card) {
super(card);
}
@Override
public GildedGhoda copy() {
return new GildedGhoda(this);
}
}

View file

@ -0,0 +1,58 @@
package mage.cards.g;
import mage.MageInt;
import mage.abilities.common.AttacksWhileSaddledTriggeredAbility;
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
import mage.abilities.keyword.LifelinkAbility;
import mage.abilities.keyword.SaddleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.FilterCard;
import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class GloryheathLynx extends CardImpl {
private static final FilterCard filter = new FilterCard("basic Plains card");
static {
filter.add(SuperType.BASIC.getPredicate());
filter.add(SubType.PLAINS.getPredicate());
}
public GloryheathLynx(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");
this.subtype.add(SubType.CAT);
this.subtype.add(SubType.MOUNT);
this.power = new MageInt(2);
this.toughness = new MageInt(3);
// Lifelink
this.addAbility(LifelinkAbility.getInstance());
// Whenever this creature attacks while saddled, search your library for a basic Plains card, reveal it, put it into your hand, then shuffle.
this.addAbility(new AttacksWhileSaddledTriggeredAbility(
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true)
));
// Saddle 2
this.addAbility(new SaddleAbility(2));
}
private GloryheathLynx(final GloryheathLynx card) {
super(card);
}
@Override
public GloryheathLynx copy() {
return new GloryheathLynx(this);
}
}

View file

@ -0,0 +1,44 @@
package mage.cards.g;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.discard.DiscardAndDrawThatManyEffect;
import mage.abilities.keyword.ExhaustAbility;
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 TheElk801
*/
public final class GreasewrenchGoblin extends CardImpl {
public GreasewrenchGoblin(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}");
this.subtype.add(SubType.GOBLIN);
this.subtype.add(SubType.ARTIFICER);
this.power = new MageInt(2);
this.toughness = new MageInt(1);
// Exhaust -- {2}{R}: Discard up to two cards, then draw that many cards. Put a +1/+1 counter on this creature.
Ability ability = new ExhaustAbility(new DiscardAndDrawThatManyEffect(2), new ManaCostsImpl<>("{2}{R}"));
ability.addEffect(new AddCountersSourceEffect(CounterType.P1P1.createInstance()));
this.addAbility(ability);
}
private GreasewrenchGoblin(final GreasewrenchGoblin card) {
super(card);
}
@Override
public GreasewrenchGoblin copy() {
return new GreasewrenchGoblin(this);
}
}

View file

@ -0,0 +1,54 @@
package mage.cards.g;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.ExhaustAbility;
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 mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class GreenbeltGuardian extends CardImpl {
public GreenbeltGuardian(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}");
this.subtype.add(SubType.ELF);
this.subtype.add(SubType.RANGER);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
// {G}: Target creature gains trample until end of turn.
Ability ability = new SimpleActivatedAbility(
new GainAbilityTargetEffect(TrampleAbility.getInstance()), new ManaCostsImpl<>("{G}")
);
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
// Exhaust -- {3}{G}: Put three +1/+1 counters on this creature.
this.addAbility(new ExhaustAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance()), new ManaCostsImpl<>("{3}{G}")
));
}
private GreenbeltGuardian(final GreenbeltGuardian card) {
super(card);
}
@Override
public GreenbeltGuardian copy() {
return new GreenbeltGuardian(this);
}
}

View file

@ -7,9 +7,11 @@ import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.hint.ValueHint;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.abilities.keyword.LifelinkAbility;
import mage.abilities.keyword.VigilanceAbility;
@ -60,7 +62,7 @@ public final class GreymondAvacynsStalwart extends CardImpl {
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new BoostControlledEffect(2, 2, Duration.WhileOnBattlefield, filter),
condition, "as long as you control four or more Humans, Humans you control get +2/+2"
)));
)).addHint(new ValueHint("Humans you control", new PermanentsOnBattlefieldCount(filter2))));
}
private GreymondAvacynsStalwart(final GreymondAvacynsStalwart card) {

View file

@ -0,0 +1,46 @@
package mage.cards.g;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.keyword.SurveilEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.target.common.TargetOpponentsCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class GrimBauble extends CardImpl {
public GrimBauble(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{B}");
// When this artifact enters, target creature an opponent controls gets -2/-2 until end of turn.
Ability ability = new EntersBattlefieldTriggeredAbility(new BoostTargetEffect(-2, -2));
ability.addTarget(new TargetOpponentsCreaturePermanent());
this.addAbility(ability);
// {2}{B}, {T}, Sacrifice this artifact: Surveil 2.
ability = new SimpleActivatedAbility(new SurveilEffect(2), new ManaCostsImpl<>("{2}{B}"));
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
}
private GrimBauble(final GrimBauble card) {
super(card);
}
@Override
public GrimBauble copy() {
return new GrimBauble(this);
}
}

View file

@ -0,0 +1,96 @@
package mage.cards.g;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.CrewAbility;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.CardsImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.players.Player;
import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class GuidelightPathmaker extends CardImpl {
public GuidelightPathmaker(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{4}{W}{U}");
this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(6);
this.toughness = new MageInt(5);
// Vigilance
this.addAbility(VigilanceAbility.getInstance());
// When this Vehicle enters, you may search your library for an artifact card and reveal it. Put it onto the battlefield if its mana value is 2 or less. Otherwise, put it into your hand. Then shuffle.
this.addAbility(new EntersBattlefieldTriggeredAbility(new GuidelightPathmakerEffect()));
// Crew 2
this.addAbility(new CrewAbility(2));
}
private GuidelightPathmaker(final GuidelightPathmaker card) {
super(card);
}
@Override
public GuidelightPathmaker copy() {
return new GuidelightPathmaker(this);
}
}
class GuidelightPathmakerEffect extends OneShotEffect {
GuidelightPathmakerEffect() {
super(Outcome.Benefit);
staticText = "search your library for an artifact card and reveal it. " +
"Put it onto the battlefield if its mana value is 2 or less. " +
"Otherwise, put it into your hand. Then shuffle";
}
private GuidelightPathmakerEffect(final GuidelightPathmakerEffect effect) {
super(effect);
}
@Override
public GuidelightPathmakerEffect copy() {
return new GuidelightPathmakerEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player == null) {
return false;
}
TargetCardInLibrary target = new TargetCardInLibrary(StaticFilters.FILTER_CARD_ARTIFACT);
player.searchLibrary(target, source, game);
Card card = player.getLibrary().getCard(target.getFirstTarget(), game);
if (card == null) {
player.shuffleLibrary(source, game);
return true;
}
player.revealCards(source, new CardsImpl(card), game);
if (card.getManaValue() <= 2) {
player.moveCards(card, Zone.BATTLEFIELD, source, game);
} else {
player.moveCards(card, Zone.HAND, source, game);
}
player.shuffleLibrary(source, game);
return true;
}
}

View file

@ -0,0 +1,52 @@
package mage.cards.h;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksWithCreaturesTriggeredAbility;
import mage.abilities.effects.common.UntapTargetEffect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.CrewAbility;
import mage.abilities.keyword.DeathtouchAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.target.common.TargetControlledCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class HauntedHellride extends CardImpl {
public HauntedHellride(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{U}{B}");
this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
// Whenever you attack, target creature you control gets +1/+0 and gains deathtouch until end of turn. Untap it.
Ability ability = new AttacksWithCreaturesTriggeredAbility(new BoostTargetEffect(1, 0)
.setText("target creature you control gets +1/+0"), 1);
ability.addEffect(new GainAbilityTargetEffect(DeathtouchAbility.getInstance())
.setText("and gains deathtouch until end of turn"));
ability.addEffect(new UntapTargetEffect("untap it"));
ability.addTarget(new TargetControlledCreaturePermanent());
this.addAbility(ability);
// Crew 1
this.addAbility(new CrewAbility(1));
}
private HauntedHellride(final HauntedHellride card) {
super(card);
}
@Override
public HauntedHellride copy() {
return new HauntedHellride(this);
}
}

View file

@ -0,0 +1,90 @@
package mage.cards.h;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.dynamicvalue.common.ControllerSpeedCount;
import mage.abilities.effects.common.combat.CantAttackBlockUnlessConditionSourceEffect;
import mage.abilities.effects.common.combat.CantBeBlockedTargetEffect;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.IndestructibleAbility;
import mage.abilities.keyword.StartYourEnginesAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.PowerPredicate;
import mage.game.Game;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class HazoretGodseeker extends CardImpl {
private static final FilterPermanent filter = new FilterCreaturePermanent("creature with power 2 or less");
static {
filter.add(new PowerPredicate(ComparisonType.FEWER_THAN, 3));
}
public HazoretGodseeker(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.GOD);
this.power = new MageInt(5);
this.toughness = new MageInt(3);
// Indestructible
this.addAbility(IndestructibleAbility.getInstance());
// Haste
this.addAbility(HasteAbility.getInstance());
// Start your engines!
this.addAbility(new StartYourEnginesAbility());
// {1}, {T}: Target creature with power 2 or less can't be blocked this turn.
Ability ability = new SimpleActivatedAbility(new CantBeBlockedTargetEffect(), new GenericManaCost(1));
ability.addCost(new TapSourceCost());
ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability);
// Hazoret can't attack or block unless you have max speed.
this.addAbility(new SimpleStaticAbility(new CantAttackBlockUnlessConditionSourceEffect(HazoretGodseekerCondition.instance)));
}
private HazoretGodseeker(final HazoretGodseeker card) {
super(card);
}
@Override
public HazoretGodseeker copy() {
return new HazoretGodseeker(this);
}
}
enum HazoretGodseekerCondition implements Condition {
instance;
@Override
public boolean apply(Game game, Ability source) {
return ControllerSpeedCount.instance.calculate(game, source, null) >= 4;
}
@Override
public String toString() {
return "you have max speed";
}
}

View file

@ -0,0 +1,60 @@
package mage.cards.h;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.CycleTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.keyword.CyclingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.TargetController;
import mage.filter.FilterPermanent;
import mage.filter.predicate.Predicates;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class HowlersHeavy extends CardImpl {
private static final FilterPermanent filter = new FilterPermanent("creature or Vehicle an opponent controls");
static {
filter.add(Predicates.or(
CardType.CREATURE.getPredicate(),
SubType.VEHICLE.getPredicate()
));
filter.add(TargetController.OPPONENT.getControllerPredicate());
}
public HowlersHeavy(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}");
this.subtype.add(SubType.SEAL);
this.subtype.add(SubType.PIRATE);
this.power = new MageInt(3);
this.toughness = new MageInt(4);
// Cycling {1}{U}
this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{1}{U}")));
// When you cycle this card, target creature or Vehicle an opponent controls gets -3/-0 until end of turn.
Ability ability = new CycleTriggeredAbility(new BoostTargetEffect(-3, 0));
ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability);
}
private HowlersHeavy(final HowlersHeavy card) {
super(card);
}
@Override
public HowlersHeavy copy() {
return new HowlersHeavy(this);
}
}

View file

@ -0,0 +1,67 @@
package mage.cards.i;
import mage.MageInt;
import mage.abilities.common.BecomesTappedSourceTriggeredAbility;
import mage.abilities.common.CrewSaddleWithToughnessAbility;
import mage.abilities.effects.common.UntapSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.game.Game;
import mage.game.events.GameEvent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class InterfaceAce extends CardImpl {
public InterfaceAce(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{1}{W}");
this.subtype.add(SubType.ROBOT);
this.subtype.add(SubType.PILOT);
this.power = new MageInt(0);
this.toughness = new MageInt(4);
// This creature saddles Mounts and crews Vehicles using its toughness rather than its power.
this.addAbility(CrewSaddleWithToughnessAbility.getInstance());
// Whenever this creature becomes tapped during your turn, untap it. This ability triggers only once each turn.
this.addAbility(new InterfaceAceTriggeredAbility());
}
private InterfaceAce(final InterfaceAce card) {
super(card);
}
@Override
public InterfaceAce copy() {
return new InterfaceAce(this);
}
}
class InterfaceAceTriggeredAbility extends BecomesTappedSourceTriggeredAbility {
InterfaceAceTriggeredAbility() {
super(new UntapSourceEffect().setText("untap it"));
setTriggerPhrase("Whenever this creature becomes tapped during your turn, ");
setTriggersLimitEachTurn(1);
}
private InterfaceAceTriggeredAbility(final InterfaceAceTriggeredAbility ability) {
super(ability);
}
@Override
public InterfaceAceTriggeredAbility copy() {
return new InterfaceAceTriggeredAbility(this);
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
return game.isActivePlayer(getControllerId()) && super.checkTrigger(event, game);
}
}

View file

@ -0,0 +1,36 @@
package mage.cards.i;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.ExileCardYouChooseTargetOpponentEffect;
import mage.abilities.keyword.CyclingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class IntimidationTactics extends CardImpl {
public IntimidationTactics(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{B}");
// Target opponent reveals their hand. You choose an artifact or creature card from it. Exile that card.
this.getSpellAbility().addEffect(new ExileCardYouChooseTargetOpponentEffect(StaticFilters.FILTER_CARD_ARTIFACT_OR_CREATURE));
// Cycling {3}
this.addAbility(new CyclingAbility(new ManaCostsImpl<>("{3}")));
}
private IntimidationTactics(final IntimidationTactics card) {
super(card);
}
@Override
public IntimidationTactics copy() {
return new IntimidationTactics(this);
}
}

View file

@ -11,6 +11,7 @@ import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.keyword.ReachAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.ExpansionSet;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
@ -19,8 +20,8 @@ import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
import mage.target.common.TargetCardInYourGraveyard;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
@ -30,23 +31,28 @@ import java.util.UUID;
public final class IshkanahBroodmother extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.SPIDER, "Spiders");
private static final List<String> spellbook = Collections.unmodifiableList(Arrays.asList(
"Arachnoform",
"Brood Weaver",
"Drider",
// "Glowstone Recluse", mutate card
"Gnottvold Recluse",
"Hatchery Spider",
"Mammoth Spider",
"Netcaster Spider",
"Prey Upon",
"Sentinel Spider",
"Snarespinner",
"Spider Spawning",
"Spidery Grasp",
"Sporecap Spider",
"Twin-Silk Spider"
));
private static final List<String> spellbook;
static {
spellbook = new ArrayList<>(Arrays.asList(
"Arachnoform",
"Brood Weaver",
"Drider",
"Glowstone Recluse", // mutate card
"Gnottvold Recluse",
"Hatchery Spider",
"Mammoth Spider",
"Netcaster Spider",
"Prey Upon",
"Sentinel Spider",
"Snarespinner",
"Spider Spawning",
"Spidery Grasp",
"Sporecap Spider",
"Twin-Silk Spider"
));
spellbook.removeIf(card -> ExpansionSet.HIDE_MUTATE_CARDS && ExpansionSet.MUTATE_CARD_NAMES.contains(card));
}
public IshkanahBroodmother(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}");

View file

@ -0,0 +1,34 @@
package mage.cards.k;
import mage.MageInt;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class KalakscionHungerTyrant extends CardImpl {
public KalakscionHungerTyrant(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{B}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.CROCODILE);
this.power = new MageInt(7);
this.toughness = new MageInt(2);
}
private KalakscionHungerTyrant(final KalakscionHungerTyrant card) {
super(card);
}
@Override
public KalakscionHungerTyrant copy() {
return new KalakscionHungerTyrant(this);
}
}

View file

@ -0,0 +1,99 @@
package mage.cards.k;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import mage.MageInt;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.DrawCardControllerTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.Condition;
import mage.abilities.decorator.ConditionalAsThoughEffect;
import mage.abilities.effects.common.continuous.CastAsThoughItHadFlashAllEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.constants.*;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.counters.CounterType;
import mage.filter.FilterCard;
import mage.filter.predicate.Predicates;
import mage.game.Game;
/**
*
* @author Grath
*/
public final class KianneCorruptedMemory extends CardImpl {
private static final FilterCard filter = new FilterCard("noncreature spells");
private static final FilterCard filter2 = new FilterCard("creature spells");
static {
filter.add(Predicates.not(CardType.CREATURE.getPredicate()));
filter2.add(CardType.CREATURE.getPredicate());
}
public KianneCorruptedMemory(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{U}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.ILLUSION);
this.power = new MageInt(2);
this.toughness = new MageInt(2);
// As long as Kianne's power is even, you may cast noncreature spells as though they had flash.
this.addAbility(new SimpleStaticAbility(
new ConditionalAsThoughEffect(
new CastAsThoughItHadFlashAllEffect(Duration.Custom, filter),
KianneCorruptedMemoryOddCondition.instance
)));
// As long as Kianne's power is odd, you may cast creature spells as though they had flash.
this.addAbility(new SimpleStaticAbility(
new ConditionalAsThoughEffect(
new CastAsThoughItHadFlashAllEffect(Duration.Custom, filter2),
KianneCorruptedMemoryEvenCondition.instance
)));
// Whenever you draw a card, put a +1/+1 counter on Kianne.
this.addAbility(new DrawCardControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false));
}
private KianneCorruptedMemory(final KianneCorruptedMemory card) {
super(card);
}
@Override
public KianneCorruptedMemory copy() {
return new KianneCorruptedMemory(this);
}
}
enum KianneCorruptedMemoryOddCondition implements Condition {
instance;
@Override
public boolean apply(Game game, Ability source) {
return Optional
.ofNullable(source.getSourcePermanentIfItStillExists(game))
.filter(Objects::nonNull)
.map(MageObject::getPower)
.map(MageInt::getValue)
.orElse(0) % 2 == 1;
}
}
enum KianneCorruptedMemoryEvenCondition implements Condition {
instance;
@Override
public boolean apply(Game game, Ability source) {
return Optional
.ofNullable(source.getSourcePermanentIfItStillExists(game))
.filter(Objects::nonNull)
.map(MageObject::getPower)
.map(MageInt::getValue)
.orElse(0) % 2 == 0;
}
}

View file

@ -95,7 +95,7 @@ class KingNarfisBetrayalFirstEffect extends OneShotEffect {
TargetCard target = new TargetCardInYourGraveyard(filter);
target.withNotTarget(true);
if (controller.chooseTarget(outcome, controller.getGraveyard(), target, source, game)) {
controller.moveCardsToExile(game.getCard(target.getFirstTarget()), source, game, true, CardUtil.getCardExileZoneId(game, source), CardUtil.createObjectRealtedWindowTitle(source, game, null));
controller.moveCardsToExile(game.getCard(target.getFirstTarget()), source, game, true, CardUtil.getCardExileZoneId(game, source), CardUtil.createObjectRelatedWindowTitle(source, game, null));
}
}
}
@ -112,7 +112,7 @@ class KingNarfisBetrayalFirstEffect extends OneShotEffect {
TargetCard target = new TargetCardInOpponentsGraveyard(1, 1, filter, true);
target.withNotTarget(true);
if (controller.chooseTarget(outcome, opponent.getGraveyard(), target, source, game)) {
controller.moveCardsToExile(game.getCard(target.getFirstTarget()), source, game, true, CardUtil.getCardExileZoneId(game, source), CardUtil.createObjectRealtedWindowTitle(source, game, null));
controller.moveCardsToExile(game.getCard(target.getFirstTarget()), source, game, true, CardUtil.getCardExileZoneId(game, source), CardUtil.createObjectRelatedWindowTitle(source, game, null));
}
}
}

View file

@ -0,0 +1,55 @@
package mage.cards.m;
import mage.MageInt;
import mage.abilities.common.DiesSourceTriggeredAbility;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.CountersSourceCount;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
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 TheElk801
*/
public final class MarketbackWalker extends CardImpl {
private static final DynamicValue xValue = new CountersSourceCount(CounterType.P1P1);
public MarketbackWalker(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{X}{X}");
this.subtype.add(SubType.CONSTRUCT);
this.power = new MageInt(0);
this.toughness = new MageInt(0);
// This creature enters with X +1/+1 counters on it.
this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldWithXCountersEffect(CounterType.P1P1.createInstance())));
// {4}: Put a +1/+1 counter on this creature.
this.addAbility(new SimpleActivatedAbility(
new AddCountersSourceEffect(CounterType.P1P1.createInstance()), new GenericManaCost(4)
));
// When this creature dies, draw a card for each +1/+1 counter on it.
this.addAbility(new DiesSourceTriggeredAbility(new DrawCardSourceControllerEffect(xValue)));
}
private MarketbackWalker(final MarketbackWalker card) {
super(card);
}
@Override
public MarketbackWalker copy() {
return new MarketbackWalker(this);
}
}

View file

@ -0,0 +1,60 @@
package mage.cards.m;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.continuous.AddCardTypeSourceEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
import mage.abilities.keyword.CrewAbility;
import mage.abilities.keyword.ExhaustAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.filter.StaticFilters;
import mage.target.common.TargetCardInLibrary;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class MarshalsPathcruiser extends CardImpl {
public MarshalsPathcruiser(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}");
this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(6);
this.toughness = new MageInt(5);
// When this Vehicle enters, search your library for a basic land card, reveal it, put it into your hand, then shuffle.
this.addAbility(new EntersBattlefieldTriggeredAbility(
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND), true)
));
// Exhaust -- {W}{U}{B}{R}{G}: This Vehicle becomes an artifact creature. Put two +1/+1 counters on it.
Ability ability = new ExhaustAbility(
new AddCardTypeSourceEffect(Duration.Custom, CardType.ARTIFACT, CardType.CREATURE),
new ManaCostsImpl<>("{W}{U}{B}{R}{G}")
);
ability.addEffect(new AddCountersSourceEffect(CounterType.P1P1.createInstance(2)));
this.addAbility(ability);
// Crew 5
this.addAbility(new CrewAbility(5));
}
private MarshalsPathcruiser(final MarshalsPathcruiser card) {
super(card);
}
@Override
public MarshalsPathcruiser copy() {
return new MarshalsPathcruiser(this);
}
}

View file

@ -0,0 +1,40 @@
package mage.cards.m;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.abilities.keyword.DeathtouchAbility;
import mage.abilities.keyword.IndestructibleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.counters.CounterType;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class MaximumOverdrive extends CardImpl {
public MaximumOverdrive(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{B}");
// Put a +1/+1 counter on target creature. It gains deathtouch and indestructible until end of turn.
this.getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.P1P1.createInstance()));
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(DeathtouchAbility.getInstance())
.setText("it gains deathtouch"));
this.getSpellAbility().addEffect(new GainAbilityTargetEffect(IndestructibleAbility.getInstance())
.setText("and indestructible until end of turn"));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
}
private MaximumOverdrive(final MaximumOverdrive card) {
super(card);
}
@Override
public MaximumOverdrive copy() {
return new MaximumOverdrive(this);
}
}

View file

@ -0,0 +1,47 @@
package mage.cards.m;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.common.NotMyTurnCondition;
import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.effects.common.continuous.AddCardTypeSourceEffect;
import mage.abilities.keyword.CrewAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class MidnightMangler extends CardImpl {
public MidnightMangler(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}{U}");
this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(3);
this.toughness = new MageInt(3);
// During turns other than yours, this Vehicle is an artifact creature.
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
new AddCardTypeSourceEffect(Duration.WhileOnBattlefield, CardType.ARTIFACT, CardType.CREATURE),
NotMyTurnCondition.instance, "during turns other than yours, this Vehicle is an artifact creature"
)));
// Crew 2
this.addAbility(new CrewAbility(2));
}
private MidnightMangler(final MidnightMangler card) {
super(card);
}
@Override
public MidnightMangler copy() {
return new MidnightMangler(this);
}
}

View file

@ -0,0 +1,51 @@
package mage.cards.m;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.dynamicvalue.common.GetXValue;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.counter.AddCountersAllEffect;
import mage.abilities.keyword.ExhaustAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.counters.CounterType;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledCreaturePermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class MindspringMerfolk extends CardImpl {
private static final FilterPermanent filter = new FilterControlledCreaturePermanent(SubType.MERFOLK, "Merfolk creature you control");
public MindspringMerfolk(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}");
this.subtype.add(SubType.MERFOLK);
this.subtype.add(SubType.WIZARD);
this.power = new MageInt(1);
this.toughness = new MageInt(1);
// Exhaust -- {X}{U}{U}, {T}: Draw X cards. Put a +1/+1 counter on each Merfolk creature you control.
Ability ability = new ExhaustAbility(new DrawCardSourceControllerEffect(GetXValue.instance), new ManaCostsImpl<>("{X}{U}{U}"));
ability.addCost(new TapSourceCost());
ability.addEffect(new AddCountersAllEffect(CounterType.P1P1.createInstance(), filter));
this.addAbility(ability);
}
private MindspringMerfolk(final MindspringMerfolk card) {
super(card);
}
@Override
public MindspringMerfolk copy() {
return new MindspringMerfolk(this);
}
}

View file

@ -75,6 +75,6 @@ enum MirkoObsessiveTheoristPredicate implements ObjectSourcePlayerPredicate<Card
@Override
public boolean apply(ObjectSourcePlayer<Card> input, Game game) {
Permanent sourcePermanent = input.getSource().getSourcePermanentOrLKI(game);
return sourcePermanent != null && input.getObject().getPower().getValue() <= sourcePermanent.getPower().getValue();
return sourcePermanent != null && input.getObject().getPower().getValue() < sourcePermanent.getPower().getValue();
}
}

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