diff --git a/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogContainer.java b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogContainer.java index 86445ea0e0..bacdbd0956 100644 --- a/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogContainer.java +++ b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogContainer.java @@ -97,6 +97,16 @@ public class DialogContainer extends JPanel { dlg.setLocation(X_OFFSET + 10, Y_OFFSET + 10); dlg.updateSize(params.rect.width - 80, params.rect.height - 80); + } else if (dialogType == DialogManager.MTGDialogs.ExileDialog) { + + backgroundColor = new Color(250, 250, 250, 50); + + alpha = 0; + ChoiceDialog dlg = new ChoiceDialog(params, "Exile"); + add(dlg); + dlg.setLocation(X_OFFSET + 10, Y_OFFSET + 10); + dlg.updateSize(params.rect.width - 80, params.rect.height - 80); + } else if (dialogType == DialogManager.MTGDialogs.EmblemsDialog) { backgroundColor = new Color(0, 0, 50, 110); diff --git a/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogManager.java b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogManager.java index 9721b8952d..66db7ad4c3 100644 --- a/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogManager.java +++ b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogManager.java @@ -1,7 +1,11 @@ package mage.client.components.ext.dlg; -import java.awt.Component; -import java.awt.Rectangle; +import mage.client.cards.BigCard; +import mage.client.game.FeedbackPanel; +import mage.view.CardsView; + +import javax.swing.*; +import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; @@ -9,10 +13,6 @@ import java.awt.event.MouseWheelEvent; import java.util.HashMap; import java.util.Map; import java.util.UUID; -import javax.swing.JComponent; -import mage.client.cards.BigCard; -import mage.client.game.FeedbackPanel; -import mage.view.CardsView; /** * @author mw, noxx @@ -40,7 +40,7 @@ public class DialogManager extends JComponent implements MouseListener, public enum MTGDialogs { none, AboutDialog, MessageDialog, StackDialog, AssignDamageDialog, ManaChoiceDialog, ChoiceDialog, EmblemsDialog, GraveDialog, DialogContainer, CombatDialog, - ChooseDeckDialog, ChooseCommonDialog, RevealDialog + ChooseDeckDialog, ChooseCommonDialog, RevealDialog, ExileDialog } /** @@ -176,6 +176,35 @@ public class DialogManager extends JComponent implements MouseListener, setVisible(true); } + public void showExileDialog(CardsView cards, BigCard bigCard, UUID gameId) { + + int w = 720; + int h = 550; + + int height = getHeight(); + int width = getWidth(); + + int x = ((width - w) / 2); + int y = ((height - h) / 2); + + DlgParams params = new DlgParams(); + params.rect = new Rectangle(x, y, w, h); + params.bigCard = bigCard; + params.gameId = gameId; + params.setCards(cards); + dialogContainer = new DialogContainer(MTGDialogs.ExileDialog, params); + dialogContainer.setVisible(true); + add(dialogContainer); + + this.currentDialog = MTGDialogs.DialogContainer; + + setDlgBounds(new Rectangle(x, y, w, h)); + + dialogContainer.showDialog(true); + + setVisible(true); + } + public void showEmblemsDialog(CardsView cards, BigCard bigCard, UUID gameId) { int w = 720; diff --git a/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java b/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java index b0b345bbde..9f9d9b2d85 100644 --- a/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java +++ b/Mage.Client/src/main/java/mage/client/game/PlayerPanelExt.java @@ -34,28 +34,6 @@ package mage.client.game; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Image; -import java.awt.Rectangle; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.image.BufferedImage; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; -import javax.swing.BorderFactory; -import javax.swing.GroupLayout; -import javax.swing.GroupLayout.Alignment; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.LayoutStyle.ComponentPlacement; -import javax.swing.SwingConstants; -import javax.swing.border.Border; -import javax.swing.border.LineBorder; import mage.MageException; import mage.cards.MageCard; import mage.cards.action.ActionCallback; @@ -82,6 +60,19 @@ import mage.view.ManaPoolView; import mage.view.PlayerView; import org.mage.card.arcane.ManaSymbols; +import javax.swing.*; +import javax.swing.GroupLayout.Alignment; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.border.Border; +import javax.swing.border.LineBorder; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.image.BufferedImage; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + /** * Enhanced player pane. * @@ -94,7 +85,6 @@ public class PlayerPanelExt extends javax.swing.JPanel { private Session session; private PlayerView player; - //private ShowCardsDialog graveyard; private BigCard bigCard; private static final int AVATAR_COUNT = 77; @@ -193,10 +183,12 @@ public class PlayerPanelExt extends javax.swing.JPanel { int graveCards = player.getGraveyard().size(); if (graveCards > 99) { - Font font = graveLabel.getFont(); - font = font.deriveFont(9f); - graveLabel.setFont(font); - changedFontGrave = true; + if (!changedFontGrave) { + Font font = graveLabel.getFont(); + font = font.deriveFont(9f); + graveLabel.setFont(font); + changedFontGrave = true; + } } else if (changedFontGrave) { Font font = lifeLabel.getFont(); font = font.deriveFont(12f); @@ -205,6 +197,22 @@ public class PlayerPanelExt extends javax.swing.JPanel { } graveLabel.setText(Integer.toString(graveCards)); + int exileCards = player.getExile().size(); + if (exileCards > 99) { + if (!changedFontExile) { + Font font = exileLabel.getFont(); + font = font.deriveFont(9f); + exileLabel.setFont(font); + changedFontExile = true; + } + } else if (changedFontExile) { + Font font = lifeLabel.getFont(); + font = font.deriveFont(12f); + exileLabel.setFont(font); + changedFontExile = false; + } + exileLabel.setText(Integer.toString(exileCards)); + if (!MageFrame.isLite()) { int id = player.getUserData().getAvatarId(); if (id <= 0) { @@ -395,6 +403,22 @@ public class PlayerPanelExt extends javax.swing.JPanel { } }); + exileLabel = new JLabel(); + exileLabel.setToolTipText("Exile"); + image = ImageHelper.getImageFromResources("/info/exile.png"); + r = new Rectangle(21, 21); + resized = ImageHelper.getResizedImage(BufferedImageBuilder.bufferImage(image, BufferedImage.TYPE_INT_ARGB), r); + exileZone = new HoverButton(null, resized, resized, resized, r); + exileZone.setToolTipText("Exile"); + exileZone.setOpaque(false); + exileZone.setObserver(new Command() { + @Override + public void execute() { + btnExileZoneActionPerformed(null); + } + }); + exileZone.setBounds(25, 0, 21, 21); + // Cheat button r = new Rectangle(25, 21); image = ImageHelper.getImageFromResources("/info/cheat.png"); @@ -426,9 +450,12 @@ public class PlayerPanelExt extends javax.swing.JPanel { btnCommandZoneActionPerformed(null); } }); - commandZone.setBounds(0, 0, 21, 21); + commandZone.setBounds(5, 0, 21, 21); zonesPanel.add(commandZone); + cheat.setBounds(28, 0, 25, 21); + zonesPanel.add(cheat); + btnPlayer = new JButton(); btnPlayer.setText("Player"); btnPlayer.setVisible(false); @@ -554,19 +581,19 @@ public class PlayerPanelExt extends javax.swing.JPanel { .addGroup(gl_panelBackground.createSequentialGroup() .addGap(9) .addGroup(gl_panelBackground.createParallelGroup(Alignment.LEADING) - .addGroup(gl_panelBackground.createSequentialGroup() - .addGap(3) - .addComponent(poison, GroupLayout.PREFERRED_SIZE, 14, GroupLayout.PREFERRED_SIZE)) - .addGroup(gl_panelBackground.createSequentialGroup() - .addGap(2) - .addComponent(btnWhiteMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE)) - .addGroup(gl_panelBackground.createSequentialGroup() - .addGap(2) - .addComponent(btnBlueMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE)) - .addGroup(gl_panelBackground.createSequentialGroup() - .addGap(2) - .addComponent(btnBlackMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE)) - .addComponent(grave, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE) + .addGroup(gl_panelBackground.createSequentialGroup() + .addGap(3) + .addComponent(poison, GroupLayout.PREFERRED_SIZE, 14, GroupLayout.PREFERRED_SIZE)) + .addGroup(gl_panelBackground.createSequentialGroup() + .addGap(2) + .addComponent(btnWhiteMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE)) + .addGroup(gl_panelBackground.createSequentialGroup() + .addGap(2) + .addComponent(btnBlueMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE)) + .addGroup(gl_panelBackground.createSequentialGroup() + .addGap(2) + .addComponent(btnBlackMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE)) + .addComponent(grave, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE) ) .addGroup(gl_panelBackground.createParallelGroup(Alignment.LEADING) .addGroup(gl_panelBackground.createSequentialGroup() @@ -601,12 +628,19 @@ public class PlayerPanelExt extends javax.swing.JPanel { .addGroup(gl_panelBackground.createSequentialGroup() .addGap(40) .addComponent(libraryLabel, GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE)) + /*.addGroup(gl_panelBackground.createSequentialGroup() + .addGap(18) + .addComponent(cheat, GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE))*/ .addGroup(gl_panelBackground.createSequentialGroup() .addGap(18) - .addComponent(cheat, GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE)) + .addComponent(exileZone, GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE) + ) .addGroup(gl_panelBackground.createSequentialGroup() .addGap(5) .addComponent(graveLabel, GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE)) + .addGroup(gl_panelBackground.createSequentialGroup() + .addGap(40) + .addComponent(exileLabel, GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE)) .addGroup(gl_panelBackground.createSequentialGroup() .addGap(1) .addComponent(manaCountLabelU, GroupLayout.PREFERRED_SIZE, 30, GroupLayout.PREFERRED_SIZE)))) @@ -644,16 +678,16 @@ public class PlayerPanelExt extends javax.swing.JPanel { .addGap(1) .addGroup(gl_panelBackground.createParallelGroup(Alignment.LEADING) .addGroup(gl_panelBackground.createSequentialGroup() - .addGap(4) - .addComponent(poison, GroupLayout.PREFERRED_SIZE, 14, GroupLayout.PREFERRED_SIZE) - .addGap(4) - .addComponent(btnWhiteMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE) - .addGap(2) - .addComponent(btnBlueMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE) - .addGap(2) - .addComponent(btnBlackMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE) - .addGap(5) - .addComponent(grave, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE) + .addGap(4) + .addComponent(poison, GroupLayout.PREFERRED_SIZE, 14, GroupLayout.PREFERRED_SIZE) + .addGap(4) + .addComponent(btnWhiteMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE) + .addGap(2) + .addComponent(btnBlueMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE) + .addGap(2) + .addComponent(btnBlackMana, GroupLayout.PREFERRED_SIZE, 15, GroupLayout.PREFERRED_SIZE) + .addGap(5) + .addComponent(grave, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE) ) .addGroup(gl_panelBackground.createSequentialGroup() .addGroup(gl_panelBackground.createParallelGroup(Alignment.LEADING) @@ -685,12 +719,19 @@ public class PlayerPanelExt extends javax.swing.JPanel { .addGap(31) .addComponent(manaCountLabelG, GroupLayout.PREFERRED_SIZE, 30, GroupLayout.PREFERRED_SIZE)) .addComponent(libraryLabel, GroupLayout.PREFERRED_SIZE, 20, GroupLayout.PREFERRED_SIZE) + /*.addGroup(gl_panelBackground.createSequentialGroup() + .addGap(76) + .addComponent(cheat, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE))*/ .addGroup(gl_panelBackground.createSequentialGroup() .addGap(76) - .addComponent(cheat, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE)) + .addComponent(exileZone, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE) + ) .addGroup(gl_panelBackground.createSequentialGroup() .addGap(76) .addComponent(graveLabel, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE)) + .addGroup(gl_panelBackground.createSequentialGroup() + .addGap(76) + .addComponent(exileLabel, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE)) .addGroup(gl_panelBackground.createSequentialGroup() .addGap(31) .addComponent(manaCountLabelU, GroupLayout.PREFERRED_SIZE, 30, GroupLayout.PREFERRED_SIZE) @@ -749,6 +790,10 @@ public class PlayerPanelExt extends javax.swing.JPanel { DialogManager.getManager(gameId).showEmblemsDialog(CardsViewUtil.convertCommandObject(player.getCommadObjectList()), bigCard, gameId); } + private void btnExileZoneActionPerformed(java.awt.event.ActionEvent evt) { + DialogManager.getManager(gameId).showExileDialog(CardsViewUtil.convertSimple(player.getExile(), MageFrame.getGame(gameId).getLoadedCards()), bigCard, gameId); + } + private void btnCheatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCheatActionPerformed DckDeckImporter deckImporter = new DckDeckImporter(); session.cheat(gameId, playerId, deckImporter.importDeck("cheat.dck")); @@ -776,9 +821,11 @@ public class PlayerPanelExt extends javax.swing.JPanel { private JLabel libraryLabel; private JLabel poisonLabel; private JLabel graveLabel; + private JLabel exileLabel; private boolean changedFontLibrary; private boolean changedFontLife; private boolean changedFontGrave; + private boolean changedFontExile; private JPanel zonesPanel; private HoverButton exileZone; diff --git a/Mage.Client/src/main/resources/info/exile.png b/Mage.Client/src/main/resources/info/exile.png new file mode 100644 index 0000000000..6f0fe92cc3 Binary files /dev/null and b/Mage.Client/src/main/resources/info/exile.png differ diff --git a/Mage.Common/src/mage/view/PlayerView.java b/Mage.Common/src/mage/view/PlayerView.java index 4a70758182..c4ae12e3e0 100644 --- a/Mage.Common/src/mage/view/PlayerView.java +++ b/Mage.Common/src/mage/view/PlayerView.java @@ -30,16 +30,17 @@ package mage.view; import mage.cards.Card; import mage.counters.CounterType; +import mage.game.ExileZone; import mage.game.Game; import mage.game.GameState; import mage.game.command.CommandObject; +import mage.game.command.Commander; import mage.game.command.Emblem; import mage.game.permanent.Permanent; import mage.players.Player; import java.io.Serializable; import java.util.*; -import mage.game.command.Commander; /** * @@ -59,6 +60,7 @@ public class PlayerView implements Serializable { private final boolean hasLeft; private final ManaPoolView manaPool; private final SimpleCardsView graveyard = new SimpleCardsView(); + private final SimpleCardsView exile = new SimpleCardsView(); private final Map<UUID, PermanentView> battlefield = new LinkedHashMap<>(); private final CardView topCard; private final UserDataView userDataView; @@ -81,6 +83,14 @@ public class PlayerView implements Serializable { for (Card card: player.getGraveyard().getCards(game)) { graveyard.put(card.getId(), new SimpleCardView(card.getId(), card.getExpansionSetCode(), card.getCardNumber(), card.getUsesVariousArt(), card.isFaceDown(), card.getTokenSetCode())); } + for (ExileZone exileZone : game.getExile().getExileZones()) { + for (Card card : exileZone.getCards(game)) { + if (!player.getId().equals(card.getOwnerId())) { + break; + } + exile.put(card.getId(), new SimpleCardView(card.getId(), card.getExpansionSetCode(), card.getCardNumber(), card.getUsesVariousArt(), card.isFaceDown(), card.getTokenSetCode())); + } + } for (Permanent permanent: state.getBattlefield().getAllPermanents()) { if (showInBattlefield(permanent, state)) { PermanentView view = new PermanentView(permanent, game.getCard(permanent.getId()), createdForPlayerId, game); @@ -165,6 +175,10 @@ public class PlayerView implements Serializable { return this.graveyard; } + public SimpleCardsView getExile() { + return exile; + } + public Map<UUID, PermanentView> getBattlefield() { return this.battlefield; }