forked from External/mage
master #15
269 changed files with 16916 additions and 4603 deletions
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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.");
|
||||
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
64
Mage.Sets/src/mage/cards/a/AatchikEmeraldRadian.java
Normal file
64
Mage.Sets/src/mage/cards/a/AatchikEmeraldRadian.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
50
Mage.Sets/src/mage/cards/a/AetherSyphon.java
Normal file
50
Mage.Sets/src/mage/cards/a/AetherSyphon.java
Normal 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);
|
||||
}
|
||||
}
|
||||
63
Mage.Sets/src/mage/cards/a/Aetherjacket.java
Normal file
63
Mage.Sets/src/mage/cards/a/Aetherjacket.java
Normal 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);
|
||||
}
|
||||
}
|
||||
70
Mage.Sets/src/mage/cards/a/AfterburnerExpert.java
Normal file
70
Mage.Sets/src/mage/cards/a/AfterburnerExpert.java
Normal 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;
|
||||
}
|
||||
}
|
||||
66
Mage.Sets/src/mage/cards/a/AgonasaurRex.java
Normal file
66
Mage.Sets/src/mage/cards/a/AgonasaurRex.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
47
Mage.Sets/src/mage/cards/a/AmonkhetRaceway.java
Normal file
47
Mage.Sets/src/mage/cards/a/AmonkhetRaceway.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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(
|
||||
|
|
|
|||
59
Mage.Sets/src/mage/cards/a/ApocalypseRunner.java
Normal file
59
Mage.Sets/src/mage/cards/a/ApocalypseRunner.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
48
Mage.Sets/src/mage/cards/a/AvishkarRaceway.java
Normal file
48
Mage.Sets/src/mage/cards/a/AvishkarRaceway.java
Normal 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);
|
||||
}
|
||||
}
|
||||
47
Mage.Sets/src/mage/cards/b/BackOnTrack.java
Normal file
47
Mage.Sets/src/mage/cards/b/BackOnTrack.java
Normal 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);
|
||||
}
|
||||
}
|
||||
69
Mage.Sets/src/mage/cards/b/BasriTomorrowsChampion.java
Normal file
69
Mage.Sets/src/mage/cards/b/BasriTomorrowsChampion.java
Normal 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);
|
||||
}
|
||||
}
|
||||
43
Mage.Sets/src/mage/cards/b/BeastriderVanguard.java
Normal file
43
Mage.Sets/src/mage/cards/b/BeastriderVanguard.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
40
Mage.Sets/src/mage/cards/b/BestowGreatness.java
Normal file
40
Mage.Sets/src/mage/cards/b/BestowGreatness.java
Normal 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);
|
||||
}
|
||||
}
|
||||
66
Mage.Sets/src/mage/cards/b/BoomScholar.java
Normal file
66
Mage.Sets/src/mage/cards/b/BoomScholar.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
44
Mage.Sets/src/mage/cards/b/BounceOff.java
Normal file
44
Mage.Sets/src/mage/cards/b/BounceOff.java
Normal 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);
|
||||
}
|
||||
}
|
||||
56
Mage.Sets/src/mage/cards/b/BrightfieldGlider.java
Normal file
56
Mage.Sets/src/mage/cards/b/BrightfieldGlider.java
Normal 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);
|
||||
}
|
||||
}
|
||||
47
Mage.Sets/src/mage/cards/b/BrightfieldMustang.java
Normal file
47
Mage.Sets/src/mage/cards/b/BrightfieldMustang.java
Normal 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);
|
||||
}
|
||||
}
|
||||
62
Mage.Sets/src/mage/cards/b/BulwarkOx.java
Normal file
62
Mage.Sets/src/mage/cards/b/BulwarkOx.java
Normal 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);
|
||||
}
|
||||
}
|
||||
57
Mage.Sets/src/mage/cards/b/BurnoutBashtronaut.java
Normal file
57
Mage.Sets/src/mage/cards/b/BurnoutBashtronaut.java
Normal 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);
|
||||
}
|
||||
}
|
||||
34
Mage.Sets/src/mage/cards/c/CaelornaCoralTyrant.java
Normal file
34
Mage.Sets/src/mage/cards/c/CaelornaCoralTyrant.java
Normal 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);
|
||||
}
|
||||
}
|
||||
67
Mage.Sets/src/mage/cards/c/CaradoraHeartOfAlacria.java
Normal file
67
Mage.Sets/src/mage/cards/c/CaradoraHeartOfAlacria.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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(
|
||||
|
|
|
|||
45
Mage.Sets/src/mage/cards/c/ClamorousIronclad.java
Normal file
45
Mage.Sets/src/mage/cards/c/ClamorousIronclad.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
54
Mage.Sets/src/mage/cards/c/CloudspireCaptain.java
Normal file
54
Mage.Sets/src/mage/cards/c/CloudspireCaptain.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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)) {
|
||||
|
|
|
|||
61
Mage.Sets/src/mage/cards/c/CollisionCourse.java
Normal file
61
Mage.Sets/src/mage/cards/c/CollisionCourse.java
Normal 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);
|
||||
}
|
||||
}
|
||||
32
Mage.Sets/src/mage/cards/c/CountOnLuck.java
Normal file
32
Mage.Sets/src/mage/cards/c/CountOnLuck.java
Normal 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);
|
||||
}
|
||||
}
|
||||
66
Mage.Sets/src/mage/cards/c/CountryRoads.java
Normal file
66
Mage.Sets/src/mage/cards/c/CountryRoads.java
Normal 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);
|
||||
}
|
||||
}
|
||||
43
Mage.Sets/src/mage/cards/c/CrashAndBurn.java
Normal file
43
Mage.Sets/src/mage/cards/c/CrashAndBurn.java
Normal 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);
|
||||
}
|
||||
}
|
||||
57
Mage.Sets/src/mage/cards/d/DaringMechanic.java
Normal file
57
Mage.Sets/src/mage/cards/d/DaringMechanic.java
Normal 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);
|
||||
}
|
||||
}
|
||||
46
Mage.Sets/src/mage/cards/d/DeathlessPilot.java
Normal file
46
Mage.Sets/src/mage/cards/d/DeathlessPilot.java
Normal 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);
|
||||
}
|
||||
}
|
||||
49
Mage.Sets/src/mage/cards/d/DebrisBeetle.java
Normal file
49
Mage.Sets/src/mage/cards/d/DebrisBeetle.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
44
Mage.Sets/src/mage/cards/d/DefendTheRider.java
Normal file
44
Mage.Sets/src/mage/cards/d/DefendTheRider.java
Normal 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);
|
||||
}
|
||||
}
|
||||
51
Mage.Sets/src/mage/cards/d/DetentionChariot.java
Normal file
51
Mage.Sets/src/mage/cards/d/DetentionChariot.java
Normal 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);
|
||||
}
|
||||
}
|
||||
119
Mage.Sets/src/mage/cards/d/DisorientingChoice.java
Normal file
119
Mage.Sets/src/mage/cards/d/DisorientingChoice.java
Normal 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;
|
||||
}
|
||||
}
|
||||
64
Mage.Sets/src/mage/cards/d/DistrictMascot.java
Normal file
64
Mage.Sets/src/mage/cards/d/DistrictMascot.java
Normal 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);
|
||||
}
|
||||
}
|
||||
52
Mage.Sets/src/mage/cards/d/DiversionUnit.java
Normal file
52
Mage.Sets/src/mage/cards/d/DiversionUnit.java
Normal 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);
|
||||
}
|
||||
}
|
||||
55
Mage.Sets/src/mage/cards/d/DraconauticsEngineer.java
Normal file
55
Mage.Sets/src/mage/cards/d/DraconauticsEngineer.java
Normal 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);
|
||||
}
|
||||
}
|
||||
55
Mage.Sets/src/mage/cards/d/DracosaurAuxiliary.java
Normal file
55
Mage.Sets/src/mage/cards/d/DracosaurAuxiliary.java
Normal 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);
|
||||
}
|
||||
}
|
||||
53
Mage.Sets/src/mage/cards/d/DredgersInsight.java
Normal file
53
Mage.Sets/src/mage/cards/d/DredgersInsight.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
57
Mage.Sets/src/mage/cards/e/EmbalmedAscendant.java
Normal file
57
Mage.Sets/src/mage/cards/e/EmbalmedAscendant.java
Normal 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);
|
||||
}
|
||||
}
|
||||
48
Mage.Sets/src/mage/cards/e/EndriderCatalyzer.java
Normal file
48
Mage.Sets/src/mage/cards/e/EndriderCatalyzer.java
Normal 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);
|
||||
}
|
||||
}
|
||||
105
Mage.Sets/src/mage/cards/e/EverethViceroyOfPlunder.java
Normal file
105
Mage.Sets/src/mage/cards/e/EverethViceroyOfPlunder.java
Normal 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";
|
||||
}
|
||||
}
|
||||
120
Mage.Sets/src/mage/cards/f/FearlessSwashbuckler.java
Normal file
120
Mage.Sets/src/mage/cards/f/FearlessSwashbuckler.java
Normal 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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
66
Mage.Sets/src/mage/cards/f/FoulRoads.java
Normal file
66
Mage.Sets/src/mage/cards/f/FoulRoads.java
Normal 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);
|
||||
}
|
||||
}
|
||||
36
Mage.Sets/src/mage/cards/f/FuelTheFlames.java
Normal file
36
Mage.Sets/src/mage/cards/f/FuelTheFlames.java
Normal 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);
|
||||
}
|
||||
}
|
||||
145
Mage.Sets/src/mage/cards/g/GandalfOfTheSecretFire.java
Normal file
145
Mage.Sets/src/mage/cards/g/GandalfOfTheSecretFire.java
Normal 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);
|
||||
}
|
||||
}
|
||||
67
Mage.Sets/src/mage/cards/g/GastalThrillroller.java
Normal file
67
Mage.Sets/src/mage/cards/g/GastalThrillroller.java
Normal 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);
|
||||
}
|
||||
}
|
||||
43
Mage.Sets/src/mage/cards/g/GildedGhoda.java
Normal file
43
Mage.Sets/src/mage/cards/g/GildedGhoda.java
Normal 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);
|
||||
}
|
||||
}
|
||||
58
Mage.Sets/src/mage/cards/g/GloryheathLynx.java
Normal file
58
Mage.Sets/src/mage/cards/g/GloryheathLynx.java
Normal 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);
|
||||
}
|
||||
}
|
||||
44
Mage.Sets/src/mage/cards/g/GreasewrenchGoblin.java
Normal file
44
Mage.Sets/src/mage/cards/g/GreasewrenchGoblin.java
Normal 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);
|
||||
}
|
||||
}
|
||||
54
Mage.Sets/src/mage/cards/g/GreenbeltGuardian.java
Normal file
54
Mage.Sets/src/mage/cards/g/GreenbeltGuardian.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
46
Mage.Sets/src/mage/cards/g/GrimBauble.java
Normal file
46
Mage.Sets/src/mage/cards/g/GrimBauble.java
Normal 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);
|
||||
}
|
||||
}
|
||||
96
Mage.Sets/src/mage/cards/g/GuidelightPathmaker.java
Normal file
96
Mage.Sets/src/mage/cards/g/GuidelightPathmaker.java
Normal 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;
|
||||
}
|
||||
}
|
||||
52
Mage.Sets/src/mage/cards/h/HauntedHellride.java
Normal file
52
Mage.Sets/src/mage/cards/h/HauntedHellride.java
Normal 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);
|
||||
}
|
||||
}
|
||||
90
Mage.Sets/src/mage/cards/h/HazoretGodseeker.java
Normal file
90
Mage.Sets/src/mage/cards/h/HazoretGodseeker.java
Normal 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";
|
||||
}
|
||||
}
|
||||
60
Mage.Sets/src/mage/cards/h/HowlersHeavy.java
Normal file
60
Mage.Sets/src/mage/cards/h/HowlersHeavy.java
Normal 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);
|
||||
}
|
||||
}
|
||||
67
Mage.Sets/src/mage/cards/i/InterfaceAce.java
Normal file
67
Mage.Sets/src/mage/cards/i/InterfaceAce.java
Normal 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);
|
||||
}
|
||||
}
|
||||
36
Mage.Sets/src/mage/cards/i/IntimidationTactics.java
Normal file
36
Mage.Sets/src/mage/cards/i/IntimidationTactics.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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}");
|
||||
|
|
|
|||
34
Mage.Sets/src/mage/cards/k/KalakscionHungerTyrant.java
Normal file
34
Mage.Sets/src/mage/cards/k/KalakscionHungerTyrant.java
Normal 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);
|
||||
}
|
||||
}
|
||||
99
Mage.Sets/src/mage/cards/k/KianneCorruptedMemory.java
Normal file
99
Mage.Sets/src/mage/cards/k/KianneCorruptedMemory.java
Normal 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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
55
Mage.Sets/src/mage/cards/m/MarketbackWalker.java
Normal file
55
Mage.Sets/src/mage/cards/m/MarketbackWalker.java
Normal 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);
|
||||
}
|
||||
}
|
||||
60
Mage.Sets/src/mage/cards/m/MarshalsPathcruiser.java
Normal file
60
Mage.Sets/src/mage/cards/m/MarshalsPathcruiser.java
Normal 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);
|
||||
}
|
||||
}
|
||||
40
Mage.Sets/src/mage/cards/m/MaximumOverdrive.java
Normal file
40
Mage.Sets/src/mage/cards/m/MaximumOverdrive.java
Normal 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);
|
||||
}
|
||||
}
|
||||
47
Mage.Sets/src/mage/cards/m/MidnightMangler.java
Normal file
47
Mage.Sets/src/mage/cards/m/MidnightMangler.java
Normal 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);
|
||||
}
|
||||
}
|
||||
51
Mage.Sets/src/mage/cards/m/MindspringMerfolk.java
Normal file
51
Mage.Sets/src/mage/cards/m/MindspringMerfolk.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue