diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index b4baec0413c..50a4e72c4d8 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -34,6 +34,7 @@ package mage.client; +import java.io.FileNotFoundException; import mage.cards.Card; import mage.cards.decks.Deck; import mage.client.cards.CardsStorage; @@ -49,6 +50,7 @@ import mage.client.remote.Session; import mage.client.util.EDTExceptionHandler; import mage.client.util.gui.ArrowBuilder; import mage.components.ImagePanel; +import mage.game.GameException; import mage.util.Logging; import javax.imageio.ImageIO; @@ -68,6 +70,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import java.util.prefs.Preferences; import mage.client.draft.DraftPane; +import mage.sets.Sets; /** * @author BetaSteward_at_googlemail.com @@ -547,7 +550,7 @@ public class MageFrame extends javax.swing.JFrame { this.tablesPane.setVisible(false); this.draftPane.setVisible(false); this.collectionViewerPane.setVisible(false); - showDeckEditor(DeckEditorMode.Constructed, null, null); + showDeckEditor(DeckEditorMode.Constructed, null, null); }//GEN-LAST:event_btnDeckEditorActionPerformed private void btnCollectionViewerActionPerformed(java.awt.event.ActionEvent evt) { diff --git a/Mage.Client/src/main/java/mage/client/cards/CardGrid.java b/Mage.Client/src/main/java/mage/client/cards/CardGrid.java index d82e4f72dd3..1f6bd127a21 100644 --- a/Mage.Client/src/main/java/mage/client/cards/CardGrid.java +++ b/Mage.Client/src/main/java/mage/client/cards/CardGrid.java @@ -84,7 +84,7 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener for (Iterator> i = cards.entrySet().iterator(); i.hasNext();) { Entry entry = i.next(); if (!showCards.containsKey(entry.getKey())) { - removeCard(entry.getKey()); + removeCardImg(entry.getKey()); i.remove(); } } @@ -123,14 +123,16 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener } } resizeArea(); + revalidate(); + repaint(); } - public void removeCard(UUID cardId) { + private void removeCardImg(UUID cardId) { for (Component comp: getComponents()) { if (comp instanceof Card) { if (((Card)comp).getCardId().equals(cardId)) { remove(comp); - } + } } else if (comp instanceof MageCard) { if (((MageCard)comp).getOriginal().getId().equals(cardId)) { remove(comp); @@ -139,6 +141,11 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener } } + public void removeCard(UUID cardId) { + removeCardImg(cardId); + cards.remove(cardId); + } + public void addCardEventListener(Listener listener) { cardEventSource.addListener(listener); @@ -213,8 +220,6 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener } if (size.height != area.height || size.width != area.width) { setPreferredSize(area); - revalidate(); - repaint(); } } diff --git a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java index 015abf0d671..6ff6b175e50 100644 --- a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java +++ b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java @@ -355,19 +355,19 @@ public class DeckGenerator { private static Card getBestBasicLand(ColoredManaSymbol color) { manaSource = color.toString(); if (color.equals(ColoredManaSymbol.G)) { - return CardImpl.createCard(Sets.findCard("Forest", GENERATE_RANDOM_BASIC_LAND)); + return Sets.findCard("Forest", GENERATE_RANDOM_BASIC_LAND); } if (color.equals(ColoredManaSymbol.R)) { - return CardImpl.createCard(Sets.findCard("Mountain", GENERATE_RANDOM_BASIC_LAND)); + return Sets.findCard("Mountain", GENERATE_RANDOM_BASIC_LAND); } if (color.equals(ColoredManaSymbol.B)) { - return CardImpl.createCard(Sets.findCard("Swamp", GENERATE_RANDOM_BASIC_LAND)); + return Sets.findCard("Swamp", GENERATE_RANDOM_BASIC_LAND); } if (color.equals(ColoredManaSymbol.U)) { - return CardImpl.createCard(Sets.findCard("Island", GENERATE_RANDOM_BASIC_LAND)); + return Sets.findCard("Island", GENERATE_RANDOM_BASIC_LAND); } if (color.equals(ColoredManaSymbol.W)) { - return CardImpl.createCard(Sets.findCard("Plains", GENERATE_RANDOM_BASIC_LAND)); + return Sets.findCard("Plains", GENERATE_RANDOM_BASIC_LAND); } return null; diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/DecDeckImporter.java b/Mage.Client/src/main/java/mage/client/deckeditor/DecDeckImporter.java index 9ca2af6d42c..268f3065ce9 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/DecDeckImporter.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/DecDeckImporter.java @@ -50,7 +50,7 @@ public class DecDeckImporter extends DeckImporterImpl { String lineName = line.substring(delim).trim(); try { int num = Integer.parseInt(lineNum); - String cardName = Sets.findCard(lineName); + String cardName = Sets.findCard(lineName).getClass().getCanonicalName(); if (cardName == null) sbMessage.append("Could not find card: '").append(lineName).append("' at line ").append(lineCount).append("\n"); else { diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/DeckArea.java b/Mage.Client/src/main/java/mage/client/deckeditor/DeckArea.java index c1a55ebafb6..5a8eebced7c 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/DeckArea.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckArea.java @@ -35,7 +35,12 @@ package mage.client.deckeditor; +import mage.cards.decks.Deck; +import mage.client.cards.BigCard; import mage.client.cards.CardsList; +import mage.client.util.Event; +import mage.client.util.Listener; +import mage.view.CardsView; /** * @@ -55,12 +60,26 @@ public class DeckArea extends javax.swing.JPanel { this.sideboardList.setVisible(show); } - public CardsList getDeckList() { - return deckList; + public void loadDeck(Deck deck, BigCard bigCard) { + deckList.loadCards(new CardsView(deck.getCards()), bigCard, null, true); + if (sideboardList.isVisible()) + sideboardList.loadCards(new CardsView(deck.getSideboard()), bigCard, null, true); } - public CardsList getSideboardList() { - return sideboardList; + public void addDeckEventListener(Listener listener) { + deckList.addCardEventListener(listener); + } + + public void clearDeckEventListeners() { + deckList.clearCardEventListeners(); + } + + public void addSideboardEventListener(Listener listener) { + sideboardList.addCardEventListener(listener); + } + + public void clearSideboardEventListeners() { + sideboardList.clearCardEventListeners(); } /** This method is called from within the constructor to diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java index 4e9fe9b6770..27333b56f50 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java @@ -37,14 +37,12 @@ package mage.client.deckeditor; import mage.cards.Card; import mage.cards.decks.Deck; import mage.client.MageFrame; -//import mage.client.deckeditor.collection.viewer.Huerotator2; import mage.client.plugins.impl.Plugins; import mage.client.util.Event; import mage.client.util.Listener; import mage.components.CardInfoPane; import mage.game.GameException; import mage.view.CardView; -import mage.view.CardsView; import javax.swing.*; import javax.swing.filechooser.FileFilter; @@ -56,7 +54,9 @@ import java.util.ArrayList; import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; +import mage.client.cards.BigCard; import mage.client.constants.Constants.DeckEditorMode; +import mage.client.dialog.AddLandDialog; import mage.sets.Sets; /** @@ -93,8 +93,10 @@ public class DeckEditorPanel extends javax.swing.JPanel { this.deck = deck; this.tableId = tableId; this.mode = mode; + this.btnAddLand.setVisible(false); switch (mode) { case Limited: + this.btnAddLand.setVisible(true); case Sideboard: this.btnSubmit.setVisible(true); this.cardSelector.loadCards(new ArrayList(deck.getSideboard()), this.bigCard, mode == DeckEditorMode.Limited); @@ -126,8 +128,9 @@ public class DeckEditorPanel extends javax.swing.JPanel { if (event.getEventName().equals("double-click")) { Card card = cardSelector.getCard((UUID) event.getSource()); if (card != null) { - deck.getCards().add(createCard(card.getClass())); + deck.getCards().add(Sets.createCard(card.getClass())); if (mode == DeckEditorMode.Sideboard || mode == DeckEditorMode.Limited) { + deck.getSideboard().remove(card); cardSelector.getCardsList().removeCard(card.getId()); } if (cardInfoPane instanceof CardInfoPane) { @@ -139,18 +142,19 @@ public class DeckEditorPanel extends javax.swing.JPanel { } } ); - this.deckArea.getDeckList().clearCardEventListeners(); - this.deckArea.getDeckList().addCardEventListener( + this.deckArea.clearDeckEventListeners(); + this.deckArea.addDeckEventListener( new Listener () { @Override public void event(Event event) { - if (System.getProperty("draft") != null) { - return; - } if (event.getEventName().equals("double-click")) { for (Card card: deck.getCards()) { if (card.getId().equals((UUID)event.getSource())) { deck.getCards().remove(card); + if (mode == DeckEditorMode.Limited || mode == DeckEditorMode.Sideboard) { + deck.getSideboard().add(card); + cardSelector.loadCards(new ArrayList(deck.getSideboard()), getBigCard(), mode == DeckEditorMode.Limited); + } break; } } @@ -164,28 +168,21 @@ public class DeckEditorPanel extends javax.swing.JPanel { this.repaint(); } + private BigCard getBigCard() { + return this.bigCard; + } + private void refreshDeck() { try { setCursor(new Cursor(Cursor.WAIT_CURSOR)); this.txtDeckName.setText(deck.getName()); - deckArea.getDeckList().loadCards(new CardsView(deck.getCards()), bigCard, null, true); - deckArea.getSideboardList().loadCards(new CardsView(deck.getSideboard()), bigCard, null, true); + deckArea.loadDeck(deck, bigCard); } finally { setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); } } - private Card createCard(Class clazz) { - try { - Constructor con = clazz.getConstructor(new Class[]{UUID.class}); - return (Card) con.newInstance(new Object[] {null}); - } catch (Exception ex) { - Logger.getLogger(DeckEditorPanel.class.getName()).log(Level.SEVERE, null, ex); - return null; - } - } - private void initComponents() { jSplitPane1 = new javax.swing.JSplitPane(); @@ -201,6 +198,7 @@ public class DeckEditorPanel extends javax.swing.JPanel { btnExit = new javax.swing.JButton(); btnImport = new javax.swing.JButton(); btnSubmit = new javax.swing.JButton(); + btnAddLand = new javax.swing.JButton(); jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); jSplitPane1.setResizeWeight(0.5); @@ -266,6 +264,14 @@ public class DeckEditorPanel extends javax.swing.JPanel { } }); + btnAddLand.setText("Add Land"); + btnAddLand.setName("btnAddLand"); // NOI18N + btnAddLand.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnAddLandActionPerformed(evt); + } + }); + javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( @@ -292,6 +298,8 @@ public class DeckEditorPanel extends javax.swing.JPanel { .addContainerGap() .addComponent(btnImport) .addContainerGap() + .addComponent(btnAddLand) + .addContainerGap() .addComponent(btnSubmit))) .addContainerGap()) ); @@ -311,6 +319,7 @@ public class DeckEditorPanel extends javax.swing.JPanel { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnImport) + .addComponent(btnAddLand) .addComponent(btnSubmit)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, isShowCardInfo ? 30 : 159, Short.MAX_VALUE) .addComponent(cardInfoPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) @@ -386,7 +395,16 @@ public class DeckEditorPanel extends javax.swing.JPanel { }//GEN-LAST:event_btnSaveActionPerformed private void btnNewActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNewActionPerformed - deck = new Deck(); + if (mode == DeckEditorMode.Sideboard || mode == DeckEditorMode.Limited) { + for (Card card: deck.getCards()) { + deck.getSideboard().add(card); + } + deck.getCards().clear(); + cardSelector.loadCards(new ArrayList(deck.getSideboard()), this.bigCard, mode == DeckEditorMode.Limited); + } + else { + deck = new Deck(); + } refreshDeck(); }//GEN-LAST:event_btnNewActionPerformed @@ -429,6 +447,12 @@ public class DeckEditorPanel extends javax.swing.JPanel { this.setVisible(false); } + private void btnAddLandActionPerformed(java.awt.event.ActionEvent evt) { + AddLandDialog addLand = new AddLandDialog(); + addLand.showDialog(deck); + refreshDeck(); + } + public DeckImporter getDeckImporter(String file) { if (file.toLowerCase().endsWith("dec")) return new DecDeckImporter(); @@ -457,6 +481,7 @@ public class DeckEditorPanel extends javax.swing.JPanel { private JComponent cardInfoPane; private javax.swing.JButton btnSubmit; + private javax.swing.JButton btnAddLand; } class DeckFilter extends FileFilter { diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/MWSDeckImporter.java b/Mage.Client/src/main/java/mage/client/deckeditor/MWSDeckImporter.java index 8e5bd4d9ff8..4c0e34c8a3e 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/MWSDeckImporter.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/MWSDeckImporter.java @@ -57,10 +57,10 @@ public class MWSDeckImporter extends DeckImporterImpl { ExpansionSet set = Sets.findSet(setCode); String cardName; if (set != null) { - cardName = set.findCard(lineName); + cardName = set.findCard(lineName).getClass().getCanonicalName(); } else { - cardName = Sets.findCard(lineName); + cardName = Sets.findCard(lineName).getClass().getCanonicalName(); } if (cardName == null) sbMessage.append("Could not find card: '").append(lineName).append("' at line ").append(lineCount).append("\n"); diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/TxtDeckImporter.java b/Mage.Client/src/main/java/mage/client/deckeditor/TxtDeckImporter.java index 35c417d265c..77d98783421 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/TxtDeckImporter.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/TxtDeckImporter.java @@ -51,7 +51,7 @@ public class TxtDeckImporter extends DeckImporterImpl { String lineName = line.substring(delim).trim(); try { int num = Integer.parseInt(lineNum); - String cardName = Sets.findCard(lineName); + String cardName = Sets.findCard(lineName).getClass().getCanonicalName(); if (cardName == null) sbMessage.append("Could not find card: '").append(lineName).append("' at line ").append(lineCount).append("\n"); else { diff --git a/Mage.Server/src/main/java/mage/server/game/GameController.java b/Mage.Server/src/main/java/mage/server/game/GameController.java index 2d1d6c5db60..97757e7d7e0 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameController.java +++ b/Mage.Server/src/main/java/mage/server/game/GameController.java @@ -238,9 +238,8 @@ public class GameController implements GameCallback { } public boolean cheat(UUID sessionId, UUID playerId, String cardName) { - String clazz = Sets.findCard(cardName); - if (clazz != null) { - Card card = CardImpl.createCard(clazz); + Card card = Sets.findCard(cardName, true); + if (card != null) { Set cards = new HashSet(); cards.add(card); game.loadCards(cards, playerId); @@ -463,17 +462,12 @@ public class GameController implements GameCallback { String cardName = m.group(3); Integer amount = Integer.parseInt(m.group(4)); for (int i = 0; i < amount; i++) { - String clazz = Sets.findCard(cardName); - if (clazz != null) { - Card card = CardImpl.createCard(clazz); - if (card != null) { - Set cards = new HashSet(); - cards.add(card); - game.loadCards(cards, player.getId()); - swapWithAnyCard(game, player, card, gameZone); - } else { - logger.severe("Couldn't create a card: " + cardName); - } + Card card = Sets.findCard(cardName, true); + if (card != null) { + Set cards = new HashSet(); + cards.add(card); + game.loadCards(cards, player.getId()); + swapWithAnyCard(game, player, card, gameZone); } else { logger.severe("Couldn't find a card: " + cardName); } diff --git a/Mage.Sets/src/mage/sets/Sets.java b/Mage.Sets/src/mage/sets/Sets.java index c14bde8ee47..f58448f531e 100644 --- a/Mage.Sets/src/mage/sets/Sets.java +++ b/Mage.Sets/src/mage/sets/Sets.java @@ -31,13 +31,18 @@ package mage.sets; import java.io.File; import java.io.FileNotFoundException; import java.io.PrintWriter; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.util.*; +import java.util.logging.Level; +import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.ExpansionSet; import mage.cards.decks.DeckCardLists; +import mage.util.Logging; /** * @@ -45,6 +50,7 @@ import mage.cards.decks.DeckCardLists; */ public class Sets extends HashMap { + private final static Logger logger = Logging.getLogger(Sets.class.getName()); private static final Sets fINSTANCE = new Sets(); private static Set names; protected static Random rnd = new Random(); @@ -83,24 +89,24 @@ public class Sets extends HashMap { return names; } - public static String findCard(String name) { + public static Card findCard(String name) { for (ExpansionSet set: fINSTANCE.values()) { - String cardName = set.findCard(name); - if (cardName != null) - return cardName; + Card card = set.findCard(name); + if (card != null) + return card; } return null; } - public static String findCard(String name, boolean random) { + public static Card findCard(String name, boolean random) { if (!random) { return findCard(name); } else { - List cards = new ArrayList(); + List cards = new ArrayList(); for (ExpansionSet set: fINSTANCE.values()) { - String cardName = set.findCard(name, true); - if (cardName != null) { - cards.add(cardName); + Card card = set.findCard(name, true); + if (card != null) { + cards.add(card); } } if (cards.size() > 0) { @@ -109,7 +115,18 @@ public class Sets extends HashMap { } return null; } - + + public static Card createCard(Class clazz) { + try { + Constructor con = clazz.getConstructor(new Class[]{UUID.class}); + return (Card) con.newInstance(new Object[] {null}); + } catch (Exception ex) { + logger.log(Level.SEVERE, "Error creating card:" + clazz.getName(), ex); + return null; + } + } + + public static ExpansionSet findSet(String code) { for (ExpansionSet set: fINSTANCE.values()) { if (set.getCode().equals(code)) diff --git a/Mage/src/mage/cards/ExpansionSet.java b/Mage/src/mage/cards/ExpansionSet.java index 6ef19623954..8d03e2f4072 100644 --- a/Mage/src/mage/cards/ExpansionSet.java +++ b/Mage/src/mage/cards/ExpansionSet.java @@ -135,19 +135,19 @@ public abstract class ExpansionSet implements Serializable { return name; } - public String findCard(String name) { + public Card findCard(String name) { for (Card card: createCards()) { if (name.equals(card.getName())) - return card.getClass().getCanonicalName(); + return card; } return null; } - public String findCard(String name, boolean random) { - List cards = new ArrayList(); + public Card findCard(String name, boolean random) { + List cards = new ArrayList(); for (Card card: createCards()) { if (name.equals(card.getName())) { - cards.add(card.getClass().getCanonicalName()); + cards.add(card); } } if (cards.size() > 0) {