diff --git a/src/main/java/forge/Constant.java b/src/main/java/forge/Constant.java
index 546a057df68..c05fd1674b1 100644
--- a/src/main/java/forge/Constant.java
+++ b/src/main/java/forge/Constant.java
@@ -287,32 +287,6 @@ public final class Constant {
public static final String[] BASIC_LANDS = { "Plains", "Island", "Swamp", "Mountain", "Forest" };
}
- /**
- * The Interface Quest.
- */
- public static class Quest {
-
- /** The fantasy quest. */
- public static final boolean[] FANTASY_QUEST = new boolean[1];
-
- // public static final Quest_Assignment[] qa = new Quest_Assignment[1];
-
- /** The human list. */
- public static final CardList[] HUMAN_LIST = new CardList[1];
-
- /** The computer list. */
- public static final CardList[] COMPUTER_LIST = new CardList[1];
-
- /** The human life. */
- public static final int[] HUMAN_LIFE = new int[1];
-
- /** The computer life. */
- public static final int[] COMPUTER_LIFE = new int[1];
-
- /** The opp icon name. */
- public static final String[] OPP_ICON_NAME = new String[1];
- }
-
/**
* The Interface CardTypes.
*/
diff --git a/src/main/java/forge/card/spellability/SpellAbilityVariables.java b/src/main/java/forge/card/spellability/SpellAbilityVariables.java
index 871971ca6f4..eb89536a2e1 100644
--- a/src/main/java/forge/card/spellability/SpellAbilityVariables.java
+++ b/src/main/java/forge/card/spellability/SpellAbilityVariables.java
@@ -20,7 +20,6 @@ package forge.card.spellability;
import java.util.ArrayList;
import forge.Constant;
-import forge.Constant.Zone;
/**
*
diff --git a/src/main/java/forge/control/ControlMatchUI.java b/src/main/java/forge/control/ControlMatchUI.java
index 55cf0f394a6..3e6f027f6b6 100644
--- a/src/main/java/forge/control/ControlMatchUI.java
+++ b/src/main/java/forge/control/ControlMatchUI.java
@@ -84,7 +84,7 @@ public class ControlMatchUI implements CardContainer {
* Fires up controllers for each component of UI.
*
*/
- public void initMatch() {
+ public void initMatch(String iconEnemy) {
ControlMatchUI.this.showCombat("");
ControlMatchUI.this.showStack();
@@ -97,8 +97,8 @@ public class ControlMatchUI implements CardContainer {
if (i != 1 && Constant.Runtime.getGameType() == GameType.Quest) {
String filename = ForgeProps.getFile(NewConstants.IMAGE_ICON) + File.separator;
- if (Constant.Quest.OPP_ICON_NAME[0] != null) {
- filename += Constant.Quest.OPP_ICON_NAME[0];
+ if (iconEnemy != null) {
+ filename += iconEnemy;
final File f = new File(filename);
img = (f.exists()
? new ImageIcon(filename).getImage()
diff --git a/src/main/java/forge/control/input/InputMulligan.java b/src/main/java/forge/control/input/InputMulligan.java
index ab5eb17a3b1..afaefb57eea 100644
--- a/src/main/java/forge/control/input/InputMulligan.java
+++ b/src/main/java/forge/control/input/InputMulligan.java
@@ -37,7 +37,7 @@ import forge.Singletons;
import forge.card.abilityfactory.AbilityFactory;
import forge.card.spellability.SpellAbility;
import forge.game.GamePlayerRating;
-import forge.quest.data.QuestData;
+import forge.quest.data.QuestController;
/**
*
* InputMulligan class.
@@ -103,8 +103,8 @@ public class InputMulligan extends Input {
final int newHand = this.doMulligan(humanPlayer, humanRating);
- final QuestData quest = AllZone.getQuestData();
- if ((quest != null) && quest.getInventory().hasItem("Sleight") && (humanRating.getMulliganCount() == 1)) {
+ final QuestController quest = AllZone.getQuest();
+ if (quest.isLoaded() && quest.getAssets().getInventory().hasItem("Sleight") && (humanRating.getMulliganCount() == 1)) {
AllZone.getHumanPlayer().drawCard();
humanRating.notifyOpeningHandSize(newHand + 1);
}
diff --git a/src/main/java/forge/game/GameNew.java b/src/main/java/forge/game/GameNew.java
index 35d38f913b4..1bfff4b9ac1 100644
--- a/src/main/java/forge/game/GameNew.java
+++ b/src/main/java/forge/game/GameNew.java
@@ -51,12 +51,12 @@ public class GameNew {
* int.
* @param computerLife
* int.
+ * @param iconEnemy
*/
public static void newGame(final Deck humanDeck, final Deck computerDeck, final CardList human,
- final CardList computer, final int humanLife, final int computerLife) {
+ final CardList computer, final int humanLife, final int computerLife, String iconEnemy) {
Singletons.getControl().changeState(FControl.MATCH_SCREEN);
- Singletons.getControl().getControlMatch().initMatch();
- Constant.Quest.FANTASY_QUEST[0] = true;
+ Singletons.getControl().getControlMatch().initMatch(iconEnemy);
GameNew.newGameCleanup();
GameNew.newMatchCleanup();
@@ -88,8 +88,7 @@ public class GameNew {
*/
public static void newGame(final Deck humanDeck, final Deck computerDeck) {
Singletons.getControl().changeState(FControl.MATCH_SCREEN);
- Singletons.getControl().getControlMatch().initMatch();
- Constant.Quest.FANTASY_QUEST[0] = false;
+ Singletons.getControl().getControlMatch().initMatch(null);
GameNew.newGameCleanup();
GameNew.newMatchCleanup();
diff --git a/src/main/java/forge/gui/deckeditor/DeckEditorQuest.java b/src/main/java/forge/gui/deckeditor/DeckEditorQuest.java
index db1589a3dc3..493e91d4c42 100644
--- a/src/main/java/forge/gui/deckeditor/DeckEditorQuest.java
+++ b/src/main/java/forge/gui/deckeditor/DeckEditorQuest.java
@@ -46,7 +46,7 @@ import forge.gui.deckeditor.elements.TableView;
import forge.item.CardPrinted;
import forge.item.InventoryItem;
import forge.item.ItemPool;
-import forge.quest.data.QuestData;
+import forge.quest.data.QuestController;
import forge.util.Predicate;
//import forge.quest.data.QuestBoosterPack;
@@ -74,7 +74,7 @@ public final class DeckEditorQuest extends DeckEditorBase {
private FilterNameTypeSetPanel filterNameTypeSet;
- private final QuestData questData;
+ private final QuestController questData;
private final DeckController controller;
/**
@@ -179,7 +179,7 @@ public final class DeckEditorQuest extends DeckEditorBase {
* @param questData2
* the quest data2
*/
- public DeckEditorQuest(final QuestData questData2) {
+ public DeckEditorQuest(final QuestController questData2) {
this.questData = questData2;
try {
diff --git a/src/main/java/forge/gui/deckeditor/QuestCardShop.java b/src/main/java/forge/gui/deckeditor/QuestCardShop.java
index d7fbbd682a5..347988c52b3 100644
--- a/src/main/java/forge/gui/deckeditor/QuestCardShop.java
+++ b/src/main/java/forge/gui/deckeditor/QuestCardShop.java
@@ -54,7 +54,7 @@ import forge.item.OpenablePack;
import forge.item.PreconDeck;
import forge.item.TournamentPack;
import forge.quest.ReadPriceList;
-import forge.quest.data.QuestData;
+import forge.quest.data.QuestController;
import forge.util.Predicate;
/**
@@ -81,7 +81,7 @@ public final class QuestCardShop extends DeckEditorBase
private double multiplier;
- private final QuestData questData;
+ private final QuestController questData;
// get pricelist:
private final ReadPriceList r = new ReadPriceList();
@@ -211,7 +211,7 @@ public final class QuestCardShop extends DeckEditorBase
* @param qd
* a {@link forge.quest.data.QuestData} object.
*/
- public QuestCardShop(final QuestData qd) {
+ public QuestCardShop(final QuestController qd) {
this.questData = qd;
try {
this.setFilterBoxes(null);
@@ -265,7 +265,7 @@ public final class QuestCardShop extends DeckEditorBase
this.setTitle("Card Shop");
this.creditsLabel.setBounds(new Rectangle(350, 365, 714, 31));
- this.creditsLabel.setText("Total credits: " + this.questData.getCredits());
+ this.creditsLabel.setText("Total credits: " + this.questData.getAssets().getCredits());
this.creditsLabel.setFont(new java.awt.Font("Dialog", 0, 14));
this.sellPercentageLabel.setBounds(new Rectangle(380, 395, 450, 31));
this.sellPercentageLabel.setText("(Sell percentage: " + this.multiplier + ")");
@@ -326,7 +326,7 @@ public final class QuestCardShop extends DeckEditorBase
final int value = this.getCardValue(item);
- if (value <= this.questData.getCredits()) {
+ if (value <= this.questData.getAssets().getCredits()) {
if (item instanceof CardPrinted) {
this.getTopTableWithCards().removeCard(item);
@@ -368,7 +368,7 @@ public final class QuestCardShop extends DeckEditorBase
}
- this.creditsLabel.setText("Total credits: " + this.questData.getCredits());
+ this.creditsLabel.setText("Total credits: " + this.questData.getAssets().getCredits());
} else {
JOptionPane.showMessageDialog(null, "Not enough credits!");
}
@@ -398,7 +398,7 @@ public final class QuestCardShop extends DeckEditorBase
.getSellPriceLimit());
this.questData.getCards().sellCard(card, price);
- this.creditsLabel.setText("Total credits: " + this.questData.getCredits());
+ this.creditsLabel.setText("Total credits: " + this.questData.getAssets().getCredits());
}
@SuppressWarnings("rawtypes")
diff --git a/src/main/java/forge/gui/home/quest/CSubmenuChallenges.java b/src/main/java/forge/gui/home/quest/CSubmenuChallenges.java
index b519c0230ed..7ba820750c5 100644
--- a/src/main/java/forge/gui/home/quest/CSubmenuChallenges.java
+++ b/src/main/java/forge/gui/home/quest/CSubmenuChallenges.java
@@ -15,6 +15,7 @@ import forge.gui.home.ICSubmenu;
import forge.gui.home.quest.SubmenuQuestUtil.SelectablePanel;
import forge.gui.toolbox.FLabel;
import forge.quest.data.QuestChallenge;
+import forge.quest.data.QuestController;
import forge.quest.data.QuestEventManager;
import forge.view.ViewHomeUI;
@@ -25,6 +26,7 @@ import forge.view.ViewHomeUI;
public enum CSubmenuChallenges implements ICSubmenu {
/** */
SINGLETON_INSTANCE;
+
/* (non-Javadoc)
* @see forge.control.home.IControlSubmenu#getCommand()
@@ -32,9 +34,10 @@ public enum CSubmenuChallenges implements ICSubmenu {
@SuppressWarnings("serial")
@Override
public Command getMenuCommand() {
+ final QuestController qc = AllZone.getQuest();
return new Command() {
public void execute() {
- if (AllZone.getQuestData() == null) {
+ if (qc.getAchievements() == null) {
ViewHomeUI.SINGLETON_INSTANCE.itemClick(EMenuItem.QUEST_DATA);
}
}
@@ -70,17 +73,18 @@ public enum CSubmenuChallenges implements ICSubmenu {
}
});
+ final QuestController quest = AllZone.getQuest();
view.getCbPlant().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
- AllZone.getQuestData().getPetManager().setUsePlant(view.getCbPlant().isSelected());
+ quest.getAssets().getPetManager().setUsePlant(view.getCbPlant().isSelected());
}
});
view.getCbZep().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
- AllZone.getQuestData().getPetManager().setUsePlant(view.getCbZep().isSelected());
+ quest.getAssets().getPetManager().setUsePlant(view.getCbZep().isSelected());
}
});
@@ -90,10 +94,10 @@ public enum CSubmenuChallenges implements ICSubmenu {
final int index = view.getCbxPet().getSelectedIndex();
if (index != -1 && index != 0) {
final String pet = ((String) view.getCbxPet().getSelectedItem());
- AllZone.getQuestData().getPetManager().setSelectedPet(pet.substring(7));
+ quest.getAssets().getPetManager().setSelectedPet(pet.substring(7));
}
else {
- AllZone.getQuestData().getPetManager().setSelectedPet(null);
+ quest.getAssets().getPetManager().setSelectedPet(null);
}
}
});
@@ -108,12 +112,12 @@ public enum CSubmenuChallenges implements ICSubmenu {
final VSubmenuChallenges view = VSubmenuChallenges.SINGLETON_INSTANCE;
- if (AllZone.getQuestData() != null) {
- view.getLblTitle().setText("Challenges: " + AllZone.getQuestData().getRank());
+ if (AllZone.getQuest().getAchievements() != null) {
+ view.getLblTitle().setText("Challenges: " + AllZone.getQuest().getRank());
view.getPnlChallenges().removeAll();
final List challenges =
- QuestEventManager.generateChallenges();
+ QuestEventManager.INSTANCE.generateChallenges();
for (final QuestChallenge c : challenges) {
final SelectablePanel temp = new SelectablePanel(c);
diff --git a/src/main/java/forge/gui/home/quest/CSubmenuDuels.java b/src/main/java/forge/gui/home/quest/CSubmenuDuels.java
index cceeba2cafa..723af344930 100644
--- a/src/main/java/forge/gui/home/quest/CSubmenuDuels.java
+++ b/src/main/java/forge/gui/home/quest/CSubmenuDuels.java
@@ -9,6 +9,7 @@ import forge.Command;
import forge.gui.home.EMenuItem;
import forge.gui.home.ICSubmenu;
import forge.gui.home.quest.SubmenuQuestUtil.SelectablePanel;
+import forge.quest.data.QuestController;
import forge.quest.data.QuestDuel;
import forge.quest.data.QuestEventManager;
import forge.view.ViewHomeUI;
@@ -27,9 +28,10 @@ public enum CSubmenuDuels implements ICSubmenu {
@SuppressWarnings("serial")
@Override
public Command getMenuCommand() {
+ final QuestController qc = AllZone.getQuest();
return new Command() {
public void execute() {
- if (AllZone.getQuestData() == null) {
+ if (qc.getAchievements() == null) {
ViewHomeUI.SINGLETON_INSTANCE.itemClick(EMenuItem.QUEST_DATA);
}
}
@@ -65,17 +67,18 @@ public enum CSubmenuDuels implements ICSubmenu {
}
});
+ final QuestController quest = AllZone.getQuest();
view.getCbPlant().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
- AllZone.getQuestData().getPetManager().setUsePlant(view.getCbPlant().isSelected());
+ quest.getAssets().getPetManager().setUsePlant(view.getCbPlant().isSelected());
}
});
view.getCbZep().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
- AllZone.getQuestData().getPetManager().setUsePlant(view.getCbZep().isSelected());
+ quest.getAssets().getPetManager().setUsePlant(view.getCbZep().isSelected());
}
});
@@ -85,10 +88,10 @@ public enum CSubmenuDuels implements ICSubmenu {
final int index = view.getCbxPet().getSelectedIndex();
if (index != -1 && index != 0) {
final String pet = ((String) view.getCbxPet().getSelectedItem());
- AllZone.getQuestData().getPetManager().setSelectedPet(pet.substring(7));
+ quest.getAssets().getPetManager().setSelectedPet(pet.substring(7));
}
else {
- AllZone.getQuestData().getPetManager().setSelectedPet(null);
+ quest.getAssets().getPetManager().setSelectedPet(null);
}
}
});
@@ -103,11 +106,11 @@ public enum CSubmenuDuels implements ICSubmenu {
final VSubmenuDuels view = VSubmenuDuels.SINGLETON_INSTANCE;
- if (AllZone.getQuestData() != null) {
- view.getLblTitle().setText("Duels: " + AllZone.getQuestData().getRank());
+ if (AllZone.getQuest().getAchievements() != null) {
+ view.getLblTitle().setText("Duels: " + AllZone.getQuest().getRank());
view.getPnlDuels().removeAll();
- final List duels = QuestEventManager.generateDuels();
+ final List duels = QuestEventManager.INSTANCE.generateDuels();
for (final QuestDuel d : duels) {
final SelectablePanel temp = new SelectablePanel(d);
diff --git a/src/main/java/forge/gui/home/quest/CSubmenuQuestData.java b/src/main/java/forge/gui/home/quest/CSubmenuQuestData.java
index 8a9d190e731..2237cde7266 100644
--- a/src/main/java/forge/gui/home/quest/CSubmenuQuestData.java
+++ b/src/main/java/forge/gui/home/quest/CSubmenuQuestData.java
@@ -7,14 +7,17 @@ import forge.gui.GuiUtils;
import forge.gui.home.ICSubmenu;
import forge.properties.ForgeProps;
import forge.properties.NewConstants;
+import forge.quest.data.QuestController;
import forge.quest.data.QuestData;
import forge.quest.data.QuestDataIO;
+import forge.quest.data.QuestMode;
import forge.quest.data.QuestPreferences.QPref;
import forge.quest.data.QuestStartPool;
import javax.swing.*;
import java.io.File;
import java.io.FilenameFilter;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@@ -64,6 +67,7 @@ public enum CSubmenuQuestData implements ICSubmenu {
public void update() {
final VSubmenuQuestData view = VSubmenuQuestData.SINGLETON_INSTANCE;
final File dirQuests = ForgeProps.getFile(NewConstants.Quest.DATA_DIR);
+ final QuestController qc = AllZone.getQuest();
// Temporary transition code between v1.2.2 and v1.2.3.
// Can be safely deleted after release of 1.2.3.
@@ -90,7 +94,7 @@ public enum CSubmenuQuestData implements ICSubmenu {
}
// Populate list with available quest datas.
- view.getLstQuests().setQuests(arrQuests.values().toArray(new QuestData[0]));
+ view.getLstQuests().setQuests(new ArrayList(arrQuests.values()));
// If there are quests available, force select.
if (arrQuests.size() > 0) {
@@ -106,10 +110,10 @@ public enum CSubmenuQuestData implements ICSubmenu {
}
// Drop into AllZone.
- AllZone.setQuestData(view.getLstQuests().getSelectedQuest());
+ qc.load(view.getLstQuests().getSelectedQuest());
}
else {
- AllZone.setQuestData(null);
+ qc.load(null);
}
view.getLstQuests().setSelectCommand(cmdQuestSelect);
@@ -122,11 +126,8 @@ public enum CSubmenuQuestData implements ICSubmenu {
private void newQuest() {
final VSubmenuQuestData view = VSubmenuQuestData.SINGLETON_INSTANCE;
int difficulty = 0;
- QuestData newdata = new QuestData();
-
- final String mode = view.getRadFantasy().isSelected()
- ? forge.quest.data.QuestData.FANTASY
- : forge.quest.data.QuestData.CLASSIC;
+
+ final QuestMode mode = view.getRadFantasy().isSelected() ? QuestMode.Fantasy : QuestMode.Classic;
if (view.getRadEasy().isSelected()) {
difficulty = 0;
@@ -163,9 +164,8 @@ public enum CSubmenuQuestData implements ICSubmenu {
}
// Give the user a few cards to build a deck
- newdata.newGame(difficulty, mode, startPool, startPrecon);
- newdata.setName(questName);
- newdata.saveData();
+ AllZone.getQuest().newGame(questName, difficulty, mode, startPool, startPrecon);
+ AllZone.getQuest().save();
// Save in preferences.
Singletons.getModel().getQuestPreferences().setPreference(QPref.CURRENT_QUEST, questName + ".dat");
@@ -176,12 +176,12 @@ public enum CSubmenuQuestData implements ICSubmenu {
/** Changes between quest data files. */
private void changeQuest() {
- AllZone.setQuestData(VSubmenuQuestData.SINGLETON_INSTANCE
+ AllZone.getQuest().load(VSubmenuQuestData.SINGLETON_INSTANCE
.getLstQuests().getSelectedQuest());
// Save in preferences.
Singletons.getModel().getQuestPreferences().setPreference(QPref.CURRENT_QUEST,
- AllZone.getQuestData().getName() + ".dat");
+ AllZone.getQuest().getName() + ".dat");
Singletons.getModel().getQuestPreferences().save();
SubmenuQuestUtil.updateStatsAndPet();
diff --git a/src/main/java/forge/gui/home/quest/CSubmenuQuestDecks.java b/src/main/java/forge/gui/home/quest/CSubmenuQuestDecks.java
index 27e8b849319..2ef22214e4f 100644
--- a/src/main/java/forge/gui/home/quest/CSubmenuQuestDecks.java
+++ b/src/main/java/forge/gui/home/quest/CSubmenuQuestDecks.java
@@ -10,7 +10,7 @@ import forge.gui.OverlayUtils;
import forge.gui.deckeditor.DeckEditorQuest;
import forge.gui.home.EMenuItem;
import forge.gui.home.ICSubmenu;
-import forge.quest.data.QuestData;
+import forge.quest.data.QuestController;
import forge.quest.data.QuestPreferences.QPref;
import forge.view.ViewHomeUI;
@@ -27,7 +27,7 @@ public enum CSubmenuQuestDecks implements ICSubmenu {
private final Command cmdDeckExit = new Command() {
@Override
public void execute() {
- AllZone.getQuestData().saveData();
+ AllZone.getQuest().save();
OverlayUtils.hideOverlay();
update();
}
@@ -52,10 +52,11 @@ public enum CSubmenuQuestDecks implements ICSubmenu {
*/
@Override
public Command getMenuCommand() {
+ final QuestController qc = AllZone.getQuest();
return new Command() {
@Override
public void execute() {
- if (AllZone.getQuestData() == null) {
+ if (qc.getAchievements() == null) {
ViewHomeUI.SINGLETON_INSTANCE.itemClick(EMenuItem.QUEST_DATA);
}
}
@@ -73,7 +74,7 @@ public enum CSubmenuQuestDecks implements ICSubmenu {
VSubmenuQuestDecks.SINGLETON_INSTANCE.getBtnNewDeck().setCommand(new Command() {
@Override
public void execute() {
- final DeckEditorQuest editor = new DeckEditorQuest(AllZone.getQuestData());
+ final DeckEditorQuest editor = new DeckEditorQuest(AllZone.getQuest());
editor.show(cmdDeckExit);
OverlayUtils.showOverlay();
editor.setVisible(true);
@@ -87,14 +88,15 @@ public enum CSubmenuQuestDecks implements ICSubmenu {
@Override
public void update() {
final VSubmenuQuestDecks view = VSubmenuQuestDecks.SINGLETON_INSTANCE;
- final QuestData qData = AllZone.getQuestData();
+ final QuestController qData = AllZone.getQuest();
+ boolean hasQuest = qData.getAssets() != null;
// Retrieve and set all decks
- view.getLstDecks().setDecks(qData != null ? qData.getMyDecks() : new ArrayList());
+ view.getLstDecks().setDecks(hasQuest ? qData.getMyDecks() : new ArrayList());
// Look through list for preferred deck from prefs
currentDeck = null;
- if (qData != null) {
+ if (hasQuest) {
final String cd = Singletons.getModel().getQuestPreferences().getPreference(QPref.CURRENT_DECK);
for (Deck d : qData.getMyDecks()) {
diff --git a/src/main/java/forge/gui/home/quest/QuestFileLister.java b/src/main/java/forge/gui/home/quest/QuestFileLister.java
index b891c95aa5f..f565ef95933 100644
--- a/src/main/java/forge/gui/home/quest/QuestFileLister.java
+++ b/src/main/java/forge/gui/home/quest/QuestFileLister.java
@@ -67,7 +67,7 @@ public class QuestFileLister extends JPanel {
}
/** @param qd0 {@link forge.quest.data.QuestData}[] */
- public void setQuests(QuestData[] qd0) {
+ public void setQuests(List qd0) {
this.removeAll();
List tempRows = new ArrayList();
List sorted = new ArrayList();
@@ -95,13 +95,13 @@ public class QuestFileLister extends JPanel {
RowPanel row;
String mode;
for (QuestData qd : sorted) {
- mode = qd.getMode().equals("Realistic") ? "Classic" : qd.getMode();
+ mode = qd.getMode().toString();
row = new RowPanel(qd);
row.add(new DeleteButton(row), "w 15%!, h 20px!, gap 0 0 5px 0");
row.add(new EditButton(row), "w 15%!, h 20px!, gaptop 5px");
row.add(new FLabel.Builder().text(qd.getName()).build(), "w 40%!, h 20px!, gap 0 0 5px 0");
row.add(new FLabel.Builder().text(mode).fontAlign(SwingConstants.CENTER).build(), "w 15%!, h 20px!, gap 0 0 5px 0");
- row.add(new FLabel.Builder().text(qd.getWin() + "/" + qd.getLost())
+ row.add(new FLabel.Builder().text(qd.getAchievements().getWin() + "/" + qd.getAchievements().getLost())
.fontAlign(SwingConstants.CENTER).build(), "w 15%!, h 20px!, gap 0 0 5px 0");
this.add(row, "w 98%!, h 30px!, gap 1% 0 0 0");
tempRows.add(row);
diff --git a/src/main/java/forge/gui/home/quest/SubmenuQuestUtil.java b/src/main/java/forge/gui/home/quest/SubmenuQuestUtil.java
index d521cb60b58..edc870d4c11 100644
--- a/src/main/java/forge/gui/home/quest/SubmenuQuestUtil.java
+++ b/src/main/java/forge/gui/home/quest/SubmenuQuestUtil.java
@@ -24,9 +24,13 @@ import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FTextArea;
import forge.properties.ForgeProps;
import forge.properties.NewConstants;
+import forge.quest.data.QuestAchievements;
+import forge.quest.data.QuestAssets;
import forge.quest.data.QuestChallenge;
-import forge.quest.data.QuestData;
+import forge.quest.data.QuestController;
import forge.quest.data.QuestEvent;
+import forge.quest.data.QuestEventManager;
+import forge.quest.data.QuestMode;
import forge.quest.data.QuestPreferences.QPref;
import forge.quest.data.QuestUtil;
import forge.quest.data.item.QuestItemZeppelin;
@@ -47,28 +51,29 @@ public class SubmenuQuestUtil {
* @return a int.
*/
public static int nextChallengeInWins() {
- final QuestData qData = AllZone.getQuestData();
- final int challengesPlayed = qData.getChallengesPlayed();
+ final QuestController qData = AllZone.getQuest();
+ final int challengesPlayed = qData.getAchievements().getChallengesPlayed();
int mul = 5;
- if (qData.getInventory().hasItem("Zeppelin")) {
+ if (qData.getAssets().getInventory().hasItem("Zeppelin")) {
mul = 3;
- } else if (qData.getInventory().hasItem("Map")) {
+ } else if (qData.getAssets().getInventory().hasItem("Map")) {
mul = 4;
}
- final int delta = (qData.getWin() < 20
- ? 20 - qData.getWin()
- : (challengesPlayed * mul) - qData.getWin());
+ final int wins = qData.getAchievements().getWin();
+ final int delta = (wins < 20 ? 20 - wins : (challengesPlayed * mul) - wins);
return (delta > 0) ? delta : 0;
}
/** Updates stats, pets panels for both duels and challenges. */
public static void updateStatsAndPet() {
- final QuestData qData = AllZone.getQuestData();
+ final QuestController qData = AllZone.getQuest();
+ final QuestAchievements qA = qData.getAchievements();
+ final QuestAssets qS = qData.getAssets();
- if (qData == null) { return; }
+ if (qA == null) { return; }
final IStatsAndPet[] viewsToUpdate = new IStatsAndPet[] {
VSubmenuDuels.SINGLETON_INSTANCE,
@@ -83,10 +88,10 @@ public class SubmenuQuestUtil {
view.getLblLife().setVisible(true);
// Stats panel
- view.getLblCredits().setText("Credits: " + qData.getCredits());
- view.getLblLife().setText("Life: " + qData.getLife());
- view.getLblWins().setText("Wins: " + qData.getWin());
- view.getLblLosses().setText("Losses: " + qData.getLost());
+ view.getLblCredits().setText("Credits: " + qS.getCredits());
+ view.getLblLife().setText("Life: " + qS.getLife());
+ view.getLblWins().setText("Wins: " + qA.getWin());
+ view.getLblLosses().setText("Losses: " + qA.getLost());
view.updateCurrentDeckStatus();
final int num = SubmenuQuestUtil.nextChallengeInWins();
@@ -98,13 +103,13 @@ public class SubmenuQuestUtil {
}
view.getLblWinStreak().setText(
- "Win streak: " + qData.getWinStreakCurrent()
- + " (Best:" + qData.getWinStreakBest() + ")");
+ "Win streak: " + qA.getWinStreakCurrent()
+ + " (Best:" + qA.getWinStreakBest() + ")");
// Start panel: pet, plant, zep.
- if (qData.getMode().equals(QuestData.FANTASY)) {
- final Set petList = qData.getPetManager().getAvailablePetNames();
- final QuestPetAbstract currentPet = qData.getPetManager().getSelectedPet();
+ if (qData.getMode() == QuestMode.Fantasy) {
+ final Set petList = qS.getPetManager().getAvailablePetNames();
+ final QuestPetAbstract currentPet = qS.getPetManager().getSelectedPet();
view.getCbxPet().removeAllItems();
// Pet list visibility
@@ -121,19 +126,19 @@ public class SubmenuQuestUtil {
}
// Plant visiblity
- if (qData.getPetManager().getPlant().getLevel() == 0) {
+ if (qS.getPetManager().getPlant().getLevel() == 0) {
view.getCbPlant().setVisible(false);
}
else {
view.getCbPlant().setVisible(true);
- view.getCbPlant().setSelected(qData.getPetManager().shouldPlantBeUsed());
+ view.getCbPlant().setSelected(qS.getPetManager().shouldPlantBeUsed());
}
// Zeppelin visibility: everything about the zeppelin is screwy right now
// for some reason, needs a large overhaul, disabled for now. 4-03-12
if (false) { //view.equals(VSubmenuChallenges.SINGLETON_INSTANCE)) {
- final QuestItemZeppelin zeppelin = (QuestItemZeppelin) qData.getInventory().getItem("Zeppelin");
- view.getCbZep().setVisible(zeppelin.isAvailableForPurchase() ? true : false);
+ final QuestItemZeppelin zeppelin = (QuestItemZeppelin) qS.getInventory().getItem("Zeppelin");
+ view.getCbZep().setVisible(zeppelin.isAvailableForPurchase(qS) ? true : false);
}
else {
view.getCbZep().setVisible(false);
@@ -160,8 +165,8 @@ public class SubmenuQuestUtil {
public static Deck getCurrentDeck() {
Deck d = null;
- if (AllZone.getQuestData() != null) {
- d = AllZone.getQuestData().getMyDecks().get(
+ if (AllZone.getQuest().getAssets() != null) {
+ d = AllZone.getQuest().getMyDecks().get(
Singletons.getModel().getQuestPreferences().getPreference(QPref.CURRENT_DECK));
}
@@ -174,12 +179,12 @@ public class SubmenuQuestUtil {
final Command exit = new Command() {
@Override
public void execute() {
- AllZone.getQuestData().saveData();
+ AllZone.getQuest().save();
updateStatsAndPet();
}
};
- final QuestCardShop g = new QuestCardShop(AllZone.getQuestData());
+ final QuestCardShop g = new QuestCardShop(AllZone.getQuest());
g.show(exit);
g.setVisible(true);
}
@@ -192,7 +197,7 @@ public class SubmenuQuestUtil {
/** */
public static void startGame() {
- final QuestData qData = AllZone.getQuestData();
+ final QuestController qData = AllZone.getQuest();
final QuestEvent event = selectedOpponent.getEvent();
SwingUtilities.invokeLater(new Runnable() {
@@ -208,15 +213,13 @@ public class SubmenuQuestUtil {
public Object doInBackground() {
Constant.Runtime.HUMAN_DECK[0] = SubmenuQuestUtil.getCurrentDeck();
Constant.Runtime.COMPUTER_DECK[0] = event.getEventDeck();
- Constant.Quest.OPP_ICON_NAME[0] = event.getIconFilename();
Constant.Runtime.setGameType(GameType.Quest);
- qData.randomizeOpponents();
+ QuestEventManager.INSTANCE.randomizeOpponents();
qData.setCurrentEvent(event);
- qData.saveData();
+ qData.save();
- if (qData.isFantasy()) {
- Constant.Quest.FANTASY_QUEST[0] = true;
+ if (qData.getMode() == QuestMode.Fantasy) {
int lifeAI = 20;
int lifeHuman = 20;
@@ -225,21 +228,22 @@ public class SubmenuQuestUtil {
// If zeppelin has been purchased, gear will be at level 2.
if (event.getEventType().equalsIgnoreCase("challenge")
- && !qData.getInventory().getItem("Zeppelin").isAvailableForPurchase()
+ && !qData.getAssets().getInventory().getItem("Zeppelin").isAvailableForPurchase(qData.getAssets())
&& VSubmenuChallenges.SINGLETON_INSTANCE.getCbZep().isSelected()) {
extraLife = 3;
}
lifeAI = ((QuestChallenge) event).getAILife();
- lifeHuman = qData.getLife() + extraLife;
+ lifeHuman = qData.getAssets().getLife() + extraLife;
}
GameNew.newGame(
Constant.Runtime.HUMAN_DECK[0],
Constant.Runtime.COMPUTER_DECK[0],
- QuestUtil.getHumanStartingCards(qData),
- QuestUtil.getComputerStartingCards(qData),
+ QuestUtil.getHumanStartingCards(qData.getAssets(), event),
+ QuestUtil.getComputerStartingCards(event),
lifeHuman,
- lifeAI);
+ lifeAI,
+ event.getIconFilename());
} // End isFantasy
else {
GameNew.newGame(SubmenuQuestUtil.getCurrentDeck(), event.getEventDeck());
diff --git a/src/main/java/forge/gui/home/quest/VSubmenuQuestData.java b/src/main/java/forge/gui/home/quest/VSubmenuQuestData.java
index aa0f2bb8d01..5d91dfc285d 100644
--- a/src/main/java/forge/gui/home/quest/VSubmenuQuestData.java
+++ b/src/main/java/forge/gui/home/quest/VSubmenuQuestData.java
@@ -6,7 +6,7 @@ import forge.gui.home.ICSubmenu;
import forge.gui.home.IVSubmenu;
import forge.gui.toolbox.*;
import forge.item.PreconDeck;
-import forge.quest.data.QuestData;
+import forge.quest.data.QuestController;
import forge.util.IStorageView;
import net.miginfocom.swing.MigLayout;
import org.apache.commons.lang3.text.WordUtils;
@@ -93,7 +93,7 @@ public enum VSubmenuQuestData implements IVSubmenu {
};
final Map preconDescriptions = new HashMap();
- IStorageView preconDecks = QuestData.getPrecons();
+ IStorageView preconDecks = QuestController.getPrecons();
for (String preconDeck : preconDecks.getNames()) {
cbxPrecon.addItem(preconDeck);
String description = preconDecks.get(preconDeck).getDescription();
@@ -102,6 +102,8 @@ public enum VSubmenuQuestData implements IVSubmenu {
}
cbxPrecon.setRenderer(new BasicComboBoxRenderer() {
+ private static final long serialVersionUID = 3477357932538947199L;
+
@Override
public Component getListCellRendererComponent(
JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
diff --git a/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java b/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java
index a3c9393c862..270bc2112f1 100644
--- a/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java
+++ b/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java
@@ -279,11 +279,11 @@ public enum CSubmenuConstructed implements ICSubmenu {
final List eventNames = new ArrayList();
- for (final QuestEvent e : QuestEventManager.ALL_DUELS) {
+ for (final QuestEvent e : QuestEventManager.INSTANCE.ALL_DUELS) {
eventNames.add(e.getEventDeck().getName());
}
- for (final QuestEvent e : QuestEventManager.ALL_CHALLENGES) {
+ for (final QuestEvent e : QuestEventManager.INSTANCE.ALL_CHALLENGES) {
eventNames.add(e.getEventDeck().getName());
}
@@ -416,7 +416,7 @@ public enum CSubmenuConstructed implements ICSubmenu {
deck.getMain().add(cards);
}
else if (lst0.getName().equals(ESubmenuConstructedTypes.QUESTEVENTS.toString())) {
- deck = QuestEventManager.getEvent(selection[0]).getEventDeck();
+ deck = QuestEventManager.INSTANCE.getEvent(selection[0]).getEventDeck();
}
// Custom deck
else if (lst0.getName().equals(ESubmenuConstructedTypes.CUSTOM.toString())) {
@@ -441,7 +441,7 @@ public enum CSubmenuConstructed implements ICSubmenu {
deck = Singletons.getModel().getDecks().getConstructed().get(deckName);
}
else {
- deck = QuestEventManager.getEvent(deckName).getEventDeck();
+ deck = QuestEventManager.INSTANCE.getEvent(deckName).getEventDeck();
}
// Dump into map and display.
diff --git a/src/main/java/forge/gui/toolbox/DeckLister.java b/src/main/java/forge/gui/toolbox/DeckLister.java
index efd6d538289..0d4374d5842 100644
--- a/src/main/java/forge/gui/toolbox/DeckLister.java
+++ b/src/main/java/forge/gui/toolbox/DeckLister.java
@@ -427,7 +427,7 @@ public class DeckLister extends JPanel {
switch (this.gametype) {
case Quest:
Constant.Runtime.HUMAN_DECK[0] = d0;
- final DeckEditorQuest editor = new DeckEditorQuest(AllZone.getQuestData());
+ final DeckEditorQuest editor = new DeckEditorQuest(AllZone.getQuest());
editor.show(this.cmdEditorExit);
editor.setVisible(true);
editor.setAlwaysOnTop(true);
@@ -475,8 +475,8 @@ public class DeckLister extends JPanel {
} else if (this.gametype.equals(GameType.Sealed)) {
deckManager.getSealed().delete(d0.getName());
} else if (this.gametype.equals(GameType.Quest)) {
- AllZone.getQuestData().getMyDecks().delete(d0.getName());
- AllZone.getQuestData().saveData();
+ AllZone.getQuest().getMyDecks().delete(d0.getName());
+ AllZone.getQuest().save();
} else {
deckManager.getConstructed().delete(d0.getName());
}
diff --git a/src/main/java/forge/model/FMatchState.java b/src/main/java/forge/model/FMatchState.java
index cb7c60d07ed..9935a182efe 100644
--- a/src/main/java/forge/model/FMatchState.java
+++ b/src/main/java/forge/model/FMatchState.java
@@ -185,7 +185,7 @@ public class FMatchState {
* @since 1.2.3
*/
public final void addAnteWonToCardPool() {
- AllZone.getQuestData().getCards().addAllCards(antesWon);
+ AllZone.getQuest().getCards().addAllCards(antesWon);
}
/**
diff --git a/src/main/java/forge/quest/SellRules.java b/src/main/java/forge/quest/SellRules.java
index d34a76605d2..b690703efa9 100644
--- a/src/main/java/forge/quest/SellRules.java
+++ b/src/main/java/forge/quest/SellRules.java
@@ -19,7 +19,7 @@ package forge.quest;
import java.util.List;
-import forge.quest.data.QuestData;
+import forge.quest.data.QuestAchievements;
import forge.util.FileSection;
/**
@@ -56,11 +56,11 @@ public class SellRules {
* @param quest the quest
* @return true, if successful
*/
- public boolean meetsRequiremnts(QuestData quest) {
+ public boolean meetsRequiremnts(QuestAchievements quest) {
if (quest.getWin() < minWins) {
return false;
}
- if (quest.getDifficultyIndex() < minDifficulty || quest.getDifficultyIndex() > maxDifficulty) {
+ if (quest.getDifficulty() < minDifficulty || quest.getDifficulty() > maxDifficulty) {
return false;
}
diff --git a/src/main/java/forge/quest/data/QuestAchievements.java b/src/main/java/forge/quest/data/QuestAchievements.java
new file mode 100644
index 00000000000..27a986e1e29
--- /dev/null
+++ b/src/main/java/forge/quest/data/QuestAchievements.java
@@ -0,0 +1,158 @@
+package forge.quest.data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import forge.Singletons;
+import forge.quest.data.QuestPreferences.QPref;
+
+/**
+ * TODO: Write javadoc for this type.
+ *
+ */
+public class QuestAchievements {
+
+ // Challenge history
+ /** The challenges played. */
+ int challengesPlayed = 0;
+ /** The completed challenges. */
+ List completedChallenges = new ArrayList();
+ /** The win. */
+ int win; // number of wins
+ int winstreakBest = 0;
+ int winstreakCurrent = 0;
+
+ /** The lost. */
+ int lost;
+
+ // Difficulty - will store only index from now.
+ private int difficulty;
+ /**
+ * TODO: Write javadoc for Constructor.
+ * @param diff
+ */
+ public QuestAchievements(int diff) {
+ difficulty = diff;
+ }
+
+ /**
+ * TODO: Write javadoc for Constructor.
+ * @param mode
+ */
+ /**
+ * Adds the win.
+ */
+ public void addWin() { // changes getRank()
+ this.win++;
+ this.winstreakCurrent++;
+
+ if (this.winstreakCurrent > this.winstreakBest) {
+ this.winstreakBest = this.winstreakCurrent;
+ }
+
+ }
+
+ // Challenge performance
+ /**
+ * Gets the challenges played.
+ *
+ * @return the challenges played
+ */
+ public int getChallengesPlayed() {
+ return this.challengesPlayed;
+ }
+ /**
+ *
+ * getCompletedChallenges.
+ *
+ * Returns stored list of non-repeatable challenge IDs.
+ *
+ * @return List
+ */
+ public List getCompletedChallenges() {
+ return this.completedChallenges;
+ }
+ /**
+ * Adds the challenges played.
+ */
+ public void addChallengesPlayed() {
+ this.challengesPlayed++;
+ }
+ /**
+ *
+ * addCompletedChallenge.
+ *
+ * Add non-repeatable challenge ID to list.
+ *
+ * @param i
+ * the i
+ */
+
+ // Poorly named - this should be "setLockedChalleneges" or similar.
+ public void addCompletedChallenge(final int i) {
+ this.completedChallenges.add(i);
+ }
+ /**
+ * Adds the lost.
+ */
+ public void addLost() {
+ this.lost++;
+ this.winstreakCurrent = 0;
+ }
+ // Level, read-only ( note: it increments in addWin() )
+ /**
+ * Gets the level.
+ *
+ * @return the level
+ */
+ public int getLevel() {
+ final int winsToLvlUp = Singletons.getModel().getQuestPreferences().getPreferenceInt(QPref.WINS_RANKUP, difficulty);
+ return this.win / winsToLvlUp;
+ }
+ // Wins & Losses
+ /**
+ * Gets the lost.
+ *
+ * @return the lost
+ */
+ public int getLost() {
+ return this.lost;
+ }
+
+ /**
+ * Gets the win.
+ *
+ * @return the win
+ */
+ public int getWin() {
+ return win;
+ }
+
+ /**
+ * Gets the win streak best.
+ *
+ * @return int
+ */
+ public int getWinStreakBest() {
+ return winstreakBest;
+ }
+
+ /**
+ * Gets the win streak current.
+ *
+ * @return int
+ */
+ public int getWinStreakCurrent() {
+ return winstreakCurrent;
+ }
+
+ /**
+ * Gets the difficulty index.
+ *
+ * @return the difficulty index
+ */
+ public int getDifficulty() {
+ return this.difficulty;
+ }
+
+}
diff --git a/src/main/java/forge/quest/data/QuestAssets.java b/src/main/java/forge/quest/data/QuestAssets.java
new file mode 100644
index 00000000000..f2f5ae1e337
--- /dev/null
+++ b/src/main/java/forge/quest/data/QuestAssets.java
@@ -0,0 +1,164 @@
+package forge.quest.data;
+
+import java.util.HashMap;
+
+import forge.Singletons;
+import forge.deck.Deck;
+import forge.item.CardPrinted;
+import forge.item.InventoryItem;
+import forge.item.ItemPool;
+import forge.item.ItemPoolView;
+import forge.quest.data.QuestPreferences.QPref;
+import forge.quest.data.item.QuestInventory;
+import forge.quest.data.pet.QuestPetManager;
+
+/**
+ * TODO: Write javadoc for this type.
+ *
+ */
+public class QuestAssets {
+
+ // Cards associated with quest
+ /** The card pool. */
+ final ItemPool cardPool = new ItemPool(CardPrinted.class); // player's
+ /** The credits. */
+ long credits; // this money is good for all modes
+ // game
+ // with
+ /** The inventory. */
+ final QuestInventory inventory = new QuestInventory(); // different
+ /** The life. */
+ int life; // for fantasy mode, how much life bought at shop to start
+ // Decks collected by player
+ /** The my decks. */
+ final HashMap myDecks = new HashMap();
+ // current
+ // shop
+ // list
+ /** The new card list. */
+ final ItemPool newCardList = new ItemPool(InventoryItem.class); // cards
+ // belonging
+ /** The shop list. */
+ final ItemPool shopList = new ItemPool(InventoryItem.class); // the
+ // gadgets
+
+ /** The pet manager. */
+ final QuestPetManager petManager = new QuestPetManager(); // pets
+ /**
+ * Adds n life to maximum.
+ *
+ * @param n
+ * int
+ */
+ public void addLife(final int n) {
+ this.life += n;
+ }
+ public QuestAssets(QuestMode mode) {
+ this.life = mode.equals(QuestMode.Fantasy) ? 15 : 20;
+
+
+ final QuestPreferences prefs = Singletons.getModel().getQuestPreferences();
+ final ItemPoolView lands = QuestUtilCards.generateBasicLands(
+ prefs.getPreferenceInt(QPref.STARTING_BASIC_LANDS), prefs.getPreferenceInt(QPref.STARTING_SNOW_LANDS));
+ this.getCardPool().addAll(lands);
+ }
+
+
+ /**
+ * Gets the credits.
+ *
+ * @return the credits
+ */
+ public long getCredits() {
+ return this.credits;
+ }
+ // All belongings
+ /**
+ * Gets the inventory.
+ *
+ * @return the inventory
+ */
+ public QuestInventory getInventory() {
+ return this.inventory;
+ }
+ // Life (only fantasy)
+ /**
+ * Gets the life.
+ *
+ * @return the life
+ */
+ public int getLife() {
+ return this.life;
+ }
+ /**
+ * Gets the new card list.
+ *
+ * @return the newCardList
+ */
+ public ItemPool getNewCardList() {
+ return this.newCardList;
+ }
+ /**
+ * Gets the shop list.
+ *
+ * @return the shopList
+ */
+ public ItemPool getShopList() {
+ return this.shopList;
+ }
+ /**
+ * Removes n life from maximum.
+ *
+ * @param n
+ * int
+ */
+ public void removeLife(final int n) {
+ this.life -= n;
+ }
+ /**
+ * Sets the credits.
+ *
+ * @param credits0
+ * the credits to set
+ */
+ public void setCredits(final long credits0) {
+ this.credits = credits0;
+ }
+
+ /**
+ * Gets the pet manager.
+ *
+ * @return the pet manager
+ */
+ public QuestPetManager getPetManager() {
+ return this.petManager;
+ }
+ // Credits
+ /**
+ * Adds the credits.
+ *
+ * @param c
+ * the c
+ */
+ public void addCredits(final long c) {
+ this.setCredits(this.getCredits() + c);
+ }
+ /**
+ * Gets the card pool.
+ *
+ * @return the cardPool
+ */
+ public ItemPool getCardPool() {
+ return this.cardPool;
+ }
+ /**
+ * Subtract credits.
+ *
+ * @param c
+ * the c
+ */
+ public void subtractCredits(final long c) {
+ this.setCredits(this.getCredits() > c ? this.getCredits() - c : 0);
+ }
+
+}
diff --git a/src/main/java/forge/quest/data/QuestController.java b/src/main/java/forge/quest/data/QuestController.java
new file mode 100644
index 00000000000..9f91b6273cd
--- /dev/null
+++ b/src/main/java/forge/quest/data/QuestController.java
@@ -0,0 +1,239 @@
+package forge.quest.data;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import forge.Singletons;
+import forge.deck.Deck;
+import forge.item.CardPrinted;
+import forge.item.PreconDeck;
+import forge.properties.ForgeProps;
+import forge.properties.NewConstants;
+import forge.quest.data.QuestPreferences.QPref;
+import forge.util.IStorage;
+import forge.util.IStorageView;
+import forge.util.Predicate;
+import forge.util.StorageView;
+
+/**
+ * TODO: Write javadoc for this type.
+ *
+ */
+public class QuestController {
+
+ private QuestData model;
+ // gadgets
+
+ // Utility class to access cards, has access to private fields
+ // Moved some methods there that otherwise would make this class even more
+ // complex
+ private transient QuestUtilCards myCards;
+
+ private transient QuestEvent currentEvent;
+
+ transient IStorage decks;
+
+ // acquired
+ // since
+ // last
+ // game-win/loss
+
+ /** The available challenges. */
+ private List availableChallenges = new ArrayList();
+
+ /** The available quests. */
+ private List availableQuests = null;
+
+ // This is used by shop. Had no idea where else to place this
+ private static transient IStorageView preconManager =
+ new StorageView(new PreconReader(ForgeProps.getFile(NewConstants.Quest.PRECONS)));
+
+ /** The Constant RANK_TITLES. */
+ public static final String[] RANK_TITLES = new String[] { "Level 0 - Confused Wizard", "Level 1 - Mana Mage",
+ "Level 2 - Death by Megrim", "Level 3 - Shattered the Competition", "Level 4 - Black Knighted",
+ "Level 5 - Shockingly Good", "Level 6 - Regressed into Timmy", "Level 7 - Loves Blue Control",
+ "Level 8 - Immobilized by Fear", "Level 9 - Lands = Friends", "Level 10 - Forging new paths",
+ "Level 11 - Infect-o-tron", "Level 12 - Great Balls of Fire", "Level 13 - Artifact Schmartifact",
+ "Level 14 - Mike Mulligan's The Name", "Level 15 - Fresh Air: Good For The Health",
+ "Level 16 - In It For The Love", "Level 17 - Sticks, Stones, Bones", "Level 18 - Credits For Breakfast",
+ "Level 19 - Millasaurus", "Level 20 - One-turn Wonder", "Teaching Gandalf a Lesson",
+ "What Do You Do With The Other Hand?", "Freelance Sorcerer, Works Weekends",
+ "Should We Hire Commentators?", "Saltblasted For Your Talent", "Serra Angel Is Your Girlfriend", };
+
+ // Cards - class uses data from here
+ /**
+ * Gets the cards.
+ *
+ * @return the cards
+ */
+ public QuestUtilCards getCards() {
+ return this.myCards;
+ }
+
+ /**
+ * Gets the my decks.
+ *
+ * @return the myDecks
+ */
+ public IStorage getMyDecks() {
+ return decks;
+ }
+
+ public QuestEvent getCurrentEvent() {
+ return currentEvent;
+ }
+ public void setCurrentEvent(QuestEvent currentEvent) {
+ this.currentEvent = currentEvent;
+ }
+
+ /**
+ * Gets the precons.
+ *
+ * @return QuestPreconManager
+ */
+ public static IStorageView getPrecons() {
+ return preconManager;
+ }
+
+ /**
+ * TODO: Write javadoc for this method.
+ * @param selectedQuest
+ */
+ public void load(QuestData selectedQuest) {
+ model = selectedQuest;
+ // These are helper classes that hold no data.
+ this.decks = model == null ? null : new QuestDeckMap(model.getAssets().myDecks);
+ this.myCards = model == null ? null : new QuestUtilCards(this);
+ currentEvent = null;
+
+ QuestEventManager.INSTANCE.randomizeOpponents();
+ }
+
+ /**
+ * TODO: Write javadoc for this method.
+ */
+ public void save() {
+ if ( model != null )
+ model.saveData();
+ }
+
+ /**
+ * TODO: Write javadoc for this method.
+ * @return
+ */
+ public boolean isLoaded() {
+ return false;
+ }
+
+ /**
+ * Clear available challenges.
+ */
+ public void clearAvailableChallenges() {
+ this.availableChallenges.clear();
+ }
+
+ /**
+ * Gets the available challenges.
+ *
+ * @return the available challenges
+ */
+ public List getAvailableChallenges() {
+ // This should be phased out after a while, when
+ // old quest decks have been updated. (changes made 19-9-11)
+ if (this.availableQuests != null) {
+ this.availableChallenges = this.availableQuests;
+ this.availableQuests = null;
+ }
+
+ return this.availableChallenges != null ? new ArrayList(this.availableChallenges) : null;
+ }
+
+ /**
+ * Sets the available challenges.
+ *
+ * @param list
+ * the new available challenges
+ */
+ public void setAvailableChallenges(final List list) {
+ this.availableChallenges = list;
+ }
+
+ /**
+ * New game.
+ *
+ * @param diff
+ * the diff
+ * @param mode
+ * the mode
+ * @param startPool
+ * the start type
+ */
+ public void newGame(final String name, final int diff, final QuestMode mode, final QuestStartPool startPool, final String preconName) {
+
+ load(new QuestData(name, diff, mode));
+
+ final Predicate filter;
+ switch (startPool) {
+ case PRECON:
+ myCards.addPreconDeck(preconManager.get(preconName));
+ return;
+
+ case STANDARD:
+ filter = Singletons.getModel().getFormats().getStandard().getFilterPrinted();
+ break;
+
+ default: //Unrestricted
+ filter = CardPrinted.Predicates.Presets.IS_TRUE;
+ break;
+ }
+
+ this.getAssets().setCredits(Singletons.getModel().getQuestPreferences().getPreferenceInt(QPref.STARTING_CREDITS, diff));
+ this.myCards.setupNewGameCardPool(filter, diff);
+ }
+
+ /**
+ * Gets the rank.
+ *
+ * @return the rank
+ */
+ public String getRank() {
+ int level = model.getAchievements().getLevel();
+ if (level >= RANK_TITLES.length) {
+ level = RANK_TITLES.length - 1;
+ }
+ return RANK_TITLES[level];
+ }
+
+ /**
+ * TODO: Write javadoc for this method.
+ * @return
+ */
+ public QuestAssets getAssets() {
+ return model == null ? null : model.getAssets();
+ }
+
+ /**
+ * TODO: Write javadoc for this method.
+ * @return
+ */
+ public String getName() {
+ return model == null ? null : model.getName();
+ }
+
+ /**
+ * TODO: Write javadoc for this method.
+ * @return
+ */
+ public QuestAchievements getAchievements() {
+ return model == null ? null : model.getAchievements();
+ }
+
+ /**
+ * TODO: Write javadoc for this method.
+ * @return
+ */
+ public QuestMode getMode() {
+ return model.getMode();
+ }
+}
diff --git a/src/main/java/forge/quest/data/QuestData.java b/src/main/java/forge/quest/data/QuestData.java
index 7595221b467..ac9110dad73 100644
--- a/src/main/java/forge/quest/data/QuestData.java
+++ b/src/main/java/forge/quest/data/QuestData.java
@@ -17,20 +17,6 @@
*/
package forge.quest.data;
-import forge.Singletons;
-import forge.deck.Deck;
-import forge.item.*;
-import forge.properties.ForgeProps;
-import forge.properties.NewConstants;
-import forge.quest.data.QuestPreferences.QPref;
-import forge.quest.data.item.QuestInventory;
-import forge.quest.data.pet.QuestPetManager;
-import forge.util.*;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
//when you create QuestDataOld and AFTER you copy the AI decks over
//you have to call one of these two methods below
//see Gui_QuestOptions for more details
@@ -47,7 +33,7 @@ public final class QuestData {
// This field holds the version of the Quest Data
/** Constant CURRENT_VERSION_NUMBER=2. */
- public static final int CURRENT_VERSION_NUMBER = 2;
+ public static final int CURRENT_VERSION_NUMBER = 3;
// This field places the version number into QD instance,
// but only when the object is created through the constructor
@@ -55,447 +41,30 @@ public final class QuestData {
/** The version number. */
private int versionNumber = QuestData.CURRENT_VERSION_NUMBER;
- /** The rank index. */
- private int rankIndex; // level
-
- /** The win. */
- private int win; // number of wins
-
- /** The lost. */
- private int lost;
-
- private int winstreakBest = 0;
-
- private int winstreakCurrent = 0;
-
- /** The credits. */
- private long credits; // this money is good for all modes
-
- /** The life. */
- private int life; // for fantasy mode, how much life bought at shop to start
- // game
- // with
- /** The inventory. */
- private QuestInventory inventory = new QuestInventory(); // different
- // gadgets
-
- /** The pet manager. */
- private final QuestPetManager petManager = new QuestPetManager(); // pets
- // that
- // start
- // match
- // with you
-
- // Diffuculty - they store both index and title
- /** The diff index. */
- private int diffIndex;
-
- /** The difficulty. */
- private String difficulty;
-
- /** */
- private String name = "";
+ private final String name;
// Quest mode - there should be an enum :(
/** The mode. */
- private String mode = "";
+ private QuestMode mode;
- /** The Constant FANTASY. */
- public static final String FANTASY = "Fantasy";
-
- /** The Constant CLASSIC. */
- public static final String CLASSIC = "Classic";
-
- // Decks collected by player
- /** The my decks. */
- private final HashMap myDecks = new HashMap();
-
- private transient IStorage decks;
-
- // Cards associated with quest
- /** The card pool. */
- private final ItemPool cardPool = new ItemPool(CardPrinted.class); // player's
- // belonging
- /** The shop list. */
- private ItemPool shopList = new ItemPool(InventoryItem.class); // the
- // current
- // shop
- // list
- /** The new card list. */
- private ItemPool newCardList = new ItemPool(InventoryItem.class); // cards
- // acquired
- // since
- // last
- // game-win/loss
-
- // Challenge history
- /** The challenges played. */
- private int challengesPlayed = 0;
-
- /** The available challenges. */
- private List availableChallenges = new ArrayList();
-
- /** The completed challenges. */
- private List completedChallenges = new ArrayList();
-
- // Challenges used to be called quests. During the renaming,
- // files could be corrupted. These fields ensure old files still work.
- // These fields should be phased out after a little while.
- // The old files, if played once, are updated automatically to the new
- // system.
- /** The quests played. */
- private int questsPlayed = -1;
-
- /** The available quests. */
- private List availableQuests = null;
-
- /** The completed quests. */
- private List completedQuests = null;
-
- // own randomizer seed
- private long randomSeed = 0;
-
- // Utility class to access cards, has access to private fields
- // Moved some methods there that otherwise would make this class even more
- // complex
- private transient QuestUtilCards myCards;
-
- private transient QuestEvent currentEvent;
-
- // This is used by shop. Had no idea where else to place this
- private static transient IStorageView preconManager =
- new StorageView(new PreconReader(ForgeProps.getFile(NewConstants.Quest.PRECONS)));
-
- /** The Constant RANK_TITLES. */
- public static final String[] RANK_TITLES = new String[] { "Level 0 - Confused Wizard", "Level 1 - Mana Mage",
- "Level 2 - Death by Megrim", "Level 3 - Shattered the Competition", "Level 4 - Black Knighted",
- "Level 5 - Shockingly Good", "Level 6 - Regressed into Timmy", "Level 7 - Loves Blue Control",
- "Level 8 - Immobilized by Fear", "Level 9 - Lands = Friends", "Level 10 - Forging new paths",
- "Level 11 - Infect-o-tron", "Level 12 - Great Balls of Fire", "Level 13 - Artifact Schmartifact",
- "Level 14 - Mike Mulligan's The Name", "Level 15 - Fresh Air: Good For The Health",
- "Level 16 - In It For The Love", "Level 17 - Sticks, Stones, Bones", "Level 18 - Credits For Breakfast",
- "Level 19 - Millasaurus", "Level 20 - One-turn Wonder", "Teaching Gandalf a Lesson",
- "What Do You Do With The Other Hand?", "Freelance Sorcerer, Works Weekends",
- "Should We Hire Commentators?", "Saltblasted For Your Talent", "Serra Angel Is Your Girlfriend", };
+ // gadgets
+
+ private final QuestAssets assets;
+ private final QuestAchievements achievements;
+
/**
* Instantiates a new quest data.
+ * @param mode2
+ * @param diff
+ * @param name2
*/
- public QuestData() {
- this("An Unknown Quest");
- }
-
- /**
- *
- * Constructor for QuestData.
- *
- *
- * @param s0
- * String name
- */
- public QuestData(final String s0) {
- this.initTransients();
- this.setName(s0);
-
- final QuestPreferences prefs = Singletons.getModel().getQuestPreferences();
- final ItemPoolView lands = QuestUtilCards.generateBasicLands(
- prefs.getPreferenceInt(QPref.STARTING_BASIC_LANDS), prefs.getPreferenceInt(QPref.STARTING_SNOW_LANDS));
- this.getCardPool().addAll(lands);
- this.randomizeOpponents();
- }
-
- private void initTransients() {
- // These are helper classes that hold no data.
- this.decks = new QuestDeckMap(this.myDecks);
- this.myCards = new QuestUtilCards(this);
-
- // to avoid NPE some pools will be created here if they are null
- if (null == this.getNewCardList()) {
- this.setNewCardList(new ItemPool(InventoryItem.class));
- }
- if (null == this.getShopList()) {
- this.setShopList(new ItemPool(InventoryItem.class));
- }
-
- currentEvent = null;
-
- }
-
- /**
- * New game.
- *
- * @param diff
- * the diff
- * @param mode
- * the mode
- * @param startPool
- * the start type
- */
- public void newGame(final int diff, final String mode, final QuestStartPool startPool, final String preconName) {
- this.setDifficulty(diff);
-
- this.mode = mode;
- this.life = this.mode.equals(QuestData.FANTASY) ? 15 : 20;
-
- final Predicate filter;
- switch (startPool) {
- case PRECON:
- myCards.addPreconDeck(preconManager.get(preconName));
- return;
-
- case STANDARD:
- filter = Singletons.getModel().getFormats().getStandard().getFilterPrinted();
- break;
-
- default: //Unrestricted
- filter = CardPrinted.Predicates.Presets.IS_TRUE;
- break;
- }
-
- this.setCredits(Singletons.getModel().getQuestPreferences().getPreferenceInt(QPref.STARTING_CREDITS, diff));
- this.myCards.setupNewGameCardPool(filter, diff);
- }
-
- // All belongings
- /**
- * Gets the inventory.
- *
- * @return the inventory
- */
- public QuestInventory getInventory() {
- return this.inventory;
- }
-
- /**
- * Gets the pet manager.
- *
- * @return the pet manager
- */
- public QuestPetManager getPetManager() {
- return this.petManager;
- }
-
- // Cards - class uses data from here
- /**
- * Gets the cards.
- *
- * @return the cards
- */
- public QuestUtilCards getCards() {
- return this.myCards;
- }
-
- // Challenge performance
- /**
- * Gets the challenges played.
- *
- * @return the challenges played
- */
- public int getChallengesPlayed() {
- // This should be phased out after a while, when
- // old quest decks have been updated. (changes made 19-9-11)
- if (this.questsPlayed != -1) {
- this.challengesPlayed = this.questsPlayed;
- this.questsPlayed = -1;
- }
-
- return this.challengesPlayed;
- }
-
- /**
- * Adds the challenges played.
- */
- public void addChallengesPlayed() {
- this.challengesPlayed++;
- }
-
- /**
- * Gets the available challenges.
- *
- * @return the available challenges
- */
- public List getAvailableChallenges() {
- // This should be phased out after a while, when
- // old quest decks have been updated. (changes made 19-9-11)
- if (this.availableQuests != null) {
- this.availableChallenges = this.availableQuests;
- this.availableQuests = null;
- }
-
- return this.availableChallenges != null ? new ArrayList(this.availableChallenges) : null;
- }
-
- /**
- * Sets the available challenges.
- *
- * @param list
- * the new available challenges
- */
- public void setAvailableChallenges(final List list) {
- this.availableChallenges = list;
- }
-
- /**
- * Clear available challenges.
- */
- public void clearAvailableChallenges() {
- this.availableChallenges.clear();
- }
-
- /**
- *
- * getCompletedChallenges.
- *
- * Returns stored list of non-repeatable challenge IDs.
- *
- * @return List
- */
- public List getCompletedChallenges() {
- // This should be phased out after a while, when
- // old quest decks have been updated. (changes made 19-9-11)
- // Also, poorly named - this should be "getLockedChalleneges" or
- // similar.
- if (this.completedQuests != null) {
- this.completedChallenges = this.completedQuests;
- this.completedQuests = null;
- }
-
- return this.completedChallenges != null ? new ArrayList(this.completedChallenges) : null;
- }
-
- /**
- *
- * addCompletedChallenge.
- *
- * Add non-repeatable challenge ID to list.
- *
- * @param i
- * the i
- */
-
- // Poorly named - this should be "setLockedChalleneges" or similar.
- public void addCompletedChallenge(final int i) {
- this.completedChallenges.add(i);
- }
-
- // Wins & Losses
- /**
- * Gets the lost.
- *
- * @return the lost
- */
- public int getLost() {
- return this.lost;
- }
-
- /**
- * Adds the lost.
- */
- public void addLost() {
- this.lost++;
-
- if (this.winstreakCurrent > this.winstreakBest) {
- this.winstreakBest = this.winstreakCurrent;
- }
-
- this.winstreakCurrent = 0;
- }
-
- /**
- * Gets the win.
- *
- * @return the win
- */
- public int getWin() {
- return this.win;
- }
-
- /**
- * Adds the win.
- */
- public void addWin() { // changes getRank()
- this.win++;
- this.winstreakCurrent++;
-
- if (this.winstreakCurrent > this.winstreakBest) {
- this.winstreakBest = this.winstreakCurrent;
- }
-
- final int winsToLvlUp = Singletons.getModel().getQuestPreferences()
- .getPreferenceInt(QPref.WINS_RANKUP, this.diffIndex);
- if ((this.win % winsToLvlUp) == 0) {
- this.rankIndex++;
- }
- }
-
- // Life (only fantasy)
- /**
- * Gets the life.
- *
- * @return the life
- */
- public int getLife() {
- return this.isFantasy() ? this.life : 20;
- }
-
- /**
- * Adds n life to maximum.
- *
- * @param n
- * int
- */
- public void addLife(final int n) {
- this.life += n;
- }
-
- /**
- * Removes n life from maximum.
- *
- * @param n
- * int
- */
- public void removeLife(final int n) {
- this.life -= n;
- }
-
- // Credits
- /**
- * Adds the credits.
- *
- * @param c
- * the c
- */
- public void addCredits(final long c) {
- this.setCredits(this.getCredits() + c);
- }
-
- /**
- * Subtract credits.
- *
- * @param c
- * the c
- */
- public void subtractCredits(final long c) {
- this.setCredits(this.getCredits() > c ? this.getCredits() - c : 0);
- }
-
- /**
- * Gets the credits.
- *
- * @return the credits
- */
- public long getCredits() {
- return this.credits;
- }
-
- // Quest mode
- /**
- * Checks if is fantasy.
- *
- * @return true, if is fantasy
- */
- public boolean isFantasy() {
- return this.mode.equals(QuestData.FANTASY);
+ public QuestData(String name2, int diff, QuestMode mode2) {
+ this.name = name2;
+
+ this.mode = mode2;
+ this.achievements = new QuestAchievements(diff);
+ this.assets = new QuestAssets(mode2);
}
/**
@@ -503,101 +72,12 @@ public final class QuestData {
*
* @return the mode
*/
- public String getMode() {
- return this.mode == null ? "" : this.mode;
+ public QuestMode getMode() {
+ return this.mode;
}
- // Difficulty
- /**
- * Gets the difficulty.
- *
- * @return the difficulty
- */
- public String getDifficulty() {
- return this.difficulty;
- }
-
- /**
- * Gets the difficulty index.
- *
- * @return the difficulty index
- */
- public int getDifficultyIndex() {
- return this.diffIndex;
- }
-
- /**
- * Sets the difficulty.
- *
- * @param i
- * the new difficulty
- */
- public void setDifficulty(final int i) {
- this.diffIndex = i;
- this.difficulty = QuestPreferences.getDifficulty(i);
- }
-
- // Level, read-only ( note: it increments in addWin() )
- /**
- * Gets the level.
- *
- * @return the level
- */
- public int getLevel() {
- return this.rankIndex;
- }
-
- /**
- * Gets the rank.
- *
- * @return the rank
- */
- public String getRank() {
- if (this.rankIndex >= QuestData.RANK_TITLES.length) {
- this.rankIndex = QuestData.RANK_TITLES.length - 1;
- }
- return QuestData.RANK_TITLES[this.rankIndex];
- }
-
- /**
- * Gets the win streak best.
- *
- * @return int
- */
- public int getWinStreakBest() {
- return this.winstreakBest;
- }
-
- /**
- * Gets the win streak current.
- *
- * @return int
- */
- public int getWinStreakCurrent() {
- return this.winstreakCurrent;
- }
-
- // decks management
-
- // randomizer - related
- /**
- * Gets the random seed.
- *
- * @return the random seed
- */
- public long getRandomSeed() {
- return this.randomSeed;
- }
-
- /**
- * This method should be called whenever the opponents should change.
- */
- public void randomizeOpponents() {
- this.randomSeed = MyRandom.getRandom().nextLong();
- }
// SERIALIZATION - related things
-
// This must be called by XML-serializer via reflection
/**
* Read resolve.
@@ -605,7 +85,6 @@ public final class QuestData {
* @return the object
*/
public Object readResolve() {
- this.initTransients();
return this;
}
@@ -616,91 +95,6 @@ public final class QuestData {
QuestDataIO.saveData(this);
}
- /**
- * Gets the card pool.
- *
- * @return the cardPool
- */
- public ItemPool getCardPool() {
- return this.cardPool;
- }
-
- /**
- * Gets the shop list.
- *
- * @return the shopList
- */
- public ItemPool getShopList() {
- return this.shopList;
- }
-
- /**
- * Sets the shop list.
- *
- * @param shopList0
- * the shopList to set
- */
- public void setShopList(final ItemPool shopList0) {
- this.shopList = shopList0;
- }
-
- /**
- * Gets the new card list.
- *
- * @return the newCardList
- */
- public ItemPool getNewCardList() {
- return this.newCardList;
- }
-
- /**
- * Sets the new card list.
- *
- * @param newCardList0
- * the newCardList to set
- */
- public void setNewCardList(final ItemPool newCardList0) {
- this.newCardList = newCardList0;
- }
-
- /**
- * Gets the my decks.
- *
- * @return the myDecks
- */
- public IStorage getMyDecks() {
- return this.decks;
- }
-
- /**
- * Gets the precons.
- *
- * @return QuestPreconManager
- */
- public static IStorageView getPrecons() {
- return QuestData.preconManager;
- }
-
- /**
- * Sets the inventory.
- *
- * @param inventory0
- * the inventory to set
- */
- public void setInventory(final QuestInventory inventory0) {
- this.inventory = inventory0;
- }
-
- /**
- * Sets the credits.
- *
- * @param credits0
- * the credits to set
- */
- public void setCredits(final long credits0) {
- this.credits = credits0;
- }
-
/**
* Gets the version number.
*
@@ -720,15 +114,6 @@ public final class QuestData {
this.versionNumber = versionNumber0;
}
- /**
- * Sets the name.
- *
- * @param s0 {@link java.lang.String}
- */
- public void setName(final String s0) {
- this.name = s0;
- }
-
/**
* Gets the name.
*
@@ -738,11 +123,21 @@ public final class QuestData {
return this.name;
}
- public QuestEvent getCurrentEvent() {
- return currentEvent;
+ /**
+ * TODO: Write javadoc for this method.
+ * @return
+ */
+ public QuestAssets getAssets() {
+ return assets;
}
- public void setCurrentEvent(QuestEvent currentEvent) {
- this.currentEvent = currentEvent;
+
+ /**
+ * TODO: Write javadoc for this method.
+ * @return
+ */
+ public QuestAchievements getAchievements() {
+ return achievements;
}
+
}
diff --git a/src/main/java/forge/quest/data/QuestDataIO.java b/src/main/java/forge/quest/data/QuestDataIO.java
index 0202c22e32e..ae405b870db 100644
--- a/src/main/java/forge/quest/data/QuestDataIO.java
+++ b/src/main/java/forge/quest/data/QuestDataIO.java
@@ -21,9 +21,13 @@ import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
+import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
+import java.io.StringWriter;
+import java.lang.reflect.Field;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.zip.GZIPInputStream;
@@ -31,9 +35,18 @@ import java.util.zip.GZIPOutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
import org.apache.commons.lang3.StringUtils;
+import org.w3c.dom.Attr;
import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
@@ -61,6 +74,7 @@ import forge.item.TournamentPack;
import forge.properties.ForgeProps;
import forge.properties.NewConstants;
import forge.quest.data.item.QuestInventory;
+import forge.quest.data.pet.QuestPetManager;
/**
*
@@ -71,12 +85,16 @@ import forge.quest.data.item.QuestInventory;
* @version $Id$
*/
public class QuestDataIO {
- /**
- *
- * Constructor for QuestDataIO.
- *
- */
- public QuestDataIO() {
+
+
+ protected static XStream getSerializer(boolean isIgnoring) {
+ final XStream xStream = isIgnoring ? new IgnoringXStream() : new XStream();
+ xStream.registerConverter(new ItemPoolToXml());
+ xStream.registerConverter(new DeckSectionToXml());
+ xStream.registerConverter(new GameTypeToXml());
+ xStream.alias("CardPool", ItemPool.class);
+ xStream.alias("DeckSection", DeckSection.class);
+ return xStream;
}
/**
@@ -91,11 +109,6 @@ public class QuestDataIO {
public static QuestData loadData(final File xmlSaveFile) {
try {
QuestData data = null;
- final String name = xmlSaveFile.getName().substring(0, xmlSaveFile.getName().length() - 4);
-
- if (!xmlSaveFile.exists()) {
- return new QuestData(name);
- }
final GZIPInputStream zin = new GZIPInputStream(new FileInputStream(xmlSaveFile));
@@ -110,21 +123,14 @@ public class QuestDataIO {
xml.append(buf, 0, len);
}
- final IgnoringXStream xStream = new IgnoringXStream();
- xStream.registerConverter(new ItemPoolToXml());
- xStream.registerConverter(new DeckSectionToXml());
- xStream.registerConverter(new GameTypeToXml());
- xStream.alias("CardPool", ItemPool.class);
- xStream.alias("DeckSection", DeckSection.class);
- data = (QuestData) xStream.fromXML(xml.toString());
- data.setName(name);
+ zin.close();
+
+ data = (QuestData) getSerializer(true).fromXML(xml.toString());
if (data.getVersionNumber() != QuestData.CURRENT_VERSION_NUMBER) {
QuestDataIO.updateSaveFile(data, xml.toString());
}
- zin.close();
-
return data;
} catch (final Exception ex) {
ErrorViewer.showError(ex, "Error loading Quest Data");
@@ -132,6 +138,12 @@ public class QuestDataIO {
}
}
+ private static void setFinalField(Class clasz, String fieldName, T instance, Object newValue) throws IllegalAccessException, NoSuchFieldException {
+ Field field = clasz.getDeclaredField(fieldName);
+ field.setAccessible(true);
+ field.set(instance, newValue); // no difference here (used only to set initial lives)
+ }
+
/**
*
* updateSaveFile.
@@ -142,6 +154,7 @@ public class QuestDataIO {
* @param input
* a {@link java.lang.String} object.
*/
+ @SuppressWarnings("unchecked")
private static void updateSaveFile(final QuestData newData, final String input) {
try {
final DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
@@ -149,33 +162,74 @@ public class QuestDataIO {
is.setCharacterStream(new StringReader(input));
final Document document = builder.parse(is);
- switch (newData.getVersionNumber()) {
+ final int saveVersion = newData.getVersionNumber();
+
+ if( saveVersion < 3 ) {
+ // no difference here (used only to set initial lives)
+ setFinalField(QuestData.class, "assets", newData, new QuestAssets(QuestMode.Classic));
+
+ int diffIdx = Integer.parseInt(document.getElementsByTagName("diffIndex").item(0).getTextContent());
+ setFinalField(QuestData.class, "achievements", newData, new QuestAchievements(diffIdx));
+ }
+
+ switch (saveVersion) {
// There should be a fall-through b/w the cases so that each
// version's changes get applied progressively
case 0:
// First beta release with new file format,
// inventory needs to be migrated
- newData.setInventory(new QuestInventory());
+ setFinalField(QuestAssets.class, "inventory", newData.getAssets(), new QuestInventory());
NodeList elements = document.getElementsByTagName("estatesLevel");
- newData.getInventory().setItemLevel("Estates", Integer.parseInt(elements.item(0).getTextContent()));
+ newData.getAssets().getInventory().setItemLevel("Estates", Integer.parseInt(elements.item(0).getTextContent()));
elements = document.getElementsByTagName("luckyCoinLevel");
- newData.getInventory().setItemLevel("Lucky Coin", Integer.parseInt(elements.item(0).getTextContent()));
+ newData.getAssets().getInventory().setItemLevel("Lucky Coin", Integer.parseInt(elements.item(0).getTextContent()));
elements = document.getElementsByTagName("sleightOfHandLevel");
- newData.getInventory().setItemLevel("Sleight", Integer.parseInt(elements.item(0).getTextContent()));
+ newData.getAssets().getInventory().setItemLevel("Sleight", Integer.parseInt(elements.item(0).getTextContent()));
elements = document.getElementsByTagName("gearLevel");
final int gearLevel = Integer.parseInt(elements.item(0).getTextContent());
if (gearLevel >= 1) {
- newData.getInventory().setItemLevel("Map", 1);
+ newData.getAssets().getInventory().setItemLevel("Map", 1);
}
if (gearLevel == 2) {
- newData.getInventory().setItemLevel("Zeppelin", 1);
+ newData.getAssets().getInventory().setItemLevel("Zeppelin", 1);
}
// fall-through
case 1:
// nothing to do here, everything is managed by CardPoolToXml
// deserializer
- break;
+
+ case 2:
+ if (StringUtils.isBlank(newData.getName())) {
+ setFinalField(QuestData.class, "name", newData, "questData");
+ }
+
+ QuestAchievements qA = newData.getAchievements();
+ qA.win = Integer.parseInt(document.getElementsByTagName("win").item(0).getTextContent());
+ qA.lost = Integer.parseInt(document.getElementsByTagName("lost").item(0).getTextContent());
+ qA.winstreakBest = Integer.parseInt(document.getElementsByTagName("winstreakBest").item(0).getTextContent());
+ qA.winstreakCurrent = Integer.parseInt(document.getElementsByTagName("winstreakCurrent").item(0).getTextContent());
+ qA.challengesPlayed = Integer.parseInt(document.getElementsByTagName("challengesPlayed").item(0).getTextContent());
+ qA.completedChallenges = new ArrayList();
+ NodeList ccs = document.getElementsByTagName("completedChallenges").item(0).getChildNodes();
+ for(int iN = 0; iN < ccs.getLength(); iN++) {
+ Node n = ccs.item(iN);
+ if ( n.getNodeType() != Node.ELEMENT_NODE ) continue;
+ qA.completedChallenges.add(Integer.parseInt(n.getTextContent()));
+ }
+
+ QuestAssets qS = newData.getAssets();
+ qS.credits = Integer.parseInt(document.getElementsByTagName("credits").item(0).getTextContent());
+ qS.life = Integer.parseInt(document.getElementsByTagName("life").item(0).getTextContent());
+
+ XStream xs = getSerializer(true);
+
+ setFinalField(QuestAssets.class, "cardPool", qS, readAsset(xs, document, "cardPool", ItemPool.class));
+ setFinalField(QuestAssets.class, "inventory", qS, readAsset(xs, document, "inventory", QuestInventory.class));
+ setFinalField(QuestAssets.class, "myDecks", qS, readAsset(xs, document, "myDecks", HashMap.class));
+ setFinalField(QuestAssets.class, "petManager", qS, readAsset(xs, document, "petManager", QuestPetManager.class));
+ setFinalField(QuestAssets.class, "shopList", qS, readAsset(xs, document, "shopList", ItemPool.class));
+ setFinalField(QuestAssets.class, "newCardList", qS, readAsset(xs, document, "newCardList", ItemPool.class));
default:
break;
}
@@ -188,6 +242,33 @@ public class QuestDataIO {
}
}
+ @SuppressWarnings("unchecked")
+ private static T readAsset(XStream xs, Document doc, String tagName, Class clasz) throws IllegalAccessException, NoSuchFieldException {
+ NodeList nn = doc.getElementsByTagName(tagName);
+ Node n = nn.item(0);
+
+ Attr att = doc.createAttribute("resolves-to");
+ att.setValue(clasz.getCanonicalName());
+ n.getAttributes().setNamedItem(att);
+
+ String xmlData = nodeToString(n);
+ return (T) xs.fromXML(xmlData);
+ }
+
+ private static String nodeToString(Node node) {
+ StringWriter sw = new StringWriter();
+ try {
+ Transformer t = TransformerFactory.newInstance().newTransformer();
+ t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+ t.setOutputProperty(OutputKeys.INDENT, "yes");
+ t.transform(new DOMSource(node), new StreamResult(sw));
+ } catch (TransformerException te) {
+ System.out.println("nodeToString Transformer Exception");
+ }
+ return sw.toString();
+ }
+
+
/**
*
* saveData.
@@ -198,25 +279,11 @@ public class QuestDataIO {
*/
public static void saveData(final QuestData qd) {
try {
- final XStream xStream = new XStream();
- xStream.registerConverter(new ItemPoolToXml());
- xStream.registerConverter(new DeckSectionToXml());
- xStream.alias("CardPool", ItemPool.class);
- xStream.alias("DeckSection", DeckSection.class);
+ final XStream xStream = getSerializer(false);
- final File f = new File(ForgeProps.getFile(NewConstants.Quest.DATA_DIR) + File.separator + qd.getName()
- + ".dat");
- final BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(f));
- final GZIPOutputStream zout = new GZIPOutputStream(bout);
- xStream.toXML(qd, zout);
- zout.flush();
- zout.close();
-
- // BufferedOutputStream boutUnp = new BufferedOutputStream(new
- // FileOutputStream(f + ".xml"));
- // xStream.toXML(qd, boutUnp);
- // boutUnp.flush();
- // boutUnp.close();
+ final File f = new File(ForgeProps.getFile(NewConstants.Quest.DATA_DIR), qd.getName() );
+ savePacked(f + ".dat", xStream, qd);
+ saveUnpacked(f + ".xml", xStream, qd);
} catch (final Exception ex) {
ErrorViewer.showError(ex, "Error saving Quest Data.");
@@ -224,6 +291,22 @@ public class QuestDataIO {
}
}
+ private static void savePacked(String f, XStream xStream, QuestData qd) throws IOException {
+ final BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(f));
+ final GZIPOutputStream zout = new GZIPOutputStream(bout);
+ xStream.toXML(qd, zout);
+ zout.flush();
+ zout.close();
+ }
+
+
+ private static void saveUnpacked(String f, XStream xStream, QuestData qd) throws IOException {
+ BufferedOutputStream boutUnp = new BufferedOutputStream(new FileOutputStream(f));
+ xStream.toXML(qd, boutUnp);
+ boutUnp.flush();
+ boutUnp.close();
+ }
+
/**
* Xstream subclass that ignores fields that are present in the save but not
* in the class. This one is intended to skip fields defined in Object class
@@ -379,7 +462,7 @@ public class QuestDataIO {
if (name == null) {
name = reader.getAttribute("s");
}
- return QuestData.getPrecons().get(name);
+ return QuestController.getPrecons().get(name);
}
protected BoosterPack readBooster(final HierarchicalStreamReader reader) {
diff --git a/src/main/java/forge/quest/data/QuestDuelDifficulty.java b/src/main/java/forge/quest/data/QuestDuelDifficulty.java
new file mode 100644
index 00000000000..10e36153005
--- /dev/null
+++ b/src/main/java/forge/quest/data/QuestDuelDifficulty.java
@@ -0,0 +1,12 @@
+package forge.quest.data;
+
+/**
+ * TODO: Write javadoc for this type.
+ *
+ */
+public enum QuestDuelDifficulty {
+ EASY,
+ MEDIUM,
+ HARD,
+ EXPERT
+}
diff --git a/src/main/java/forge/quest/data/QuestEventManager.java b/src/main/java/forge/quest/data/QuestEventManager.java
index de0e38a082c..c49246bd768 100644
--- a/src/main/java/forge/quest/data/QuestEventManager.java
+++ b/src/main/java/forge/quest/data/QuestEventManager.java
@@ -20,6 +20,7 @@ package forge.quest.data;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
@@ -45,23 +46,17 @@ import forge.util.FileUtil;
*/
public enum QuestEventManager {
/** */
- SINGLETON_INSTANCE;
+ INSTANCE;
+ private final Map> SortedDuels = new EnumMap>(QuestDuelDifficulty.class);
+
/** */
- private static final List EASY_DUELS = new ArrayList();
+ public final List ALL_DUELS = new ArrayList();
/** */
- private static final List MEDIUM_DUELS = new ArrayList();
- /** */
- private static final List HARD_DUELS = new ArrayList();
- /** */
- private static final List EXPERT_DUELS = new ArrayList();
- /** */
- public static final List ALL_DUELS = new ArrayList();
- /** */
- public static final List ALL_CHALLENGES = new ArrayList();
+ public final List ALL_CHALLENGES = new ArrayList();
/** Instantiate all events and difficulty lists. */
- static {
+ private QuestEventManager() {
QuestEvent tempEvent;
final File[] allFiles = ForgeProps.getFile(NewConstants.Quest.DECKS).listFiles(DeckSerializer.DCK_FILE_FILTER);
@@ -70,20 +65,20 @@ public enum QuestEventManager {
final Map> contents = FileSection.parseSections(FileUtil.readFile(f));
if (contents.containsKey("quest")) {
- tempEvent = QuestEventManager.readChallenge(contents.get("quest"));
+ tempEvent = readChallenge(contents.get("quest"));
ALL_CHALLENGES.add((QuestChallenge) tempEvent);
}
else {
- tempEvent = QuestEventManager.readDuel(contents.get("metadata"));
+ tempEvent = readDuel(contents.get("metadata"));
ALL_DUELS.add((QuestDuel) tempEvent);
}
// Assemble metadata (may not be necessary later) and deck object.
- QuestEventManager.readMetadata(contents.get("metadata"), tempEvent);
+ readMetadata(contents.get("metadata"), tempEvent);
tempEvent.setEventDeck(Deck.fromSections(contents));
} // End for(allFiles)
- QuestEventManager.assembleDuelDifficultyLists();
+ assembleDuelDifficultyLists();
} // End assembleAllEvents()
/**
@@ -93,7 +88,7 @@ public enum QuestEventManager {
* {@link java.lang.String}
* @return {@link forge.data.QuestEvent}
*/
- public static QuestEvent getEvent(final String s0) {
+ public QuestEvent getEvent(final String s0) {
for (final QuestEvent q : ALL_DUELS) {
if (q.getName().equals(s0)) {
return q;
@@ -113,43 +108,47 @@ public enum QuestEventManager {
*
* @return an array of {@link java.lang.String} objects.
*/
- public static final List generateDuels() {
+ public final List generateDuels() {
final QuestPreferences qpref = Singletons.getModel().getQuestPreferences();
- if (AllZone.getQuestData() == null) {
+ if (AllZone.getQuest().getAchievements() == null) {
return null;
}
-
- final int index = AllZone.getQuestData().getDifficultyIndex();
+
+ final QuestController qCtrl = AllZone.getQuest();
+ final int cntWins = qCtrl.getAchievements().getWin();
+
+ final int index = qCtrl.getAchievements().getDifficulty();
final List duelOpponents = new ArrayList();
- if (AllZone.getQuestData().getWin() < qpref.getPreferenceInt(QPref.WINS_MEDIUMAI, index)) {
- duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(QuestEventManager.EASY_DUELS, 0));
- duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(QuestEventManager.EASY_DUELS, 1));
- duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(QuestEventManager.EASY_DUELS, 2));
- } else if (AllZone.getQuestData().getWin() == qpref.getPreferenceInt(QPref.WINS_MEDIUMAI, index)) {
- duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(QuestEventManager.EASY_DUELS, 0));
- duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(QuestEventManager.MEDIUM_DUELS, 0));
- duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(QuestEventManager.MEDIUM_DUELS, 1));
- } else if (AllZone.getQuestData().getWin() < qpref.getPreferenceInt(QPref.WINS_HARDAI, index)) {
- duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(QuestEventManager.MEDIUM_DUELS, 0));
- duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(QuestEventManager.MEDIUM_DUELS, 1));
- duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(QuestEventManager.MEDIUM_DUELS, 2));
+
+ if (cntWins < qpref.getPreferenceInt(QPref.WINS_MEDIUMAI, index)) {
+ duelOpponents.add(SortedDuels.get(QuestDuelDifficulty.EASY).get(0));
+ duelOpponents.add(SortedDuels.get(QuestDuelDifficulty.EASY).get(1));
+ duelOpponents.add(SortedDuels.get(QuestDuelDifficulty.EASY).get(2));
+ } else if (cntWins == qpref.getPreferenceInt(QPref.WINS_MEDIUMAI, index)) {
+ duelOpponents.add(SortedDuels.get(QuestDuelDifficulty.EASY).get(0));
+ duelOpponents.add(SortedDuels.get(QuestDuelDifficulty.MEDIUM).get(0));
+ duelOpponents.add(SortedDuels.get(QuestDuelDifficulty.MEDIUM).get(1));
+ } else if (cntWins < qpref.getPreferenceInt(QPref.WINS_HARDAI, index)) {
+ duelOpponents.add(SortedDuels.get(QuestDuelDifficulty.MEDIUM).get(0));
+ duelOpponents.add(SortedDuels.get(QuestDuelDifficulty.MEDIUM).get(1));
+ duelOpponents.add(SortedDuels.get(QuestDuelDifficulty.MEDIUM).get(2));
}
- else if (AllZone.getQuestData().getWin() == qpref.getPreferenceInt(QPref.WINS_HARDAI, index)) {
- duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(QuestEventManager.MEDIUM_DUELS, 0));
- duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(QuestEventManager.HARD_DUELS, 0));
- duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(QuestEventManager.HARD_DUELS, 1));
+ else if (cntWins == qpref.getPreferenceInt(QPref.WINS_HARDAI, index)) {
+ duelOpponents.add(SortedDuels.get(QuestDuelDifficulty.MEDIUM).get(0));
+ duelOpponents.add(SortedDuels.get(QuestDuelDifficulty.HARD).get(0));
+ duelOpponents.add(SortedDuels.get(QuestDuelDifficulty.HARD).get(1));
}
- else if (AllZone.getQuestData().getWin() < qpref.getPreferenceInt(QPref.WINS_EXPERTAI, index)) {
- duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(QuestEventManager.HARD_DUELS, 0));
- duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(QuestEventManager.HARD_DUELS, 1));
- duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(QuestEventManager.HARD_DUELS, 2));
+ else if (cntWins < qpref.getPreferenceInt(QPref.WINS_EXPERTAI, index)) {
+ duelOpponents.add(SortedDuels.get(QuestDuelDifficulty.HARD).get(0));
+ duelOpponents.add(SortedDuels.get(QuestDuelDifficulty.HARD).get(1));
+ duelOpponents.add(SortedDuels.get(QuestDuelDifficulty.HARD).get(2));
} else {
- duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(QuestEventManager.HARD_DUELS, 0));
- duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(QuestEventManager.HARD_DUELS, 1));
- duelOpponents.add(QuestEventManager.getDuelOpponentByNumber(QuestEventManager.EXPERT_DUELS, 2));
+ duelOpponents.add(SortedDuels.get(QuestDuelDifficulty.HARD).get(0));
+ duelOpponents.add(SortedDuels.get(QuestDuelDifficulty.HARD).get(1));
+ duelOpponents.add(SortedDuels.get(QuestDuelDifficulty.EXPERT).get(0));
}
return duelOpponents;
@@ -159,9 +158,10 @@ public enum QuestEventManager {
*
* @return a {@link java.util.List} object.
*/
- public static final List generateChallenges() {
+ public final List generateChallenges() {
final List challengeOpponents = new ArrayList();
- final QuestData qData = AllZone.getQuestData();
+ final QuestController qCtrl = AllZone.getQuest();
+ final QuestAchievements qData = qCtrl.getAchievements();
int maxChallenges = qData.getWin() / 10;
if (maxChallenges > 5) {
@@ -169,12 +169,12 @@ public enum QuestEventManager {
}
// Generate IDs as needed.
- if ((qData.getAvailableChallenges() == null) || (qData.getAvailableChallenges().size() < maxChallenges)) {
+ if ((qCtrl.getAvailableChallenges() == null) || (qCtrl.getAvailableChallenges().size() < maxChallenges)) {
final List unlockedChallengeIds = new ArrayList();
final List availableChallengeIds = new ArrayList();
- for (final QuestChallenge qc : QuestEventManager.ALL_CHALLENGES) {
+ for (final QuestChallenge qc : ALL_CHALLENGES) {
if ((qc.getWinsReqd() <= qData.getWin())
&& !qData.getCompletedChallenges().contains(qc.getId())) {
unlockedChallengeIds.add(qc.getId());
@@ -189,13 +189,13 @@ public enum QuestEventManager {
availableChallengeIds.add(unlockedChallengeIds.get(i));
}
- qData.setAvailableChallenges(availableChallengeIds);
- qData.saveData();
+ qCtrl.setAvailableChallenges(availableChallengeIds);
+ qCtrl.save();
}
// Finally, pull challenge events from available IDs and return.
- for (final int i : qData.getAvailableChallenges()) {
- challengeOpponents.add(QuestEventManager.getChallengeEventByNumber(i));
+ for (final int i : qCtrl.getAvailableChallenges()) {
+ challengeOpponents.add(getChallengeEventByNumber(i));
}
return challengeOpponents;
@@ -210,7 +210,7 @@ public enum QuestEventManager {
* @param contents
* @param qd
*/
- private static QuestDuel readDuel(final List contents) {
+ private QuestDuel readDuel(final List contents) {
final QuestDuel qd = new QuestDuel();
int eqpos;
String key, value;
@@ -243,7 +243,7 @@ public enum QuestEventManager {
* @param contents
* @param qc
*/
- private static QuestChallenge readChallenge(final List contents) {
+ private QuestChallenge readChallenge(final List contents) {
int eqpos;
String key, value;
@@ -312,7 +312,7 @@ public enum QuestEventManager {
* @param contents
* @param qe
*/
- private static void readMetadata(final List contents, final QuestEvent qe) {
+ private void readMetadata(final List contents, final QuestEvent qe) {
int eqpos;
String key, value;
@@ -347,48 +347,38 @@ public enum QuestEventManager {
*
- * Returns specific duel opponent from current shuffle of available duels.
- * This is to make sure that the opponents do not change when the deck
- * editor is launched.
- *
- * @param aiDeck
- * a {@link java.util.List} object.
- * @param number
- * a int.
- * @return a {@link java.lang.String} object.
- */
- private static QuestDuel getDuelOpponentByNumber(final List aiDeck, final int n) {
- final List deckListCopy = new ArrayList(aiDeck);
- Collections.shuffle(deckListCopy, new Random(AllZone.getQuestData().getRandomSeed()));
-
- return deckListCopy.get(n);
+ public void randomizeOpponents() {
+ long seed = new Random().nextLong();
+ Random r = new Random(seed);
+ Collections.shuffle(SortedDuels.get(QuestDuelDifficulty.EASY), r);
+ Collections.shuffle(SortedDuels.get(QuestDuelDifficulty.MEDIUM), r);
+ Collections.shuffle(SortedDuels.get(QuestDuelDifficulty.HARD), r);
+ Collections.shuffle(SortedDuels.get(QuestDuelDifficulty.EXPERT), r);
}
-
+
/**
*
* getChallengeOpponentByNumber.
@@ -399,7 +389,7 @@ public enum QuestEventManager {
* @param n
* @return
*/
- private static QuestChallenge getChallengeEventByNumber(final int n) {
+ private QuestChallenge getChallengeEventByNumber(final int n) {
for (final QuestChallenge qc : ALL_CHALLENGES) {
if (qc.getId() == n) {
return qc;
diff --git a/src/main/java/forge/quest/data/QuestMode.java b/src/main/java/forge/quest/data/QuestMode.java
new file mode 100644
index 00000000000..fcb80d2126a
--- /dev/null
+++ b/src/main/java/forge/quest/data/QuestMode.java
@@ -0,0 +1,12 @@
+package forge.quest.data;
+
+/**
+ * TODO: Write javadoc for this type.
+ *
+ */
+public enum QuestMode {
+ // Do not apply checkstyle here, to maintain compatibility with old saves
+ Fantasy,
+ Classic,
+ Gauntlet
+}
diff --git a/src/main/java/forge/quest/data/QuestStartPool.java b/src/main/java/forge/quest/data/QuestStartPool.java
index b6653c5a9cb..d0feede81ff 100644
--- a/src/main/java/forge/quest/data/QuestStartPool.java
+++ b/src/main/java/forge/quest/data/QuestStartPool.java
@@ -3,5 +3,6 @@ package forge.quest.data;
public enum QuestStartPool {
COMPLETE,
STANDARD,
+ Extended,
PRECON
}
diff --git a/src/main/java/forge/quest/data/QuestUtil.java b/src/main/java/forge/quest/data/QuestUtil.java
index 78c4be85ae6..21f2fd04ec6 100644
--- a/src/main/java/forge/quest/data/QuestUtil.java
+++ b/src/main/java/forge/quest/data/QuestUtil.java
@@ -44,7 +44,7 @@ public class QuestUtil {
* a {@link forge.quest.data.QuestData} object.
* @return a {@link forge.CardList} object.
*/
- public static CardList getComputerStartingCards(final QuestData qd) {
+ public static CardList getComputerStartingCards() {
return new CardList();
}
@@ -60,7 +60,7 @@ public class QuestUtil {
* a {@link forge.quest.data.QuestEvent} object.
* @return a {@link forge.CardList} object.
*/
- public static CardList getComputerStartingCards(final QuestData qd, final QuestEvent qe) {
+ public static CardList getComputerStartingCards(final QuestEvent qe) {
final CardList list = new CardList();
if (qe.getEventType().equals("challenge")) {
@@ -84,7 +84,7 @@ public class QuestUtil {
* a {@link forge.quest.data.QuestData} object.
* @return a {@link forge.CardList} object.
*/
- public static CardList getHumanStartingCards(final QuestData qd) {
+ public static CardList getHumanStartingCards(final QuestAssets qd) {
final CardList list = new CardList();
if (qd.getPetManager().shouldPetBeUsed()) {
@@ -111,8 +111,8 @@ public class QuestUtil {
* a {@link forge.quest.data.QuestEvent} object.
* @return a {@link forge.CardList} object.
*/
- public static CardList getHumanStartingCards(final QuestData qd, final QuestEvent qe) {
- final CardList list = QuestUtil.getHumanStartingCards(qd);
+ public static CardList getHumanStartingCards(final QuestAssets qa, final QuestEvent qe) {
+ final CardList list = QuestUtil.getHumanStartingCards(qa);
if (qe.getEventType().equals("challenge")) {
final List extras = ((QuestChallenge) qe).getHumanExtraCards();
diff --git a/src/main/java/forge/quest/data/QuestUtilCards.java b/src/main/java/forge/quest/data/QuestUtilCards.java
index dbfd9e106b4..43df67acd6d 100644
--- a/src/main/java/forge/quest/data/QuestUtilCards.java
+++ b/src/main/java/forge/quest/data/QuestUtilCards.java
@@ -38,8 +38,9 @@ import java.util.Map.Entry;
* created to decrease complexity of questData class
*/
public final class QuestUtilCards {
- private final QuestData q;
+ private final QuestController qc;
private final QuestPreferences qpref;
+ private final QuestAssets qa;
/**
* Instantiates a new quest util cards.
@@ -47,8 +48,9 @@ public final class QuestUtilCards {
* @param qd
* the qd
*/
- public QuestUtilCards(final QuestData qd) {
- this.q = qd;
+ public QuestUtilCards(final QuestController qd) {
+ this.qc = qd;
+ this.qa = qc.getAssets();
this.qpref = Singletons.getModel().getQuestPreferences();
}
@@ -121,10 +123,10 @@ public final class QuestUtilCards {
* the card
*/
public void addSingleCard(final CardPrinted card) {
- this.q.getCardPool().add(card);
+ this.qa.getCardPool().add(card);
// register card into that list so that it would appear as a new one.
- this.q.getNewCardList().add(card);
+ this.qa.getNewCardList().add(card);
}
private static final Predicate RARE_PREDICATE = CardPrinted.Predicates.Presets.IS_RARE_OR_MYTHIC;
@@ -178,9 +180,9 @@ public final class QuestUtilCards {
* the value
*/
public void buyCard(final CardPrinted card, final int value) {
- if (this.q.getCredits() >= value) {
- this.q.setCredits(this.q.getCredits() - value);
- this.q.getShopList().remove(card);
+ if (this.qa.getCredits() >= value) {
+ this.qa.setCredits(this.qa.getCredits() - value);
+ this.qa.getShopList().remove(card);
this.addSingleCard(card);
}
}
@@ -194,9 +196,8 @@ public final class QuestUtilCards {
* the value
*/
public void buyPack(final OpenablePack booster, final int value) {
- if (this.q.getCredits() >= value) {
- this.q.setCredits(this.q.getCredits() - value);
- this.q.getShopList().remove(booster);
+ if (this.qa.getCredits() >= value) {
+ this.qa.setCredits(this.qa.getCredits() - value);
this.addAllCards(booster.getCards());
}
}
@@ -210,15 +211,15 @@ public final class QuestUtilCards {
* the value
*/
public void buyPreconDeck(final PreconDeck precon, final int value) {
- if (this.q.getCredits() >= value) {
- this.q.setCredits(this.q.getCredits() - value);
- this.q.getShopList().remove(precon);
+ if (this.qa.getCredits() >= value) {
+ this.qa.setCredits(this.qa.getCredits() - value);
+ this.qa.getShopList().remove(precon);
addPreconDeck(precon);
}
}
void addPreconDeck(PreconDeck precon) {
- this.q.getMyDecks().add(precon.getDeck());
+ this.qc.getMyDecks().add(precon.getDeck());
this.addAllCards(precon.getDeck().getMain().toFlatList());
this.addAllCards(precon.getDeck().getSideboard().toFlatList());
}
@@ -247,17 +248,17 @@ public final class QuestUtilCards {
*/
public void sellCard(final CardPrinted card, final int price, final boolean addToShop) {
if (price > 0) {
- this.q.setCredits(this.q.getCredits() + price);
+ this.qa.setCredits(this.qa.getCredits() + price);
}
- this.q.getCardPool().remove(card);
+ this.qa.getCardPool().remove(card);
if (addToShop) {
- this.q.getShopList().add(card);
+ this.qa.getShopList().add(card);
}
// remove card being sold from all decks
- final int leftInPool = this.q.getCardPool().count(card);
+ final int leftInPool = this.qa.getCardPool().count(card);
// remove sold cards from all decks:
- for (final Deck deck : this.q.getMyDecks()) {
+ for (final Deck deck : this.qc.getMyDecks()) {
deck.getMain().remove(card, deck.getMain().count(card) - leftInPool);
}
}
@@ -266,8 +267,8 @@ public final class QuestUtilCards {
* Clear shop list.
*/
public void clearShopList() {
- if (null != this.q.getShopList()) {
- this.q.getShopList().clear();
+ if (null != this.qa.getShopList()) {
+ this.qa.getShopList().clear();
}
}
@@ -277,12 +278,12 @@ public final class QuestUtilCards {
* @return the sell mutliplier
*/
public double getSellMutliplier() {
- double multi = 0.20 + (0.001 * this.q.getWin());
+ double multi = 0.20 + (0.001 * this.qc.getAchievements().getWin());
if (multi > 0.6) {
multi = 0.6;
}
- final int lvlEstates = this.q.isFantasy() ? this.q.getInventory().getItemLevel("Estates") : 0;
+ final int lvlEstates = this.qc.getMode() == QuestMode.Fantasy ? this.qa.getInventory().getItemLevel("Estates") : 0;
switch (lvlEstates) {
case 1:
multi += 0.01;
@@ -306,7 +307,7 @@ public final class QuestUtilCards {
* @return the sell price limit
*/
public int getSellPriceLimit() {
- return this.q.getWin() <= 50 ? 1000 : Integer.MAX_VALUE;
+ return this.qc.getAchievements().getWin() <= 50 ? 1000 : Integer.MAX_VALUE;
}
/**
@@ -340,7 +341,7 @@ public final class QuestUtilCards {
final int rollD100 = MyRandom.getRandom().nextInt(100);
final Predicate filter = rollD100 < 40 ? this.filterT2booster
: (rollD100 < 75 ? this.filterExtButT2 : this.filterNotExt);
- this.q.getShopList().addAllFlat(
+ this.qa.getShopList().addAllFlat(
filter.random(Singletons.getModel().getEditions(), 1, BoosterPack.FN_FROM_SET));
}
}
@@ -353,14 +354,14 @@ public final class QuestUtilCards {
*/
public void generateTournamentsInShop(final int count) {
Predicate hasTournament = CardEdition.Predicates.HAS_TOURNAMENT_PACK;
- this.q.getShopList().addAllFlat(hasTournament.random(Singletons.getModel().getEditions(),
+ this.qa.getShopList().addAllFlat(hasTournament.random(Singletons.getModel().getEditions(),
count,
TournamentPack.FN_FROM_SET));
}
public void generateFatPacksInShop(final int count) {
Predicate hasPack = CardEdition.Predicates.HAS_FAT_PACK;
- this.q.getShopList().addAllFlat(hasPack.random(Singletons.getModel().getEditions(), count, FatPack.FN_FROM_SET));
+ this.qa.getShopList().addAllFlat(hasPack.random(Singletons.getModel().getEditions(), count, FatPack.FN_FROM_SET));
}
/**
@@ -371,12 +372,12 @@ public final class QuestUtilCards {
*/
public void generatePreconsInShop(final int count) {
final List meetRequirements = new ArrayList();
- for (final PreconDeck deck : QuestData.getPrecons()) {
- if (deck.getRecommendedDeals().meetsRequiremnts(this.q)) {
+ for (final PreconDeck deck : QuestController.getPrecons()) {
+ if (deck.getRecommendedDeals().meetsRequiremnts(this.qc.getAchievements())) {
meetRequirements.add(deck);
}
}
- this.q.getShopList().addAllFlat(Predicate.getTrue(PreconDeck.class).random(meetRequirements, count));
+ this.qa.getShopList().addAllFlat(Predicate.getTrue(PreconDeck.class).random(meetRequirements, count));
}
/**
@@ -385,6 +386,8 @@ public final class QuestUtilCards {
public void generateCardsInShop() {
final BoosterGenerator pack = new BoosterGenerator(CardDb.instance().getAllCards());
+ int nLevel = this.qc.getAchievements().getLevel();
+
// Preferences
final int startPacks = this.qpref.getPreferenceInt(QPref.SHOP_STARTING_PACKS);
final int winsForPack = this.qpref.getPreferenceInt(QPref.SHOP_WINS_FOR_ADDITIONAL_PACK);
@@ -393,20 +396,20 @@ public final class QuestUtilCards {
final int uncommon = this.qpref.getPreferenceInt(QPref.SHOP_SINGLES_UNCOMMON);
final int rare = this.qpref.getPreferenceInt(QPref.SHOP_SINGLES_RARE);
- final int levelPacks = this.q.getLevel() > 0 ? startPacks / this.q.getLevel() : startPacks;
- final int winPacks = this.q.getWin() / winsForPack;
+ final int levelPacks = nLevel > 0 ? startPacks / nLevel : startPacks;
+ final int winPacks = this.qc.getAchievements().getWin() / winsForPack;
final int totalPacks = Math.min(levelPacks + winPacks, maxPacks);
- this.q.getShopList().clear();
+ this.qa.getShopList().clear();
for (int i = 0; i < totalPacks; i++) {
- this.q.getShopList().addAllFlat(pack.getBoosterPack(common, uncommon, rare, 0, 0, 0, 0, 0, 0));
+ this.qa.getShopList().addAllFlat(pack.getBoosterPack(common, uncommon, rare, 0, 0, 0, 0, 0, 0));
}
this.generateBoostersInShop(totalPacks);
this.generatePreconsInShop(totalPacks);
this.generateTournamentsInShop(totalPacks);
this.generateFatPacksInShop(totalPacks);
- this.q.getShopList().addAll(QuestUtilCards.generateBasicLands(10, 5));
+ this.qa.getShopList().addAll(QuestUtilCards.generateBasicLands(10, 5));
}
/**
@@ -415,7 +418,7 @@ public final class QuestUtilCards {
* @return the cardpool
*/
public ItemPool getCardpool() {
- return this.q.getCardPool();
+ return this.qa.getCardPool();
}
/**
@@ -424,10 +427,10 @@ public final class QuestUtilCards {
* @return the shop list
*/
public ItemPoolView getShopList() {
- if (this.q.getShopList().isEmpty()) {
+ if (this.qa.getShopList().isEmpty()) {
this.generateCardsInShop();
}
- return this.q.getShopList();
+ return this.qa.getShopList();
}
/**
@@ -436,14 +439,14 @@ public final class QuestUtilCards {
* @return the new cards
*/
public ItemPoolView getNewCards() {
- return this.q.getNewCardList();
+ return this.qa.getNewCardList();
}
/**
* Reset new list.
*/
public void resetNewList() {
- this.q.getNewCardList().clear();
+ this.qa.getNewCardList().clear();
}
/**
@@ -475,7 +478,7 @@ public final class QuestUtilCards {
private final Lambda1> fnNewCompare = new Lambda1>() {
@Override
public Comparable apply(final Entry from) {
- return QuestUtilCards.this.q.getNewCardList().contains(from.getKey()) ? Integer.valueOf(1) : Integer
+ return QuestUtilCards.this.qa.getNewCardList().contains(from.getKey()) ? Integer.valueOf(1) : Integer
.valueOf(0);
}
};
@@ -484,7 +487,7 @@ public final class QuestUtilCards {
private final Lambda1