From a2484cc6d982c4a0c2731f84708c9fe2633fe8ff Mon Sep 17 00:00:00 2001
From: LevelX2 <ludwig.hirth@online.de>
Date: Sun, 16 Nov 2014 08:59:59 +0100
Subject: [PATCH] Added F10 to skip priority while the stack resolves.

---
 .../main/java/mage/client/game/GamePanel.java |  59 +++++++++++++++---
 .../mage/plugins/card/utils/ImageManager.java |   1 +
 .../card/utils/impl/ImageManagerImpl.java     |   9 +++
 .../src/main/resources/buttons/skip_stack.png | Bin 0 -> 2440 bytes
 Mage.Common/src/mage/view/PlayerView.java     |   5 ++
 .../src/mage/player/human/HumanPlayer.java    |   9 +++
 6 files changed, 75 insertions(+), 8 deletions(-)
 create mode 100644 Mage.Client/src/main/resources/buttons/skip_stack.png

diff --git a/Mage.Client/src/main/java/mage/client/game/GamePanel.java b/Mage.Client/src/main/java/mage/client/game/GamePanel.java
index e0a4826f2c..e69f613cb9 100644
--- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java
+++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java
@@ -367,6 +367,7 @@ public final class GamePanel extends javax.swing.JPanel {
         this.btnSkipToNextTurn.setVisible(true);
         this.btnSkipToEndTurn.setVisible(true);
         this.btnSkipToNextMain.setVisible(true);
+        this.btnSkipStack.setVisible(true);
         this.btnSkipToYourTurn.setVisible(true);
         
         this.pnlReplay.setVisible(false);
@@ -395,6 +396,7 @@ public final class GamePanel extends javax.swing.JPanel {
         this.btnSkipToNextTurn.setVisible(false);
         this.btnSkipToEndTurn.setVisible(false);
         this.btnSkipToNextMain.setVisible(false);
+        this.btnSkipStack.setVisible(false);
         this.btnSkipToYourTurn.setVisible(false);
         
         
@@ -605,7 +607,7 @@ public final class GamePanel extends javax.swing.JPanel {
                 }
                 players.get(player.getPlayerId()).update(player);
                 if (player.getPlayerId().equals(playerId)) {
-                    updateSkipButtons(player.isPassedTurn(), player.isPassedUntilEndOfTurn(), player.isPassedUntilNextMain(), player.isPassedAllTurns());
+                    updateSkipButtons(player.isPassedTurn(), player.isPassedUntilEndOfTurn(), player.isPassedUntilNextMain(), player.isPassedAllTurns(), player.isPassedUntilStackResolved());
                 }
             } else {
                 logger.warn("Couldn't find player.");
@@ -664,7 +666,7 @@ public final class GamePanel extends javax.swing.JPanel {
     
     static final int BORDER_SIZE = 2;
 
-    private void updateSkipButtons(boolean turn, boolean endOfTurn, boolean nextMain, boolean allTurns) {
+    private void updateSkipButtons(boolean turn, boolean endOfTurn, boolean nextMain, boolean allTurns, boolean stack) {
         if (turn) { //F4
             btnSkipToNextTurn.setBorder(new LineBorder(Color.red, BORDER_SIZE));
         } else {
@@ -680,6 +682,11 @@ public final class GamePanel extends javax.swing.JPanel {
         } else {
             btnSkipToNextMain.setBorder(new EmptyBorder(BORDER_SIZE,BORDER_SIZE,BORDER_SIZE,BORDER_SIZE));
         }
+        if (stack) { // F8
+            btnSkipStack.setBorder(new LineBorder(Color.red, BORDER_SIZE));
+        } else {
+            btnSkipStack.setBorder(new EmptyBorder(BORDER_SIZE,BORDER_SIZE,BORDER_SIZE,BORDER_SIZE));
+        }
         if (allTurns) { // F9
             btnSkipToYourTurn.setBorder(new LineBorder(Color.red, BORDER_SIZE));
         } else {
@@ -937,6 +944,7 @@ public final class GamePanel extends javax.swing.JPanel {
         btnSkipToNextTurn = new javax.swing.JButton(); // F4
         btnSkipToEndTurn = new javax.swing.JButton(); // F5
         btnSkipToNextMain = new javax.swing.JButton(); // F7
+        btnSkipStack = new javax.swing.JButton(); // F8
         btnSkipToYourTurn = new javax.swing.JButton(); // F9
 
         btnConcede = new javax.swing.JButton();
@@ -1139,7 +1147,30 @@ public final class GamePanel extends javax.swing.JPanel {
                 btnPassPriorityUntilNextYourTurnActionPerformed(actionEvent);
             }
         });
-               
+
+        btnSkipStack.setContentAreaFilled(false);
+        btnSkipStack.setBorder(new EmptyBorder(BORDER_SIZE,BORDER_SIZE,BORDER_SIZE, BORDER_SIZE));
+        btnSkipStack.setIcon(new ImageIcon(ImageManagerImpl.getInstance().getSkipStackButtonImage()));
+        btnSkipStack.setToolTipText("Skip until stack is resolved (F10).");
+        btnSkipStack.setFocusable(false);
+        btnSkipStack.addMouseListener(new MouseAdapter() {
+            @Override
+            public void mouseClicked(MouseEvent evt) {
+                if (evt.getButton() == MouseEvent.BUTTON1) {
+                    btnPassPriorityUntilStackResolvedActionPerformed(null);
+                }
+            }
+        });
+
+        ks = KeyStroke.getKeyStroke(KeyEvent.VK_F10, 0);
+        this.getInputMap(c).put(ks, "F10_PRESS");
+        this.getActionMap().put("F10_PRESS", new AbstractAction() {
+            @Override
+            public void actionPerformed(ActionEvent actionEvent) {
+                btnPassPriorityUntilStackResolvedActionPerformed(actionEvent);
+            }
+        });
+
         btnConcede.setContentAreaFilled(false);
         btnConcede.setBorder(new EmptyBorder(BORDER_SIZE,BORDER_SIZE,BORDER_SIZE, BORDER_SIZE));
         btnConcede.setIcon(new ImageIcon(ImageManagerImpl.getInstance().getConcedeButtonImage()));
@@ -1336,6 +1367,7 @@ public final class GamePanel extends javax.swing.JPanel {
                                 .addComponent(btnSkipToEndTurn)
                                 .addComponent(btnSkipToNextMain)
                                 .addComponent(btnSkipToYourTurn)
+                                .addComponent(btnSkipStack)
                         )
                         .addGroup(gl_pnlShortCuts.createSequentialGroup()
                                 .addComponent(btnSwitchHands)
@@ -1367,6 +1399,7 @@ public final class GamePanel extends javax.swing.JPanel {
                             .addComponent(btnSkipToEndTurn)
                             .addComponent(btnSkipToNextMain)
                             .addComponent(btnSkipToYourTurn)
+                            .addComponent(btnSkipStack)
                     )
                     .addGroup(gl_pnlShortCuts.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                             .addComponent(btnSwitchHands)
@@ -1523,6 +1556,9 @@ public final class GamePanel extends javax.swing.JPanel {
         for (MouseListener ml :this.btnSkipToYourTurn.getMouseListeners()) {
             this.btnSkipToYourTurn.removeMouseListener(ml);
         }
+        for (MouseListener ml :this.btnSkipStack.getMouseListeners()) {
+            this.btnSkipStack.removeMouseListener(ml);
+        }
         for (MouseListener ml :this.btnSkipToEndTurn.getMouseListeners()) {
             this.btnSkipToEndTurn.removeMouseListener(ml);
         }
@@ -1591,31 +1627,37 @@ public final class GamePanel extends javax.swing.JPanel {
     private void btnEndTurnActionPerformed(java.awt.event.ActionEvent evt) {
         session.sendPlayerAction(PlayerAction.PASS_PRIORITY_UNTIL_NEXT_TURN, gameId);
         AudioManager.playOnSkipButton();
-        updateSkipButtons(true, false, false, false);
+        updateSkipButtons(true, false, false, false, false);
     }
 
     private void btnUntilEndOfTurnActionPerformed(java.awt.event.ActionEvent evt) {
         session.sendPlayerAction(PlayerAction.PASS_PRIORITY_UNTIL_TURN_END_STEP, gameId);
         AudioManager.playOnSkipButton();
-        updateSkipButtons(false, true, false, false);
+        updateSkipButtons(false, true, false, false, false);
     }
 
     private void btnUntilNextMainPhaseActionPerformed(java.awt.event.ActionEvent evt) {
         session.sendPlayerAction(PlayerAction.PASS_PRIORITY_UNTIL_NEXT_MAIN_PHASE, gameId);
         AudioManager.playOnSkipButton();
-        updateSkipButtons(false, false, true, false);
+        updateSkipButtons(false, false, true, false, false);
     }
 
     private void btnPassPriorityUntilNextYourTurnActionPerformed(java.awt.event.ActionEvent evt) {
         session.sendPlayerAction(PlayerAction.PASS_PRIORITY_UNTIL_MY_NEXT_TURN, gameId);
         AudioManager.playOnSkipButton();
-        updateSkipButtons(false, false, false, true);
+        updateSkipButtons(false, false, false, true, false);
+    }
+
+    private void btnPassPriorityUntilStackResolvedActionPerformed(java.awt.event.ActionEvent evt) {
+        session.sendPlayerAction(PlayerAction.PASS_PRIORITY_UNTIL_STACK_RESOLVED, gameId);
+        AudioManager.playOnSkipButton();
+        updateSkipButtons(false, false, false, false, true);
     }
 
     private void restorePriorityActionPerformed(java.awt.event.ActionEvent evt) {
         session.sendPlayerAction(PlayerAction.PASS_PRIORITY_CANCEL_ALL_ACTIONS, gameId);
         AudioManager.playOnSkipButtonCancel();
-        updateSkipButtons(false, false, false, false);
+        updateSkipButtons(false, false, false, false, false);
     }
 
     private void mouseClickPhaseBar(MouseEvent evt) {
@@ -1728,6 +1770,7 @@ public final class GamePanel extends javax.swing.JPanel {
     private javax.swing.JButton btnSkipToNextTurn; // F4
     private javax.swing.JButton btnSkipToEndTurn; // F5
     private javax.swing.JButton btnSkipToNextMain; // F7
+    private javax.swing.JButton btnSkipStack; // F8
     private javax.swing.JButton btnSkipToYourTurn; // F9
 
     private javax.swing.JButton btnConcede;
diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/utils/ImageManager.java b/Mage.Client/src/main/java/org/mage/plugins/card/utils/ImageManager.java
index a7254e7771..52138aa996 100644
--- a/Mage.Client/src/main/java/org/mage/plugins/card/utils/ImageManager.java
+++ b/Mage.Client/src/main/java/org/mage/plugins/card/utils/ImageManager.java
@@ -37,6 +37,7 @@ public interface ImageManager {
     Image getSkipNextTurnButtonImage();
     Image getSkipEndTurnButtonImage();
     Image getSkipMainButtonImage();
+    Image getSkipStackButtonImage();
     Image getSkipYourNextTurnButtonImage();
 
 
diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java b/Mage.Client/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java
index 3d30f575da..4ec5ac433d 100644
--- a/Mage.Client/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java
+++ b/Mage.Client/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java
@@ -293,6 +293,14 @@ public class ImageManagerImpl implements ImageManager {
         return imageSkipToMainButton;
     }
 
+    @Override
+    public Image getSkipStackButtonImage() {
+        if (imageSkipStackButton == null) {
+            imageSkipStackButton = getBufferedImageFromResource("/buttons/skip_stack.png");
+        }
+        return imageSkipStackButton;
+    }
+
     @Override
     public Image getSkipYourNextTurnButtonImage() {
         if (imageSkipYourNextTurnButton == null) {
@@ -388,6 +396,7 @@ public class ImageManagerImpl implements ImageManager {
     private static BufferedImage imageSkipNextTurnButton;
     private static BufferedImage imageSkipToEndTurnButton;
     private static BufferedImage imageSkipToMainButton;
+    private static BufferedImage imageSkipStackButton;
     private static BufferedImage imageSkipYourNextTurnButton;
 
     private static Map<String, Image> phasesImages;
diff --git a/Mage.Client/src/main/resources/buttons/skip_stack.png b/Mage.Client/src/main/resources/buttons/skip_stack.png
new file mode 100644
index 0000000000000000000000000000000000000000..40597cfb64fed8491cb760927fa4098411ce4400
GIT binary patch
literal 2440
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
GLSTYXjl!P*

literal 0
HcmV?d00001

diff --git a/Mage.Common/src/mage/view/PlayerView.java b/Mage.Common/src/mage/view/PlayerView.java
index ea56766257..e98091a010 100644
--- a/Mage.Common/src/mage/view/PlayerView.java
+++ b/Mage.Common/src/mage/view/PlayerView.java
@@ -71,6 +71,7 @@ public class PlayerView implements Serializable {
     private final boolean passedTurn; // F4
     private final boolean passedUntilEndOfTurn; // F5
     private final boolean passedUntilNextMain; // F6
+    private final boolean passedUntilStackResolved; // F8
     private final boolean passedAllTurns; // F9
 
     public PlayerView(Player player, GameState state, Game game, UUID createdForPlayerId) {
@@ -140,6 +141,7 @@ public class PlayerView implements Serializable {
         this.passedUntilEndOfTurn = player.getPassedUntilEndOfTurn();
         this.passedUntilNextMain = player.getPassedUntilNextMain();
         this.passedAllTurns = player.getPassedAllTurns();
+        this.passedUntilStackResolved = player.getPassedUntilStackResolved();
     }
 
     private boolean showInBattlefield(Permanent permanent, GameState state) {
@@ -255,4 +257,7 @@ public class PlayerView implements Serializable {
         return passedAllTurns;
     }
 
+    public boolean isPassedUntilStackResolved() {
+        return passedUntilStackResolved;
+    }
 }
diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java
index b7ed748b06..6cbdf379e4 100644
--- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java
+++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java
@@ -466,6 +466,7 @@ public class HumanPlayer extends PlayerImpl {
                 return false;
             }
             if (game.getStack().isEmpty()) {
+                passedUntilStackResolved = false;
                 boolean dontCheckPassStep = false;
                 if (passedTurn) {
                     pass(game);
@@ -509,6 +510,14 @@ public class HumanPlayer extends PlayerImpl {
                     pass(game);
                     return false;
                 }                
+            } else if (passedUntilStackResolved) {
+                if (dateLastAddedToStack == game.getStack().getDateLastAdded()) {
+                    dateLastAddedToStack = game.getStack().getDateLastAdded();
+                    pass(game);
+                    return false;
+                } else {
+                    passedUntilStackResolved = false;
+                }
             }
             updateGameStatePriority("priority", game);
             game.firePriorityEvent(playerId);