From f777d4f7e7dcf548c697c0dba7f273a714d603af Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Sat, 10 Mar 2012 08:24:34 +0000 Subject: [PATCH] QuestController introduced, 1st stage of quest saves refactoring --- .gitattributes | 7 +- src/main/java/forge/AllZone.java | 23 +- src/main/java/forge/Constant.java | 26 - .../spellability/SpellAbilityVariables.java | 1 - .../java/forge/control/ControlMatchUI.java | 6 +- .../forge/control/input/InputMulligan.java | 6 +- src/main/java/forge/game/GameNew.java | 9 +- .../forge/gui/deckeditor/DeckEditorQuest.java | 6 +- .../forge/gui/deckeditor/QuestCardShop.java | 14 +- .../gui/home/quest/CSubmenuChallenges.java | 20 +- .../forge/gui/home/quest/CSubmenuDuels.java | 19 +- .../gui/home/quest/CSubmenuQuestData.java | 26 +- .../gui/home/quest/CSubmenuQuestDecks.java | 16 +- .../forge/gui/home/quest/QuestFileLister.java | 6 +- .../gui/home/quest/SubmenuQuestUtil.java | 80 ++- .../gui/home/quest/VSubmenuQuestData.java | 6 +- .../home/sanctioned/CSubmenuConstructed.java | 8 +- .../java/forge/gui/toolbox/DeckLister.java | 6 +- src/main/java/forge/model/FMatchState.java | 2 +- src/main/java/forge/quest/SellRules.java | 6 +- .../forge/quest/data/QuestAchievements.java | 158 +++++ .../java/forge/quest/data/QuestAssets.java | 164 +++++ .../forge/quest/data/QuestController.java | 239 +++++++ src/main/java/forge/quest/data/QuestData.java | 671 +----------------- .../java/forge/quest/data/QuestDataIO.java | 179 +++-- .../forge/quest/data/QuestDuelDifficulty.java | 12 + .../forge/quest/data/QuestEventManager.java | 160 ++--- src/main/java/forge/quest/data/QuestMode.java | 12 + .../java/forge/quest/data/QuestStartPool.java | 1 + src/main/java/forge/quest/data/QuestUtil.java | 10 +- .../java/forge/quest/data/QuestUtilCards.java | 89 +-- ...sable.java => IQuestStallPurchasable.java} | 13 +- .../quest/data/bazaar/QuestStallManager.java | 25 +- .../quest/data/item/QuestItemAbstract.java | 22 +- .../quest/data/item/QuestItemElixir.java | 12 +- .../quest/data/item/QuestItemEstates.java | 5 +- .../quest/data/item/QuestItemLuckyCoin.java | 5 +- .../forge/quest/data/item/QuestItemMap.java | 5 +- .../quest/data/item/QuestItemPoundFlesh.java | 17 +- .../quest/data/item/QuestItemSleight.java | 5 +- .../quest/data/item/QuestItemZeppelin.java | 10 +- .../quest/data/pet/QuestPetAbstract.java | 18 +- .../forge/quest/data/pet/QuestPetPlant.java | 9 +- src/main/java/forge/view/ViewHomeUI.java | 2 +- src/main/java/forge/view/bazaar/ViewItem.java | 27 +- .../java/forge/view/bazaar/ViewStall.java | 11 +- .../forge/view/match/QuestWinLoseHandler.java | 53 +- 47 files changed, 1143 insertions(+), 1084 deletions(-) create mode 100644 src/main/java/forge/quest/data/QuestAchievements.java create mode 100644 src/main/java/forge/quest/data/QuestAssets.java create mode 100644 src/main/java/forge/quest/data/QuestController.java create mode 100644 src/main/java/forge/quest/data/QuestDuelDifficulty.java create mode 100644 src/main/java/forge/quest/data/QuestMode.java rename src/main/java/forge/quest/data/bazaar/{QuestStallPurchasable.java => IQuestStallPurchasable.java} (86%) diff --git a/.gitattributes b/.gitattributes index 19eba6677cd..381d2af8d6b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -11571,20 +11571,25 @@ src/main/java/forge/quest/BoosterUtils.java svneol=native#text/plain src/main/java/forge/quest/ReadPriceList.java svneol=native#text/plain src/main/java/forge/quest/SellRules.java -text src/main/java/forge/quest/data/PreconReader.java -text +src/main/java/forge/quest/data/QuestAchievements.java -text +src/main/java/forge/quest/data/QuestAssets.java -text src/main/java/forge/quest/data/QuestChallenge.java svneol=native#text/plain +src/main/java/forge/quest/data/QuestController.java -text src/main/java/forge/quest/data/QuestData.java svneol=native#text/plain src/main/java/forge/quest/data/QuestDataIO.java svneol=native#text/plain src/main/java/forge/quest/data/QuestDeckMap.java -text src/main/java/forge/quest/data/QuestDuel.java svneol=native#text/plain +src/main/java/forge/quest/data/QuestDuelDifficulty.java -text src/main/java/forge/quest/data/QuestEvent.java -text src/main/java/forge/quest/data/QuestEventManager.java svneol=native#text/plain +src/main/java/forge/quest/data/QuestMode.java -text src/main/java/forge/quest/data/QuestPreferences.java svneol=native#text/plain src/main/java/forge/quest/data/QuestStartPool.java -text src/main/java/forge/quest/data/QuestUtil.java svneol=native#text/plain src/main/java/forge/quest/data/QuestUtilCards.java -text +src/main/java/forge/quest/data/bazaar/IQuestStallPurchasable.java svneol=native#text/plain src/main/java/forge/quest/data/bazaar/QuestStallDefinition.java svneol=native#text/plain src/main/java/forge/quest/data/bazaar/QuestStallManager.java svneol=native#text/plain -src/main/java/forge/quest/data/bazaar/QuestStallPurchasable.java svneol=native#text/plain src/main/java/forge/quest/data/bazaar/package-info.java svneol=native#text/plain src/main/java/forge/quest/data/item/QuestInventory.java svneol=native#text/plain src/main/java/forge/quest/data/item/QuestItemAbstract.java svneol=native#text/plain diff --git a/src/main/java/forge/AllZone.java b/src/main/java/forge/AllZone.java index 2a83c040b17..5df6f5944f1 100644 --- a/src/main/java/forge/AllZone.java +++ b/src/main/java/forge/AllZone.java @@ -30,7 +30,7 @@ import forge.control.input.InputControl; import forge.game.GameState; import forge.properties.ForgeProps; import forge.properties.NewConstants; -import forge.quest.data.QuestData; +import forge.quest.data.QuestController; /** * Please use public getters and setters instead of direct field access. @@ -52,7 +52,7 @@ public final class AllZone { } /** Global questData. */ - private static forge.quest.data.QuestData questData = null; + private static forge.quest.data.QuestController quest = null; /** Constant NAME_CHANGER. */ private static final NameChanger NAME_CHANGER = new NameChanger(); @@ -121,22 +121,13 @@ public final class AllZone { * @return a {@link forge.quest.data.QuestData} object. * @since 1.0.15 */ - public static forge.quest.data.QuestData getQuestData() { - return AllZone.questData; + public static forge.quest.data.QuestController getQuest() { + if ( null == quest ) + quest = new QuestController(); + return AllZone.quest; } - /** - *

