From f1bdfaa81986d0d44af3f2f5246b284f578ce84d Mon Sep 17 00:00:00 2001 From: drdev Date: Sun, 6 Jul 2014 18:21:17 +0000 Subject: [PATCH] Hook things up so new quest can be created --- .../forge/screens/quest/LoadQuestScreen.java | 2 +- .../forge/screens/quest/NewQuestScreen.java | 190 +++++++++++++++++- .../screens/quest/QuestBazaarScreen.java | 2 +- .../screens/quest/QuestChallengesScreen.java | 2 +- .../forge/screens/quest/QuestDecksScreen.java | 2 +- .../forge/screens/quest/QuestDuelsScreen.java | 2 +- .../src/forge/screens/quest/QuestMenu.java | 8 + .../forge/screens/quest/QuestPrefsScreen.java | 2 +- .../screens/quest/QuestSpellShopScreen.java | 2 +- .../forge/screens/quest/QuestStatsScreen.java | 2 +- .../screens/quest/QuestTournamentsScreen.java | 2 +- 11 files changed, 206 insertions(+), 10 deletions(-) diff --git a/forge-gui-mobile/src/forge/screens/quest/LoadQuestScreen.java b/forge-gui-mobile/src/forge/screens/quest/LoadQuestScreen.java index 2e2b64d32e6..3670bd0ca59 100644 --- a/forge-gui-mobile/src/forge/screens/quest/LoadQuestScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/LoadQuestScreen.java @@ -4,7 +4,7 @@ import forge.screens.FScreen; public class LoadQuestScreen extends FScreen { public LoadQuestScreen() { - super("Load Quest", new QuestMenu()); + super("Load Quest", QuestMenu.getMenu()); } @Override diff --git a/forge-gui-mobile/src/forge/screens/quest/NewQuestScreen.java b/forge-gui-mobile/src/forge/screens/quest/NewQuestScreen.java index 95f88bbf548..842cecccbc0 100644 --- a/forge-gui-mobile/src/forge/screens/quest/NewQuestScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/NewQuestScreen.java @@ -1,7 +1,12 @@ package forge.screens.quest; +import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; +import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.Map.Entry; import org.apache.commons.lang3.text.WordUtils; @@ -12,13 +17,21 @@ import forge.assets.FSkinImage; import forge.card.MagicColor; import forge.deck.Deck; import forge.deck.DeckGroup; +import forge.deck.DeckSection; import forge.game.GameFormat; +import forge.item.PaperCard; import forge.item.PreconDeck; import forge.model.CardCollections; import forge.model.FModel; +import forge.properties.ForgeConstants; import forge.quest.QuestController; +import forge.quest.QuestMode; +import forge.quest.QuestUtil; import forge.quest.QuestWorld; +import forge.quest.StartingPoolPreferences; import forge.quest.StartingPoolType; +import forge.quest.data.GameFormatQuest; +import forge.quest.data.QuestPreferences.QPref; import forge.screens.FScreen; import forge.toolbox.FCheckBox; import forge.toolbox.FComboBox; @@ -28,13 +41,19 @@ import forge.toolbox.FEvent.FEventHandler; import forge.toolbox.FLabel; import forge.toolbox.FOptionPane; import forge.toolbox.FScrollPane; +import forge.util.FileUtil; +import forge.util.ThreadUtil; import forge.util.Utils; +import forge.util.gui.SOptionPane; import forge.util.storage.IStorage; public class NewQuestScreen extends FScreen { private static final float EMBARK_BTN_HEIGHT = 2 * Utils.AVG_FINGER_HEIGHT; private static final float PADDING = FOptionPane.PADDING; + private final List customFormatCodes = new ArrayList(); + private final List customPrizeFormatCodes = new ArrayList(); + private final FScrollPane scroller = add(new FScrollPane() { @Override protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) { @@ -110,7 +129,18 @@ public class NewQuestScreen extends FScreen { private final FCheckBox cbFantasy = scroller.add(new FCheckBox("Fantasy Mode")); private final FLabel btnEmbark = add(new FLabel.ButtonBuilder() - .font(FSkinFont.get(22)).text("Embark!").icon(FSkinImage.QUEST_ZEP).build()); + .font(FSkinFont.get(22)).text("Embark!").icon(FSkinImage.QUEST_ZEP).command(new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + //create new quest in game thread so option panes can wait for input + ThreadUtil.invokeInGameThread(new Runnable() { + @Override + public void run() { + newQuest(); + } + }); + } + }).build()); public NewQuestScreen() { super("Start a New Quest"); @@ -190,6 +220,43 @@ public class NewQuestScreen extends FScreen { preconDescriptions.put(name, description); } + // disable the very powerful sets -- they can be unlocked later for a high price + final List unselectableSets = new ArrayList(); + unselectableSets.add("LEA"); + unselectableSets.add("LEB"); + unselectableSets.add("MBP"); + unselectableSets.add("VAN"); + unselectableSets.add("ARC"); + unselectableSets.add("PC2"); + + btnDefineCustomFormat.setCommand(new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + /*final DialogChooseSets dialog = new DialogChooseSets(customFormatCodes, unselectableSets, false); + dialog.setOkCallback(new Runnable() { + @Override + public void run() { + customFormatCodes.clear(); + customFormatCodes.addAll(dialog.getSelectedSets()); + } + });*/ + } + }); + + btnPrizeDefineCustomFormat.setCommand(new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + /*final DialogChooseSets dialog = new DialogChooseSets(customPrizeFormatCodes, unselectableSets, false); + dialog.setOkCallback(new Runnable() { + @Override + public void run() { + customPrizeFormatCodes.clear(); + customPrizeFormatCodes.addAll(dialog.getSelectedSets()); + } + });*/ + } + }); + // Fantasy box enabled by Default cbFantasy.setSelected(true); cbFantasy.setEnabled(true); @@ -330,4 +397,125 @@ public class NewQuestScreen extends FScreen { btnEmbark.setBounds(PADDING, height - EMBARK_BTN_HEIGHT - PADDING, width - 2 * PADDING, EMBARK_BTN_HEIGHT); scroller.setBounds(0, startY, width, btnEmbark.getTop() - startY); } + + /** + * The actuator for new quests. + */ + private void newQuest() { + final QuestController qc = FModel.getQuest(); + final QuestMode mode = isFantasy() ? QuestMode.Fantasy : QuestMode.Classic; + + Deck dckStartPool = null; + GameFormat fmtStartPool = null; + int difficulty = getSelectedDifficulty(); + QuestWorld startWorld = FModel.getWorlds().get(getStartingWorldName()); + GameFormat worldFormat = (startWorld == null ? null : startWorld.getFormat()); + + if (worldFormat == null) { + switch(getStartingPoolType()) { + case Rotating: + fmtStartPool = getRotatingFormat(); + break; + + case CustomFormat: + if (customFormatCodes.isEmpty()) { + if (!SOptionPane.showConfirmDialog("You have defined a custom format that doesn't contain any sets.\nThis will start a game without restriction.\n\nContinue?")) { + return; + } + } + fmtStartPool = customFormatCodes.isEmpty() ? null : new GameFormatQuest("Custom", customFormatCodes, null); // chosen sets and no banend cards + break; + + case DraftDeck: + case SealedDeck: + case Cube: + dckStartPool = getSelectedDeck(); + if (null == dckStartPool) { + FOptionPane.showMessageDialog("You have not selected a deck to start.", "Cannot start a quest", FOptionPane.ERROR_ICON); + return; + } + break; + + case Precon: + dckStartPool = QuestController.getPrecons().get(getSelectedPrecon()).getDeck(); + break; + + case Complete: + default: + // leave everything as nulls + break; + } + } + else { + fmtStartPool = worldFormat; + } + + GameFormat fmtPrizes = null; + + // The starting QuestWorld format should NOT affect what you get if you travel to a world that doesn't have one... + // if (worldFormat == null) { + StartingPoolType prizedPoolType = getPrizedPoolType(); + if (null == prizedPoolType) { + fmtPrizes = fmtStartPool; + if (null == fmtPrizes && dckStartPool != null) { // build it form deck + Set sets = new HashSet(); + for (Entry c : dckStartPool.getMain()) { + sets.add(c.getKey().getEdition()); + } + if (dckStartPool.has(DeckSection.Sideboard)) { + for (Entry c : dckStartPool.get(DeckSection.Sideboard)) { + sets.add(c.getKey().getEdition()); + } + } + fmtPrizes = new GameFormat("From deck", sets, null); + } + } + else { + switch(prizedPoolType) { + case Complete: + fmtPrizes = null; + break; + case CustomFormat: + if (customPrizeFormatCodes.isEmpty()) { + if (!SOptionPane.showConfirmDialog("You have defined custom format as containing no sets.\nThis will choose all editions without restriction as prized.\n\nContinue?")) { + return; + } + } + fmtPrizes = customPrizeFormatCodes.isEmpty() ? null : new GameFormat("Custom Prizes", customPrizeFormatCodes, null); // chosen sets and no banend cards + break; + case Rotating: + fmtPrizes = getPrizedRotatingFormat(); + break; + default: + throw new RuntimeException("Should not get this result"); + } + } + + final StartingPoolPreferences userPrefs = new StartingPoolPreferences(randomizeColorDistribution(), getPreferredColor()); + + String questName; + while (true) { + questName = SOptionPane.showInputDialog("Poets will remember your quest as:", "Quest Name"); + if (questName == null) { return; } + + questName = QuestUtil.cleanString(questName); + + if (questName.isEmpty()) { + FOptionPane.showMessageDialog("Please specify a quest name."); + continue; + } + if (FileUtil.doesFileExist(ForgeConstants.QUEST_SAVE_DIR + questName + ".dat")) { + FOptionPane.showMessageDialog("A quest already exists with that name. Please pick another quest name."); + continue; + } + break; + } + + qc.newGame(questName, difficulty, mode, fmtPrizes, isUnlockSetsAllowed(), dckStartPool, fmtStartPool, getStartingWorldName(), userPrefs); + qc.save(); + + // Save in preferences. + FModel.getQuestPreferences().setPref(QPref.CURRENT_QUEST, questName + ".dat"); + FModel.getQuestPreferences().save(); + } } diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestBazaarScreen.java b/forge-gui-mobile/src/forge/screens/quest/QuestBazaarScreen.java index ffc5eac3d00..a566d2118cf 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestBazaarScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestBazaarScreen.java @@ -4,7 +4,7 @@ import forge.screens.FScreen; public class QuestBazaarScreen extends FScreen { public QuestBazaarScreen() { - super("Bazaar", new QuestMenu()); + super("Bazaar", QuestMenu.getMenu()); } @Override diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestChallengesScreen.java b/forge-gui-mobile/src/forge/screens/quest/QuestChallengesScreen.java index 864233057b6..da5b646c791 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestChallengesScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestChallengesScreen.java @@ -4,7 +4,7 @@ import forge.screens.LaunchScreen; public class QuestChallengesScreen extends LaunchScreen { public QuestChallengesScreen() { - super("Quest Duels", new QuestMenu()); + super("Quest Duels", QuestMenu.getMenu()); } @Override diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestDecksScreen.java b/forge-gui-mobile/src/forge/screens/quest/QuestDecksScreen.java index 863bb55a254..042115d069f 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestDecksScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestDecksScreen.java @@ -4,7 +4,7 @@ import forge.screens.FScreen; public class QuestDecksScreen extends FScreen { public QuestDecksScreen() { - super("Select Quest Deck", new QuestMenu()); + super("Select Quest Deck", QuestMenu.getMenu()); } @Override diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestDuelsScreen.java b/forge-gui-mobile/src/forge/screens/quest/QuestDuelsScreen.java index 52f8953388c..b21cb63f73e 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestDuelsScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestDuelsScreen.java @@ -4,7 +4,7 @@ import forge.screens.LaunchScreen; public class QuestDuelsScreen extends LaunchScreen { public QuestDuelsScreen() { - super("Quest Duels", new QuestMenu()); + super("Quest Duels", QuestMenu.getMenu()); } @Override diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestMenu.java b/forge-gui-mobile/src/forge/screens/quest/QuestMenu.java index 8bedafda3a9..ae121adbd83 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestMenu.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestMenu.java @@ -14,6 +14,7 @@ import forge.toolbox.FEvent; import forge.toolbox.FEvent.FEventHandler; public class QuestMenu extends FPopupMenu implements IVQuestStats { + private static final QuestMenu questMenu = new QuestMenu(); private static final QuestBazaarScreen bazaarScreen = new QuestBazaarScreen(); private static QuestChallengesScreen challengesScreen = new QuestChallengesScreen(); private static QuestDecksScreen decksScreen = new QuestDecksScreen(); @@ -23,6 +24,13 @@ public class QuestMenu extends FPopupMenu implements IVQuestStats { private static QuestStatsScreen statsScreen = new QuestStatsScreen(); private static QuestTournamentsScreen tournamentsScreen = new QuestTournamentsScreen(); + public static QuestMenu getMenu() { + return questMenu; + } + + private QuestMenu() { + } + public static void launchQuestMode() { QuestController qc = FModel.getQuest(); if (qc == null || qc.getAssets() == null) { diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestPrefsScreen.java b/forge-gui-mobile/src/forge/screens/quest/QuestPrefsScreen.java index d4bf9902a33..dcdfd29052a 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestPrefsScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestPrefsScreen.java @@ -4,7 +4,7 @@ import forge.screens.FScreen; public class QuestPrefsScreen extends FScreen { public QuestPrefsScreen() { - super("Quest Preferences", new QuestMenu()); + super("Quest Preferences", QuestMenu.getMenu()); } @Override diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestSpellShopScreen.java b/forge-gui-mobile/src/forge/screens/quest/QuestSpellShopScreen.java index fb234737537..5a63bcb6fb7 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestSpellShopScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestSpellShopScreen.java @@ -4,7 +4,7 @@ import forge.screens.FScreen; public class QuestSpellShopScreen extends FScreen { public QuestSpellShopScreen() { - super("Spell Shop", new QuestMenu()); + super("Spell Shop", QuestMenu.getMenu()); } @Override diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestStatsScreen.java b/forge-gui-mobile/src/forge/screens/quest/QuestStatsScreen.java index c80dd2cadce..b4e93465f57 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestStatsScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestStatsScreen.java @@ -64,7 +64,7 @@ public class QuestStatsScreen extends FScreen { } public QuestStatsScreen() { - super("Quest Statistics", new QuestMenu()); + super("Quest Statistics", QuestMenu.getMenu()); } @Override diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestTournamentsScreen.java b/forge-gui-mobile/src/forge/screens/quest/QuestTournamentsScreen.java index 784508bf5fa..fd3fc5b35e2 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestTournamentsScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestTournamentsScreen.java @@ -4,7 +4,7 @@ import forge.screens.LaunchScreen; public class QuestTournamentsScreen extends LaunchScreen { public QuestTournamentsScreen() { - super("Quest Duels", new QuestMenu()); + super("Quest Duels", QuestMenu.getMenu()); } @Override