Hook things up so new quest can be created

This commit is contained in:
drdev
2014-07-06 18:21:17 +00:00
parent 7dd6e74089
commit f1bdfaa819
11 changed files with 206 additions and 10 deletions

View File

@@ -4,7 +4,7 @@ import forge.screens.FScreen;
public class LoadQuestScreen extends FScreen { public class LoadQuestScreen extends FScreen {
public LoadQuestScreen() { public LoadQuestScreen() {
super("Load Quest", new QuestMenu()); super("Load Quest", QuestMenu.getMenu());
} }
@Override @Override

View File

@@ -1,7 +1,12 @@
package forge.screens.quest; package forge.screens.quest;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import org.apache.commons.lang3.text.WordUtils; import org.apache.commons.lang3.text.WordUtils;
@@ -12,13 +17,21 @@ import forge.assets.FSkinImage;
import forge.card.MagicColor; import forge.card.MagicColor;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckGroup; import forge.deck.DeckGroup;
import forge.deck.DeckSection;
import forge.game.GameFormat; import forge.game.GameFormat;
import forge.item.PaperCard;
import forge.item.PreconDeck; import forge.item.PreconDeck;
import forge.model.CardCollections; import forge.model.CardCollections;
import forge.model.FModel; import forge.model.FModel;
import forge.properties.ForgeConstants;
import forge.quest.QuestController; import forge.quest.QuestController;
import forge.quest.QuestMode;
import forge.quest.QuestUtil;
import forge.quest.QuestWorld; import forge.quest.QuestWorld;
import forge.quest.StartingPoolPreferences;
import forge.quest.StartingPoolType; import forge.quest.StartingPoolType;
import forge.quest.data.GameFormatQuest;
import forge.quest.data.QuestPreferences.QPref;
import forge.screens.FScreen; import forge.screens.FScreen;
import forge.toolbox.FCheckBox; import forge.toolbox.FCheckBox;
import forge.toolbox.FComboBox; import forge.toolbox.FComboBox;
@@ -28,13 +41,19 @@ import forge.toolbox.FEvent.FEventHandler;
import forge.toolbox.FLabel; import forge.toolbox.FLabel;
import forge.toolbox.FOptionPane; import forge.toolbox.FOptionPane;
import forge.toolbox.FScrollPane; import forge.toolbox.FScrollPane;
import forge.util.FileUtil;
import forge.util.ThreadUtil;
import forge.util.Utils; import forge.util.Utils;
import forge.util.gui.SOptionPane;
import forge.util.storage.IStorage; import forge.util.storage.IStorage;
public class NewQuestScreen extends FScreen { public class NewQuestScreen extends FScreen {
private static final float EMBARK_BTN_HEIGHT = 2 * Utils.AVG_FINGER_HEIGHT; private static final float EMBARK_BTN_HEIGHT = 2 * Utils.AVG_FINGER_HEIGHT;
private static final float PADDING = FOptionPane.PADDING; private static final float PADDING = FOptionPane.PADDING;
private final List<String> customFormatCodes = new ArrayList<String>();
private final List<String> customPrizeFormatCodes = new ArrayList<String>();
private final FScrollPane scroller = add(new FScrollPane() { private final FScrollPane scroller = add(new FScrollPane() {
@Override @Override
protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) { 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 FCheckBox cbFantasy = scroller.add(new FCheckBox("Fantasy Mode"));
private final FLabel btnEmbark = add(new FLabel.ButtonBuilder() 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() { public NewQuestScreen() {
super("Start a New Quest"); super("Start a New Quest");
@@ -190,6 +220,43 @@ public class NewQuestScreen extends FScreen {
preconDescriptions.put(name, description); preconDescriptions.put(name, description);
} }
// disable the very powerful sets -- they can be unlocked later for a high price
final List<String> unselectableSets = new ArrayList<String>();
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 // Fantasy box enabled by Default
cbFantasy.setSelected(true); cbFantasy.setSelected(true);
cbFantasy.setEnabled(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); btnEmbark.setBounds(PADDING, height - EMBARK_BTN_HEIGHT - PADDING, width - 2 * PADDING, EMBARK_BTN_HEIGHT);
scroller.setBounds(0, startY, width, btnEmbark.getTop() - startY); 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<String> sets = new HashSet<String>();
for (Entry<PaperCard, Integer> c : dckStartPool.getMain()) {
sets.add(c.getKey().getEdition());
}
if (dckStartPool.has(DeckSection.Sideboard)) {
for (Entry<PaperCard, Integer> 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();
}
} }

View File

@@ -4,7 +4,7 @@ import forge.screens.FScreen;
public class QuestBazaarScreen extends FScreen { public class QuestBazaarScreen extends FScreen {
public QuestBazaarScreen() { public QuestBazaarScreen() {
super("Bazaar", new QuestMenu()); super("Bazaar", QuestMenu.getMenu());
} }
@Override @Override

View File

@@ -4,7 +4,7 @@ import forge.screens.LaunchScreen;
public class QuestChallengesScreen extends LaunchScreen { public class QuestChallengesScreen extends LaunchScreen {
public QuestChallengesScreen() { public QuestChallengesScreen() {
super("Quest Duels", new QuestMenu()); super("Quest Duels", QuestMenu.getMenu());
} }
@Override @Override

View File

@@ -4,7 +4,7 @@ import forge.screens.FScreen;
public class QuestDecksScreen extends FScreen { public class QuestDecksScreen extends FScreen {
public QuestDecksScreen() { public QuestDecksScreen() {
super("Select Quest Deck", new QuestMenu()); super("Select Quest Deck", QuestMenu.getMenu());
} }
@Override @Override

View File

@@ -4,7 +4,7 @@ import forge.screens.LaunchScreen;
public class QuestDuelsScreen extends LaunchScreen { public class QuestDuelsScreen extends LaunchScreen {
public QuestDuelsScreen() { public QuestDuelsScreen() {
super("Quest Duels", new QuestMenu()); super("Quest Duels", QuestMenu.getMenu());
} }
@Override @Override

View File

@@ -14,6 +14,7 @@ import forge.toolbox.FEvent;
import forge.toolbox.FEvent.FEventHandler; import forge.toolbox.FEvent.FEventHandler;
public class QuestMenu extends FPopupMenu implements IVQuestStats { public class QuestMenu extends FPopupMenu implements IVQuestStats {
private static final QuestMenu questMenu = new QuestMenu();
private static final QuestBazaarScreen bazaarScreen = new QuestBazaarScreen(); private static final QuestBazaarScreen bazaarScreen = new QuestBazaarScreen();
private static QuestChallengesScreen challengesScreen = new QuestChallengesScreen(); private static QuestChallengesScreen challengesScreen = new QuestChallengesScreen();
private static QuestDecksScreen decksScreen = new QuestDecksScreen(); 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 QuestStatsScreen statsScreen = new QuestStatsScreen();
private static QuestTournamentsScreen tournamentsScreen = new QuestTournamentsScreen(); private static QuestTournamentsScreen tournamentsScreen = new QuestTournamentsScreen();
public static QuestMenu getMenu() {
return questMenu;
}
private QuestMenu() {
}
public static void launchQuestMode() { public static void launchQuestMode() {
QuestController qc = FModel.getQuest(); QuestController qc = FModel.getQuest();
if (qc == null || qc.getAssets() == null) { if (qc == null || qc.getAssets() == null) {

View File

@@ -4,7 +4,7 @@ import forge.screens.FScreen;
public class QuestPrefsScreen extends FScreen { public class QuestPrefsScreen extends FScreen {
public QuestPrefsScreen() { public QuestPrefsScreen() {
super("Quest Preferences", new QuestMenu()); super("Quest Preferences", QuestMenu.getMenu());
} }
@Override @Override

View File

@@ -4,7 +4,7 @@ import forge.screens.FScreen;
public class QuestSpellShopScreen extends FScreen { public class QuestSpellShopScreen extends FScreen {
public QuestSpellShopScreen() { public QuestSpellShopScreen() {
super("Spell Shop", new QuestMenu()); super("Spell Shop", QuestMenu.getMenu());
} }
@Override @Override

View File

@@ -64,7 +64,7 @@ public class QuestStatsScreen extends FScreen {
} }
public QuestStatsScreen() { public QuestStatsScreen() {
super("Quest Statistics", new QuestMenu()); super("Quest Statistics", QuestMenu.getMenu());
} }
@Override @Override

View File

@@ -4,7 +4,7 @@ import forge.screens.LaunchScreen;
public class QuestTournamentsScreen extends LaunchScreen { public class QuestTournamentsScreen extends LaunchScreen {
public QuestTournamentsScreen() { public QuestTournamentsScreen() {
super("Quest Duels", new QuestMenu()); super("Quest Duels", QuestMenu.getMenu());
} }
@Override @Override