From 486d05589b1d6d88f315cbe5ea80925f98d967de Mon Sep 17 00:00:00 2001 From: Devon Richards Date: Mon, 19 Jun 2017 23:16:29 -0500 Subject: [PATCH 1/7] Remove failing tests for Urborg/Blood Moon --- .../test/cards/continuous/LandTypeChangingEffectsTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/continuous/LandTypeChangingEffectsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/continuous/LandTypeChangingEffectsTest.java index 091484c1128..91732f530a1 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/continuous/LandTypeChangingEffectsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/continuous/LandTypeChangingEffectsTest.java @@ -138,6 +138,7 @@ public class LandTypeChangingEffectsTest extends CardTestPlayerBase { /* NOTE: this test is currently failing due to bug in code. See issue #3072 */ + /* @Test public void testBloodMoonBeforeUrborg() { // Blood Moon 2R @@ -166,10 +167,12 @@ public class LandTypeChangingEffectsTest extends CardTestPlayerBase { assertNotSubtype(urborgtoy, "Swamp"); Assert.assertTrue("The mana the land can produce should be [{R}] but it's " + playerB.getManaAvailable(currentGame).toString(), playerB.getManaAvailable(currentGame).toString().equals("[{R}]")); } + */ /* NOTE: this test is currently failing due to bug in code. See issue #3072 */ + /* @Test public void testBloodMoonAfterUrborg() { // Blood Moon 2R @@ -198,5 +201,6 @@ public class LandTypeChangingEffectsTest extends CardTestPlayerBase { assertNotSubtype(urborgtoy, "Swamp"); Assert.assertTrue("The mana the land can produce should be [{R}] but it's " + playerB.getManaAvailable(currentGame).toString(), playerB.getManaAvailable(currentGame).toString().equals("[{R}]")); } + */ } From 028d7ed1f8728516fe9d35e6afbc1cf99b00b917 Mon Sep 17 00:00:00 2001 From: Devon Richards Date: Tue, 20 Jun 2017 19:54:16 -0500 Subject: [PATCH 2/7] Initial working product. Doesn't handle skipping stack. --- .../mage/client/dialog/PreferencesDialog.java | 1 + .../main/java/mage/client/game/GamePanel.java | 39 +++++++++++++ .../src/mage/player/human/HumanPlayer.java | 57 +++++++++++++++++++ .../src/mage/player/human/PlayerResponse.java | 28 +++++++++ .../java/mage/constants/PlayerAction.java | 3 +- 5 files changed, 127 insertions(+), 1 deletion(-) diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java index 61b83ebd8e8..407d1352238 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java @@ -299,6 +299,7 @@ public class PreferencesDialog extends javax.swing.JDialog { public static final String KEY_CONNECTION_URL_SERVER_LIST = "connectionURLServerList"; // controls + public static final String KEY_CONTROL_TOGGLE_MACRO = "controlToggleMacro"; public static final String KEY_CONTROL_CONFIRM = "controlConfirm"; public static final String KEY_CONTROL_CANCEL_SKIP = "controlCancelSkip"; public static final String KEY_CONTROL_NEXT_TURN = "controlNextTurn"; 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 3c6d2f3bfe7..0897a0b4c2c 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -489,6 +489,7 @@ public final class GamePanel extends javax.swing.JPanel { this.btnStopWatching.setVisible(false); this.btnSwitchHands.setVisible(false); this.btnCancelSkip.setVisible(true); + this.btnToggleMacro.setVisible(true); this.btnSkipToNextTurn.setVisible(true); this.btnSkipToEndTurn.setVisible(true); @@ -522,6 +523,7 @@ public final class GamePanel extends javax.swing.JPanel { this.btnSwitchHands.setVisible(false); this.chosenHandKey = ""; this.btnCancelSkip.setVisible(false); + this.btnToggleMacro.setVisible(false); this.btnSkipToNextTurn.setVisible(false); this.btnSkipToEndTurn.setVisible(false); @@ -1346,6 +1348,7 @@ public final class GamePanel extends javax.swing.JPanel { txtHoldPriority.setToolTipText("Holding priority after the next spell cast or ability activation"); txtHoldPriority.setVisible(false); + btnToggleMacro = new KeyboundButton(KEY_CONTROL_TOGGLE_MACRO); btnCancelSkip = new KeyboundButton(KEY_CONTROL_CANCEL_SKIP); // F3 btnSkipToNextTurn = new KeyboundButton(KEY_CONTROL_NEXT_TURN); // F4 btnSkipToEndTurn = new KeyboundButton(KEY_CONTROL_END_STEP); // F5 @@ -1436,6 +1439,30 @@ public final class GamePanel extends javax.swing.JPanel { bigCard.setBorder(new LineBorder(Color.black, 1, true)); int c = JComponent.WHEN_IN_FOCUSED_WINDOW; + + + btnToggleMacro.setContentAreaFilled(false); + btnToggleMacro.setBorder(new EmptyBorder(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE)); + btnToggleMacro.setIcon(new ImageIcon(ImageManagerImpl.instance.getSkipNextTurnButtonImage())); + btnToggleMacro.setToolTipText("Toggle Record Macro (F8)."); + btnToggleMacro.setFocusable(false); + btnToggleMacro.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent evt) { + if (evt.getButton() == MouseEvent.BUTTON1) { + btnToggleMacroActionPerformed(null); + } + } + }); + + KeyStroke kst = KeyStroke.getKeyStroke(KeyEvent.VK_F8, 0); + this.getInputMap(c).put(kst, "F8_PRESS"); + this.getActionMap().put("F8_PRESS", new AbstractAction() { + @Override + public void actionPerformed(ActionEvent actionEvent) { + btnToggleMacroActionPerformed(actionEvent); + } + }); KeyStroke ks3 = getCachedKeystroke(KEY_CONTROL_CANCEL_SKIP); this.getInputMap(c).put(ks3, "F3_PRESS"); @@ -1809,6 +1836,7 @@ public final class GamePanel extends javax.swing.JPanel { .addComponent(btnSkipToEndStepBeforeYourTurn) ) .addGroup(gl_pnlShortCuts.createSequentialGroup() + .addComponent(btnToggleMacro) .addComponent(txtHoldPriority) .addComponent(txtSpellsCast) .addComponent(btnSwitchHands) @@ -1843,6 +1871,7 @@ public final class GamePanel extends javax.swing.JPanel { .addComponent(btnSkipToEndStepBeforeYourTurn) ) .addGroup(gl_pnlShortCuts.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(btnToggleMacro) .addComponent(txtHoldPriority) .addComponent(txtSpellsCast) .addComponent(btnSwitchHands) @@ -1989,6 +2018,9 @@ public final class GamePanel extends javax.swing.JPanel { for (MouseListener ml : this.getMouseListeners()) { this.removeMouseListener(ml); } + for (MouseListener ml : this.btnToggleMacro.getMouseListeners()) { + this.btnToggleMacro.removeMouseListener(ml); + } for (MouseListener ml : this.btnCancelSkip.getMouseListeners()) { this.btnCancelSkip.removeMouseListener(ml); } @@ -2070,6 +2102,12 @@ public final class GamePanel extends javax.swing.JPanel { message.setGameId(gameId); MageFrame.getInstance().showUserRequestDialog(message); } + + private void btnToggleMacroActionPerformed(java.awt.event.ActionEvent evt) { + SessionHandler.sendPlayerAction(PlayerAction.TOGGLE_RECORD_MACRO, gameId, null); + AudioManager.playOnSkipButton(); + updateSkipButtons(false, false, false, false, false, false); + } private void btnEndTurnActionPerformed(java.awt.event.ActionEvent evt) { SessionHandler.sendPlayerAction(PlayerAction.PASS_PRIORITY_UNTIL_NEXT_TURN, gameId, null); @@ -2360,6 +2398,7 @@ public final class GamePanel extends javax.swing.JPanel { private mage.client.cards.BigCard bigCard; // private JPanel cancelSkipPanel; + private KeyboundButton btnToggleMacro; private KeyboundButton btnCancelSkip; private KeyboundButton btnSkipToNextTurn; // F4 private KeyboundButton btnSkipToEndTurn; // F5 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 d3196c93849..d83b6ac2e6a 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 @@ -102,6 +102,12 @@ public class HumanPlayer extends PlayerImpl { protected Map requestAutoAnswerText = new HashMap<>(); protected boolean holdingPriority; + + protected Queue actionQueue = new LinkedList<>(); + protected Queue actionQueueSaved = new LinkedList<>(); + protected int actionIterations = 0; + protected boolean recordingMacro = false; + public HumanPlayer(String name, RangeOfInfluence range, int skill) { super(name, range); @@ -116,8 +122,32 @@ public class HumanPlayer extends PlayerImpl { this.currentlyUnpaidMana = player.currentlyUnpaidMana; this.replacementEffectChoice = player.replacementEffectChoice; } + + protected boolean pullResponseFromQueue(Game game) { + if (actionQueue.isEmpty() && actionIterations > 0 && !actionQueueSaved.isEmpty()) { + actionQueue = new LinkedList(actionQueueSaved); + actionIterations--; + } + PlayerResponse action = actionQueue.poll(); + if (action != null) { + logger.info("Popping an action " + action); + synchronized (response) { + if (action.getString() != null && action.getString().equals("resolveStack")) { + logger.info("Skipping stack"); + sendPlayerAction(PlayerAction.PASS_PRIORITY_UNTIL_STACK_RESOLVED, game, null); + response.clear(); + } else { + response.copy(action); + } + response.notifyAll(); + return true; + } + } + return false; + } protected void waitForResponse(Game game) { + if(pullResponseFromQueue(game)) return; response.clear(); logger.debug("Waiting response from player: " + getId()); game.resumeTimer(getTurnControlledBy()); @@ -131,6 +161,10 @@ public class HumanPlayer extends PlayerImpl { game.pauseTimer(getTurnControlledBy()); } } + if (recordingMacro) { + logger.info("Adding an action " + response); + actionQueueSaved.add(new PlayerResponse(response)); + } } @Override @@ -679,6 +713,7 @@ public class HumanPlayer extends PlayerImpl { holdingPriority = false; game.firePriorityEvent(playerId); waitForResponse(game); + logger.info("Human Priority got response: " + response); if (game.executingRollback()) { return true; } @@ -1523,6 +1558,28 @@ public class HumanPlayer extends PlayerImpl { case UNHOLD_PRIORITY: holdingPriority = false; break; + case TOGGLE_RECORD_MACRO: + if(recordingMacro) { + logger.info("Finished Recording Macro"); + recordingMacro = false; + // TODO: Figure out how to make dialog + actionIterations = 3; + pullResponseFromQueue(game); + } else { + logger.info("Starting Recording Macro"); + resetPlayerPassedActions(); + recordingMacro = true; + actionIterations = 0; + actionQueueSaved.clear(); + actionQueue.clear(); + } + break; + case PASS_PRIORITY_UNTIL_STACK_RESOLVED: + if (recordingMacro) { + PlayerResponse tResponse = new PlayerResponse(); + tResponse.setString("resolveStack"); + actionQueueSaved.add(tResponse); + } default: super.sendPlayerAction(playerAction, game, data); } diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/PlayerResponse.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/PlayerResponse.java index d8769b72845..5d82f843748 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/PlayerResponse.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/PlayerResponse.java @@ -44,6 +44,34 @@ public class PlayerResponse implements Serializable { private Integer responseInteger; private ManaType responseManaType; private UUID responseManaTypePlayerId; + + public PlayerResponse() { + clear(); + } + + public String toString() { + String res = new String(); + res += responseString + ","; + res += responseUUID + ","; + res += responseBoolean + ","; + res += responseInteger + ","; + res += responseManaType + ","; + res += responseManaTypePlayerId; + return res; + } + + public PlayerResponse(PlayerResponse other) { + copy(other); + } + + public void copy(PlayerResponse other) { + responseString = other.responseString; + responseUUID = other.responseUUID; + responseBoolean = other.responseBoolean; + responseInteger = other.responseInteger; + responseManaType = other.responseManaType; + responseManaTypePlayerId = other.responseManaTypePlayerId; + } public void clear() { responseString = null; diff --git a/Mage/src/main/java/mage/constants/PlayerAction.java b/Mage/src/main/java/mage/constants/PlayerAction.java index cdee7edd3a9..fa0bf2c05bc 100644 --- a/Mage/src/main/java/mage/constants/PlayerAction.java +++ b/Mage/src/main/java/mage/constants/PlayerAction.java @@ -84,5 +84,6 @@ public enum PlayerAction { CLIENT_REPLAY_ACTION, HOLD_PRIORITY, UNHOLD_PRIORITY, - VIEW_LIMITED_DECK + VIEW_LIMITED_DECK, + TOGGLE_RECORD_MACRO } From 0d98514550fae1bc881a04d45029113f4b282867 Mon Sep 17 00:00:00 2001 From: Devon Richards Date: Wed, 21 Jun 2017 01:09:54 -0500 Subject: [PATCH 3/7] Added better UI and made it work with most categories of combos --- .../main/java/mage/client/game/GamePanel.java | 5 + .../src/mage/player/human/HumanPlayer.java | 141 ++++++++++++------ 2 files changed, 100 insertions(+), 46 deletions(-) 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 0897a0b4c2c..0646da5e576 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -2107,6 +2107,11 @@ public final class GamePanel extends javax.swing.JPanel { SessionHandler.sendPlayerAction(PlayerAction.TOGGLE_RECORD_MACRO, gameId, null); AudioManager.playOnSkipButton(); updateSkipButtons(false, false, false, false, false, false); + if (btnToggleMacro.getBorder() instanceof EmptyBorder) { + btnToggleMacro.setBorder(new LineBorder(Color.orange, BORDER_SIZE)); + } else { + btnToggleMacro.setBorder(new EmptyBorder(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE)); + } } private void btnEndTurnActionPerformed(java.awt.event.ActionEvent evt) { 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 d83b6ac2e6a..fcbbb7ef3a0 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 @@ -107,7 +107,8 @@ public class HumanPlayer extends PlayerImpl { protected Queue actionQueueSaved = new LinkedList<>(); protected int actionIterations = 0; protected boolean recordingMacro = false; - + protected boolean macroTriggeredSelectionFlag; + protected boolean activatingMacro = false; public HumanPlayer(String name, RangeOfInfluence range, int skill) { super(name, range); @@ -123,6 +124,10 @@ public class HumanPlayer extends PlayerImpl { this.replacementEffectChoice = player.replacementEffectChoice; } + protected boolean isExecutingMacro() { + return !actionQueue.isEmpty() || (actionIterations > 0 && !actionQueueSaved.isEmpty()); + } + protected boolean pullResponseFromQueue(Game game) { if (actionQueue.isEmpty() && actionIterations > 0 && !actionQueueSaved.isEmpty()) { actionQueue = new LinkedList(actionQueueSaved); @@ -130,16 +135,16 @@ public class HumanPlayer extends PlayerImpl { } PlayerResponse action = actionQueue.poll(); if (action != null) { - logger.info("Popping an action " + action); + if (action.getString() != null + && action.getString().equals("resolveStack")) { + action = actionQueue.poll(); + if (action == null) return false; + sendPlayerAction(PlayerAction.PASS_PRIORITY_UNTIL_STACK_RESOLVED, game, null); + } synchronized (response) { - if (action.getString() != null && action.getString().equals("resolveStack")) { - logger.info("Skipping stack"); - sendPlayerAction(PlayerAction.PASS_PRIORITY_UNTIL_STACK_RESOLVED, game, null); - response.clear(); - } else { - response.copy(action); - } + response.copy(action); response.notifyAll(); + macroTriggeredSelectionFlag = false; return true; } } @@ -147,7 +152,7 @@ public class HumanPlayer extends PlayerImpl { } protected void waitForResponse(Game game) { - if(pullResponseFromQueue(game)) return; + if(!recordingMacro && pullResponseFromQueue(game)) return; response.clear(); logger.debug("Waiting response from player: " + getId()); game.resumeTimer(getTurnControlledBy()); @@ -161,8 +166,8 @@ public class HumanPlayer extends PlayerImpl { game.pauseTimer(getTurnControlledBy()); } } - if (recordingMacro) { - logger.info("Adding an action " + response); + if (recordingMacro && !macroTriggeredSelectionFlag) { + logger.debug("Adding an action " + response); actionQueueSaved.add(new PlayerResponse(response)); } } @@ -178,7 +183,7 @@ public class HumanPlayer extends PlayerImpl { Map options = new HashMap<>(); options.put("UI.left.btn.text", "Mulligan"); options.put("UI.right.btn.text", "Keep"); - game.fireAskPlayerEvent(playerId, new MessageToClient(message), null, options); + if(!isExecutingMacro()) game.fireAskPlayerEvent(playerId, new MessageToClient(message), null, options); waitForResponse(game); } while (response.getBoolean() == null && !abort); if (!abort) { @@ -218,7 +223,7 @@ public class HumanPlayer extends PlayerImpl { if (messageToClient.getSecondMessage() == null) { messageToClient.setSecondMessage(getRelatedObjectName(source, game)); } - game.fireAskPlayerEvent(playerId, messageToClient, source, options); + if(!isExecutingMacro()) game.fireAskPlayerEvent(playerId, messageToClient, source, options); waitForResponse(game); } while (response.getBoolean() == null && !abort); if (!abort) { @@ -277,7 +282,7 @@ public class HumanPlayer extends PlayerImpl { replacementEffectChoice.setKeyChoices(rEffects); while (!abort) { - game.fireChooseChoiceEvent(playerId, replacementEffectChoice); + if(!isExecutingMacro()) game.fireChooseChoiceEvent(playerId, replacementEffectChoice); updateGameStatePriority("chooseEffect", game); waitForResponse(game); logger.debug("Choose effect: " + response.getString()); @@ -312,7 +317,7 @@ public class HumanPlayer extends PlayerImpl { } updateGameStatePriority("choose(3)", game); while (!abort) { - game.fireChooseChoiceEvent(playerId, choice); + if(!isExecutingMacro()) game.fireChooseChoiceEvent(playerId, choice); waitForResponse(game); if (response.getString() != null) { choice.setChoice(response.getString()); @@ -354,7 +359,7 @@ public class HumanPlayer extends PlayerImpl { List chosen = target.getTargets(); options.put("chosen", (Serializable) chosen); - game.fireSelectTargetEvent(getId(), new MessageToClient(target.getMessage(), getRelatedObjectName(sourceId, game)), targetIds, required, getOptions(target, options)); + if(!isExecutingMacro()) game.fireSelectTargetEvent(getId(), new MessageToClient(target.getMessage(), getRelatedObjectName(sourceId, game)), targetIds, required, getOptions(target, options)); waitForResponse(game); if (response.getUUID() != null) { if (!targetIds.contains(response.getUUID())) { @@ -419,7 +424,7 @@ public class HumanPlayer extends PlayerImpl { required = false; } - game.fireSelectTargetEvent(getId(), new MessageToClient(target.getMessage(), getRelatedObjectName(source, game)), possibleTargets, required, getOptions(target, null)); + if(!isExecutingMacro()) game.fireSelectTargetEvent(getId(), new MessageToClient(target.getMessage(), getRelatedObjectName(source, game)), possibleTargets, required, getOptions(target, null)); waitForResponse(game); if (response.getUUID() != null) { if (target.getTargets().contains(response.getUUID())) { @@ -487,7 +492,7 @@ public class HumanPlayer extends PlayerImpl { options.put("choosable", (Serializable) choosable); } - game.fireSelectTargetEvent(playerId, new MessageToClient(target.getMessage()), cards, required, options); + if(!isExecutingMacro()) game.fireSelectTargetEvent(playerId, new MessageToClient(target.getMessage()), cards, required, options); waitForResponse(game); if (response.getUUID() != null) { if (target.canTarget(response.getUUID(), cards, game)) { @@ -546,7 +551,7 @@ public class HumanPlayer extends PlayerImpl { if (!choosable.isEmpty()) { options.put("choosable", (Serializable) choosable); } - game.fireSelectTargetEvent(playerId, new MessageToClient(target.getMessage(), getRelatedObjectName(source, game)), cards, required, options); + if(!isExecutingMacro()) game.fireSelectTargetEvent(playerId, new MessageToClient(target.getMessage(), getRelatedObjectName(source, game)), cards, required, options); waitForResponse(game); if (response.getUUID() != null) { if (target.getTargets().contains(response.getUUID())) { // if already included remove it @@ -573,7 +578,7 @@ public class HumanPlayer extends PlayerImpl { public boolean chooseTargetAmount(Outcome outcome, TargetAmount target, Ability source, Game game) { updateGameStatePriority("chooseTargetAmount", game); while (!abort) { - game.fireSelectTargetEvent(playerId, new MessageToClient(target.getMessage() + "\n Amount remaining:" + target.getAmountRemaining(), getRelatedObjectName(source, game)), + if(!isExecutingMacro()) game.fireSelectTargetEvent(playerId, new MessageToClient(target.getMessage() + "\n Amount remaining:" + target.getAmountRemaining(), getRelatedObjectName(source, game)), target.possibleTargets(source == null ? null : source.getSourceId(), playerId, game), target.isRequired(source), getOptions(target, null)); @@ -711,17 +716,21 @@ public class HumanPlayer extends PlayerImpl { while (canRespond()) { updateGameStatePriority("priority", game); holdingPriority = false; - game.firePriorityEvent(playerId); + if(!isExecutingMacro()) game.firePriorityEvent(playerId); waitForResponse(game); - logger.info("Human Priority got response: " + response); if (game.executingRollback()) { return true; } if (response.getBoolean() != null || response.getInteger() != null) { - if (passWithManaPoolCheck(game)) { + if (passWithManaPoolCheck(game) && !activatingMacro) { return false; } else { + if(activatingMacro){ + synchronized(actionQueue) { + actionQueue.notifyAll(); + } + } continue; } } @@ -824,17 +833,28 @@ public class HumanPlayer extends PlayerImpl { || autoOrderUse) { return abilitiesWithNoOrderSet.iterator().next(); } + macroTriggeredSelectionFlag = true; updateGameStatePriority("chooseTriggeredAbility", game); - game.fireSelectTargetTriggeredAbilityEvent(playerId, "Pick triggered ability (goes to the stack first)", abilitiesWithNoOrderSet); + if(!isExecutingMacro()) game.fireSelectTargetTriggeredAbilityEvent(playerId, "Pick triggered ability (goes to the stack first)", abilitiesWithNoOrderSet); waitForResponse(game); if (response.getUUID() != null) { for (TriggeredAbility ability : abilitiesWithNoOrderSet) { - if (ability.getId().equals(response.getUUID())) { + if (ability.getId().equals(response.getUUID()) + || (!macroTriggeredSelectionFlag + && ability.getSourceId().equals(response.getUUID()))) { + if (recordingMacro) { + PlayerResponse tResponse = new PlayerResponse(); + tResponse.setUUID(ability.getSourceId()); + actionQueueSaved.add(tResponse); + logger.debug("Adding Triggered Ability Source: " + tResponse); + } + macroTriggeredSelectionFlag = false; return ability; } } } } + macroTriggeredSelectionFlag = false; return null; } @@ -849,7 +869,7 @@ public class HumanPlayer extends PlayerImpl { protected boolean playManaHandling(Ability abilityToCast, ManaCost unpaid, String promptText, Game game) { updateGameStatePriority("playMana", game); Map options = new HashMap<>(); - game.firePlayManaEvent(playerId, "Pay " + promptText, options); + if(!isExecutingMacro()) game.firePlayManaEvent(playerId, "Pay " + promptText, options); waitForResponse(game); if (!this.canRespond()) { return false; @@ -872,6 +892,27 @@ public class HumanPlayer extends PlayerImpl { } return true; } + + /** + * Gets the number of times the user wants to repeat their macro + * + * @param game + * @return + */ + public int announceRepetitions(Game game) { + int xValue = 0; + updateGameStatePriority("announceRepetitions", game); + do { + game.fireGetAmountEvent(playerId, "How many times do you want to repeat your shortcut?", 0, 999); + waitForResponse(game); + } while (response.getInteger() == null + && !abort); + if (response != null + && response.getInteger() != null) { + xValue = response.getInteger(); + } + return xValue; + } /** * Gets the amount of mana the player want to spent for a x spell @@ -888,7 +929,7 @@ public class HumanPlayer extends PlayerImpl { int xValue = 0; updateGameStatePriority("announceXMana", game); do { - game.fireGetAmountEvent(playerId, message, min, max); + if(!isExecutingMacro()) game.fireGetAmountEvent(playerId, message, min, max); waitForResponse(game); } while (response.getInteger() == null && !abort); @@ -904,7 +945,7 @@ public class HumanPlayer extends PlayerImpl { int xValue = 0; updateGameStatePriority("announceXCost", game); do { - game.fireGetAmountEvent(playerId, message, min, max); + if(!isExecutingMacro()) game.fireGetAmountEvent(playerId, message, min, max); waitForResponse(game); } while (response.getInteger() == null && !abort); @@ -968,7 +1009,7 @@ public class HumanPlayer extends PlayerImpl { options.put(Constants.Option.SPECIAL_BUTTON, (Serializable) "All attack"); } - game.fireSelectEvent(playerId, "Select attackers", options); + if(!isExecutingMacro()) game.fireSelectEvent(playerId, "Select attackers", options); waitForResponse(game); if (response.getString() != null && response.getString().equals("special")) { // All attack @@ -1128,7 +1169,7 @@ public class HumanPlayer extends PlayerImpl { return; } while (!abort) { - game.fireSelectEvent(playerId, "Select blockers"); + if(!isExecutingMacro()) game.fireSelectEvent(playerId, "Select blockers"); waitForResponse(game); if (response.getBoolean() != null) { return; @@ -1158,7 +1199,7 @@ public class HumanPlayer extends PlayerImpl { public UUID chooseAttackerOrder(List attackers, Game game) { updateGameStatePriority("chooseAttackerOrder", game); while (!abort) { - game.fireSelectTargetEvent(playerId, "Pick attacker", attackers, true); + if(!isExecutingMacro()) game.fireSelectTargetEvent(playerId, "Pick attacker", attackers, true); waitForResponse(game); if (response.getUUID() != null) { for (Permanent perm : attackers) { @@ -1175,7 +1216,7 @@ public class HumanPlayer extends PlayerImpl { public UUID chooseBlockerOrder(List blockers, CombatGroup combatGroup, List blockerOrder, Game game) { updateGameStatePriority("chooseBlockerOrder", game); while (!abort) { - game.fireSelectTargetEvent(playerId, "Pick blocker", blockers, true); + if(!isExecutingMacro()) game.fireSelectTargetEvent(playerId, "Pick blocker", blockers, true); waitForResponse(game); if (response.getUUID() != null) { for (Permanent perm : blockers) { @@ -1191,7 +1232,7 @@ public class HumanPlayer extends PlayerImpl { protected void selectCombatGroup(UUID defenderId, UUID blockerId, Game game) { updateGameStatePriority("selectCombatGroup", game); TargetAttackingCreature target = new TargetAttackingCreature(); - game.fireSelectTargetEvent(playerId, new MessageToClient("Select attacker to block", getRelatedObjectName(blockerId, game)), + if(!isExecutingMacro()) game.fireSelectTargetEvent(playerId, new MessageToClient("Select attacker to block", getRelatedObjectName(blockerId, game)), target.possibleTargets(null, playerId, game), false, getOptions(target, null)); waitForResponse(game); if (response.getBoolean() != null) { @@ -1241,7 +1282,7 @@ public class HumanPlayer extends PlayerImpl { public int getAmount(int min, int max, String message, Game game) { updateGameStatePriority("getAmount", game); do { - game.fireGetAmountEvent(playerId, message, min, max); + if(!isExecutingMacro()) game.fireGetAmountEvent(playerId, message, min, max); waitForResponse(game); } while (response.getInteger() == null && !abort); if (response != null && response.getInteger() != null) { @@ -1270,7 +1311,7 @@ public class HumanPlayer extends PlayerImpl { LinkedHashMap specialActions = game.getState().getSpecialActions().getControlledBy(playerId, false); if (!specialActions.isEmpty()) { updateGameStatePriority("specialAction", game); - game.fireGetChoiceEvent(playerId, name, null, new ArrayList<>(specialActions.values())); + if(!isExecutingMacro()) game.fireGetChoiceEvent(playerId, name, null, new ArrayList<>(specialActions.values())); waitForResponse(game); if (response.getUUID() != null) { if (specialActions.containsKey(response.getUUID())) { @@ -1284,7 +1325,7 @@ public class HumanPlayer extends PlayerImpl { LinkedHashMap specialActions = game.getState().getSpecialActions().getControlledBy(playerId, true); if (!specialActions.isEmpty()) { updateGameStatePriority("specialAction", game); - game.fireGetChoiceEvent(playerId, name, null, new ArrayList<>(specialActions.values())); + if(!isExecutingMacro()) game.fireGetChoiceEvent(playerId, name, null, new ArrayList<>(specialActions.values())); waitForResponse(game); if (response.getUUID() != null) { if (specialActions.containsKey(response.getUUID())) { @@ -1327,7 +1368,7 @@ public class HumanPlayer extends PlayerImpl { } } - game.fireGetChoiceEvent(playerId, name, object, new ArrayList<>(abilities.values())); + if(!isExecutingMacro()) game.fireGetChoiceEvent(playerId, name, object, new ArrayList<>(abilities.values())); waitForResponse(game); if (response.getUUID() != null && isInGame()) { @@ -1365,7 +1406,7 @@ public class HumanPlayer extends PlayerImpl { return (SpellAbility) useableAbilities.values().iterator().next(); } else if (useableAbilities != null && !useableAbilities.isEmpty()) { - game.fireGetChoiceEvent(playerId, name, object, new ArrayList<>(useableAbilities.values())); + if(!isExecutingMacro()) game.fireGetChoiceEvent(playerId, name, object, new ArrayList<>(useableAbilities.values())); waitForResponse(game); if (response.getUUID() != null) { if (useableAbilities.containsKey(response.getUUID())) { @@ -1415,7 +1456,7 @@ public class HumanPlayer extends PlayerImpl { if (!modeMap.isEmpty()) { boolean done = false; while (!done) { - game.fireGetModeEvent(playerId, "Choose Mode", modeMap); + if(!isExecutingMacro()) game.fireGetModeEvent(playerId, "Choose Mode", modeMap); waitForResponse(game); if (response.getUUID() != null) { for (Mode mode : modes.getAvailableModes(source, game)) { @@ -1442,7 +1483,7 @@ public class HumanPlayer extends PlayerImpl { public boolean choosePile(Outcome outcome, String message, List pile1, List pile2, Game game) { updateGameStatePriority("choosePile", game); do { - game.fireChoosePileEvent(playerId, message, pile1, pile2); + if(!isExecutingMacro()) game.fireChoosePileEvent(playerId, message, pile1, pile2); waitForResponse(game); } while (response.getBoolean() == null && !abort); if (!abort) { @@ -1560,13 +1601,20 @@ public class HumanPlayer extends PlayerImpl { break; case TOGGLE_RECORD_MACRO: if(recordingMacro) { - logger.info("Finished Recording Macro"); + logger.debug("Finished Recording Macro"); + activatingMacro = true; recordingMacro = false; - // TODO: Figure out how to make dialog - actionIterations = 3; - pullResponseFromQueue(game); + actionIterations = announceRepetitions(game); + try { + synchronized(actionQueue) { + actionQueue.wait(); + } + } catch (InterruptedException ex){ + } finally { + activatingMacro = false; + } } else { - logger.info("Starting Recording Macro"); + logger.debug("Starting Recording Macro"); resetPlayerPassedActions(); recordingMacro = true; actionIterations = 0; @@ -1576,6 +1624,7 @@ public class HumanPlayer extends PlayerImpl { break; case PASS_PRIORITY_UNTIL_STACK_RESOLVED: if (recordingMacro) { + logger.debug("Adding a resolveStack"); PlayerResponse tResponse = new PlayerResponse(); tResponse.setString("resolveStack"); actionQueueSaved.add(tResponse); From f0b8fd8eec22c8a60c397e6cfbd93f592cc7065b Mon Sep 17 00:00:00 2001 From: Devon Richards Date: Wed, 21 Jun 2017 23:44:50 -0500 Subject: [PATCH 4/7] Revert "Remove failing tests for Urborg/Blood Moon" This reverts commit 486d05589b1d6d88f315cbe5ea80925f98d967de. --- .../test/cards/continuous/LandTypeChangingEffectsTest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/continuous/LandTypeChangingEffectsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/continuous/LandTypeChangingEffectsTest.java index 91732f530a1..091484c1128 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/continuous/LandTypeChangingEffectsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/continuous/LandTypeChangingEffectsTest.java @@ -138,7 +138,6 @@ public class LandTypeChangingEffectsTest extends CardTestPlayerBase { /* NOTE: this test is currently failing due to bug in code. See issue #3072 */ - /* @Test public void testBloodMoonBeforeUrborg() { // Blood Moon 2R @@ -167,12 +166,10 @@ public class LandTypeChangingEffectsTest extends CardTestPlayerBase { assertNotSubtype(urborgtoy, "Swamp"); Assert.assertTrue("The mana the land can produce should be [{R}] but it's " + playerB.getManaAvailable(currentGame).toString(), playerB.getManaAvailable(currentGame).toString().equals("[{R}]")); } - */ /* NOTE: this test is currently failing due to bug in code. See issue #3072 */ - /* @Test public void testBloodMoonAfterUrborg() { // Blood Moon 2R @@ -201,6 +198,5 @@ public class LandTypeChangingEffectsTest extends CardTestPlayerBase { assertNotSubtype(urborgtoy, "Swamp"); Assert.assertTrue("The mana the land can produce should be [{R}] but it's " + playerB.getManaAvailable(currentGame).toString(), playerB.getManaAvailable(currentGame).toString().equals("[{R}]")); } - */ } From 63382aed93b9b88d28a921f896bc7329df92371b Mon Sep 17 00:00:00 2001 From: Devon Richards Date: Wed, 21 Jun 2017 23:51:59 -0500 Subject: [PATCH 5/7] Some stylistic fixes for code review --- .../src/mage/player/human/HumanPlayer.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) 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 fcbbb7ef3a0..7e8a4b3e10f 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 @@ -125,7 +125,9 @@ public class HumanPlayer extends PlayerImpl { } protected boolean isExecutingMacro() { - return !actionQueue.isEmpty() || (actionIterations > 0 && !actionQueueSaved.isEmpty()); + return !recordingMacro + && (!actionQueue.isEmpty() + || (actionIterations > 0 && !actionQueueSaved.isEmpty())); } protected boolean pullResponseFromQueue(Game game) { @@ -152,7 +154,10 @@ public class HumanPlayer extends PlayerImpl { } protected void waitForResponse(Game game) { - if(!recordingMacro && pullResponseFromQueue(game)) return; + if (isExecutingMacro()) { + pullResponseFromQueue(game); + return; + } response.clear(); logger.debug("Waiting response from player: " + getId()); game.resumeTimer(getTurnControlledBy()); From b68091683ab74ff464cf5c50e386e545c63dff5a Mon Sep 17 00:00:00 2001 From: Ben Homer Date: Thu, 22 Jun 2017 01:42:01 -0500 Subject: [PATCH 6/7] Added keybinding to preferences and improved UI appearance with new image file. --- .../mage/client/dialog/PreferencesDialog.form | 24 +- .../mage/client/dialog/PreferencesDialog.java | 299 +++++++++++++++--- .../main/java/mage/client/game/GamePanel.java | 7 +- .../client/remote/CallbackClientImpl.java | 3 + .../mage/plugins/card/utils/ImageManager.java | 1 + .../card/utils/impl/ImageManagerImpl.java | 9 + .../main/resources/buttons/toggle_macro.png | Bin 0 -> 2123 bytes 7 files changed, 286 insertions(+), 57 deletions(-) create mode 100644 Mage.Client/src/main/resources/buttons/toggle_macro.png diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form index a10b6a4a50a..e5a149c549a 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form +++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form @@ -150,7 +150,7 @@ - + @@ -5904,6 +5904,7 @@ + @@ -5916,9 +5917,10 @@ + - + @@ -5976,6 +5978,11 @@ + + + + + @@ -6117,6 +6124,19 @@ + + + + + + + + + + + + + diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java index 407d1352238..a12bd1237ed 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java @@ -577,6 +577,8 @@ public class PreferencesDialog extends javax.swing.JDialog { labelConfirm = new javax.swing.JLabel(); controlsDescriptionLabel = new javax.swing.JLabel(); bttnResetControls = new javax.swing.JButton(); + labelToggleRecordMacro = new javax.swing.JLabel(); + keyToggleRecordMacro = new KeyBindButton(this, KEY_CONTROL_TOGGLE_MACRO); saveButton = new javax.swing.JButton(); exitButton = new javax.swing.JButton(); @@ -592,7 +594,11 @@ public class PreferencesDialog extends javax.swing.JDialog { showCardName.setToolTipText("Write the card's name on the card to make the card name more recognizable."); showCardName.setActionCommand(""); showCardName.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); - showCardName.addActionListener(evt -> showCardNameActionPerformed(evt)); + showCardName.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + showCardNameActionPerformed(evt); + } + }); tooltipDelayLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); tooltipDelayLabel.setText("Delay in milliseconds for showing the card tooltip text"); @@ -614,7 +620,7 @@ public class PreferencesDialog extends javax.swing.JDialog { .add(main_cardLayout.createSequentialGroup() .add(6, 6, 6) .add(main_cardLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false) - .add(tooltipDelayLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 308, Short.MAX_VALUE) + .add(tooltipDelayLabel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 308, Short.MAX_VALUE) .add(org.jdesktop.layout.GroupLayout.LEADING, showCardName) .add(tooltipDelay, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) @@ -634,43 +640,71 @@ public class PreferencesDialog extends javax.swing.JDialog { nonLandPermanentsInOnePile.setSelected(true); nonLandPermanentsInOnePile.setText("Put non-land permanents in same row as creatures"); nonLandPermanentsInOnePile.setToolTipText("If activated, all non land permanents are shown in one row.
\nFirst creatures than other permanents. If not activated, creatures are
\nshown in a separate row."); - nonLandPermanentsInOnePile.addActionListener(evt -> nonLandPermanentsInOnePileActionPerformed(evt)); + nonLandPermanentsInOnePile.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + nonLandPermanentsInOnePileActionPerformed(evt); + } + }); showPlayerNamesPermanently.setSelected(true); showPlayerNamesPermanently.setText("Show player names on avatar permanently"); showPlayerNamesPermanently.setToolTipText("Instead showing the names only if you hover over the avatar with the mouse, the name is shown all the time."); showPlayerNamesPermanently.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); - showPlayerNamesPermanently.addActionListener(evt -> showPlayerNamesPermanentlyActionPerformed(evt)); + showPlayerNamesPermanently.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + showPlayerNamesPermanentlyActionPerformed(evt); + } + }); showAbilityPickerForced.setSelected(true); showAbilityPickerForced.setText("Show ability picker for abilities or spells without costs"); showAbilityPickerForced.setToolTipText("This prevents you from accidently activating abilities without other costs than tapping or casting spells with 0 mana costs."); showAbilityPickerForced.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); - showAbilityPickerForced.addActionListener(evt -> showAbilityPickerForcedActionPerformed(evt)); + showAbilityPickerForced.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + showAbilityPickerForcedActionPerformed(evt); + } + }); cbAllowRequestToShowHandCards.setSelected(true); cbAllowRequestToShowHandCards.setText("Allow requests from players and spectators to show your hand cards"); cbAllowRequestToShowHandCards.setToolTipText("This is the default setting used for your matches. If activated other players or spectators
\nof your match can send a request so you can allow them to see your hand cards."); cbAllowRequestToShowHandCards.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); - cbAllowRequestToShowHandCards.addActionListener(evt -> cbAllowRequestToShowHandCardsActionPerformed(evt)); + cbAllowRequestToShowHandCards.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbAllowRequestToShowHandCardsActionPerformed(evt); + } + }); cbShowStormCounter.setSelected(true); cbShowStormCounter.setText("Show the number of spell casts during the current turn"); cbShowStormCounter.setToolTipText("Adds a little box left to the short keys line with the number
\nof spells already cast during the current turn (storm counter)."); cbShowStormCounter.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); - cbShowStormCounter.addActionListener(evt -> cbShowStormCounterActionPerformed(evt)); + cbShowStormCounter.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbShowStormCounterActionPerformed(evt); + } + }); cbConfirmEmptyManaPool.setSelected(true); cbConfirmEmptyManaPool.setText("Confirm if you want to pass a phase/step but there is still mana in your mana pool"); cbConfirmEmptyManaPool.setToolTipText("If activated you get a confirm message if you pass priority while stack is empty
\n and you still have mana in your mana pool."); cbConfirmEmptyManaPool.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); - cbConfirmEmptyManaPool.addActionListener(evt -> cbConfirmEmptyManaPoolActionPerformed(evt)); + cbConfirmEmptyManaPool.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbConfirmEmptyManaPoolActionPerformed(evt); + } + }); cbAskMoveToGraveOrder.setSelected(true); cbAskMoveToGraveOrder.setText("Ask player for setting order cards go to graveyard"); cbAskMoveToGraveOrder.setToolTipText("If activated and multiple cards go to the graveyard at the same time
\nthe player is asked to set the order of the cards."); cbAskMoveToGraveOrder.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); - cbAskMoveToGraveOrder.addActionListener(evt -> cbAskMoveToGraveOrderActionPerformed(evt)); + cbAskMoveToGraveOrder.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbAskMoveToGraveOrderActionPerformed(evt); + } + }); org.jdesktop.layout.GroupLayout main_gameLayout = new org.jdesktop.layout.GroupLayout(main_game); main_game.setLayout(main_gameLayout); @@ -714,12 +748,20 @@ public class PreferencesDialog extends javax.swing.JDialog { cbGameLogAutoSave.setSelected(true); cbGameLogAutoSave.setText("Auto save game logs (to \"../Mage.Client/gamelogs/\" directory)"); cbGameLogAutoSave.setToolTipText("The logs of all your games will be saved to the mentioned folder if this option is switched on."); - cbGameLogAutoSave.addActionListener(evt -> cbGameLogAutoSaveActionPerformed(evt)); + cbGameLogAutoSave.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbGameLogAutoSaveActionPerformed(evt); + } + }); cbDraftLogAutoSave.setSelected(true); cbDraftLogAutoSave.setText("Auto save draft logs (to \"../Mage.Client/gamelogs/\" directory)"); cbDraftLogAutoSave.setToolTipText("The logs of all your games will be saved to the mentioned folder if this option is switched on."); - cbDraftLogAutoSave.addActionListener(evt -> cbDraftLogAutoSaveActionPerformed(evt)); + cbDraftLogAutoSave.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbDraftLogAutoSaveActionPerformed(evt); + } + }); org.jdesktop.layout.GroupLayout main_gamelogLayout = new org.jdesktop.layout.GroupLayout(main_gamelog); main_gamelog.setLayout(main_gamelogLayout); @@ -1220,47 +1262,75 @@ public class PreferencesDialog extends javax.swing.JDialog { cbStopAttack.setText("Stop on declare attackers step if you skip steps (F4/F5/F7) and attackers are available"); cbStopAttack.setToolTipText("If you use F4, F5 or F7 to skip steps, you stop on declare attackers step if attackers are available. If this option is not activated, you also skip the declare attackers step with this actions. F9 does always skip the declare attackers step."); cbStopAttack.setActionCommand(""); - cbStopAttack.addActionListener(evt -> cbStopAttackActionPerformed(evt)); + cbStopAttack.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbStopAttackActionPerformed(evt); + } + }); phases_stopSettings.add(cbStopAttack); cbStopBlock.setText("Stop on your declare blockers step also if no blockers available"); cbStopBlock.setToolTipText("Also if you have no blockers to declare, the game stops at the declare blockers step."); cbStopBlock.setActionCommand(""); - cbStopBlock.addActionListener(evt -> cbStopBlockActionPerformed(evt)); + cbStopBlock.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbStopBlockActionPerformed(evt); + } + }); phases_stopSettings.add(cbStopBlock); cbStopOnAllMain.setText("Skip with F7 to next main phase (if not activated skip always to your next main phase)"); cbStopOnAllMain.setToolTipText("If activated F7 skips to next main phases (regardless of the active players)."); cbStopOnAllMain.setActionCommand(""); - cbStopOnAllMain.addActionListener(evt -> cbStopOnAllMainActionPerformed(evt)); + cbStopOnAllMain.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbStopOnAllMainActionPerformed(evt); + } + }); phases_stopSettings.add(cbStopOnAllMain); cbStopOnAllEnd.setText("Skip with F5 to next end step (if not activated only to end steps of opponents)"); cbStopOnAllEnd.setToolTipText("If activated - F5 skips to the next end step (regardless of the current player)"); cbStopOnAllEnd.setActionCommand(""); cbStopOnAllEnd.setPreferredSize(new java.awt.Dimension(300, 25)); - cbStopOnAllEnd.addActionListener(evt -> cbStopOnAllEndActionPerformed(evt)); + cbStopOnAllEnd.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbStopOnAllEndActionPerformed(evt); + } + }); phases_stopSettings.add(cbStopOnAllEnd); cbPassPriorityCast.setText("Pass priority automatically after you have put a spell on the stack"); cbPassPriorityCast.setToolTipText("If activated the system passes priority automatically for you if you have put a spell on the stack."); cbPassPriorityCast.setActionCommand(""); cbPassPriorityCast.setPreferredSize(new java.awt.Dimension(300, 25)); - cbPassPriorityCast.addActionListener(evt -> cbPassPriorityCastActionPerformed(evt)); + cbPassPriorityCast.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbPassPriorityCastActionPerformed(evt); + } + }); phases_stopSettings.add(cbPassPriorityCast); cbPassPriorityActivation.setText("Pass priority automatically after you have put an activated ability on the stack"); cbPassPriorityActivation.setToolTipText("If activated the system passes priority for you automatically after you have put an activated ability on the stack."); cbPassPriorityActivation.setActionCommand(""); cbPassPriorityActivation.setPreferredSize(new java.awt.Dimension(300, 25)); - cbPassPriorityActivation.addActionListener(evt -> cbPassPriorityActivationActionPerformed(evt)); + cbPassPriorityActivation.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbPassPriorityActivationActionPerformed(evt); + } + }); phases_stopSettings.add(cbPassPriorityActivation); cbAutoOrderTrigger.setText("Set order for your triggers automatically if all have the same text"); cbAutoOrderTrigger.setToolTipText("If activated the order to put on the stack your triggers that trigger at the same time
\nis set automatically if all have the same text."); cbAutoOrderTrigger.setActionCommand(""); cbAutoOrderTrigger.setPreferredSize(new java.awt.Dimension(300, 25)); - cbAutoOrderTrigger.addActionListener(evt -> cbAutoOrderTriggerActionPerformed(evt)); + cbAutoOrderTrigger.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbAutoOrderTriggerActionPerformed(evt); + } + }); phases_stopSettings.add(cbAutoOrderTrigger); org.jdesktop.layout.GroupLayout tabPhasesLayout = new org.jdesktop.layout.GroupLayout(tabPhases); @@ -1382,18 +1452,34 @@ public class PreferencesDialog extends javax.swing.JDialog { panelCardImages.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Card images:")); cbUseDefaultImageFolder.setText("Use default location to save images"); - cbUseDefaultImageFolder.addActionListener(evt -> cbUseDefaultImageFolderActionPerformed(evt)); + cbUseDefaultImageFolder.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbUseDefaultImageFolderActionPerformed(evt); + } + }); txtImageFolderPath.setToolTipText("The selected image will be used as background picture. You have to restart MAGE to view a changed background image."); btnBrowseImageLocation.setText("Browse..."); - btnBrowseImageLocation.addActionListener(evt -> btnBrowseImageLocationActionPerformed(evt)); + btnBrowseImageLocation.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnBrowseImageLocationActionPerformed(evt); + } + }); cbCheckForNewImages.setText("Check for new images on startup"); - cbCheckForNewImages.addActionListener(evt -> cbCheckForNewImagesActionPerformed(evt)); + cbCheckForNewImages.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbCheckForNewImagesActionPerformed(evt); + } + }); cbSaveToZipFiles.setText("Store images in zip files"); - cbSaveToZipFiles.addActionListener(evt -> cbSaveToZipFilesActionPerformed(evt)); + cbSaveToZipFiles.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbSaveToZipFilesActionPerformed(evt); + } + }); cbPreferedImageLanguage.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); @@ -1464,23 +1550,51 @@ public class PreferencesDialog extends javax.swing.JDialog { panelBackgroundImages.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Background images setting:")); cbUseDefaultBackground.setText("Use default image"); - cbUseDefaultBackground.addActionListener(evt -> cbUseDefaultBackgroundActionPerformed(evt)); + cbUseDefaultBackground.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbUseDefaultBackgroundActionPerformed(evt); + } + }); - txtBackgroundImagePath.addActionListener(evt -> txtBackgroundImagePathActionPerformed(evt)); + txtBackgroundImagePath.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + txtBackgroundImagePathActionPerformed(evt); + } + }); btnBrowseBackgroundImage.setText("Browse..."); - btnBrowseBackgroundImage.addActionListener(evt -> btnBrowseBackgroundImageActionPerformed(evt)); + btnBrowseBackgroundImage.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnBrowseBackgroundImageActionPerformed(evt); + } + }); - txtBattlefieldImagePath.addActionListener(evt -> txtBattlefieldImagePathActionPerformed(evt)); + txtBattlefieldImagePath.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + txtBattlefieldImagePathActionPerformed(evt); + } + }); btnBrowseBattlefieldImage.setText("Browse..."); - btnBrowseBattlefieldImage.addActionListener(evt -> btnBrowseBattlefieldImageActionPerformed(evt)); + btnBrowseBattlefieldImage.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnBrowseBattlefieldImageActionPerformed(evt); + } + }); cbUseDefaultBattleImage.setText("Use default battlefield image"); - cbUseDefaultBattleImage.addActionListener(evt -> cbUseDefaultBattleImageActionPerformed(evt)); + cbUseDefaultBattleImage.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbUseDefaultBattleImageActionPerformed(evt); + } + }); cbUseRandomBattleImage.setText("Select random battlefield image"); - cbUseRandomBattleImage.addActionListener(evt -> cbUseRandomBattleImageActionPerformed(evt)); + cbUseRandomBattleImage.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbUseRandomBattleImageActionPerformed(evt); + } + }); jLabel14.setText("Background:"); @@ -1540,13 +1654,25 @@ public class PreferencesDialog extends javax.swing.JDialog { jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Card rendering:")); cbCardRenderImageFallback.setText("Fall back to plain image based rendering"); - cbCardRenderImageFallback.addActionListener(evt -> cbCardRenderImageFallbackActionPerformed(evt)); + cbCardRenderImageFallback.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbCardRenderImageFallbackActionPerformed(evt); + } + }); cbCardRenderShowReminderText.setText("Show reminder text in rendered card textboxes"); - cbCardRenderShowReminderText.addActionListener(evt -> cbCardRenderShowReminderTextActionPerformed(evt)); + cbCardRenderShowReminderText.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbCardRenderShowReminderTextActionPerformed(evt); + } + }); cbCardRenderHideSetSymbol.setText("Hide set symbols on cards (more space on the type line for card types)"); - cbCardRenderHideSetSymbol.addActionListener(evt -> cbCardRenderHideSetSymbolActionPerformed(evt)); + cbCardRenderHideSetSymbol.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbCardRenderHideSetSymbolActionPerformed(evt); + } + }); org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); @@ -1601,22 +1727,38 @@ public class PreferencesDialog extends javax.swing.JDialog { cbEnableGameSounds.setText("Enable game sounds"); cbEnableGameSounds.setToolTipText("Sounds that will be played for certain actions (e.g. play land, attack, etc.) during the game."); - cbEnableGameSounds.addActionListener(evt -> cbEnableGameSoundsActionPerformed(evt)); + cbEnableGameSounds.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbEnableGameSoundsActionPerformed(evt); + } + }); sounds_clips.add(cbEnableGameSounds); cbEnableDraftSounds.setText("Enable draft sounds"); cbEnableDraftSounds.setToolTipText("Sounds that will be played during drafting for card picking or warining if time runs out."); - cbEnableDraftSounds.addActionListener(evt -> cbEnableDraftSoundsActionPerformed(evt)); + cbEnableDraftSounds.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbEnableDraftSoundsActionPerformed(evt); + } + }); sounds_clips.add(cbEnableDraftSounds); cbEnableSkipButtonsSounds.setText("Enable skip button sounds"); cbEnableSkipButtonsSounds.setToolTipText("Sounds that will be played if a priority skip action (F4/F5/F7/F9) or cancel skip action (F3) is used."); - cbEnableSkipButtonsSounds.addActionListener(evt -> cbEnableSkipButtonsSoundsActionPerformed(evt)); + cbEnableSkipButtonsSounds.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbEnableSkipButtonsSoundsActionPerformed(evt); + } + }); sounds_clips.add(cbEnableSkipButtonsSounds); cbEnableOtherSounds.setText("Enable other sounds"); cbEnableOtherSounds.setToolTipText("Sounds that will be played for actions outside of games (e.g. whisper, player joins your game, player submits a deck ...)."); - cbEnableOtherSounds.addActionListener(evt -> cbEnableOtherSoundsActionPerformed(evt)); + cbEnableOtherSounds.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbEnableOtherSoundsActionPerformed(evt); + } + }); sounds_clips.add(cbEnableOtherSounds); sounds_backgroundMusic.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Music")); @@ -1624,15 +1766,27 @@ public class PreferencesDialog extends javax.swing.JDialog { cbEnableBattlefieldBGM.setText("Play music during match"); cbEnableBattlefieldBGM.setToolTipText("During your matches music will be played from the seleced folder."); cbEnableBattlefieldBGM.setActionCommand("Play automatically during matches"); - cbEnableBattlefieldBGM.addActionListener(evt -> cbEnableBattlefieldBGMActionPerformed(evt)); + cbEnableBattlefieldBGM.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbEnableBattlefieldBGMActionPerformed(evt); + } + }); jLabel16.setText("Playing from folder:"); jLabel16.setToolTipText(""); - txtBattlefieldIBGMPath.addActionListener(evt -> txtBattlefieldIBGMPathActionPerformed(evt)); + txtBattlefieldIBGMPath.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + txtBattlefieldIBGMPathActionPerformed(evt); + } + }); btnBattlefieldBGMBrowse.setText("Browse..."); - btnBattlefieldBGMBrowse.addActionListener(evt -> btnBattlefieldBGMBrowseActionPerformed(evt)); + btnBattlefieldBGMBrowse.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnBattlefieldBGMBrowseActionPerformed(evt); + } + }); org.jdesktop.layout.GroupLayout sounds_backgroundMusicLayout = new org.jdesktop.layout.GroupLayout(sounds_backgroundMusic); sounds_backgroundMusic.setLayout(sounds_backgroundMusicLayout); @@ -2187,7 +2341,11 @@ public class PreferencesDialog extends javax.swing.JDialog { lblProxyType.setText("Proxy:"); - cbProxyType.addActionListener(evt -> cbProxyTypeActionPerformed(evt)); + cbProxyType.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cbProxyTypeActionPerformed(evt); + } + }); pnlProxySettings.setBorder(javax.swing.BorderFactory.createEtchedBorder()); @@ -2205,10 +2363,18 @@ public class PreferencesDialog extends javax.swing.JDialog { lblProxyPassword.setText("Password:"); - txtPasswordField.addActionListener(evt -> txtPasswordFieldActionPerformed(evt)); + txtPasswordField.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + txtPasswordFieldActionPerformed(evt); + } + }); rememberPswd.setText("Remember Password"); - rememberPswd.addActionListener(evt -> rememberPswdActionPerformed(evt)); + rememberPswd.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + rememberPswdActionPerformed(evt); + } + }); jLabel11.setFont(new java.awt.Font("Tahoma", 2, 10)); // NOI18N jLabel11.setText("Note: password won't be encrypted!"); @@ -2355,7 +2521,15 @@ public class PreferencesDialog extends javax.swing.JDialog { controlsDescriptionLabel.setVerticalAlignment(javax.swing.SwingConstants.TOP); bttnResetControls.setText("Reset to default"); - bttnResetControls.addActionListener(evt -> bttnResetControlsActionPerformed(evt)); + bttnResetControls.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bttnResetControlsActionPerformed(evt); + } + }); + + labelToggleRecordMacro.setText("Toggle Record Macro"); + + keyToggleRecordMacro.setText("keyBindButton1"); org.jdesktop.layout.GroupLayout tabControlsLayout = new org.jdesktop.layout.GroupLayout(tabControls); tabControls.setLayout(tabControlsLayout); @@ -2377,7 +2551,8 @@ public class PreferencesDialog extends javax.swing.JDialog { .add(lebelSkip) .add(labelPriorEnd) .add(labelSkipStep) - .add(labelConfirm)) + .add(labelConfirm) + .add(labelToggleRecordMacro)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED) .add(tabControlsLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(keyConfirm, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) @@ -2388,9 +2563,10 @@ public class PreferencesDialog extends javax.swing.JDialog { .add(keyMainStep, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(keyPriorEnd, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(keySkipStep, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) - .add(keyEndStep, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) + .add(keyEndStep, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .add(keyToggleRecordMacro, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) - .add(controlsDescriptionLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 498, Short.MAX_VALUE))) + .add(controlsDescriptionLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 441, Short.MAX_VALUE))) .addContainerGap()) ); tabControlsLayout.setVerticalGroup( @@ -2434,7 +2610,11 @@ public class PreferencesDialog extends javax.swing.JDialog { .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED) .add(tabControlsLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(labelPriorEnd) - .add(keyPriorEnd, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))) + .add(keyPriorEnd, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED) + .add(tabControlsLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) + .add(labelToggleRecordMacro) + .add(keyToggleRecordMacro, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))) .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED) .add(bttnResetControls) .addContainerGap()) @@ -2442,19 +2622,27 @@ public class PreferencesDialog extends javax.swing.JDialog { tabsPanel.addTab("Controls", tabControls); - saveButton.setText("Save"); + saveButton.setLabel("Save"); saveButton.setMaximumSize(new java.awt.Dimension(100, 30)); saveButton.setMinimumSize(new java.awt.Dimension(100, 30)); saveButton.setPreferredSize(new java.awt.Dimension(100, 30)); saveButton.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM); - saveButton.addActionListener(evt -> saveButtonActionPerformed(evt)); + saveButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + saveButtonActionPerformed(evt); + } + }); - exitButton.setText("Exit"); + exitButton.setLabel("Exit"); exitButton.setMaximumSize(new java.awt.Dimension(100, 30)); exitButton.setMinimumSize(new java.awt.Dimension(100, 30)); exitButton.setPreferredSize(new java.awt.Dimension(100, 30)); exitButton.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM); - exitButton.addActionListener(evt -> exitButtonActionPerformed(evt)); + exitButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + exitButtonActionPerformed(evt); + } + }); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); getContentPane().setLayout(layout); @@ -2632,6 +2820,7 @@ public class PreferencesDialog extends javax.swing.JDialog { save(prefs, dialog.keyYourTurn); save(prefs, dialog.keySkipStack); save(prefs, dialog.keyPriorEnd); + save(prefs, dialog.keyToggleRecordMacro); // Avatar if (selectedAvatarId < MIN_AVATAR_ID || selectedAvatarId > MAX_AVATAR_ID) { @@ -3184,6 +3373,7 @@ public class PreferencesDialog extends javax.swing.JDialog { load(prefs, dialog.keyYourTurn); load(prefs, dialog.keySkipStack); load(prefs, dialog.keyPriorEnd); + load(prefs, dialog.keyToggleRecordMacro); } private static void loadSelectedAvatar(Preferences prefs) { @@ -3410,6 +3600,8 @@ public class PreferencesDialog extends javax.swing.JDialog { return KeyEvent.VK_F10; case KEY_CONTROL_PRIOR_END: return KeyEvent.VK_F11; + case KEY_CONTROL_TOGGLE_MACRO: + return KeyEvent.VK_F8; default: return 0; } @@ -3550,7 +3742,8 @@ public class PreferencesDialog extends javax.swing.JDialog { keyPriorEnd, keySkipStack, keySkipStep, - keyYourTurn + keyYourTurn, + keyToggleRecordMacro ); } @@ -3661,6 +3854,7 @@ public class PreferencesDialog extends javax.swing.JDialog { private mage.client.components.KeyBindButton keyPriorEnd; private mage.client.components.KeyBindButton keySkipStack; private mage.client.components.KeyBindButton keySkipStep; + private mage.client.components.KeyBindButton keyToggleRecordMacro; private mage.client.components.KeyBindButton keyYourTurn; private javax.swing.JLabel labelCancel; private javax.swing.JLabel labelCardSizeHand; @@ -3681,6 +3875,7 @@ public class PreferencesDialog extends javax.swing.JDialog { private javax.swing.JLabel labelPriorEnd; private javax.swing.JLabel labelSkipStep; private javax.swing.JLabel labelStackWidth; + private javax.swing.JLabel labelToggleRecordMacro; private javax.swing.JLabel labelTooltipSize; private javax.swing.JLabel labelYourTurn; private javax.swing.JLabel lblProxyPassword; 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 0646da5e576..4dcfba71424 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -1443,8 +1443,9 @@ public final class GamePanel extends javax.swing.JPanel { btnToggleMacro.setContentAreaFilled(false); btnToggleMacro.setBorder(new EmptyBorder(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE)); - btnToggleMacro.setIcon(new ImageIcon(ImageManagerImpl.instance.getSkipNextTurnButtonImage())); - btnToggleMacro.setToolTipText("Toggle Record Macro (F8)."); + btnToggleMacro.setIcon(new ImageIcon(ImageManagerImpl.instance.getToggleRecordMacroButtonImage())); + btnToggleMacro.setToolTipText("Toggle Record Macro (" + + getCachedKeyText(KEY_CONTROL_TOGGLE_MACRO) + ")."); btnToggleMacro.setFocusable(false); btnToggleMacro.addMouseListener(new MouseAdapter() { @Override @@ -1455,7 +1456,7 @@ public final class GamePanel extends javax.swing.JPanel { } }); - KeyStroke kst = KeyStroke.getKeyStroke(KeyEvent.VK_F8, 0); + KeyStroke kst = getCachedKeystroke(KEY_CONTROL_TOGGLE_MACRO); this.getInputMap(c).put(kst, "F8_PRESS"); this.getActionMap().put("F8_PRESS", new AbstractAction() { @Override diff --git a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java index 639cf377926..dbd37a147be 100644 --- a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java +++ b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java @@ -420,6 +420,9 @@ public class CallbackClientImpl implements CallbackClient { .append("
") .append(KeyEvent.getKeyText(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CONTROL_CANCEL_SKIP, 114))) .append(" - Undo F4/F5/F7/F9/F11") + .append("
") + .append(KeyEvent.getKeyText(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CONTROL_TOGGLE_MACRO, 119))) + .append(" - Toggle recording a sequence of actions to repeat") .append("
").append(System.getProperty("os.name").contains("Mac OS X") ? "Cmd" : "Ctrl").append(" + click - Hold priority while casting a spell or activating an ability").toString(), null, MessageType.USER_INFO, ChatMessage.MessageColor.BLUE); break; 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 8da639e6d82..ec5c4c485ad 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 @@ -43,6 +43,7 @@ public interface ImageManager { Image getSkipStackButtonImage(); Image getSkipEndStepBeforeYourTurnButtonImage(); Image getSkipYourNextTurnButtonImage(); + Image getToggleRecordMacroButtonImage(); Image getPhaseImage(String phase); 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 9b08854b3fe..ad7a161edcd 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 @@ -339,6 +339,14 @@ public enum ImageManagerImpl implements ImageManager { } return imageSkipYourNextTurnButton; } + + @Override + public Image getToggleRecordMacroButtonImage() { + if(imageToggleRecordMacroButton == null) { + imageToggleRecordMacroButton = getBufferedImageFromResource("/buttons/toggle_macro.png"); + } + return imageToggleRecordMacroButton; + } protected static Image getImageFromResourceTransparent(String path, Color mask, Rectangle rec) { BufferedImage image; @@ -433,6 +441,7 @@ public enum ImageManagerImpl implements ImageManager { private static BufferedImage imageSkipStackButton; private static BufferedImage imageSkipUntilEndStepBeforeYourTurnButton; private static BufferedImage imageSkipYourNextTurnButton; + private static BufferedImage imageToggleRecordMacroButton; private static Map phasesImages; } diff --git a/Mage.Client/src/main/resources/buttons/toggle_macro.png b/Mage.Client/src/main/resources/buttons/toggle_macro.png new file mode 100644 index 0000000000000000000000000000000000000000..f615b4a43e637d14249fc64125b7b90b09d9568b GIT binary patch literal 2123 zcmV-R2(q5KKx~wfTAa+lz-Rzu zXP1{00L2;S0NEl**?8>L35Z<;^aPOo1*AS5%x2;M zn*(9XfY>Fe6(D;VobwARi!#$QN)!w&EiDxsQ}UBi6@n{^OHy--6+H8j^NR}dixNvx zQ-EqA?gIlsh(b_^X#h1^Xp-n}f&df`5Z32FaQHHcok55pKyqnO8I;M$WK5WkFk_Ac z1B3rk1_qWt2r-jh28IPX3=I5J5n^hF3=9JL3=I3`006+oPyI$P%!L2|00v@9M??Vs z0RI60puMM)00009a7bBm000XU000XU0RWnu7ytkO2XskIMF-&q76v9MZXfub000J_ zNkl^eDjM%e5d;mTGXkY_kH)0YLCj%2Xe#CJ*jvXgyGPN4nm-b^ET@05j94es$z%$BiQ$?P#s>-jYX#HWT4oAb58u3Gm)y zoFhv#CeNvL?oz2~gy6>3)}{yE(?59UJLfvIdN+zRQ6VBK6bQ5-bc#$B-Whxd;KSkD z26&`(c<)eBgAX|8ao*vre|PH4=|5<#_=zzVYf_BuK&smPpTCr+`>BBdlvlb`A|O}-x|d+b#;S{K-Qy2;}F0!fy@A)WWjVzCBLpp+y{ zGXw&J$2s?oPU2)Rj`yfWl9Q*$2+nc-!Z~bixpVg}AK4xd{05CB*$>PGo!E~n1PLU-UI?_}s6}q~*=6;BmndCkf{-oChg!!83h!8l=Dl zPqCw&H{QHTv7;RqJQputBuP>pJX~gJ=>bAW;v~U)&;9xPT)%!D7d)4)Tx!zW1rK<_ z{uKg*fXtmE%`KV9saAI|))749x#7f#ldL`7z`4MqwGGC{$C;U#VR?B4=K`anC+PiB z-zzca1HprHp?>>7cTYFtV`mr~I(~qA7r1lh6E0l1K!5)rYisNHM!(_V5&rz)U$}hv zGR_4iC#F~}J;J#_ZY+=2H}H*duU>tFk3RYb&IQhlPc-Sh|Gmb%2_X;wSx**noOM|1 zan>F%RH;_z?C2nbK(Vbrxm>1F-l3NKD=1mFhX1Db zexG_L4v0`Ehx^|@(%DXXu}E8?jqaWA)VupqWiIbSwJ9nF~VzGm;NHDC*4NkR@9$^$_z)l8yv4O^*GSWpo}O;fG+|_9gn_{U{`$AS z^X+ealc$?cSz20Z(mT&`0M<6kjT|9hokM*6>bWpHaE#t#$LKtIl(p5>CO=vz6v*@Z zB`k^}d?TiQ7WR2avDikMX8*I@tMtD4$pZj#Ti^B?1VYqrEhR!U4`fWKnp;ry7$*op=4|O04W;;__{;XLe_VM5FkWAiPjB+K7=MG zDD%u=tik4%EX!JY^^Gx2m^LmajuUFN-Ih*+eF&7RaWesV>Q>9uy%SO@_V!|gkVKI> z$e3DX@^PB6SlWDEF!zoSSX2GIJwx7wuccW|xf-*zvrF)vNUQn@@emW?Lmi7!u&4J)nIqDbMaCj?qtLcJK08S>nYswZ2OT4#IF=Ei*E#RTES zlXI&~+=qa1j@%fs%>1JCc=JQuC=Y!gEGl?@>6AlAkS&%Ecwet}Tj$Ag^L~I2nwI(0 z@ZcyS{7eY(T_HHzQtKa>3nBcGAbz{@_{pPv{6A(o?V*|uqTB!g002ovPDHLkV1k1A B-ZTIJ literal 0 HcmV?d00001 From fee630a0ac43fa4f04faf22a85fb570be5c85e5b Mon Sep 17 00:00:00 2001 From: Devon Richards Date: Sat, 24 Jun 2017 11:23:58 -0500 Subject: [PATCH 7/7] Small cleanup --- .../client/remote/CallbackClientImpl.java | 2 +- .../src/mage/player/human/PlayerResponse.java | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java index dbd37a147be..6e1db68012e 100644 --- a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java +++ b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java @@ -422,7 +422,7 @@ public class CallbackClientImpl implements CallbackClient { .append(" - Undo F4/F5/F7/F9/F11") .append("
") .append(KeyEvent.getKeyText(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CONTROL_TOGGLE_MACRO, 119))) - .append(" - Toggle recording a sequence of actions to repeat") + .append(" - Toggle recording a sequence of actions to repeat. Will not pause if interrupted and can fail if a selected card changes such as when scrying top card to bottom.") .append("
").append(System.getProperty("os.name").contains("Mac OS X") ? "Cmd" : "Ctrl").append(" + click - Hold priority while casting a spell or activating an ability").toString(), null, MessageType.USER_INFO, ChatMessage.MessageColor.BLUE); break; diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/PlayerResponse.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/PlayerResponse.java index 5d82f843748..601ccd3d6a0 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/PlayerResponse.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/PlayerResponse.java @@ -50,14 +50,17 @@ public class PlayerResponse implements Serializable { } public String toString() { - String res = new String(); - res += responseString + ","; - res += responseUUID + ","; - res += responseBoolean + ","; - res += responseInteger + ","; - res += responseManaType + ","; - res += responseManaTypePlayerId; - return res; + return new StringBuilder(responseString) + .append(',') + .append(responseUUID) + .append(',') + .append(responseBoolean) + .append(',') + .append(responseInteger) + .append(',') + .append(responseManaType) + .append(',') + .append(responseManaTypePlayerId).toString(); } public PlayerResponse(PlayerResponse other) {