diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.form b/Mage.Client/src/main/java/mage/client/MageFrame.form index 1c0968259a3..40d70fa386a 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.form +++ b/Mage.Client/src/main/java/mage/client/MageFrame.form @@ -16,6 +16,14 @@ + + + + + + + + diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index 10d85cbc47e..08c29ba8ad2 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -827,6 +827,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { popupDebug = new javax.swing.JPopupMenu(); menuDebugTestModalDialog = new javax.swing.JMenuItem(); + menuDebugTestCardRenderModesDialog = new javax.swing.JMenuItem(); desktopPane = new MageJDesktop(); mageToolbar = new javax.swing.JToolBar(); btnPreferences = new javax.swing.JButton(); @@ -857,6 +858,14 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { }); popupDebug.add(menuDebugTestModalDialog); + menuDebugTestCardRenderModesDialog.setText("Test Card Render Modes"); + menuDebugTestCardRenderModesDialog.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + menuDebugTestCardRenderModesDialogActionPerformed(evt); + } + }); + popupDebug.add(menuDebugTestCardRenderModesDialog); + setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); setMinimumSize(new java.awt.Dimension(1024, 768)); @@ -995,16 +1004,16 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(desktopPane, javax.swing.GroupLayout.DEFAULT_SIZE, 838, Short.MAX_VALUE) - .addComponent(mageToolbar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(desktopPane, javax.swing.GroupLayout.DEFAULT_SIZE, 838, Short.MAX_VALUE) + .addComponent(mageToolbar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(mageToolbar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(2, 2, 2) - .addComponent(desktopPane, javax.swing.GroupLayout.DEFAULT_SIZE, 145, Short.MAX_VALUE)) + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(mageToolbar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(2, 2, 2) + .addComponent(desktopPane, javax.swing.GroupLayout.DEFAULT_SIZE, 145, Short.MAX_VALUE)) ); pack(); @@ -1079,6 +1088,11 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { popupDebug.show(evt.getComponent(), 0, evt.getComponent().getHeight()); }//GEN-LAST:event_btnDebugMouseClicked + private void menuDebugTestCardRenderModesDialogActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuDebugTestCardRenderModesDialogActionPerformed + final TestCardRenderDialog dialog = new TestCardRenderDialog(); + dialog.showDialog(); + }//GEN-LAST:event_menuDebugTestCardRenderModesDialogActionPerformed + public void downloadImages() { DownloadPicturesService.startDownload(); } @@ -1328,6 +1342,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { private javax.swing.JToolBar.Separator jSeparatorImages; private javax.swing.JToolBar.Separator jSeparatorSymbols; private javax.swing.JToolBar mageToolbar; + private javax.swing.JMenuItem menuDebugTestCardRenderModesDialog; private javax.swing.JMenuItem menuDebugTestModalDialog; private javax.swing.JPopupMenu popupDebug; private javax.swing.JToolBar.Separator separatorDebug; diff --git a/Mage.Client/src/main/java/mage/client/dialog/TestCardRenderDialog.form b/Mage.Client/src/main/java/mage/client/dialog/TestCardRenderDialog.form new file mode 100644 index 00000000000..bdc2ec168ac --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/dialog/TestCardRenderDialog.form @@ -0,0 +1,77 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/Mage.Client/src/main/java/mage/client/dialog/TestCardRenderDialog.java b/Mage.Client/src/main/java/mage/client/dialog/TestCardRenderDialog.java new file mode 100644 index 00000000000..7833195372c --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/dialog/TestCardRenderDialog.java @@ -0,0 +1,223 @@ +package mage.client.dialog; + +import mage.cards.Card; +import mage.cards.CardGraphicInfo; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.decks.Deck; +import mage.cards.repository.CardInfo; +import mage.cards.repository.CardRepository; +import mage.cards.repository.ExpansionInfo; +import mage.cards.repository.ExpansionRepository; +import mage.client.MageFrame; +import mage.client.cards.BigCard; +import mage.constants.MultiplayerAttackOption; +import mage.constants.RangeOfInfluence; +import mage.game.Game; +import mage.game.GameImpl; +import mage.game.match.MatchType; +import mage.game.mulligan.Mulligan; +import mage.game.mulligan.VancouverMulligan; +import mage.game.permanent.PermanentCard; +import mage.players.Player; +import mage.players.StubPlayer; +import mage.view.CardsView; +import mage.view.PermanentView; +import org.apache.log4j.Logger; + +import javax.swing.*; +import java.awt.event.KeyEvent; +import java.util.UUID; + +/** + * @author JayDi85 + */ +public class TestCardRenderDialog extends MageDialog { + + private static final Logger logger = Logger.getLogger(TestCardRenderDialog.class); + + public TestCardRenderDialog() { + initComponents(); + } + + public void showDialog() { + this.setModal(false); + getRootPane().setDefaultButton(buttonCancel); + + // windows settings + MageFrame.getDesktop().remove(this); + if (this.isModal()) { + MageFrame.getDesktop().add(this, JLayeredPane.MODAL_LAYER); + } else { + MageFrame.getDesktop().add(this, JLayeredPane.PALETTE_LAYER); + } + this.makeWindowCentered(); + + // Close on "ESC" + registerKeyboardAction(e -> onCancel(), KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + + this.setVisible(true); + } + + private void onCancel() { + this.removeDialog(); + } + + private PermanentView createCard(Game game, UUID controllerId, String code, String cardNumber, int damage) { + CardInfo cardInfo = CardRepository.instance.findCard(code, cardNumber); + ExpansionInfo setInfo = ExpansionRepository.instance.getSetByCode(code); + CardSetInfo testSet = new CardSetInfo(cardInfo.getName(), setInfo.getCode(), cardNumber, cardInfo.getRarity(), + new CardGraphicInfo(cardInfo.getFrameStyle(), cardInfo.usesVariousArt())); + Card card = CardImpl.createCard(cardInfo.getClassName(), testSet); + + PermanentCard perm = new PermanentCard(card, controllerId, game); + if (damage > 0) { + perm.damage(damage, null, game); + } + PermanentView cardView = new PermanentView(perm, card, controllerId, game); + cardView.setInViewerOnly(true); + + return cardView; + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + buttonCancel = new javax.swing.JButton(); + cardArea1 = new mage.client.cards.CardArea(); + jButton1 = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + + buttonCancel.setText("Close"); + buttonCancel.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonCancelActionPerformed(evt); + } + }); + + jButton1.setText("jButton1"); + jButton1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton1ActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGap(0, 578, Short.MAX_VALUE) + .addComponent(buttonCancel, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(cardArea1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addComponent(jButton1) + .addGap(0, 0, Short.MAX_VALUE))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addComponent(jButton1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 88, Short.MAX_VALUE) + .addComponent(cardArea1, javax.swing.GroupLayout.PREFERRED_SIZE, 327, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(buttonCancel, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + private void buttonCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonCancelActionPerformed + onCancel(); + }//GEN-LAST:event_buttonCancelActionPerformed + + private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed + Game game = new TestGame(MultiplayerAttackOption.MULTIPLE, RangeOfInfluence.ALL, new VancouverMulligan(0), 20); + Player player = new StubPlayer("player1", RangeOfInfluence.ALL); + Deck deck = new Deck(); + game.addPlayer(player, deck); + + BigCard big = new BigCard(); + CardsView view = new CardsView(); + PermanentView card; + card = createCard(game, player.getId(), "RNA", "263", 0); // mountain + view.put(card.getId(), card); + card = createCard(game, player.getId(), "RNA", "185", 0); // Judith, the Scourge Diva + view.put(card.getId(), card); + card = createCard(game, player.getId(), "RNA", "14", 1); // Knight of Sorrows + view.put(card.getId(), card); + + cardArea1.loadCards(view, big, null); + }//GEN-LAST:event_jButton1ActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton buttonCancel; + private mage.client.cards.CardArea cardArea1; + private javax.swing.JButton jButton1; + // End of variables declaration//GEN-END:variables +} + +class TestGame extends GameImpl { + + private int numPlayers; + + public TestGame(MultiplayerAttackOption attackOption, RangeOfInfluence range, Mulligan mulligan, int startLife) { + super(attackOption, range, mulligan, startLife); + } + + public TestGame(final TestGame game) { + super(game); + this.numPlayers = game.numPlayers; + } + + @Override + public MatchType getGameType() { + return new TestGameType(); + } + + @Override + public int getNumPlayers() { + return numPlayers; + } + + @Override + public TestGame copy() { + return new TestGame(this); + } + +} + +class TestGameType extends MatchType { + + public TestGameType() { + this.name = "Test Game Type"; + this.maxPlayers = 10; + this.minPlayers = 3; + this.numTeams = 0; + this.useAttackOption = true; + this.useRange = true; + this.sideboardingAllowed = true; + } + + protected TestGameType(final TestGameType matchType) { + super(matchType); + } + + @Override + public TestGameType copy() { + return new TestGameType(this); + } +} diff --git a/Mage.Tests/src/test/java/org/mage/test/mulligan/MulliganTestBase.java b/Mage.Tests/src/test/java/org/mage/test/mulligan/MulliganTestBase.java index 711d9792b7b..7f6dd82569e 100644 --- a/Mage.Tests/src/test/java/org/mage/test/mulligan/MulliganTestBase.java +++ b/Mage.Tests/src/test/java/org/mage/test/mulligan/MulliganTestBase.java @@ -1,41 +1,21 @@ - package org.mage.test.mulligan; -import mage.MageItem; -import mage.abilities.Ability; -import mage.abilities.Mode; -import mage.abilities.Modes; -import mage.abilities.TriggeredAbility; -import mage.abilities.costs.VariableCost; -import mage.abilities.costs.mana.ManaCost; -import mage.cards.Card; import mage.cards.CardSetInfo; -import mage.cards.Cards; import mage.cards.basiclands.Forest; import mage.cards.decks.Deck; -import mage.choices.Choice; -import mage.constants.Outcome; import mage.constants.RangeOfInfluence; import mage.game.Game; import mage.game.GameOptions; import mage.game.TwoPlayerDuel; -import mage.game.combat.CombatGroup; -import mage.game.draft.Draft; -import mage.game.match.Match; import mage.game.mulligan.Mulligan; import mage.game.mulligan.MulliganType; -import mage.game.permanent.Permanent; -import mage.game.tournament.Tournament; -import mage.players.Player; -import mage.players.PlayerImpl; -import mage.target.Target; -import mage.target.TargetAmount; -import mage.target.TargetCard; -import mage.target.TargetPlayer; +import mage.players.StubPlayer; import org.apache.log4j.Logger; -import java.io.Serializable; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.UUID; import java.util.stream.Stream; import static com.google.common.base.Preconditions.checkArgument; @@ -43,7 +23,6 @@ import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.Iterables.getOnlyElement; import static java.util.Collections.unmodifiableList; import static java.util.Collections.unmodifiableSet; -import static java.util.stream.Collectors.toList; import static mage.constants.MultiplayerAttackOption.LEFT; import static mage.constants.RangeOfInfluence.ONE; import static mage.constants.Rarity.LAND; @@ -167,7 +146,8 @@ public class MulliganTestBase { return deck; } - interface Step {} + interface Step { + } interface MulliganStep extends Step { boolean mulligan(); @@ -242,192 +222,4 @@ public class MulliganTestBase { } - static class StubPlayer extends PlayerImpl implements Player { - - public boolean choose(Outcome outcome, Target target, UUID sourceId, Game game) { - if (target instanceof TargetPlayer) { - for (Player player : game.getPlayers().values()) { - if (player.getId().equals(getId()) && target.canTarget(getId(), game)) { - target.add(player.getId(), game); - return true; - } - } - } - return false; - } - - public boolean choose(Outcome outcome, Cards cards, TargetCard target, Game game) { - cards.getCards(game).stream().map(MageItem::getId).forEach(cardId -> target.add(cardId, game)); - return true; - } - - @Override - public boolean chooseTarget(Outcome outcome, Cards cards, TargetCard target, Ability source, Game game) { - if ("cards to PUT on the BOTTOM of your library (Discard for Mulligan)".equals(target.getFilter().getMessage())) { - chooseDiscardBottom(game, target.getMinNumberOfTargets(), cards.getCards(game) - .stream().map(MageItem::getId).collect(toList())).forEach(cardId -> target.add(cardId, game)); - } else { - UUID cardId = getOnlyElement(cards.getCards(game)).getId(); - if (chooseScry(game, cardId)) { - target.add(cardId, game); - return true; - } - } - return false; - } - - public List chooseDiscardBottom(Game game, int count, List cardIds) { - return cardIds.subList(0, count); - } - - public boolean chooseScry(Game game, UUID cardId) { - return false; - } - - @Override - public void shuffleLibrary(Ability source, Game game) { - - } - - public StubPlayer(String name, RangeOfInfluence range) { - super(name, range); - } - - @Override - public void abort() { - - } - - @Override - public void skip() { - - } - - @Override - public Player copy() { - return null; - } - - @Override - public boolean priority(Game game) { - return false; - } - - @Override - public boolean choose(Outcome outcome, Target target, UUID sourceId, Game game, Map options) { - return false; - } - - @Override - public boolean chooseTarget(Outcome outcome, Target target, Ability source, Game game) { - return false; - } - - @Override - public boolean chooseTargetAmount(Outcome outcome, TargetAmount target, Ability source, Game game) { - return false; - } - - @Override - public boolean chooseMulligan(Game game) { - return false; - } - - @Override - public boolean chooseUse(Outcome outcome, String message, Ability source, Game game) { - return false; - } - - @Override - public boolean chooseUse(Outcome outcome, String message, String secondMessage, String trueText, String falseText, Ability source, Game game) { - return false; - } - - @Override - public boolean choose(Outcome outcome, Choice choice, Game game) { - return false; - } - - @Override - public boolean choosePile(Outcome outcome, String message, List pile1, List pile2, Game game) { - return false; - } - - @Override - public boolean playMana(Ability ability, ManaCost unpaid, String promptText, Game game) { - return false; - } - - @Override - public int announceXMana(int min, int max, String message, Game game, Ability ability) { - return 0; - } - - @Override - public int announceXCost(int min, int max, String message, Game game, Ability ability, VariableCost variableCost) { - return 0; - } - - @Override - public int chooseReplacementEffect(Map abilityMap, Game game) { - return 0; - } - - @Override - public TriggeredAbility chooseTriggeredAbility(List abilities, Game game) { - return null; - } - - @Override - public Mode chooseMode(Modes modes, Ability source, Game game) { - return null; - } - - @Override - public void selectAttackers(Game game, UUID attackingPlayerId) { - - } - - @Override - public void selectBlockers(Game game, UUID defendingPlayerId) { - - } - - @Override - public UUID chooseAttackerOrder(List attacker, Game game) { - return null; - } - - @Override - public UUID chooseBlockerOrder(List blockers, CombatGroup combatGroup, List blockerOrder, Game game) { - return null; - } - - @Override - public void assignDamage(int damage, List targets, String singleTargetName, UUID sourceId, Game game) { - - } - - @Override - public int getAmount(int min, int max, String message, Game game) { - return 0; - } - - @Override - public void sideboard(Match match, Deck deck) { - - } - - @Override - public void construct(Tournament tournament, Deck deck) { - - } - - @Override - public void pickCard(List cards, Deck deck, Draft draft) { - - } - - } - } \ No newline at end of file diff --git a/Mage/src/main/java/mage/players/StubPlayer.java b/Mage/src/main/java/mage/players/StubPlayer.java new file mode 100644 index 00000000000..04665fbbc2e --- /dev/null +++ b/Mage/src/main/java/mage/players/StubPlayer.java @@ -0,0 +1,221 @@ +package mage.players; + +import mage.MageItem; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.Modes; +import mage.abilities.TriggeredAbility; +import mage.abilities.costs.VariableCost; +import mage.abilities.costs.mana.ManaCost; +import mage.cards.Card; +import mage.cards.Cards; +import mage.cards.decks.Deck; +import mage.choices.Choice; +import mage.constants.Outcome; +import mage.constants.RangeOfInfluence; +import mage.game.Game; +import mage.game.combat.CombatGroup; +import mage.game.draft.Draft; +import mage.game.match.Match; +import mage.game.permanent.Permanent; +import mage.game.tournament.Tournament; +import mage.target.Target; +import mage.target.TargetAmount; +import mage.target.TargetCard; +import mage.target.TargetPlayer; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import static com.google.common.collect.Iterables.getOnlyElement; +import static java.util.stream.Collectors.toList; + +public class StubPlayer extends PlayerImpl implements Player { + + public boolean choose(Outcome outcome, Target target, UUID sourceId, Game game) { + if (target instanceof TargetPlayer) { + for (Player player : game.getPlayers().values()) { + if (player.getId().equals(getId()) && target.canTarget(getId(), game)) { + target.add(player.getId(), game); + return true; + } + } + } + return false; + } + + public boolean choose(Outcome outcome, Cards cards, TargetCard target, Game game) { + cards.getCards(game).stream().map(MageItem::getId).forEach(cardId -> target.add(cardId, game)); + return true; + } + + @Override + public boolean chooseTarget(Outcome outcome, Cards cards, TargetCard target, Ability source, Game game) { + if ("cards to PUT on the BOTTOM of your library (Discard for Mulligan)".equals(target.getFilter().getMessage())) { + chooseDiscardBottom(game, target.getMinNumberOfTargets(), cards.getCards(game) + .stream().map(MageItem::getId).collect(toList())).forEach(cardId -> target.add(cardId, game)); + } else { + UUID cardId = getOnlyElement(cards.getCards(game)).getId(); + if (chooseScry(game, cardId)) { + target.add(cardId, game); + return true; + } + } + return false; + } + + public List chooseDiscardBottom(Game game, int count, List cardIds) { + return cardIds.subList(0, count); + } + + public boolean chooseScry(Game game, UUID cardId) { + return false; + } + + @Override + public void shuffleLibrary(Ability source, Game game) { + + } + + public StubPlayer(String name, RangeOfInfluence range) { + super(name, range); + } + + @Override + public void abort() { + + } + + @Override + public void skip() { + + } + + @Override + public Player copy() { + return null; + } + + @Override + public boolean priority(Game game) { + return false; + } + + @Override + public boolean choose(Outcome outcome, Target target, UUID sourceId, Game game, Map options) { + return false; + } + + @Override + public boolean chooseTarget(Outcome outcome, Target target, Ability source, Game game) { + return false; + } + + @Override + public boolean chooseTargetAmount(Outcome outcome, TargetAmount target, Ability source, Game game) { + return false; + } + + @Override + public boolean chooseMulligan(Game game) { + return false; + } + + @Override + public boolean chooseUse(Outcome outcome, String message, Ability source, Game game) { + return false; + } + + @Override + public boolean chooseUse(Outcome outcome, String message, String secondMessage, String trueText, String falseText, Ability source, Game game) { + return false; + } + + @Override + public boolean choose(Outcome outcome, Choice choice, Game game) { + return false; + } + + @Override + public boolean choosePile(Outcome outcome, String message, List pile1, List pile2, Game game) { + return false; + } + + @Override + public boolean playMana(Ability ability, ManaCost unpaid, String promptText, Game game) { + return false; + } + + @Override + public int announceXMana(int min, int max, String message, Game game, Ability ability) { + return 0; + } + + @Override + public int announceXCost(int min, int max, String message, Game game, Ability ability, VariableCost variableCost) { + return 0; + } + + @Override + public int chooseReplacementEffect(Map abilityMap, Game game) { + return 0; + } + + @Override + public TriggeredAbility chooseTriggeredAbility(List abilities, Game game) { + return null; + } + + @Override + public Mode chooseMode(Modes modes, Ability source, Game game) { + return null; + } + + @Override + public void selectAttackers(Game game, UUID attackingPlayerId) { + + } + + @Override + public void selectBlockers(Game game, UUID defendingPlayerId) { + + } + + @Override + public UUID chooseAttackerOrder(List attacker, Game game) { + return null; + } + + @Override + public UUID chooseBlockerOrder(List blockers, CombatGroup combatGroup, List blockerOrder, Game game) { + return null; + } + + @Override + public void assignDamage(int damage, List targets, String singleTargetName, UUID sourceId, Game game) { + + } + + @Override + public int getAmount(int min, int max, String message, Game game) { + return 0; + } + + @Override + public void sideboard(Match match, Deck deck) { + + } + + @Override + public void construct(Tournament tournament, Deck deck) { + + } + + @Override + public void pickCard(List cards, Deck deck, Draft draft) { + + } + +} \ No newline at end of file