From 2e302bcd6a77cb5c690b6d8498e7782a960fef36 Mon Sep 17 00:00:00 2001 From: drdev Date: Sun, 3 Jul 2016 02:50:12 +0000 Subject: [PATCH] Refactor quest tournaments logic to make them easier to implement for Android --- .gitattributes | 2 + .../src/main/java/forge/GuiDesktop.java | 9 + .../home/quest/CSubmenuQuestDraft.java | 614 +----------------- .../home/quest/VSubmenuQuestDraft.java | 140 +++- forge-gui-mobile/src/forge/GuiMobile.java | 10 + .../main/java/forge/interfaces/IGuiBase.java | 1 + .../forge/quest/IQuestTournamentView.java | 25 + .../java/forge/quest/QuestDraftUtils.java | 9 +- .../quest/QuestTournamentController.java | 446 +++++++++++++ 9 files changed, 624 insertions(+), 632 deletions(-) create mode 100644 forge-gui/src/main/java/forge/quest/IQuestTournamentView.java create mode 100644 forge-gui/src/main/java/forge/quest/QuestTournamentController.java diff --git a/.gitattributes b/.gitattributes index 0e8506cbdf3..c8067da183f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -19626,6 +19626,7 @@ forge-gui/src/main/java/forge/properties/ForgePreferences.java svneol=native#tex forge-gui/src/main/java/forge/properties/package-info.java svneol=native#text/plain forge-gui/src/main/java/forge/quest/BoosterUtils.java svneol=native#text/plain forge-gui/src/main/java/forge/quest/IQuestRewardCard.java -text +forge-gui/src/main/java/forge/quest/IQuestTournamentView.java -text forge-gui/src/main/java/forge/quest/IVQuestStats.java -text forge-gui/src/main/java/forge/quest/QuestController.java -text forge-gui/src/main/java/forge/quest/QuestDeckGroupMap.java -text @@ -19642,6 +19643,7 @@ forge-gui/src/main/java/forge/quest/QuestRewardCard.java -text forge-gui/src/main/java/forge/quest/QuestRewardCardDuplicate.java -text forge-gui/src/main/java/forge/quest/QuestRewardCardFiltered.java -text forge-gui/src/main/java/forge/quest/QuestSpellShop.java -text +forge-gui/src/main/java/forge/quest/QuestTournamentController.java -text forge-gui/src/main/java/forge/quest/QuestUtil.java svneol=native#text/plain forge-gui/src/main/java/forge/quest/QuestUtilCards.java -text forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java -text diff --git a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java index 7d8130a755c..4e2c3dd5933 100644 --- a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java +++ b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java @@ -27,6 +27,7 @@ import forge.download.GuiDownloadService; import forge.download.GuiDownloader; import forge.error.BugReportDialog; import forge.gui.BoxedProductCardListViewer; +import forge.gui.CardListChooser; import forge.gui.CardListViewer; import forge.gui.GuiChoose; import forge.gui.framework.FScreen; @@ -182,6 +183,14 @@ public class GuiDesktop implements IGuiBase { return viewer.skipTheRest(); } + @Override + public PaperCard chooseCard(String title, String message, List list) { + final CardListChooser cardListChooser = new CardListChooser(title, message, list); + cardListChooser.setVisible(true); + cardListChooser.dispose(); + return cardListChooser.getSelectedCard(); + } + @Override public int getAvatarCount() { if (FSkin.isLoaded()) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestDraft.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestDraft.java index 415e16a546c..295109bf58a 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestDraft.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestDraft.java @@ -1,51 +1,11 @@ package forge.screens.home.quest; -import com.beust.jcommander.internal.Lists; -import com.google.common.collect.ImmutableList; -import forge.GuiBase; -import forge.Singletons; import forge.UiCommand; -import forge.assets.FSkinProp; import forge.deck.DeckGroup; -import forge.game.GameType; -import forge.gui.BoxedProductCardListViewer; -import forge.gui.CardListChooser; -import forge.gui.CardListViewer; -import forge.gui.GuiChoose; -import forge.gui.framework.FScreen; import forge.gui.framework.ICDoc; -import forge.interfaces.IGuiGame; -import forge.item.BoosterPack; -import forge.item.PaperCard; -import forge.itemmanager.DeckManager; -import forge.limited.BoosterDraft; -import forge.model.FModel; -import forge.properties.ForgePreferences.FPref; -import forge.quest.QuestDraftUtils; -import forge.quest.QuestEventDraft; -import forge.quest.QuestEventDraft.QuestDraftFormat; -import forge.quest.QuestUtil; -import forge.quest.data.QuestAchievements; -import forge.screens.deckeditor.CDeckEditorUI; -import forge.screens.deckeditor.controllers.CEditorQuestDraftingProcess; -import forge.screens.deckeditor.controllers.CEditorQuestLimited; -import forge.screens.deckeditor.views.VCurrentDeck; -import forge.screens.home.quest.VSubmenuQuestDraft.Mode; -import forge.screens.home.sanctioned.CSubmenuDraft; -import forge.screens.match.controllers.CDetailPicture; -import forge.toolbox.FOptionPane; -import forge.toolbox.FSkin; -import forge.toolbox.FSkin.SkinImage; -import forge.toolbox.JXButtonPanel; -import forge.tournament.system.TournamentBracket; -import forge.tournament.system.TournamentPairing; -import forge.tournament.system.TournamentPlayer; +import forge.quest.QuestTournamentController; -import javax.swing.*; import java.awt.event.*; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.List; /** * Controls the quest draft submenu in the home UI. @@ -56,10 +16,7 @@ import java.util.List; public enum CSubmenuQuestDraft implements ICDoc { SINGLETON_INSTANCE; - private static final DecimalFormat NUMBER_FORMATTER = new DecimalFormat("#,###"); - - private boolean drafting = false; - private IGuiGame gui = null; + private QuestTournamentController controller; @Override public void register() { @@ -68,8 +25,8 @@ public enum CSubmenuQuestDraft implements ICDoc { @SuppressWarnings("serial") @Override public void initialize() { - final VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE; + controller = new QuestTournamentController(view); view.getBtnStartDraft().addActionListener(selectTournamentStart); view.getBtnStartTournament().addActionListener(prepareDeckStart); @@ -77,600 +34,53 @@ public enum CSubmenuQuestDraft implements ICDoc { view.getBtnStartMatchSmall().setCommand(new UiCommand() { @Override public void run() { - CSubmenuQuestDraft.this.startNextMatch(); + controller.startNextMatch(); } }); view.getBtnSpendToken().setCommand(new UiCommand() { @Override public void run() { - CSubmenuQuestDraft.this.spendToken(); + controller.spendToken(); } }); view.getBtnEditDeck().setCommand(new UiCommand() { @Override public void run() { - CSubmenuQuestDraft.this.editDeck(); + controller.editDeck(); } }); view.getBtnLeaveTournament().setCommand(new UiCommand() { @Override public void run() { - CSubmenuQuestDraft.this.endTournamentAndAwardPrizes(); + controller.endTournamentAndAwardPrizes(); } }); - - final QuestAchievements achievements = FModel.getQuest().getAchievements(); - FModel.getQuest().getDraftDecks(); - - if (achievements == null) { - - view.setMode(Mode.EMPTY); - - } else if (achievements.getDraftEvents() == null || achievements.getDraftEvents().isEmpty()) { - - achievements.generateDrafts(); - - if (achievements.getDraftEvents().isEmpty()) { - view.setMode(Mode.EMPTY); - } else { - view.setMode(Mode.SELECT_TOURNAMENT); - } - - } else if (FModel.getQuest().getDraftDecks() == null || !FModel.getQuest().getDraftDecks().contains(QuestEventDraft.DECK_NAME)) { - - achievements.generateDrafts(); - view.setMode(Mode.SELECT_TOURNAMENT); - - } else if (!achievements.getCurrentDraft().isStarted()) { - - view.setMode(Mode.PREPARE_DECK); - - } else { - - view.setMode(Mode.TOURNAMENT_ACTIVE); - - } - } - private void endTournamentAndAwardPrizes() { - final QuestEventDraft draft = FModel.getQuest().getAchievements().getCurrentDraft(); - - if (!draft.isStarted()) { - - final boolean shouldQuit = FOptionPane.showOptionDialog("If you leave now, this tournament will be forever gone." - + "\nYou will keep the cards you drafted, but will receive no other prizes." - + "\n\nWould you still like to quit the tournament?", "Really Quit?", FSkin.getImage(FSkinProp.ICO_WARNING).scale(2.0), ImmutableList.of("Yes", "No"), 1) == 0; - if (!shouldQuit) { - return; - } - - } else { - - if (draft.playerHasMatchesLeft()) { - final boolean shouldQuit = FOptionPane.showOptionDialog("You have matches left to play!\nLeaving the tournament early will forfeit your potential future winnings." - + "\nYou will still receive winnings as if you conceded your next match and you will keep the cards you drafted." - + "\n\nWould you still like to quit the tournament?", "Really Quit?", FSkin.getImage(FSkinProp.ICO_WARNING).scale(2.0), ImmutableList.of("Yes", "No"), 1) == 0; - if (!shouldQuit) { - return; - } - } - - final String placement = draft.getPlacementString(); - - final QuestEventDraft.QuestDraftPrizes prizes = draft.collectPrizes(); - - if (prizes.hasCredits()) { - FOptionPane.showMessageDialog("For placing " + placement + ", you have been awarded " + prizes.credits + " credits!", "Credits Awarded", FSkin.getImage(FSkinProp.ICO_QUEST_GOLD)); - } - - if (prizes.hasIndividualCards()) { - final CardListViewer c = new CardListViewer("Tournament Reward", "For participating in the tournament, you have been awarded the following promotional card:", prizes.individualCards); - c.setVisible(true); - c.dispose(); - } - - if (prizes.hasBoosterPacks()) { - - final String packPlural = (prizes.boosterPacks.size() == 1) ? "" : "s"; - - FOptionPane.showMessageDialog("For placing " + placement + ", you have been awarded " + prizes.boosterPacks.size() + " booster pack" + packPlural + "!", "Booster Pack" + packPlural + " Awarded", FSkin.getImage(FSkinProp.ICO_QUEST_BOX)); - - if (FModel.getPreferences().getPrefBoolean(FPref.UI_OPEN_PACKS_INDIV) && prizes.boosterPacks.size() > 1) { - - boolean skipTheRest = false; - final List remainingCards = new ArrayList<>(); - final int totalPacks = prizes.boosterPacks.size(); - int currentPack = 0; - - while (!prizes.boosterPacks.isEmpty()) { - - final BoosterPack pack = prizes.boosterPacks.remove(0); - currentPack++; - - if (skipTheRest) { - remainingCards.addAll(pack.getCards()); - continue; - } - - final BoxedProductCardListViewer c = new BoxedProductCardListViewer(pack.getName(), "You have found the following cards inside (Booster Pack " + currentPack + " of " + totalPacks + "):", pack.getCards()); - c.setVisible(true); - c.dispose(); - skipTheRest = c.skipTheRest(); - - } - - if (skipTheRest && !remainingCards.isEmpty()) { - final CardListViewer c = new CardListViewer("Tournament Reward", "You have found the following cards inside:", remainingCards); - c.setVisible(true); - c.dispose(); - } - - } else { - - final List cards = new ArrayList<>(); - - while (!prizes.boosterPacks.isEmpty()) { - final BoosterPack pack = prizes.boosterPacks.remove(0); - cards.addAll(pack.getCards()); - } - - final CardListViewer c = new CardListViewer("Tournament Reward", "You have found the following cards inside:", cards); - c.setVisible(true); - c.dispose(); - - } - - } - - if (prizes.selectRareFromSets()) { - - FOptionPane.showMessageDialog("For placing " + placement + ", you may select a rare or mythic rare card from the drafted block.", "Rare Awarded", FSkin.getImage(FSkinProp.ICO_QUEST_STAKES)); - - final CardListChooser cardListChooser = new CardListChooser("Select a Card", "Select a card to keep:", prizes.selectRareCards); - cardListChooser.setVisible(true); - cardListChooser.dispose(); - prizes.addSelectedCard(cardListChooser.getSelectedCard()); - - FOptionPane.showMessageDialog("'" + cardListChooser.getSelectedCard().getName() + "' has been added to your collection!", "Card Added", FSkin.getImage(FSkinProp.ICO_QUEST_STAKES)); - - } - - if (draft.getPlayerPlacement() == 1) { - FOptionPane.showMessageDialog("For placing " + placement + ", you have been awarded a token!\nUse tokens to create new drafts to play.", "Bonus Token", FSkin.getImage(FSkinProp.ICO_QUEST_NOTES)); - FModel.getQuest().getAchievements().addDraftToken(); - } - - } - - final boolean saveDraft = FOptionPane.showOptionDialog("Would you like to save this draft to the regular draft mode?", "Save Draft?", FSkin.getImage(FSkinProp.ICO_QUESTION).scale(2.0), ImmutableList.of("Yes", "No"), 0) == 0; - - if (saveDraft) { - draft.saveToRegularDraft(); - CSubmenuDraft.SINGLETON_INSTANCE.update(); - } - - draft.addToQuestDecks(); - - final VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE; - CSubmenuQuestDraft.SINGLETON_INSTANCE.update(); - view.populate(); - - } - - - private final ActionListener selectTournamentStart = new ActionListener() { @Override public void actionPerformed(final ActionEvent event) { - CSubmenuQuestDraft.this.startDraft(); + controller.startDraft(); } }; private final ActionListener prepareDeckStart = new ActionListener() { @Override public void actionPerformed(final ActionEvent event) { - CSubmenuQuestDraft.this.startTournament(); + controller.startTournament(); } }; private final ActionListener nextMatchStart = new ActionListener() { @Override public void actionPerformed(final ActionEvent event) { - CSubmenuQuestDraft.this.startNextMatch(); + controller.startNextMatch(); } }; - private final KeyAdapter startOnEnter = new KeyAdapter() { - @Override - public void keyPressed(final KeyEvent e) { - if (KeyEvent.VK_ENTER == e.getKeyChar()) { - VSubmenuQuestDraft.SINGLETON_INSTANCE.getBtnStartDraft().doClick(); - } - } - }; - - private final MouseAdapter startOnDblClick = new MouseAdapter() { - @Override - public void mouseClicked(final MouseEvent e) { - if (MouseEvent.BUTTON1 == e.getButton() && 2 == e.getClickCount()) { - VSubmenuQuestDraft.SINGLETON_INSTANCE.getBtnStartDraft().doClick(); - } - } - }; - - private void spendToken() { - - final QuestAchievements achievements = FModel.getQuest().getAchievements(); - - if (achievements != null) { - - List formats = QuestEventDraft.getAvailableFormats(FModel.getQuest()); - - if (formats.isEmpty()) { - FOptionPane.showErrorDialog( - "You do not have any draft-able sets unlocked!\n" + - "Come back later when you've unlocked more sets.", - "No Available Drafts"); - return; - } - - final QuestDraftFormat format = GuiChoose.oneOrNone("Choose Draft Format", formats); - - if (format != null) { - - achievements.spendDraftToken(format); - - update(); - VSubmenuQuestDraft.SINGLETON_INSTANCE.populate(); - - } - - } - - } - @Override public void update() { - - final VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE; - - if (FModel.getQuest().getAchievements() == null) { - view.setMode(Mode.EMPTY); - return; - } - - final QuestAchievements achievements = FModel.getQuest().getAchievements(); - achievements.generateDrafts(); - - if (FModel.getQuest().getAchievements().getDraftEvents().isEmpty()) { - view.setMode(Mode.EMPTY); - updatePlacementLabelsText(); - return; - } - - if ((FModel.getQuest().getDraftDecks() == null - || !FModel.getQuest().getDraftDecks().contains(QuestEventDraft.DECK_NAME) - || FModel.getQuest().getAchievements().getCurrentDraftIndex() == -1)) { - view.setMode(Mode.SELECT_TOURNAMENT); - } else if (!FModel.getQuest().getAchievements().getCurrentDraft().isStarted()) { - view.setMode(Mode.PREPARE_DECK); - } else { - view.setMode(Mode.TOURNAMENT_ACTIVE); - } - - QuestDraftUtils.update(gui); - - switch (view.getMode()) { - - case SELECT_TOURNAMENT: - updateSelectTournament(); - break; - - case PREPARE_DECK: - updatePrepareDeck(); - break; - - case TOURNAMENT_ACTIVE: - updateTournamentActive(); - break; - - default: - break; - - } - - } - - private void updateSelectTournament() { - - final VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE; - - view.getLblCredits().setText("Available Credits: " + NUMBER_FORMATTER.format(FModel.getQuest().getAssets().getCredits())); - - final QuestAchievements achievements = FModel.getQuest().getAchievements(); - achievements.generateDrafts(); - - view.getPnlTournaments().removeAll(); - final JXButtonPanel grpPanel = new JXButtonPanel(); - - boolean firstPanel = true; - - for (final QuestEventDraft draft : FModel.getQuest().getAchievements().getDraftEvents()) { - - final PnlDraftEvent draftPanel = new PnlDraftEvent(draft); - final JRadioButton button = draftPanel.getRadioButton(); - - if (firstPanel) { - button.setSelected(true); - SwingUtilities.invokeLater(new Runnable() { - @Override public void run() { button.requestFocusInWindow(); } - }); - firstPanel = false; - } - - grpPanel.add(draftPanel, button, "w 100%!, h 135px!, gapy 15px"); - - button.addKeyListener(startOnEnter); - button.addMouseListener(startOnDblClick); - - } - - view.getPnlTournaments().add(grpPanel, "w 100%!"); - - updatePlacementLabelsText(); - - } - - private void updatePlacementLabelsText() { - - final VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE; - final QuestAchievements achievements = FModel.getQuest().getAchievements(); - - if (view.getMode().equals(Mode.EMPTY)) { - view.getPnlTournaments().removeAll(); - } - - view.getLblFirst().setText("1st Place: " + achievements.getWinsForPlace(1) + " time" + (achievements.getWinsForPlace(1) == 1 ? "" : "s")); - view.getLblSecond().setText("2nd Place: " + achievements.getWinsForPlace(2) + " time" + (achievements.getWinsForPlace(2) == 1 ? "" : "s")); - view.getLblThird().setText("3rd Place: " + achievements.getWinsForPlace(3) + " time" + (achievements.getWinsForPlace(3) == 1 ? "" : "s")); - view.getLblFourth().setText("4th Place: " + achievements.getWinsForPlace(4) + " time" + (achievements.getWinsForPlace(4) == 1 ? "" : "s")); - - view.getLblTokens().setText("Tokens: " + achievements.getDraftTokens()); - view.getBtnSpendToken().setEnabled(achievements.getDraftTokens() > 0); - - } - - private void updatePrepareDeck() { - } - - private void updateTournamentActive() { - if (FModel.getQuest().getAchievements().getCurrentDraft() == null) { - return; - } - - if (QuestDraftUtils.TOURNAMENT_TOGGLE) { - updateTournamentActiveForBracket(); - return; - } - - final VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE; - - for (int i = 0; i < 15; i++) { - - String playerID = FModel.getQuest().getAchievements().getCurrentDraft().getStandings()[i]; - - int iconID = 0; - - switch (playerID) { - case QuestEventDraft.HUMAN: - playerID = FModel.getPreferences().getPref(FPref.PLAYER_NAME); - if (FModel.getPreferences().getPref(FPref.UI_AVATARS).split(",").length > 0) { - iconID = Integer.parseInt(FModel.getPreferences().getPref(FPref.UI_AVATARS).split(",")[0]); - } - break; - case QuestEventDraft.UNDETERMINED: - playerID = "Undetermined"; - iconID = GuiBase.getInterface().getAvatarCount() - 1; - break; - default: - iconID = FModel.getQuest().getAchievements().getCurrentDraft().getAIIcons()[Integer.parseInt(playerID) - 1]; - playerID = FModel.getQuest().getAchievements().getCurrentDraft().getAINames()[Integer.parseInt(playerID) - 1]; - break; - } - - final boolean first = i % 2 == 0; - final int box = i / 2; - - SkinImage icon = FSkin.getAvatars().get(iconID); - - if (icon == null) { - icon = FSkin.getAvatars().get(0); - } - - if (first) { - view.getLblsMatchups()[box].setPlayerOne(playerID, icon); - } else { - view.getLblsMatchups()[box].setPlayerTwo(playerID, icon); - } - - } - - if (FModel.getQuest().getAchievements().getCurrentDraft().playerHasMatchesLeft()) { - view.getBtnLeaveTournament().setText("Leave Tournament"); - } else { - view.getBtnLeaveTournament().setText("Collect Prizes"); - } - - } - - private void updateTournamentBoxLabel(String playerID, int iconID, int box, boolean first) { - final VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE; - - SkinImage icon = FSkin.getAvatars().get(iconID); - - if (icon == null) { - icon = FSkin.getAvatars().get(0); - } - - if (first) { - view.getLblsMatchups()[box].setPlayerOne(playerID, icon); - } else { - view.getLblsMatchups()[box].setPlayerTwo(playerID, icon); - } - } - - private void updateTournamentActiveForBracket() { - final VSubmenuQuestDraft view = VSubmenuQuestDraft.SINGLETON_INSTANCE; - - QuestEventDraft draft = FModel.getQuest().getAchievements().getCurrentDraft(); - TournamentBracket bracket = draft.getBracket(); - - if (bracket == null) { - return; - } - - // Combine finished pairings with active round pairings - List allPairings = Lists.newArrayList(); - allPairings.addAll(bracket.getCompletedPairings()); - allPairings.addAll(bracket.getActivePairings()); - - int count = 0; - int playerCount = 0; - int lastWinner = 0; - for(TournamentPairing tp : allPairings) { - boolean first = true; - String playerID = "Undetermined"; - int iconID = 0; - for(TournamentPlayer player : tp.getPairedPlayers()) { - if (player.getIndex() == -1) { - playerID = FModel.getPreferences().getPref(FPref.PLAYER_NAME); - if (FModel.getPreferences().getPref(FPref.UI_AVATARS).split(",").length > 0) { - iconID = Integer.parseInt(FModel.getPreferences().getPref(FPref.UI_AVATARS).split(",")[0]); - } - } - else{ - playerID = player.getPlayer().getName(); - iconID = player.getIndex(); - } - updateTournamentBoxLabel(playerID, iconID, count, first); - - if (tp.getWinner() != null && tp.getWinner().equals(player)) { - // Temporarily fill in winner box - lastWinner = playerCount; - updateTournamentBoxLabel(player.getPlayer().getName(), player.getIndex(), playerCount/4 + 4, count%2 == 0); - } - first = false; - playerCount++; - } - count++; - } - if (!bracket.isTournamentOver()) { - for (int i = lastWinner/2+9 ; i < 15; i++) { - String playerID = "Undetermined"; - int iconID = GuiBase.getInterface().getAvatarCount() - 1; - updateTournamentBoxLabel(playerID, iconID, i / 2, i%2 == 0); - } - } - - if (draft.playerHasMatchesLeft()) { - view.getBtnLeaveTournament().setText("Leave Tournament"); - } else { - view.getBtnLeaveTournament().setText("Collect Prizes"); - } + controller.update(); } public void setCompletedDraft(final DeckGroup finishedDraft) { - - QuestDraftUtils.completeDraft(finishedDraft); - - Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_QUEST_TOURNAMENT); - CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorQuestLimited(FModel.getQuest(), CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture())); - - drafting = false; - - VSubmenuQuestDraft.SINGLETON_INSTANCE.setMode(Mode.PREPARE_DECK); - VSubmenuQuestDraft.SINGLETON_INSTANCE.populate(); - + controller.setCompletedDraft(finishedDraft); } - - private void editDeck() { - final CDetailPicture cDetailPicture = CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture(); - VCurrentDeck.SINGLETON_INSTANCE.setItemManager(new DeckManager(GameType.Draft, cDetailPicture)); - Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_QUEST_TOURNAMENT); - CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorQuestLimited(FModel.getQuest(), cDetailPicture)); - FModel.getQuest().save(); - } - - private void startDraft() { - - if (drafting) { - FOptionPane.showErrorDialog("You are currently in a draft.\n" + - "You should leave or finish that draft before starting another."); - return; - } - - final QuestEventDraft draftEvent = QuestUtil.getDraftEvent(); - - final long creditsAvailable = FModel.getQuest().getAssets().getCredits(); - if (draftEvent.canEnter()) { - FOptionPane.showMessageDialog("You need " + NUMBER_FORMATTER.format(draftEvent.getEntryFee() - creditsAvailable) + " more credits to enter this tournament.", "Not Enough Credits", FSkin.getImage(FSkinProp.ICO_WARNING).scale(2.0)); - return; - } - - final boolean okayToEnter = FOptionPane.showOptionDialog("This tournament costs " + draftEvent.getEntryFee() + " credits to enter.\nAre you sure you wish to enter?", "Enter Draft Tournament?", FSkin.getImage(FSkinProp.ICO_QUEST_GOLD), ImmutableList.of("Yes", "No"), 1) == 0; - - if (!okayToEnter) { - return; - } - - drafting = true; - - final BoosterDraft draft = draftEvent.enter(); - - final CEditorQuestDraftingProcess draftController = new CEditorQuestDraftingProcess(CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture()); - draftController.showGui(draft); - - draftController.setDraftQuest(CSubmenuQuestDraft.this); - - Singletons.getControl().setCurrentScreen(FScreen.DRAFTING_PROCESS); - CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(draftController); - - } - - private void startTournament() { - - FModel.getQuest().save(); - - final String message = GameType.QuestDraft.getDeckFormat().getDeckConformanceProblem(FModel.getQuest().getAssets().getDraftDeckStorage().get(QuestEventDraft.DECK_NAME).getHumanDeck()); - if (message != null && FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { - FOptionPane.showMessageDialog(message, "Deck Invalid"); - return; - } - - FModel.getQuest().getAchievements().getCurrentDraft().start(); - - VSubmenuQuestDraft.SINGLETON_INSTANCE.setMode(Mode.TOURNAMENT_ACTIVE); - VSubmenuQuestDraft.SINGLETON_INSTANCE.populate(); - - update(); - - } - - private void startNextMatch() { - - final String message = QuestDraftUtils.getDeckLegality(); - - if (message != null) { - FOptionPane.showMessageDialog(message, "Deck Invalid"); - return; - } - - if (QuestDraftUtils.matchInProgress) { - FOptionPane.showErrorDialog("There is already a match in progress.\n" + - "Please wait for the current round to end before attempting to continue."); - return; - } - - gui = GuiBase.getInterface().getNewGuiGame(); - QuestDraftUtils.startNextMatch(gui); - } - } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestDraft.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestDraft.java index 5928b08d0ed..5e0acce623a 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestDraft.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestDraft.java @@ -1,22 +1,42 @@ package forge.screens.home.quest; import forge.GuiBase; +import forge.Singletons; import forge.assets.FSkinProp; +import forge.game.GameType; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; +import forge.gui.framework.FScreen; +import forge.itemmanager.DeckManager; +import forge.limited.BoosterDraft; import forge.model.FModel; +import forge.quest.IQuestTournamentView; +import forge.quest.QuestEventDraft; +import forge.quest.QuestDraftUtils.Mode; +import forge.quest.data.QuestEventDraftContainer; +import forge.screens.deckeditor.CDeckEditorUI; +import forge.screens.deckeditor.controllers.CEditorQuestDraftingProcess; +import forge.screens.deckeditor.controllers.CEditorQuestLimited; +import forge.screens.deckeditor.views.VCurrentDeck; import forge.screens.home.*; +import forge.screens.match.controllers.CDetailPicture; import forge.toolbox.FLabel; import forge.toolbox.FScrollPanel; import forge.toolbox.FSkin; import forge.toolbox.FSkin.Colors; import forge.toolbox.FSkin.SkinColor; import forge.toolbox.FSkin.SkinImage; +import forge.toolbox.JXButtonPanel; import net.miginfocom.swing.MigLayout; import javax.swing.*; + import java.awt.*; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.awt.geom.Rectangle2D; /** @@ -24,17 +44,9 @@ import java.awt.geom.Rectangle2D; * *

