diff --git a/.gitattributes b/.gitattributes index 9423fb67e08..1cae4a903de 100644 --- a/.gitattributes +++ b/.gitattributes @@ -16644,6 +16644,7 @@ forge-gui/src/main/java/forge/events/UiEventAttackerDeclared.java -text forge-gui/src/main/java/forge/events/UiEventBlockerAssigned.java -text forge-gui/src/main/java/forge/gauntlet/GauntletData.java -text forge-gui/src/main/java/forge/gauntlet/GauntletIO.java -text +forge-gui/src/main/java/forge/gauntlet/GauntletWinLoseController.java -text forge-gui/src/main/java/forge/interfaces/IButton.java -text forge-gui/src/main/java/forge/interfaces/ICheckBox.java -text forge-gui/src/main/java/forge/interfaces/IComboBox.java -text diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java index 3b2699366b1..052da685a6c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java @@ -17,21 +17,9 @@ package forge.screens.match; * along with this program. If not, see . */ -import com.google.common.collect.Lists; - -import forge.GuiBase; -import forge.LobbyPlayer; -import forge.Singletons; import forge.assets.FSkinProp; -import forge.control.FControl; -import forge.deck.Deck; import forge.game.Game; -import forge.game.GameType; -import forge.game.Match; -import forge.game.player.RegisteredPlayer; -import forge.gauntlet.GauntletData; -import forge.gauntlet.GauntletIO; -import forge.model.FModel; +import forge.gauntlet.GauntletWinLoseController; import forge.toolbox.FLabel; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedPanel; @@ -47,6 +35,8 @@ import java.util.List; * games. */ public class GauntletWinLose extends ControlWinLose { + private final GauntletWinLoseController controller; + /** * Instantiates a new gauntlet win/lose handler. * @@ -55,6 +45,53 @@ public class GauntletWinLose extends ControlWinLose { */ public GauntletWinLose(final ViewWinLose view0, Game lastGame) { super(view0, lastGame); + controller = new GauntletWinLoseController(view0, lastGame) { + @Override + protected void showOutcome(String message1, String message2, FSkinProp icon, List lstEventNames, List lstEventRecords, int len, int num) { + final JLabel lblTitle = new FLabel.Builder().text("Gauntlet Progress") + .fontAlign(SwingConstants.CENTER).fontSize(18).build(); + + final JPanel pnlResults = new JPanel(); + pnlResults.setOpaque(false); + pnlResults.setLayout(new MigLayout("insets 0, gap 0, wrap " + + (int) Math.ceil(len / 2d) + ", flowy")); + + JLabel lblTemp; + for (int i = 0; i < len; i++) { + lblTemp = new FLabel.Builder().fontSize(14).build(); + + if (i <= num) { + lblTemp.setForeground(Color.green.darker()); + lblTemp.setText((i + 1) + ". " + lstEventNames.get(i) + + " (" + lstEventRecords.get(i) + ")"); + } + else { + lblTemp.setForeground(Color.red); + lblTemp.setText((i + 1) + ". ??????"); + } + + pnlResults.add(lblTemp, "w 50%!, h 25px!, gap 0 0 5px 0"); + } + + final SkinnedPanel pnl = view0.getPnlCustom(); + pnl.setLayout(new MigLayout("insets 0, gap 0, wrap, ax center")); + pnl.setOpaque(true); + pnl.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); + pnl.add(lblTitle, "gap 0 0 20px 10px, ax center"); + pnl.add(pnlResults, "w 96%!, growy, pushy, gap 2% 0 0 0"); + + if (message1 != null) { + pnl.add(new FLabel.Builder().icon(FSkin.getIcon(icon)).build(), "w 120px!, h 120px!, ax center"); + pnl.add(new FLabel.Builder().fontSize(24).text(message1).build(), "w 96%!, h 40px!, gap 2% 0 0 0"); + pnl.add(new FLabel.Builder().fontSize(18).text(message2).build(), "w 96%!, h 40px!, gap 2% 0 0 50px"); + } + } + + @Override + protected void saveOptions() { + GauntletWinLose.this.saveOptions(); + } + }; } /** @@ -65,152 +102,13 @@ public class GauntletWinLose extends ControlWinLose { */ @Override public final boolean populateCustomPanel() { - final GauntletData gd = FModel.getGauntletData(); - final List lstEventNames = gd.getEventNames(); - final List lstDecks = gd.getDecks(); - final List lstEventRecords = gd.getEventRecords(); - final int len = lstDecks.size(); - final int num = gd.getCompleted(); - JLabel lblGraphic = null; - JLabel lblMessage1 = null; - JLabel lblMessage2 = null; - - // No restarts. - this.getView().getBtnRestart().setVisible(false); - - // Generic event record. - lstEventRecords.set(gd.getCompleted(), "Ongoing"); - - final Match match = lastGame.getMatch(); - - // Match won't be saved until it is over. This opens up a cheat - // or failsafe mechanism (depending on your perspective) in which - // the player can restart Forge to replay a match. - // Pretty sure this can't be fixed until in-game states can be - // saved. Doublestrike 07-10-12 - LobbyPlayer questPlayer = GuiBase.getInterface().getQuestPlayer(); - - // In all cases, update stats. - lstEventRecords.set(gd.getCompleted(), match.getGamesWonBy(questPlayer) + " - " - + (match.getPlayedGames().size() - match.getGamesWonBy(questPlayer))); - - if (match.isMatchOver()) { - gd.setCompleted(gd.getCompleted() + 1); - - // Win match case - if (match.isWonBy(questPlayer)) { - // Gauntlet complete: Remove save file - if (gd.getCompleted() == lstDecks.size()) { - lblGraphic = new FLabel.Builder() - .icon(FSkin.getIcon(FSkinProp.ICO_QUEST_COIN)).build(); - lblMessage1 = new FLabel.Builder().fontSize(24) - .text("CONGRATULATIONS!").build(); - lblMessage2 = new FLabel.Builder().fontSize(18) - .text("You made it through the gauntlet!").build(); - - this.getView().getBtnContinue().setVisible(false); - this.getView().getBtnContinue().repaintSelf(); - this.getView().getBtnQuit().setText("OK"); - - // Remove save file if it's a quickie, or just reset it. - if (gd.getName().startsWith(GauntletIO.PREFIX_QUICK)) { - GauntletIO.getGauntletFile(gd).delete(); - } - else { - gd.reset(); - } - } - // Or, save and move to next game - else { - gd.stamp(); - GauntletIO.saveGauntlet(gd); - - this.getView().getBtnContinue().setVisible(true); - this.getView().getBtnContinue().setEnabled(true); - this.getView().getBtnQuit().setText("Save and Quit"); - } - } - // Lose match case; stop gauntlet. - else { - lblGraphic = new FLabel.Builder() - .icon(FSkin.getIcon(FSkinProp.ICO_QUEST_HEART)).build(); - lblMessage1 = new FLabel.Builder().fontSize(24) - .text("DEFEATED!").build(); - lblMessage2 = new FLabel.Builder().fontSize(18) - .text("You have failed to pass the gauntlet.").build(); - - this.getView().getBtnContinue().setVisible(false); - - // Remove save file if it's a quickie, or just reset it. - if (gd.getName().startsWith(GauntletIO.PREFIX_QUICK)) { - GauntletIO.getGauntletFile(gd).delete(); - } - else { - gd.reset(); - } - } - } - - gd.setEventRecords(lstEventRecords); - - // Custom panel display - final JLabel lblTitle = new FLabel.Builder().text("Gauntlet Progress") - .fontAlign(SwingConstants.CENTER).fontSize(18).build(); - - final JPanel pnlResults = new JPanel(); - pnlResults.setOpaque(false); - pnlResults.setLayout(new MigLayout("insets 0, gap 0, wrap " - + (int) Math.ceil(gd.getDecks().size() / 2d) + ", flowy")); - - JLabel lblTemp; - for (int i = 0; i < len; i++) { - lblTemp = new FLabel.Builder().fontSize(14).build(); - - if (i <= num) { - lblTemp.setForeground(Color.green.darker()); - lblTemp.setText((i + 1) + ". " + lstEventNames.get(i) - + " (" + lstEventRecords.get(i) + ")"); - } - else { - lblTemp.setForeground(Color.red); - lblTemp.setText((i + 1) + ". ??????"); - } - - pnlResults.add(lblTemp, "w 50%!, h 25px!, gap 0 0 5px 0"); - } - - final SkinnedPanel pnl = this.getView().getPnlCustom(); - pnl.setLayout(new MigLayout("insets 0, gap 0, wrap, ax center")); - pnl.setOpaque(true); - pnl.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); - pnl.add(lblTitle, "gap 0 0 20px 10px, ax center"); - pnl.add(pnlResults, "w 96%!, growy, pushy, gap 2% 0 0 0"); - - if (lblGraphic != null) { - pnl.add(lblGraphic, "w 120px!, h 120px!, ax center"); - pnl.add(lblMessage1, "w 96%!, h 40px!, gap 2% 0 0 0"); - pnl.add(lblMessage2, "w 96%!, h 40px!, gap 2% 0 0 50px"); - } - + controller.showOutcome(); return true; } - + @Override public void actionOnContinue() { - if (lastGame.getMatch().isMatchOver()) { - // To change the AI deck, we have to create a new match. - GauntletData gd = FModel.getGauntletData(); - Deck aiDeck = gd.getDecks().get(gd.getCompleted()); - List players = Lists.newArrayList(); - FControl fc = Singletons.getControl(); - players.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(fc.getGuiPlayer())); - players.add(new RegisteredPlayer(aiDeck).setPlayer(fc.getAiPlayer())); - - saveOptions(); - fc.endCurrentGame(); - - fc.startMatch(GameType.Gauntlet, players); - } else { + if (!controller.actionOnContinue()) { super.actionOnContinue(); } } diff --git a/forge-gui-mobile/src/forge/deck/FDeckChooser.java b/forge-gui-mobile/src/forge/deck/FDeckChooser.java index 19b2beaafe7..af411086d0b 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckChooser.java +++ b/forge-gui-mobile/src/forge/deck/FDeckChooser.java @@ -52,7 +52,7 @@ public class FDeckChooser extends FScreen { private final ForgePreferences prefs = FModel.getPreferences(); private FPref stateSetting = null; - //Show dialog to select a deck + //Show screen to select a deck public static void promptForDeck(String title, GameType gameType, boolean forAi, final Callback callback) { FThreads.assertExecutedByEdt(true); final FDeckChooser chooser = new FDeckChooser(gameType, forAi, null) { diff --git a/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java b/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java index 316f6b68fa9..cc62bc8ab49 100644 --- a/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java +++ b/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java @@ -17,22 +17,12 @@ package forge.screens.match.winlose; * along with this program. If not, see . */ -import com.google.common.collect.Lists; - -import forge.GuiBase; -import forge.LobbyPlayer; -import forge.assets.FSkinImage; -import forge.deck.Deck; +import forge.FThreads; +import forge.assets.FSkinProp; import forge.game.Game; -import forge.game.GameType; -import forge.game.Match; -import forge.game.player.RegisteredPlayer; -import forge.gauntlet.GauntletData; -import forge.gauntlet.GauntletIO; -import forge.interfaces.IGuiBase; -import forge.model.FModel; -import forge.screens.match.FControl; -import forge.toolbox.FOptionPane; +import forge.gauntlet.GauntletWinLoseController; +import forge.util.gui.SOptionPane; + import java.util.List; /** @@ -40,6 +30,8 @@ import java.util.List; * games. */ public class GauntletWinLose extends ControlWinLose { + private final GauntletWinLoseController controller; + /** * Instantiates a new gauntlet win/lose handler. * @@ -48,125 +40,52 @@ public class GauntletWinLose extends ControlWinLose { */ public GauntletWinLose(final ViewWinLose view0, Game lastGame) { super(view0, lastGame); + controller = new GauntletWinLoseController(view0, lastGame) { + @Override + protected void showOutcome(final String message1, final String message2, final FSkinProp icon, final List lstEventNames, final List lstEventRecords, final int len, final int num) { + FThreads.invokeInBackgroundThread(new Runnable() { + @Override + public void run() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < len; i++) { + if (i <= num) { + sb.append((i + 1) + ". " + lstEventNames.get(i) + + " (" + lstEventRecords.get(i) + ")\n"); + } + else { + sb.append((i + 1) + ". ??????\n"); + } + } + + if (message1 != null) { + sb.append("\n"); + sb.append(message1 + "\n\n"); + sb.append(message2); + } + else { + sb.deleteCharAt(sb.length() - 1); //remove final new line character + } + + SOptionPane.showMessageDialog(sb.toString(), "Gauntlet Progress", icon); + } + }); + } + + @Override + protected void saveOptions() { + GauntletWinLose.this.saveOptions(); + } + }; } @Override public final void showRewards() { - final GauntletData gd = FModel.getGauntletData(); - final List lstEventNames = gd.getEventNames(); - final List lstDecks = gd.getDecks(); - final List lstEventRecords = gd.getEventRecords(); - final int len = lstDecks.size(); - final int num = gd.getCompleted(); - FSkinImage icon = null; - String message1 = ""; - String message2 = ""; - - // No restarts. - getView().getBtnRestart().setVisible(false); - - // Generic event record. - lstEventRecords.set(gd.getCompleted(), "Ongoing"); - - final Match match = lastGame.getMatch(); - - // Match won't be saved until it is over. This opens up a cheat - // or failsafe mechanism (depending on your perspective) in which - // the player can restart Forge to replay a match. - // Pretty sure this can't be fixed until in-game states can be - // saved. Doublestrike 07-10-12 - LobbyPlayer questPlayer = GuiBase.getInterface().getQuestPlayer(); - - // In all cases, update stats. - lstEventRecords.set(gd.getCompleted(), match.getGamesWonBy(questPlayer) + " - " - + (match.getPlayedGames().size() - match.getGamesWonBy(questPlayer))); - - if (match.isMatchOver()) { - gd.setCompleted(gd.getCompleted() + 1); - - // Win match case - if (match.isWonBy(questPlayer)) { - // Gauntlet complete: Remove save file - if (gd.getCompleted() == lstDecks.size()) { - icon = FSkinImage.QUEST_COIN; - message1 = "CONGRATULATIONS!"; - message2 = "You made it through the gauntlet!"; - - getView().getBtnContinue().setVisible(false); - getView().getBtnQuit().setText("OK"); - - // Remove save file if it's a quickie, or just reset it. - if (gd.getName().startsWith(GauntletIO.PREFIX_QUICK)) { - GauntletIO.getGauntletFile(gd).delete(); - } - else { - gd.reset(); - } - } - // Or, save and move to next game - else { - gd.stamp(); - GauntletIO.saveGauntlet(gd); - - getView().getBtnContinue().setVisible(true); - getView().getBtnContinue().setEnabled(true); - getView().getBtnQuit().setText("Save and Quit"); - } - } - // Lose match case; stop gauntlet. - else { - icon = FSkinImage.QUEST_HEART; - message1 = "DEFEATED!"; - message2 = "You have failed to pass the gauntlet."; - - getView().getBtnContinue().setVisible(false); - - // Remove save file if it's a quickie, or just reset it. - if (gd.getName().startsWith(GauntletIO.PREFIX_QUICK)) { - GauntletIO.getGauntletFile(gd).delete(); - } - else { - gd.reset(); - } - } - } - - gd.setEventRecords(lstEventRecords); - - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < len; i++) { - if (i <= num) { - sb.append((i + 1) + ". " + lstEventNames.get(i) - + " (" + lstEventRecords.get(i) + ")\n"); - } - else { - sb.append((i + 1) + ". ??????\n"); - } - } - - sb.append("\n"); - sb.append(message1 + "\n\n"); - sb.append(message2); - - FOptionPane.showMessageDialog(sb.toString(), "Gauntlet Progress", icon); + controller.showOutcome(); } @Override public void actionOnContinue() { - if (lastGame.getMatch().isMatchOver()) { - // To change the AI deck, we have to create a new match. - GauntletData gd = FModel.getGauntletData(); - Deck aiDeck = gd.getDecks().get(gd.getCompleted()); - List players = Lists.newArrayList(); - IGuiBase fc = GuiBase.getInterface(); - players.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(fc.getGuiPlayer())); - players.add(new RegisteredPlayer(aiDeck).setPlayer(fc.createAiPlayer())); - - saveOptions(); - FControl.endCurrentGame(); - - FControl.startMatch(GameType.Gauntlet, players); - } else { + if (!controller.actionOnContinue()) { super.actionOnContinue(); } } diff --git a/forge-gui/src/main/java/forge/gauntlet/GauntletWinLoseController.java b/forge-gui/src/main/java/forge/gauntlet/GauntletWinLoseController.java new file mode 100644 index 00000000000..4c8bf3d65f0 --- /dev/null +++ b/forge-gui/src/main/java/forge/gauntlet/GauntletWinLoseController.java @@ -0,0 +1,136 @@ +package forge.gauntlet; + +import java.util.List; + +import com.google.common.collect.Lists; + +import forge.GuiBase; +import forge.LobbyPlayer; +import forge.assets.FSkinProp; +import forge.deck.Deck; +import forge.game.Game; +import forge.game.GameType; +import forge.game.Match; +import forge.game.player.RegisteredPlayer; +import forge.interfaces.IButton; +import forge.interfaces.IGuiBase; +import forge.interfaces.IWinLoseView; +import forge.model.FModel; + +public abstract class GauntletWinLoseController { + private final Game lastGame; + private final IWinLoseView view; + + public GauntletWinLoseController(IWinLoseView view0, Game lastGame0) { + view = view0; + lastGame = lastGame0; + } + + public void showOutcome() { + final GauntletData gd = FModel.getGauntletData(); + final List lstEventNames = gd.getEventNames(); + final List lstDecks = gd.getDecks(); + final List lstEventRecords = gd.getEventRecords(); + final int len = lstDecks.size(); + final int num = gd.getCompleted(); + FSkinProp icon = null; + String message1 = null; + String message2 = null; + + // No restarts. + view.getBtnRestart().setVisible(false); + + // Generic event record. + lstEventRecords.set(gd.getCompleted(), "Ongoing"); + + final Match match = lastGame.getMatch(); + + // Match won't be saved until it is over. This opens up a cheat + // or failsafe mechanism (depending on your perspective) in which + // the player can restart Forge to replay a match. + // Pretty sure this can't be fixed until in-game states can be + // saved. Doublestrike 07-10-12 + LobbyPlayer questPlayer = GuiBase.getInterface().getQuestPlayer(); + + // In all cases, update stats. + lstEventRecords.set(gd.getCompleted(), match.getGamesWonBy(questPlayer) + " - " + + (match.getPlayedGames().size() - match.getGamesWonBy(questPlayer))); + + if (match.isMatchOver()) { + gd.setCompleted(gd.getCompleted() + 1); + + // Win match case + if (match.isWonBy(questPlayer)) { + // Gauntlet complete: Remove save file + if (gd.getCompleted() == lstDecks.size()) { + icon = FSkinProp.ICO_QUEST_COIN; + message1 = "CONGRATULATIONS!"; + message2 = "You made it through the gauntlet!"; + + view.getBtnContinue().setVisible(false); + view.getBtnQuit().setText("OK"); + + // Remove save file if it's a quickie, or just reset it. + if (gd.getName().startsWith(GauntletIO.PREFIX_QUICK)) { + GauntletIO.getGauntletFile(gd).delete(); + } + else { + gd.reset(); + } + } + // Or, save and move to next game + else { + gd.stamp(); + GauntletIO.saveGauntlet(gd); + + view.getBtnContinue().setVisible(true); + view.getBtnContinue().setEnabled(true); + view.getBtnQuit().setText("Save and Quit"); + } + } + // Lose match case; stop gauntlet. + else { + icon = FSkinProp.ICO_QUEST_HEART; + message1 = "DEFEATED!"; + message2 = "You have failed to pass the gauntlet."; + + view.getBtnContinue().setVisible(false); + + // Remove save file if it's a quickie, or just reset it. + if (gd.getName().startsWith(GauntletIO.PREFIX_QUICK)) { + GauntletIO.getGauntletFile(gd).delete(); + } + else { + gd.reset(); + } + } + } + + gd.setEventRecords(lstEventRecords); + + showOutcome(message1, message2, icon, lstEventNames, lstEventRecords, len, num); + } + + public final boolean actionOnContinue() { + if (lastGame.getMatch().isMatchOver()) { + // To change the AI deck, we have to create a new match. + GauntletData gd = FModel.getGauntletData(); + Deck aiDeck = gd.getDecks().get(gd.getCompleted()); + List players = Lists.newArrayList(); + IGuiBase fc = GuiBase.getInterface(); + players.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(fc.getGuiPlayer())); + players.add(new RegisteredPlayer(aiDeck).setPlayer(fc.createAiPlayer())); + + view.hide(); + saveOptions(); + GuiBase.getInterface().endCurrentGame(); + + GuiBase.getInterface().startMatch(GameType.Gauntlet, players); + return true; + } + return false; + } + + protected abstract void showOutcome(String message1, String message2, FSkinProp icon, List lstEventNames, List lstEventRecords, int len, int num); + protected abstract void saveOptions(); +}