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 extends IButton> view;
+
+ public GauntletWinLoseController(IWinLoseView extends IButton> 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();
+}