(V at beginning of class name denotes a view class.) */ -public enum VSubmenuQuestDraft implements IVSubmenu { - +public enum VSubmenuQuestDraft implements IVSubmenu, IQuestTournamentView { SINGLETON_INSTANCE; - protected enum Mode { - EMPTY, - SELECT_TOURNAMENT, - PREPARE_DECK, - TOURNAMENT_ACTIVE - } - private final DragTab tab = new DragTab("Tournaments"); private final LblHeader lblTitle = new LblHeader("Quest Mode: Draft Tournament"); @@ -180,23 +192,23 @@ public enum VSubmenuQuestDraft implements IVSubmenu { return matchups; } - public JLabel getLblFirst() { + public FLabel getLblFirst() { return lblFirst; } - public JLabel getLblSecond() { + public FLabel getLblSecond() { return lblSecond; } - public JLabel getLblThird() { + public FLabel getLblThird() { return lblThird; } - public JLabel getLblFourth() { + public FLabel getLblFourth() { return lblFourth; } - public JLabel getLblTokens() { + public FLabel getLblTokens() { return lblTokens; } @@ -281,7 +293,6 @@ public enum VSubmenuQuestDraft implements IVSubmenu { VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().repaintSelf(); VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().revalidate(); - } private void populateSelectTournament() { @@ -312,7 +323,6 @@ public enum VSubmenuQuestDraft implements IVSubmenu { } private void populateTournamentActive() { - lblTitle.setText("Quest Mode: Draft Tournament - " + FModel.getQuest().getAchievements().getCurrentDraft().getTitle()); VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().setLayout(new MigLayout("insets 0, gap 0, ax center, wrap 1")); VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(lblTitle, "w 80%!, h 40px!, gap 20% 0 15px 10px, ax right, span 2"); @@ -340,28 +350,23 @@ public enum VSubmenuQuestDraft implements IVSubmenu { JPanel bottomButtons = new JPanel(new MigLayout("insets 0, gap 0, wrap 2, ax center")); if (FModel.getQuest().getAchievements().getCurrentDraft().playerHasMatchesLeft()) { - VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(btnStartMatch, "gap 0 0 0 20px, ax center"); bottomButtons.add(btnEditDeck, "w 135px!, h 25px!, gap 0 25px 10px 10px, ax right"); bottomButtons.add(btnLeaveTournament, "w 135px!, h 25px!, gap 25px 0 10px 10px, ax right"); btnLeaveTournament.setFontSize(12); - - } else { - + } + else { VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(btnLeaveTournament, "w 250px!, h 60px!, gap 0 0 20px 20px, ax center"); bottomButtons.add(btnEditDeck, "w 135px!, h 25px!, gap 0 25px 10px 10px, ax right"); bottomButtons.add(btnStartMatchSmall, "w 135px!, h 25px!, gap 25px 0 10px 10px, ax right"); btnLeaveTournament.setFontSize(24); - } VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(bottomButtons, "w 100%!"); bottomButtons.setOpaque(false); - } private final class ProportionalPanel extends JPanel { - private static final long serialVersionUID = 2098643413467094674L; private final SkinImage image; @@ -381,7 +386,6 @@ public enum VSubmenuQuestDraft implements IVSubmenu { @Override public void paintComponent(final Graphics g) { - Graphics2D g2d = (Graphics2D) g.create(); Dimension srcSize = image.getSizeForPaint(g2d); @@ -403,13 +407,10 @@ public enum VSubmenuQuestDraft implements IVSubmenu { 0, 0, wSrc, hSrc); // Source g2d.dispose(); - } - } private final class ProportionalDimension extends Dimension { - private static final long serialVersionUID = -428811386088062426L; private ProportionalDimension(Dimension d, int w, int h) { @@ -581,9 +582,90 @@ public enum VSubmenuQuestDraft implements IVSubmenu { } g2d.dispose(); - } - } + @Override + public void updateEventList(QuestEventDraftContainer events) { + pnlTournaments.removeAll(); + if (events == null) { return; } + + final JXButtonPanel grpPanel = new JXButtonPanel(); + + boolean firstPanel = true; + + for (final QuestEventDraft draft : events) { + final PnlDraftEvent draftPanel = new PnlDraftEvent(draft); + final JRadioButton button = draftPanel.getRadioButton(); + + if (firstPanel) { + button.setSelected(true); + SwingUtilities.invokeLater(new Runnable() { + @Override public void run() { button.requestFocusInWindow(); } + }); + firstPanel = false; + } + + grpPanel.add(draftPanel, button, "w 100%!, h 135px!, gapy 15px"); + + button.addKeyListener(startOnEnter); + button.addMouseListener(startOnDblClick); + } + + pnlTournaments.add(grpPanel, "w 100%!"); + } + + private final KeyAdapter startOnEnter = new KeyAdapter() { + @Override + public void keyPressed(final KeyEvent e) { + if (KeyEvent.VK_ENTER == e.getKeyChar()) { + btnStartDraft.doClick(); + } + } + }; + + private final MouseAdapter startOnDblClick = new MouseAdapter() { + @Override + public void mouseClicked(final MouseEvent e) { + if (MouseEvent.BUTTON1 == e.getButton() && 2 == e.getClickCount()) { + btnStartDraft.doClick(); + } + } + }; + + @Override + public void updateTournamentBoxLabel(String playerID, int iconID, int box, boolean first) { + SkinImage icon = FSkin.getAvatars().get(iconID); + if (icon == null) { + icon = FSkin.getAvatars().get(0); + } + + if (first) { + matchups[box].setPlayerOne(playerID, icon); + } + else { + matchups[box].setPlayerTwo(playerID, icon); + } + } + + @Override + public void startDraft(BoosterDraft draft) { + final CEditorQuestDraftingProcess draftController = new CEditorQuestDraftingProcess(CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture()); + draftController.showGui(draft); + + draftController.setDraftQuest(CSubmenuQuestDraft.SINGLETON_INSTANCE); + + Singletons.getControl().setCurrentScreen(FScreen.DRAFTING_PROCESS); + CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(draftController); + } + + @Override + public void editDeck(boolean isExistingDeck) { + final CDetailPicture cDetailPicture = CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture(); + if (isExistingDeck) { + VCurrentDeck.SINGLETON_INSTANCE.setItemManager(new DeckManager(GameType.Draft, cDetailPicture)); + } + Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_QUEST_TOURNAMENT); + CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorQuestLimited(FModel.getQuest(), cDetailPicture)); + } } diff --git a/forge-gui-mobile/src/forge/GuiMobile.java b/forge-gui-mobile/src/forge/GuiMobile.java index eff1bd02586..0975278792b 100644 --- a/forge-gui-mobile/src/forge/GuiMobile.java +++ b/forge-gui-mobile/src/forge/GuiMobile.java @@ -208,6 +208,16 @@ public class GuiMobile implements IGuiBase { return false; } + @Override + public PaperCard chooseCard(final String title, final String message, final List list) { + return new WaitCallback() { + @Override + public void run() { + GuiChoose.one(title + " - " + message, list, this); + } + }.invokeAndWait(); + } + @Override public int getAvatarCount() { if (FSkin.isLoaded()) { diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiBase.java b/forge-gui/src/main/java/forge/interfaces/IGuiBase.java index 24176414348..7c3018c56df 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiBase.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiBase.java @@ -40,6 +40,7 @@ public interface IGuiBase { void download(GuiDownloadService service, Callback callback); void showCardList(String title, String message, List list); boolean showBoxedProduct(String title, String message, List list); + PaperCard chooseCard(String title, String message, List list); int getAvatarCount(); void copyToClipboard(String text); void browseToUrl(String url) throws IOException, URISyntaxException; diff --git a/forge-gui/src/main/java/forge/quest/IQuestTournamentView.java b/forge-gui/src/main/java/forge/quest/IQuestTournamentView.java new file mode 100644 index 00000000000..c4b6a5ac877 --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/IQuestTournamentView.java @@ -0,0 +1,25 @@ +package forge.quest; + +import forge.interfaces.IButton; +import forge.limited.BoosterDraft; +import forge.quest.QuestDraftUtils.Mode; +import forge.quest.data.QuestEventDraftContainer; + +public interface IQuestTournamentView { + Mode getMode(); + void setMode(Mode mode0); + void populate(); + void updateEventList(QuestEventDraftContainer events); + void updateTournamentBoxLabel(String playerID, int iconID, int box, boolean first); + void startDraft(BoosterDraft draft); + void editDeck(boolean isNew); + + IButton getLblCredits(); + IButton getLblFirst(); + IButton getLblSecond(); + IButton getLblThird(); + IButton getLblFourth(); + IButton getLblTokens(); + IButton getBtnSpendToken(); + IButton getBtnLeaveTournament(); +} diff --git a/forge-gui/src/main/java/forge/quest/QuestDraftUtils.java b/forge-gui/src/main/java/forge/quest/QuestDraftUtils.java index 30be3f35ab9..1517c1d9bbf 100644 --- a/forge-gui/src/main/java/forge/quest/QuestDraftUtils.java +++ b/forge-gui/src/main/java/forge/quest/QuestDraftUtils.java @@ -25,12 +25,19 @@ import java.util.ArrayList; import java.util.List; public class QuestDraftUtils { - private static final List matchups = new ArrayList<>(); public static boolean TOURNAMENT_TOGGLE = false; public static boolean AI_BACKGROUND = false; public static boolean matchInProgress = false; private static boolean waitForUserInput = false; + private static final List matchups = new ArrayList<>(); + + public enum Mode { + EMPTY, + SELECT_TOURNAMENT, + PREPARE_DECK, + TOURNAMENT_ACTIVE + } public static void completeDraft(final DeckGroup finishedDraft) { final List aiDecks = new ArrayList<>(finishedDraft.getAiDecks()); diff --git a/forge-gui/src/main/java/forge/quest/QuestTournamentController.java b/forge-gui/src/main/java/forge/quest/QuestTournamentController.java new file mode 100644 index 00000000000..43934467884 --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/QuestTournamentController.java @@ -0,0 +1,446 @@ +package forge.quest; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; + +import forge.GuiBase; +import forge.assets.FSkinProp; +import forge.deck.DeckGroup; +import forge.game.GameType; +import forge.interfaces.IGuiGame; +import forge.item.BoosterPack; +import forge.item.PaperCard; +import forge.limited.BoosterDraft; +import forge.model.FModel; +import forge.properties.ForgePreferences.FPref; +import forge.quest.QuestDraftUtils.Mode; +import forge.quest.QuestEventDraft.QuestDraftFormat; +import forge.quest.data.QuestAchievements; +import forge.tournament.system.TournamentBracket; +import forge.tournament.system.TournamentPairing; +import forge.tournament.system.TournamentPlayer; +import forge.util.gui.SGuiChoose; +import forge.util.gui.SOptionPane; +import forge.util.storage.IStorage; + +public class QuestTournamentController { + private static final DecimalFormat NUMBER_FORMATTER = new DecimalFormat("#,###"); + + private final IQuestTournamentView view; + private boolean drafting = false; + private IGuiGame gui = null; + + public QuestTournamentController(IQuestTournamentView view0) { + view = view0; + + final QuestAchievements achievements = FModel.getQuest().getAchievements(); + final IStorage decks = FModel.getQuest().getDraftDecks(); + + if (achievements == null) { + view.setMode(Mode.EMPTY); + } + else if (achievements.getDraftEvents() == null || achievements.getDraftEvents().isEmpty()) { + achievements.generateDrafts(); + + if (achievements.getDraftEvents().isEmpty()) { + view.setMode(Mode.EMPTY); + } + else { + view.setMode(Mode.SELECT_TOURNAMENT); + } + } + else if (decks == null || !decks.contains(QuestEventDraft.DECK_NAME)) { + achievements.generateDrafts(); + view.setMode(Mode.SELECT_TOURNAMENT); + } + else if (!achievements.getCurrentDraft().isStarted()) { + view.setMode(Mode.PREPARE_DECK); + } + else { + view.setMode(Mode.TOURNAMENT_ACTIVE); + } + } + + public void endTournamentAndAwardPrizes() { + final QuestEventDraft draft = FModel.getQuest().getAchievements().getCurrentDraft(); + + if (!draft.isStarted()) { + final boolean shouldQuit = SOptionPane.showOptionDialog("If you leave now, this tournament will be forever gone." + + "\nYou will keep the cards you drafted, but will receive no other prizes." + + "\n\nWould you still like to quit the tournament?", "Really Quit?", SOptionPane.WARNING_ICON, ImmutableList.of("Yes", "No"), 1) == 0; + if (!shouldQuit) { + return; + } + } + else { + if (draft.playerHasMatchesLeft()) { + final boolean shouldQuit = SOptionPane.showOptionDialog("You have matches left to play!\nLeaving the tournament early will forfeit your potential future winnings." + + "\nYou will still receive winnings as if you conceded your next match and you will keep the cards you drafted." + + "\n\nWould you still like to quit the tournament?", "Really Quit?", SOptionPane.WARNING_ICON, ImmutableList.of("Yes", "No"), 1) == 0; + if (!shouldQuit) { + return; + } + } + + final String placement = draft.getPlacementString(); + + final QuestEventDraft.QuestDraftPrizes prizes = draft.collectPrizes(); + + if (prizes.hasCredits()) { + SOptionPane.showMessageDialog("For placing " + placement + ", you have been awarded " + prizes.credits + " credits!", "Credits Awarded", FSkinProp.ICO_QUEST_GOLD); + } + + if (prizes.hasIndividualCards()) { + GuiBase.getInterface().showCardList("Tournament Reward", "For participating in the tournament, you have been awarded the following promotional card:", prizes.individualCards); + } + + if (prizes.hasBoosterPacks()) { + final String packPlural = (prizes.boosterPacks.size() == 1) ? "" : "s"; + + SOptionPane.showMessageDialog("For placing " + placement + ", you have been awarded " + prizes.boosterPacks.size() + " booster pack" + packPlural + "!", "Booster Pack" + packPlural + " Awarded", FSkinProp.ICO_QUEST_BOX); + + if (FModel.getPreferences().getPrefBoolean(FPref.UI_OPEN_PACKS_INDIV) && prizes.boosterPacks.size() > 1) { + boolean skipTheRest = false; + final List remainingCards = new ArrayList<>(); + final int totalPacks = prizes.boosterPacks.size(); + int currentPack = 0; + + while (!prizes.boosterPacks.isEmpty()) { + + final BoosterPack pack = prizes.boosterPacks.remove(0); + currentPack++; + + if (skipTheRest) { + remainingCards.addAll(pack.getCards()); + continue; + } + + skipTheRest = GuiBase.getInterface().showBoxedProduct(pack.getName(), "You have found the following cards inside (Booster Pack " + currentPack + " of " + totalPacks + "):", pack.getCards()); + } + + if (skipTheRest && !remainingCards.isEmpty()) { + GuiBase.getInterface().showCardList("Tournament Reward", "You have found the following cards inside:", remainingCards); + } + } + else { + final List cards = new ArrayList<>(); + + while (!prizes.boosterPacks.isEmpty()) { + final BoosterPack pack = prizes.boosterPacks.remove(0); + cards.addAll(pack.getCards()); + } + + GuiBase.getInterface().showCardList("Tournament Reward", "You have found the following cards inside:", cards); + } + } + + if (prizes.selectRareFromSets()) { + SOptionPane.showMessageDialog("For placing " + placement + ", you may select a rare or mythic rare card from the drafted block.", "Rare Awarded", FSkinProp.ICO_QUEST_STAKES); + + final PaperCard card = GuiBase.getInterface().chooseCard("Select a Card", "Select a card to keep:", prizes.selectRareCards); + prizes.addSelectedCard(card); + + SOptionPane.showMessageDialog("'" + card.getName() + "' has been added to your collection!", "Card Added", FSkinProp.ICO_QUEST_STAKES); + } + + if (draft.getPlayerPlacement() == 1) { + SOptionPane.showMessageDialog("For placing " + placement + ", you have been awarded a token!\nUse tokens to create new drafts to play.", "Bonus Token", FSkinProp.ICO_QUEST_NOTES); + FModel.getQuest().getAchievements().addDraftToken(); + } + + } + + final boolean saveDraft = SOptionPane.showOptionDialog("Would you like to save this draft to the regular draft mode?", "Save Draft?", SOptionPane.QUESTION_ICON, ImmutableList.of("Yes", "No"), 0) == 0; + if (saveDraft) { + draft.saveToRegularDraft(); + } + draft.addToQuestDecks(); + + update(); + view.populate(); + } + + public void spendToken() { + final QuestAchievements achievements = FModel.getQuest().getAchievements(); + if (achievements != null) { + + List formats = QuestEventDraft.getAvailableFormats(FModel.getQuest()); + + if (formats.isEmpty()) { + SOptionPane.showErrorDialog( + "You do not have any draft-able sets unlocked!\n" + + "Come back later when you've unlocked more sets.", + "No Available Drafts"); + return; + } + + final QuestDraftFormat format = SGuiChoose.oneOrNone("Choose Draft Format", formats); + if (format != null) { + achievements.spendDraftToken(format); + + update(); + view.populate(); + } + } + } + + public void update() { + if (FModel.getQuest().getAchievements() == null) { + view.setMode(Mode.EMPTY); + return; + } + + final QuestAchievements achievements = FModel.getQuest().getAchievements(); + achievements.generateDrafts(); + + if (FModel.getQuest().getAchievements().getDraftEvents().isEmpty()) { + view.setMode(Mode.EMPTY); + updatePlacementLabelsText(); + return; + } + + if ((FModel.getQuest().getDraftDecks() == null + || !FModel.getQuest().getDraftDecks().contains(QuestEventDraft.DECK_NAME) + || FModel.getQuest().getAchievements().getCurrentDraftIndex() == -1)) { + view.setMode(Mode.SELECT_TOURNAMENT); + } + else if (!FModel.getQuest().getAchievements().getCurrentDraft().isStarted()) { + view.setMode(Mode.PREPARE_DECK); + } + else { + view.setMode(Mode.TOURNAMENT_ACTIVE); + } + + QuestDraftUtils.update(gui); + + switch (view.getMode()) { + case SELECT_TOURNAMENT: + updateSelectTournament(); + break; + case PREPARE_DECK: + updatePrepareDeck(); + break; + case TOURNAMENT_ACTIVE: + updateTournamentActive(); + break; + default: + break; + } + } + + private void updateSelectTournament() { + view.getLblCredits().setText("Available Credits: " + NUMBER_FORMATTER.format(FModel.getQuest().getAssets().getCredits())); + + final QuestAchievements achievements = FModel.getQuest().getAchievements(); + achievements.generateDrafts(); + + view.updateEventList(achievements.getDraftEvents()); + + updatePlacementLabelsText(); + } + + private void updatePlacementLabelsText() { + final QuestAchievements achievements = FModel.getQuest().getAchievements(); + + if (view.getMode() == Mode.EMPTY) { + view.updateEventList(null); + } + + view.getLblFirst().setText("1st Place: " + achievements.getWinsForPlace(1) + " time" + (achievements.getWinsForPlace(1) == 1 ? "" : "s")); + view.getLblSecond().setText("2nd Place: " + achievements.getWinsForPlace(2) + " time" + (achievements.getWinsForPlace(2) == 1 ? "" : "s")); + view.getLblThird().setText("3rd Place: " + achievements.getWinsForPlace(3) + " time" + (achievements.getWinsForPlace(3) == 1 ? "" : "s")); + view.getLblFourth().setText("4th Place: " + achievements.getWinsForPlace(4) + " time" + (achievements.getWinsForPlace(4) == 1 ? "" : "s")); + + view.getLblTokens().setText("Tokens: " + achievements.getDraftTokens()); + view.getBtnSpendToken().setEnabled(achievements.getDraftTokens() > 0); + } + + private void updatePrepareDeck() { + } + + private void updateTournamentActive() { + if (FModel.getQuest().getAchievements().getCurrentDraft() == null) { + return; + } + + if (QuestDraftUtils.TOURNAMENT_TOGGLE) { + updateTournamentActiveForBracket(); + return; + } + + for (int i = 0; i < 15; i++) { + String playerID = FModel.getQuest().getAchievements().getCurrentDraft().getStandings()[i]; + + int iconID = 0; + + switch (playerID) { + case QuestEventDraft.HUMAN: + playerID = FModel.getPreferences().getPref(FPref.PLAYER_NAME); + if (FModel.getPreferences().getPref(FPref.UI_AVATARS).split(",").length > 0) { + iconID = Integer.parseInt(FModel.getPreferences().getPref(FPref.UI_AVATARS).split(",")[0]); + } + break; + case QuestEventDraft.UNDETERMINED: + playerID = "Undetermined"; + iconID = GuiBase.getInterface().getAvatarCount() - 1; + break; + default: + iconID = FModel.getQuest().getAchievements().getCurrentDraft().getAIIcons()[Integer.parseInt(playerID) - 1]; + playerID = FModel.getQuest().getAchievements().getCurrentDraft().getAINames()[Integer.parseInt(playerID) - 1]; + break; + } + + final boolean first = i % 2 == 0; + final int box = i / 2; + view.updateTournamentBoxLabel(playerID, iconID, box, first); + } + + if (FModel.getQuest().getAchievements().getCurrentDraft().playerHasMatchesLeft()) { + view.getBtnLeaveTournament().setText("Leave Tournament"); + } + else { + view.getBtnLeaveTournament().setText("Collect Prizes"); + } + } + + private void updateTournamentActiveForBracket() { + QuestEventDraft draft = FModel.getQuest().getAchievements().getCurrentDraft(); + TournamentBracket bracket = draft.getBracket(); + + if (bracket == null) { + return; + } + + // Combine finished pairings with active round pairings + List allPairings = Lists.newArrayList(); + allPairings.addAll(bracket.getCompletedPairings()); + allPairings.addAll(bracket.getActivePairings()); + + int count = 0; + int playerCount = 0; + int lastWinner = 0; + for (TournamentPairing tp : allPairings) { + boolean first = true; + String playerID = "Undetermined"; + int iconID = 0; + for(TournamentPlayer player : tp.getPairedPlayers()) { + if (player.getIndex() == -1) { + playerID = FModel.getPreferences().getPref(FPref.PLAYER_NAME); + if (FModel.getPreferences().getPref(FPref.UI_AVATARS).split(",").length > 0) { + iconID = Integer.parseInt(FModel.getPreferences().getPref(FPref.UI_AVATARS).split(",")[0]); + } + } + else{ + playerID = player.getPlayer().getName(); + iconID = player.getIndex(); + } + view.updateTournamentBoxLabel(playerID, iconID, count, first); + + if (tp.getWinner() != null && tp.getWinner().equals(player)) { + // Temporarily fill in winner box + lastWinner = playerCount; + view.updateTournamentBoxLabel(player.getPlayer().getName(), player.getIndex(), playerCount/4 + 4, count%2 == 0); + } + first = false; + playerCount++; + } + count++; + } + if (!bracket.isTournamentOver()) { + for (int i = lastWinner/2+9 ; i < 15; i++) { + String playerID = "Undetermined"; + int iconID = GuiBase.getInterface().getAvatarCount() - 1; + view.updateTournamentBoxLabel(playerID, iconID, i / 2, i%2 == 0); + } + } + + if (draft.playerHasMatchesLeft()) { + view.getBtnLeaveTournament().setText("Leave Tournament"); + } + else { + view.getBtnLeaveTournament().setText("Collect Prizes"); + } + } + + public void setCompletedDraft(final DeckGroup finishedDraft) { + QuestDraftUtils.completeDraft(finishedDraft); + + view.editDeck(false); + + drafting = false; + + view.setMode(Mode.PREPARE_DECK); + view.populate(); + } + + public void editDeck() { + view.editDeck(true); + FModel.getQuest().save(); + } + + public void startDraft() { + if (drafting) { + SOptionPane.showErrorDialog("You are currently in a draft.\n" + + "You should leave or finish that draft before starting another."); + return; + } + + final QuestEventDraft draftEvent = QuestUtil.getDraftEvent(); + + final long creditsAvailable = FModel.getQuest().getAssets().getCredits(); + if (draftEvent.canEnter()) { + SOptionPane.showMessageDialog("You need " + NUMBER_FORMATTER.format(draftEvent.getEntryFee() - creditsAvailable) + " more credits to enter this tournament.", "Not Enough Credits", SOptionPane.WARNING_ICON); + return; + } + + final boolean okayToEnter = SOptionPane.showOptionDialog("This tournament costs " + draftEvent.getEntryFee() + " credits to enter.\nAre you sure you wish to enter?", "Enter Draft Tournament?", FSkinProp.ICO_QUEST_GOLD, ImmutableList.of("Yes", "No"), 1) == 0; + + if (!okayToEnter) { + return; + } + + drafting = true; + + final BoosterDraft draft = draftEvent.enter(); + view.startDraft(draft); + } + + public void startTournament() { + FModel.getQuest().save(); + + final String message = GameType.QuestDraft.getDeckFormat().getDeckConformanceProblem(FModel.getQuest().getAssets().getDraftDeckStorage().get(QuestEventDraft.DECK_NAME).getHumanDeck()); + if (message != null && FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { + SOptionPane.showMessageDialog(message, "Deck Invalid"); + return; + } + + FModel.getQuest().getAchievements().getCurrentDraft().start(); + + view.setMode(Mode.TOURNAMENT_ACTIVE); + view.populate(); + + update(); + } + + public void startNextMatch() { + final String message = QuestDraftUtils.getDeckLegality(); + + if (message != null) { + SOptionPane.showMessageDialog(message, "Deck Invalid"); + return; + } + + if (QuestDraftUtils.matchInProgress) { + SOptionPane.showErrorDialog("There is already a match in progress.\n" + + "Please wait for the current round to end before attempting to continue."); + return; + } + + gui = GuiBase.getInterface().getNewGuiGame(); + QuestDraftUtils.startNextMatch(gui); + } +}