- * setQuestData. - *

- * - * @param questData0 - * a {@link forge.quest.data.QuestData} object. - * @since 1.0.15 - */ - public static void setQuestData(final QuestData questData0) { - AllZone.questData = questData0; - } + /** *

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 { *

* Assemble duel deck difficulty lists */ - private static void assembleDuelDifficultyLists() { - EASY_DUELS.clear(); - MEDIUM_DUELS.clear(); - HARD_DUELS.clear(); - EXPERT_DUELS.clear(); + private void assembleDuelDifficultyLists() { + SortedDuels.clear(); + SortedDuels.put(QuestDuelDifficulty.EASY, new ArrayList() ); + SortedDuels.put(QuestDuelDifficulty.MEDIUM, new ArrayList() ); + SortedDuels.put(QuestDuelDifficulty.HARD, new ArrayList() ); + SortedDuels.put(QuestDuelDifficulty.EXPERT, new ArrayList() ); + String s; for (final QuestDuel qd : ALL_DUELS) { s = qd.getDifficulty(); if (s.equalsIgnoreCase("easy")) { - EASY_DUELS.add(qd); + SortedDuels.get(QuestDuelDifficulty.EASY).add(qd); } else if (s.equalsIgnoreCase("medium")) { - MEDIUM_DUELS.add(qd); + SortedDuels.get(QuestDuelDifficulty.MEDIUM).add(qd); } else if (s.equalsIgnoreCase("hard")) { - HARD_DUELS.add(qd); + SortedDuels.get(QuestDuelDifficulty.HARD).add(qd); } else if (s.equalsIgnoreCase("very hard")) { - EXPERT_DUELS.add(qd); + SortedDuels.get(QuestDuelDifficulty.EXPERT).add(qd); } } } - /** - *

- * getDuelOpponent. - *

- * 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> fnNewGet = new Lambda1>() { @Override public Object apply(final Entry from) { - return QuestUtilCards.this.q.getNewCardList().contains(from.getKey()) ? "NEW" : ""; + return QuestUtilCards.this.qa.getNewCardList().contains(from.getKey()) ? "NEW" : ""; } }; } diff --git a/src/main/java/forge/quest/data/bazaar/QuestStallPurchasable.java b/src/main/java/forge/quest/data/bazaar/IQuestStallPurchasable.java similarity index 86% rename from src/main/java/forge/quest/data/bazaar/QuestStallPurchasable.java rename to src/main/java/forge/quest/data/bazaar/IQuestStallPurchasable.java index 7ff56edecf5..6c146ab1817 100644 --- a/src/main/java/forge/quest/data/bazaar/QuestStallPurchasable.java +++ b/src/main/java/forge/quest/data/bazaar/IQuestStallPurchasable.java @@ -19,13 +19,15 @@ package forge.quest.data.bazaar; import javax.swing.ImageIcon; +import forge.quest.data.QuestAssets; + /** * This interface defines a thing that can be sold at the Bazaar. * * @author Forge * @version $Id$ */ -public interface QuestStallPurchasable extends Comparable { +public interface IQuestStallPurchasable extends Comparable { /** *

* getPurchaseName. @@ -60,7 +62,7 @@ public interface QuestStallPurchasable extends Comparable { * * @return the buying cost of the item in credits */ - int getBuyingPrice(); + int getBuyingPrice(QuestAssets qA); /** *

@@ -69,7 +71,7 @@ public interface QuestStallPurchasable extends Comparable { * * @return the selling cost of the item in credits */ - int getSellingPrice(); + int getSellingPrice(QuestAssets qA); /** * Returns if the item is available for purchase;. @@ -78,12 +80,13 @@ public interface QuestStallPurchasable extends Comparable { * false if the item should not be displayed in store * since, for example, prerequisites are not met */ - boolean isAvailableForPurchase(); + boolean isAvailableForPurchase(QuestAssets questAssets); /** * Executed when the item is bought. + * @param questAssets */ - void onPurchase(); + void onPurchase(QuestAssets questAssets); /** *

diff --git a/src/main/java/forge/quest/data/bazaar/QuestStallManager.java b/src/main/java/forge/quest/data/bazaar/QuestStallManager.java index 7e75dbbb209..c895a00e4d1 100644 --- a/src/main/java/forge/quest/data/bazaar/QuestStallManager.java +++ b/src/main/java/forge/quest/data/bazaar/QuestStallManager.java @@ -26,6 +26,7 @@ import java.util.TreeSet; import forge.AllZone; import forge.gui.toolbox.FSkin; +import forge.quest.data.QuestAssets; /** *

@@ -40,7 +41,7 @@ public class QuestStallManager { /** Constant stalls. */ private static Map stalls; /** Constant items. */ - private static Map> items; + private static Map> items; /** * Master method for assembling stall data: merchant... @@ -109,18 +110,19 @@ public class QuestStallManager { * and maps to appropriate merchant. */ public static void buildItems() { - final SortedSet itemSet = new TreeSet(); + final SortedSet itemSet = new TreeSet(); - itemSet.addAll(AllZone.getQuestData().getInventory().getItems()); - itemSet.addAll(AllZone.getQuestData().getPetManager().getPetsAndPlants()); + final QuestAssets qA = AllZone.getQuest().getAssets(); + itemSet.addAll(qA.getInventory().getItems()); + itemSet.addAll(qA.getPetManager().getPetsAndPlants()); - QuestStallManager.items = new HashMap>(); + QuestStallManager.items = new HashMap>(); for (final String stallName : QuestStallManager.getStallNames()) { - QuestStallManager.items.put(stallName, new TreeSet()); + QuestStallManager.items.put(stallName, new TreeSet()); } - for (final QuestStallPurchasable purchasable : itemSet) { + for (final IQuestStallPurchasable purchasable : itemSet) { QuestStallManager.items.get(purchasable.getStallName()).add(purchasable); } @@ -132,13 +134,14 @@ public class QuestStallManager { * @param stallName   {@link java.lang.String} * @return {@link java.util.List}. */ - public static List getItems(final String stallName) { + public static List getItems(final String stallName) { QuestStallManager.buildItems(); - final List ret = new ArrayList(); + final List ret = new ArrayList(); - for (final QuestStallPurchasable purchasable : QuestStallManager.items.get(stallName)) { - if (purchasable.isAvailableForPurchase()) { + QuestAssets qA = AllZone.getQuest().getAssets(); + for (final IQuestStallPurchasable purchasable : QuestStallManager.items.get(stallName)) { + if (purchasable.isAvailableForPurchase(qA)) { ret.add(purchasable); } } diff --git a/src/main/java/forge/quest/data/item/QuestItemAbstract.java b/src/main/java/forge/quest/data/item/QuestItemAbstract.java index 7ec4a44873e..42e66da454b 100644 --- a/src/main/java/forge/quest/data/item/QuestItemAbstract.java +++ b/src/main/java/forge/quest/data/item/QuestItemAbstract.java @@ -19,8 +19,8 @@ package forge.quest.data.item; import javax.swing.ImageIcon; -import forge.AllZone; -import forge.quest.data.bazaar.QuestStallPurchasable; +import forge.quest.data.QuestAssets; +import forge.quest.data.bazaar.IQuestStallPurchasable; /** *

@@ -30,7 +30,7 @@ import forge.quest.data.bazaar.QuestStallPurchasable; * @author Forge * @version $Id$ */ -public abstract class QuestItemAbstract implements QuestStallPurchasable { +public abstract class QuestItemAbstract implements IQuestStallPurchasable { private int level = 0; private final String name; private final String shopName; @@ -104,9 +104,9 @@ public abstract class QuestItemAbstract implements QuestStallPurchasable { * This method will be invoked when an item is bought in a shop. */ @Override - public void onPurchase() { - final int currentLevel = AllZone.getQuestData().getInventory().getItemLevel(this.name); - AllZone.getQuestData().getInventory().setItemLevel(this.name, currentLevel + 1); + public void onPurchase(QuestAssets qA) { + final int currentLevel = qA.getInventory().getItemLevel(this.name); + qA.getInventory().setItemLevel(this.name, currentLevel + 1); } /** @@ -117,8 +117,8 @@ public abstract class QuestItemAbstract implements QuestStallPurchasable { * @return a boolean. */ @Override - public boolean isAvailableForPurchase() { - return AllZone.getQuestData().getInventory().getItemLevel(this.name) < this.maxLevel; + public boolean isAvailableForPurchase(QuestAssets qA) { + return qA.getInventory().getItemLevel(this.name) < this.maxLevel; } /** @@ -188,16 +188,16 @@ public abstract class QuestItemAbstract implements QuestStallPurchasable { /** @return a int. */ @Override - public abstract int getBuyingPrice(); + public abstract int getBuyingPrice(QuestAssets qA); /** @return a int. */ @Override - public abstract int getSellingPrice(); + public abstract int getSellingPrice(QuestAssets qA); /** {@inheritDoc} */ @Override public final int compareTo(final Object o) { - final QuestStallPurchasable q = (QuestStallPurchasable) o; + final IQuestStallPurchasable q = (IQuestStallPurchasable) o; return this.getPurchaseName().compareTo(q.getPurchaseName()); } } diff --git a/src/main/java/forge/quest/data/item/QuestItemElixir.java b/src/main/java/forge/quest/data/item/QuestItemElixir.java index 44569a3ebdb..413a13c18eb 100644 --- a/src/main/java/forge/quest/data/item/QuestItemElixir.java +++ b/src/main/java/forge/quest/data/item/QuestItemElixir.java @@ -19,8 +19,8 @@ package forge.quest.data.item; import javax.swing.ImageIcon; -import forge.AllZone; import forge.gui.toolbox.FSkin; +import forge.quest.data.QuestAssets; import forge.quest.data.bazaar.QuestStallManager; /** @@ -56,7 +56,7 @@ public class QuestItemElixir extends QuestItemAbstract { /** {@inheritDoc} */ @Override - public final int getBuyingPrice() { + public final int getBuyingPrice(QuestAssets qA) { if (this.getLevel() < 5) { return 250; } else if (this.getLevel() < 10) { @@ -70,17 +70,17 @@ public class QuestItemElixir extends QuestItemAbstract { /** {@inheritDoc} */ @Override - public final int getSellingPrice() { + public final int getSellingPrice(QuestAssets qA) { return 0; } /** {@inheritDoc} */ @Override - public final void onPurchase() { - super.onPurchase(); + public final void onPurchase(QuestAssets qA) { + super.onPurchase(qA); if (this.getLevel() <= this.getMaxLevel()) { - AllZone.getQuestData().addLife(1); + qA.addLife(1); } } } diff --git a/src/main/java/forge/quest/data/item/QuestItemEstates.java b/src/main/java/forge/quest/data/item/QuestItemEstates.java index f28b8755dd0..1d9b8d0df82 100644 --- a/src/main/java/forge/quest/data/item/QuestItemEstates.java +++ b/src/main/java/forge/quest/data/item/QuestItemEstates.java @@ -20,6 +20,7 @@ package forge.quest.data.item; import javax.swing.ImageIcon; import forge.gui.toolbox.FSkin; +import forge.quest.data.QuestAssets; import forge.quest.data.bazaar.QuestStallManager; /** @@ -58,7 +59,7 @@ public class QuestItemEstates extends QuestItemAbstract { /** {@inheritDoc} */ @Override - public final int getBuyingPrice() { + public final int getBuyingPrice(QuestAssets qA) { if (this.getLevel() == 0) { return 500; } else if (this.getLevel() == 1) { @@ -70,7 +71,7 @@ public class QuestItemEstates extends QuestItemAbstract { /** {@inheritDoc} */ @Override - public final int getSellingPrice() { + public final int getSellingPrice(QuestAssets qA) { return 0; } } diff --git a/src/main/java/forge/quest/data/item/QuestItemLuckyCoin.java b/src/main/java/forge/quest/data/item/QuestItemLuckyCoin.java index f1fac290362..a2c90fad1ab 100644 --- a/src/main/java/forge/quest/data/item/QuestItemLuckyCoin.java +++ b/src/main/java/forge/quest/data/item/QuestItemLuckyCoin.java @@ -20,6 +20,7 @@ package forge.quest.data.item; import javax.swing.ImageIcon; import forge.gui.toolbox.FSkin; +import forge.quest.data.QuestAssets; import forge.quest.data.bazaar.QuestStallManager; /** @@ -55,13 +56,13 @@ public class QuestItemLuckyCoin extends QuestItemAbstract { /** {@inheritDoc} */ @Override - public final int getBuyingPrice() { + public final int getBuyingPrice(QuestAssets qA) { return 2000; } /** {@inheritDoc} */ @Override - public final int getSellingPrice() { + public final int getSellingPrice(QuestAssets qA) { return 0; } } diff --git a/src/main/java/forge/quest/data/item/QuestItemMap.java b/src/main/java/forge/quest/data/item/QuestItemMap.java index f8e812ae288..30f8030c1f4 100644 --- a/src/main/java/forge/quest/data/item/QuestItemMap.java +++ b/src/main/java/forge/quest/data/item/QuestItemMap.java @@ -20,6 +20,7 @@ package forge.quest.data.item; import javax.swing.ImageIcon; import forge.gui.toolbox.FSkin; +import forge.quest.data.QuestAssets; import forge.quest.data.bazaar.QuestStallManager; /** @@ -61,13 +62,13 @@ public class QuestItemMap extends QuestItemAbstract { /** {@inheritDoc} */ @Override - public final int getBuyingPrice() { + public final int getBuyingPrice(QuestAssets qA) { return 2000; } /** {@inheritDoc} */ @Override - public final int getSellingPrice() { + public final int getSellingPrice(QuestAssets qA) { return 0; } } diff --git a/src/main/java/forge/quest/data/item/QuestItemPoundFlesh.java b/src/main/java/forge/quest/data/item/QuestItemPoundFlesh.java index 902fd8045d3..32b6de4ff54 100644 --- a/src/main/java/forge/quest/data/item/QuestItemPoundFlesh.java +++ b/src/main/java/forge/quest/data/item/QuestItemPoundFlesh.java @@ -21,6 +21,7 @@ import javax.swing.ImageIcon; import forge.AllZone; import forge.gui.toolbox.FSkin; +import forge.quest.data.QuestAssets; import forge.quest.data.bazaar.QuestStallManager; /** @@ -45,7 +46,7 @@ public class QuestItemPoundFlesh extends QuestItemAbstract { public final String getPurchaseDescription() { return "The Alchemist welcomes contributions to his famous Elixer.\n" + "But beware, you may build an immunity to its effects...\n" - + "\nEffect: Alchemist gives you " + getSellingPrice() + " credits." + + "\nEffect: Alchemist gives you " + getSellingPrice(AllZone.getQuest().getAssets()) + " credits." + "\nEffect: Reduces maximum life by 1."; } @@ -57,13 +58,13 @@ public class QuestItemPoundFlesh extends QuestItemAbstract { /** {@inheritDoc} */ @Override - public final int getBuyingPrice() { + public final int getBuyingPrice(QuestAssets qA) { return 0; } /** {@inheritDoc} */ - public final int getSellingPrice() { - if (AllZone.getQuestData().getLife() < 2) { + public final int getSellingPrice(QuestAssets qA) { + if (qA.getLife() < 2) { return 0; } else if (this.getLevel() < 5) { return 250; @@ -76,10 +77,10 @@ public class QuestItemPoundFlesh extends QuestItemAbstract { /** {@inheritDoc} */ @Override - public final void onPurchase() { - if (AllZone.getQuestData().getLife() > 1) { - super.onPurchase(); - AllZone.getQuestData().removeLife(1); + public final void onPurchase(QuestAssets qA) { + if (qA.getLife() > 1) { + super.onPurchase(qA); + qA.removeLife(1); } } } diff --git a/src/main/java/forge/quest/data/item/QuestItemSleight.java b/src/main/java/forge/quest/data/item/QuestItemSleight.java index c611e867f5b..29550dcd9ef 100644 --- a/src/main/java/forge/quest/data/item/QuestItemSleight.java +++ b/src/main/java/forge/quest/data/item/QuestItemSleight.java @@ -20,6 +20,7 @@ package forge.quest.data.item; import javax.swing.ImageIcon; import forge.gui.toolbox.FSkin; +import forge.quest.data.QuestAssets; import forge.quest.data.bazaar.QuestStallManager; /** @@ -49,13 +50,13 @@ public class QuestItemSleight extends QuestItemAbstract { /** {@inheritDoc} */ @Override - public final int getBuyingPrice() { + public final int getBuyingPrice(QuestAssets qA) { return 2000; } /** {@inheritDoc} */ @Override - public final int getSellingPrice() { + public final int getSellingPrice(QuestAssets qA) { return 0; } diff --git a/src/main/java/forge/quest/data/item/QuestItemZeppelin.java b/src/main/java/forge/quest/data/item/QuestItemZeppelin.java index 7e84ea63326..6a89ecf1db6 100644 --- a/src/main/java/forge/quest/data/item/QuestItemZeppelin.java +++ b/src/main/java/forge/quest/data/item/QuestItemZeppelin.java @@ -19,8 +19,8 @@ package forge.quest.data.item; import javax.swing.ImageIcon; -import forge.AllZone; import forge.gui.toolbox.FSkin; +import forge.quest.data.QuestAssets; import forge.quest.data.bazaar.QuestStallManager; /** @@ -68,20 +68,20 @@ public class QuestItemZeppelin extends QuestItemAbstract { /** {@inheritDoc} */ @Override - public final int getBuyingPrice() { + public final int getBuyingPrice(QuestAssets qA) { return 5000; } /** {@inheritDoc} */ @Override - public final int getSellingPrice() { + public final int getSellingPrice(QuestAssets qA) { return 0; } /** {@inheritDoc} */ @Override - public final boolean isAvailableForPurchase() { - return super.isAvailableForPurchase() && AllZone.getQuestData().getInventory().hasItem("Map"); + public final boolean isAvailableForPurchase(QuestAssets qA) { + return super.isAvailableForPurchase(qA) && qA.getInventory().hasItem("Map"); } /** diff --git a/src/main/java/forge/quest/data/pet/QuestPetAbstract.java b/src/main/java/forge/quest/data/pet/QuestPetAbstract.java index 903c2697a9f..4aeccb7d623 100644 --- a/src/main/java/forge/quest/data/pet/QuestPetAbstract.java +++ b/src/main/java/forge/quest/data/pet/QuestPetAbstract.java @@ -19,10 +19,10 @@ package forge.quest.data.pet; import javax.swing.ImageIcon; -import forge.AllZone; import forge.Card; +import forge.quest.data.QuestAssets; import forge.quest.data.bazaar.QuestStallManager; -import forge.quest.data.bazaar.QuestStallPurchasable; +import forge.quest.data.bazaar.IQuestStallPurchasable; /** *

@@ -32,7 +32,7 @@ import forge.quest.data.bazaar.QuestStallPurchasable; * @author Forge * @version $Id$ */ -public abstract class QuestPetAbstract implements QuestStallPurchasable { +public abstract class QuestPetAbstract implements IQuestStallPurchasable { /** The level. */ private int level; @@ -67,13 +67,13 @@ public abstract class QuestPetAbstract implements QuestStallPurchasable { * @return a int. */ @Override - public final int getBuyingPrice() { + public final int getBuyingPrice(QuestAssets qA) { return this.getAllUpgradePrices()[this.level]; } /** {@inheritDoc} */ @Override - public final int getSellingPrice() { + public final int getSellingPrice(QuestAssets qA) { return 0; } @@ -293,8 +293,8 @@ public abstract class QuestPetAbstract implements QuestStallPurchasable { * @return a boolean. */ @Override - public boolean isAvailableForPurchase() { - final QuestPetAbstract pet = AllZone.getQuestData().getPetManager().getPet(this.name); + public boolean isAvailableForPurchase(QuestAssets qA) { + final QuestPetAbstract pet = qA.getPetManager().getPet(this.name); if (pet == null) { return true; } @@ -307,7 +307,7 @@ public abstract class QuestPetAbstract implements QuestStallPurchasable { *

*/ @Override - public void onPurchase() { - AllZone.getQuestData().getPetManager().addPetLevel(this.name); + public void onPurchase(QuestAssets qA) { + qA.getPetManager().addPetLevel(this.name); } } diff --git a/src/main/java/forge/quest/data/pet/QuestPetPlant.java b/src/main/java/forge/quest/data/pet/QuestPetPlant.java index 8ba301e435f..4e147ba142a 100644 --- a/src/main/java/forge/quest/data/pet/QuestPetPlant.java +++ b/src/main/java/forge/quest/data/pet/QuestPetPlant.java @@ -30,6 +30,7 @@ import forge.card.spellability.AbilityActivated; import forge.card.spellability.SpellAbility; import forge.properties.ForgeProps; import forge.properties.NewConstants; +import forge.quest.data.QuestAssets; import forge.quest.data.bazaar.QuestStallManager; /** @@ -173,14 +174,14 @@ public class QuestPetPlant extends QuestPetAbstract { /** {@inheritDoc} */ @Override - public final void onPurchase() { - AllZone.getQuestData().getPetManager().addPlantLevel(); + public final void onPurchase(QuestAssets qA) { + qA.getPetManager().addPlantLevel(); } /** {@inheritDoc} */ @Override - public final boolean isAvailableForPurchase() { - final QuestPetPlant plant = (QuestPetPlant) AllZone.getQuestData().getPetManager().getPlant(); + public final boolean isAvailableForPurchase(QuestAssets qA) { + final QuestPetPlant plant = (QuestPetPlant) qA.getPetManager().getPlant(); return (plant == null) || (plant.getLevel() < plant.getMaxLevel()); } diff --git a/src/main/java/forge/view/ViewHomeUI.java b/src/main/java/forge/view/ViewHomeUI.java index 0d459d1e366..24f073fac56 100644 --- a/src/main/java/forge/view/ViewHomeUI.java +++ b/src/main/java/forge/view/ViewHomeUI.java @@ -106,7 +106,7 @@ public enum ViewHomeUI { final File data = new File(dirQuests.getPath() + File.separator + questname); if (data.exists()) { - AllZone.setQuestData(QuestDataIO.loadData(data)); + AllZone.getQuest().load(QuestDataIO.loadData(data)); } ////////////////////////////// diff --git a/src/main/java/forge/view/bazaar/ViewItem.java b/src/main/java/forge/view/bazaar/ViewItem.java index 4504328d5f6..36247efce6f 100644 --- a/src/main/java/forge/view/bazaar/ViewItem.java +++ b/src/main/java/forge/view/bazaar/ViewItem.java @@ -12,14 +12,15 @@ import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FPanel; import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FTextArea; -import forge.quest.data.bazaar.QuestStallPurchasable; +import forge.quest.data.QuestAssets; +import forge.quest.data.bazaar.IQuestStallPurchasable; /** An update-able panel instance representing a single item. */ @SuppressWarnings("serial") public class ViewItem extends FPanel { private final FLabel lblIcon, lblName, lblPrice, btnPurchase; private final FTextArea tarDesc; - private QuestStallPurchasable item; + private IQuestStallPurchasable item; /** An update-able panel instance representing a single item. */ public ViewItem() { @@ -45,22 +46,23 @@ public class ViewItem extends FPanel { btnPurchase.setCommand(new Command() { @Override public void execute() { - AllZone.getQuestData().subtractCredits(getItem().getBuyingPrice()); - AllZone.getQuestData().addCredits(getItem().getSellingPrice()); - getItem().onPurchase(); - AllZone.getQuestData().saveData(); + QuestAssets qA = AllZone.getQuest().getAssets(); + qA.subtractCredits(getItem().getBuyingPrice(qA)); + qA.addCredits(getItem().getSellingPrice(qA)); + getItem().onPurchase(qA); + AllZone.getQuest().save(); Singletons.getView().getViewBazaar().refreshLastInstance(); } }); } - /** @param i0   {@link forge.quest.data.bazaar.QuestStallPurchasable} */ - public void setItem(QuestStallPurchasable i0) { + /** @param i0   {@link forge.quest.data.bazaar.IQuestStallPurchasable} */ + public void setItem(IQuestStallPurchasable i0) { this.item = i0; } - /** @return {@link forge.quest.data.bazaar.QuestStallPurchasable} */ - public QuestStallPurchasable getItem() { + /** @return {@link forge.quest.data.bazaar.IQuestStallPurchasable} */ + public IQuestStallPurchasable getItem() { return this.item; } @@ -69,12 +71,13 @@ public class ViewItem extends FPanel { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { + QuestAssets qA = AllZone.getQuest().getAssets(); lblIcon.setIcon(getItem().getIcon()); lblName.setText(getItem().getPurchaseName()); - lblPrice.setText("Cost: " + String.valueOf(getItem().getBuyingPrice()) + " credits"); + lblPrice.setText("Cost: " + String.valueOf(getItem().getBuyingPrice(qA)) + " credits"); tarDesc.setText(getItem().getPurchaseDescription()); - if (AllZone.getQuestData().getCredits() < getItem().getBuyingPrice()) { + if (qA.getCredits() < getItem().getBuyingPrice(qA)) { btnPurchase.setEnabled(false); } diff --git a/src/main/java/forge/view/bazaar/ViewStall.java b/src/main/java/forge/view/bazaar/ViewStall.java index 658a696f7cd..6a6534862cd 100644 --- a/src/main/java/forge/view/bazaar/ViewStall.java +++ b/src/main/java/forge/view/bazaar/ViewStall.java @@ -35,9 +35,10 @@ import forge.control.bazaar.ControlStall; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FScrollPane; import forge.gui.toolbox.FSkin; +import forge.quest.data.QuestAssets; import forge.quest.data.bazaar.QuestStallDefinition; import forge.quest.data.bazaar.QuestStallManager; -import forge.quest.data.bazaar.QuestStallPurchasable; +import forge.quest.data.bazaar.IQuestStallPurchasable; import forge.view.ViewBazaarUI; /** @@ -143,13 +144,13 @@ public class ViewStall extends JPanel { * and creates new panels if necessary. */ public void updateStall() { - if (AllZone.getQuestData() == null) { return; } + if (AllZone.getQuest().getAssets() == null) { return; } + QuestAssets qS = AllZone.getQuest().getAssets(); this.lblStats.setText( - "Credits: " + AllZone.getQuestData().getCredits() - + " Life: " + AllZone.getQuestData().getLife()); + "Credits: " + qS.getCredits() + " Life: " + qS.getLife()); - final List items = + final List items = QuestStallManager.getItems(stall.getName()); lblStallName.setText(stall.getDisplayName()); diff --git a/src/main/java/forge/view/match/QuestWinLoseHandler.java b/src/main/java/forge/view/match/QuestWinLoseHandler.java index 6ca42471091..2302728a94a 100644 --- a/src/main/java/forge/view/match/QuestWinLoseHandler.java +++ b/src/main/java/forge/view/match/QuestWinLoseHandler.java @@ -51,9 +51,11 @@ import forge.gui.toolbox.FSkin; import forge.item.CardPrinted; import forge.model.FMatchState; import forge.properties.ForgePreferences.FPref; +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.QuestMode; import forge.quest.data.QuestPreferences.QPref; import forge.quest.data.QuestUtil; import forge.util.MyRandom; @@ -81,7 +83,7 @@ public class QuestWinLoseHandler extends ControlWinLose { private static final String CONSTRAINTS_CARDS = "w 95%!, h 330px!, gap 0 0 0 20px"; private final transient FMatchState matchState; - private final transient QuestData qData; + private final transient QuestController qData; private final transient QuestEvent qEvent; /** @@ -93,7 +95,7 @@ public class QuestWinLoseHandler extends ControlWinLose { super(view0); this.view = view0; matchState = Singletons.getModel().getMatchState(); - qData = AllZone.getQuestData(); + qData = AllZone.getQuest(); qEvent = qData.getCurrentEvent(); this.wonMatch = matchState.isMatchWonBy(AllZone.getHumanPlayer().getName()); this.isAnte = Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_ANTE); @@ -112,26 +114,27 @@ public class QuestWinLoseHandler extends ControlWinLose { OverlayUtils.hideOverlay(); Singletons.getModel().getQuestPreferences().save(); - if (Constant.Quest.FANTASY_QUEST[0]) { + QuestAssets qa = qData.getAssets(); + if (qData.getMode() == QuestMode.Fantasy) { int extraLife = 0; if (qEvent.getEventType().equals("challenge")) { - if (qData.getInventory().hasItem("Zeppelin")) { + if (qa.getInventory().hasItem("Zeppelin")) { extraLife = 3; } } - final CardList humanList = QuestUtil.getHumanStartingCards(qData, qEvent); - final CardList computerList = QuestUtil.getComputerStartingCards(qData, qEvent); + final CardList humanList = QuestUtil.getHumanStartingCards(qa, qEvent); + final CardList computerList = QuestUtil.getComputerStartingCards(qEvent); - final int humanLife = qData.getLife() + extraLife; + final int humanLife = qa.getLife() + extraLife; int computerLife = 20; if (qEvent.getEventType().equals("challenge")) { computerLife = ((QuestChallenge) qEvent).getAILife(); } GameNew.newGame(Constant.Runtime.HUMAN_DECK[0], Constant.Runtime.COMPUTER_DECK[0], - humanList, computerList, humanLife, computerLife); + humanList, computerList, humanLife, computerLife, qEvent.getIconFilename()); } else { super.startNextRound(); } @@ -165,7 +168,7 @@ public class QuestWinLoseHandler extends ControlWinLose { final List antesPrinted = Singletons.getModel().getMatchState().addAnteLost(antes); for (final CardPrinted ante : antesPrinted) { //the last param here (should) determine if this is added to the Card Shop - AllZone.getQuestData().getCards().sellCard(ante, 0, false); + AllZone.getQuest().getCards().sellCard(ante, 0, false); } this.anteLost(antesPrinted); } @@ -199,12 +202,12 @@ public class QuestWinLoseHandler extends ControlWinLose { } // Random rare for winning against a very hard deck - if (qData.getDifficultyIndex() == 4) { + if (qData.getAchievements().getDifficulty() == 4) { this.awardRandomRare("You've won a random rare for winning against a very hard deck."); } // Award jackpot every 80 games won (currently 10 rares) - final int wins = qData.getWin(); + final int wins = qData.getAchievements().getWin(); if ((wins > 0) && ((wins % 80) == 0)) { this.awardJackpot(); } @@ -216,8 +219,8 @@ public class QuestWinLoseHandler extends ControlWinLose { // Win or lose, still a chance to win a booster, frequency set in // preferences - final int outcome = this.wonMatch ? qData.getWin() : qData.getLost(); - if ((outcome % Singletons.getModel().getQuestPreferences().getPreferenceInt(QPref.WINS_BOOSTER, qData.getDifficultyIndex())) == 0) { + final int outcome = this.wonMatch ? qData.getAchievements().getWin() : qData.getAchievements().getLost(); + if ((outcome % Singletons.getModel().getQuestPreferences().getPreferenceInt(QPref.WINS_BOOSTER, qData.getAchievements().getDifficulty())) == 0) { this.awardBooster(); } @@ -276,10 +279,10 @@ public class QuestWinLoseHandler extends ControlWinLose { // Record win/loss in quest data if (this.wonMatch) { - qData.addWin(); + qData.getAchievements().addWin(); } else { - qData.addLost(); - qData.subtractCredits(x); + qData.getAchievements().addLost(); + qData.getAssets().subtractCredits(x); } qData.getCards().clearShopList(); @@ -293,7 +296,7 @@ public class QuestWinLoseHandler extends ControlWinLose { CSubmenuChallenges.SINGLETON_INSTANCE.update(); qData.setCurrentEvent(null); - qData.saveData(); + qData.save(); Singletons.getModel().getQuestPreferences().save(); Singletons.getModel().savePrefs(); @@ -338,7 +341,7 @@ public class QuestWinLoseHandler extends ControlWinLose { credBase += (int) ((base * multiplier) + (Double.parseDouble(Singletons.getModel().getQuestPreferences().getPreference(QPref.REWARDS_WINS_MULTIPLIER)) - * qData.getWin())); + * qData.getAchievements().getWin())); sb.append(diff + " opponent: " + credBase + " credits.
"); // Gameplay bonuses (for each game win) @@ -421,7 +424,7 @@ public class QuestWinLoseHandler extends ControlWinLose { // Estates bonus credTotal = credBase + credGameplay + credUndefeated; double estateValue = 0; - switch (qData.getInventory().getItemLevel("Estates")) { + switch (qData.getAssets().getInventory().getItemLevel("Estates")) { case 1: estateValue = .1; break; @@ -459,7 +462,7 @@ public class QuestWinLoseHandler extends ControlWinLose { sb.append(String.format("%s %d credits in total.", congrats, credTotal)); sb.append(""); - qData.addCredits(credTotal); + qData.getAssets().addCredits(credTotal); // Generate Swing components and attach. this.icoTemp = GuiUtils.getResizedIcon(FSkin.getIcon(FSkin.QuestIcons.ICO_GOLD), 0.5); @@ -560,12 +563,12 @@ public class QuestWinLoseHandler extends ControlWinLose { */ private void awardChallengeWin() { if (!((QuestChallenge) qEvent).getRepeatable()) { - qData.addCompletedChallenge(((QuestChallenge) qEvent).getId()); + qData.getAchievements().addCompletedChallenge(((QuestChallenge) qEvent).getId()); } // Note: challenge only registers as "played" if it's won. // This doesn't seem right, but it's easy to fix. Doublestrike 01-10-11 - qData.addChallengesPlayed(); + qData.getAchievements().addChallengesPlayed(); final List cardsWon = ((QuestChallenge) qEvent).getCardRewardList(); final long questRewardCredits = ((QuestChallenge) qEvent).getCreditsReward(); @@ -574,7 +577,7 @@ public class QuestWinLoseHandler extends ControlWinLose { sb.append("Challenge completed.

"); sb.append("Challenge bounty: " + questRewardCredits + " credits."); - qData.addCredits(questRewardCredits); + qData.getAssets().addCredits(questRewardCredits); // Generate Swing components and attach. this.icoTemp = GuiUtils.getResizedIcon(FSkin.getIcon(FSkin.QuestIcons.ICO_BOX), 0.5); @@ -624,7 +627,7 @@ public class QuestWinLoseHandler extends ControlWinLose { * @return boolean */ private boolean getLuckyCoinResult() { - final boolean hasCoin = qData.getInventory().getItemLevel("Lucky Coin") >= 1; + final boolean hasCoin = qData.getAssets().getInventory().getItemLevel("Lucky Coin") >= 1; return MyRandom.getRandom().nextFloat() <= (hasCoin ? 0.65f : 0.5f); }