* InputMulligan class.
@@ -104,7 +105,7 @@ public class InputMulligan extends Input {
final int newHand = this.doMulligan(humanPlayer, humanRating);
final QuestController quest = AllZone.getQuest();
- if (quest.isLoaded() && quest.getAssets().getInventory().hasItem("Sleight") && (humanRating.getMulliganCount() == 1)) {
+ if (quest.isLoaded() && quest.getAssets().hasItem(QuestItemType.SLEIGHT) && (humanRating.getMulliganCount() == 1)) {
AllZone.getHumanPlayer().drawCard();
humanRating.notifyOpeningHandSize(newHand + 1);
}
diff --git a/src/main/java/forge/gui/home/quest/SubmenuQuestUtil.java b/src/main/java/forge/gui/home/quest/SubmenuQuestUtil.java
index e023aa28e21..bd0e7c0df77 100644
--- a/src/main/java/forge/gui/home/quest/SubmenuQuestUtil.java
+++ b/src/main/java/forge/gui/home/quest/SubmenuQuestUtil.java
@@ -32,7 +32,7 @@ import forge.quest.data.QuestAchievements;
import forge.quest.data.QuestAssets;
import forge.quest.data.QuestMode;
import forge.quest.data.QuestPreferences.QPref;
-import forge.quest.data.item.QuestItemZeppelin;
+import forge.quest.data.item.QuestItemType;
import forge.quest.data.pet.QuestPetAbstract;
/**
@@ -54,9 +54,9 @@ public class SubmenuQuestUtil {
final int challengesPlayed = qData.getAchievements().getChallengesPlayed();
int mul = 5;
- if (qData.getAssets().getInventory().hasItem("Zeppelin")) {
+ if (qData.getAssets().hasItem(QuestItemType.ZEPPELIN)) {
mul = 3;
- } else if (qData.getAssets().getInventory().hasItem("Map")) {
+ } else if (qData.getAssets().hasItem(QuestItemType.MAP)) {
mul = 4;
}
@@ -88,7 +88,7 @@ public class SubmenuQuestUtil {
// Stats panel
view.getLblCredits().setText("Credits: " + qS.getCredits());
- view.getLblLife().setText("Life: " + qS.getLife());
+ view.getLblLife().setText("Life: " + qS.getLife(qData.getMode()));
view.getLblWins().setText("Wins: " + qA.getWin());
view.getLblLosses().setText("Losses: " + qA.getLost());
view.updateCurrentDeckStatus();
@@ -133,15 +133,7 @@ public class SubmenuQuestUtil {
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) qS.getInventory().getItem("Zeppelin");
- view.getCbZep().setVisible(zeppelin.isAvailableForPurchase(qS) ? true : false);
- }
- else {
- view.getCbZep().setVisible(false);
- }
+ view.getCbZep().setVisible(qS.hasItem(QuestItemType.ZEPPELIN));
}
else {
// Classic mode display changes
@@ -226,13 +218,12 @@ public class SubmenuQuestUtil {
int extraLife = 0;
// If zeppelin has been purchased, gear will be at level 2.
- if (event.getEventType().equalsIgnoreCase("challenge")
- && !qData.getAssets().getInventory().getItem("Zeppelin").isAvailableForPurchase(qData.getAssets())
+ if ( qData.getAssets().hasItem(QuestItemType.ZEPPELIN)
&& VSubmenuChallenges.SINGLETON_INSTANCE.getCbZep().isSelected()) {
extraLife = 3;
}
lifeAI = ((QuestChallenge) event).getAILife();
- lifeHuman = qData.getAssets().getLife() + extraLife;
+ lifeHuman = qData.getAssets().getLife(qData.getMode()) + extraLife;
}
GameNew.newGame(
diff --git a/src/main/java/forge/gui/toolbox/FSkin.java b/src/main/java/forge/gui/toolbox/FSkin.java
index e423bc371b0..906f7704799 100644
--- a/src/main/java/forge/gui/toolbox/FSkin.java
+++ b/src/main/java/forge/gui/toolbox/FSkin.java
@@ -227,7 +227,7 @@ public enum FSkin {
ICO_ZEP (new int[] {0, 480, 80, 80}), /** */
ICO_GEAR (new int[] {80, 480, 80, 80}), /** */
ICO_GOLD (new int[] {160, 480, 80, 80}), /** */
- ICO_ELIXER (new int[] {240, 480, 80, 80}), /** */
+ ICO_ELIXIR (new int[] {240, 480, 80, 80}), /** */
ICO_BOOK (new int[] {320, 480, 80, 80}), /** */
ICO_BOTTLES (new int[] {400, 480, 80, 80}), /** */
ICO_BOX (new int[] {480, 480, 80, 80}), /** */
diff --git a/src/main/java/forge/quest/QuestStallManager.java b/src/main/java/forge/quest/QuestStallManager.java
index be93ffe4590..4a154e0c7d5 100644
--- a/src/main/java/forge/quest/QuestStallManager.java
+++ b/src/main/java/forge/quest/QuestStallManager.java
@@ -34,6 +34,7 @@ import javax.xml.parsers.ParserConfigurationException;
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.SAXException;
@@ -41,12 +42,13 @@ import org.xml.sax.SAXException;
import com.thoughtworks.xstream.XStream;
import forge.AllZone;
-import forge.gui.toolbox.FSkin.QuestIcons;
import forge.quest.data.QuestAssets;
import forge.quest.data.QuestStallDefinition;
import forge.quest.data.item.IQuestStallPurchasable;
-import forge.quest.data.item.QuestItemAbstract;
+import forge.quest.data.item.QuestItemPassive;
+import forge.quest.data.item.QuestItemType;
import forge.quest.data.pet.QuestPetAbstract;
+import forge.util.IgnoringXStream;
import forge.util.XmlUtil;
/**
@@ -61,7 +63,6 @@ public class QuestStallManager {
private final File xmlFile;
public QuestStallManager(File xmlFile0) {
-
xmlFile = xmlFile0;
}
@@ -71,10 +72,10 @@ public class QuestStallManager {
builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
final Document document = builder.parse(xmlFile);
- NodeList xmlStalls = document.getElementsByTagName("stalls").item(0).getChildNodes();
-
- XStream xs = new XStream();
+ XStream xs = new IgnoringXStream();
xs.autodetectAnnotations(true);
+
+ NodeList xmlStalls = document.getElementsByTagName("stalls").item(0).getChildNodes();
for (int iN = 0; iN < xmlStalls.getLength(); iN++) {
Node n = xmlStalls.item(iN);
if (n.getNodeType() != Node.ELEMENT_NODE) { continue; }
@@ -86,6 +87,22 @@ public class QuestStallManager {
stalls.put(stall.getName(), stall);
}
+ NodeList xmlQuestItems = document.getElementsByTagName("questItems").item(0).getChildNodes();
+ for (int iN = 0; iN < xmlQuestItems.getLength(); iN++) {
+ Node n = xmlQuestItems.item(iN);
+ if (n.getNodeType() != Node.ELEMENT_NODE) { continue; }
+
+ NamedNodeMap attrs = n.getAttributes();
+ String sType = attrs.getNamedItem("itemType").getTextContent();
+ String name = attrs.getNamedItem("name").getTextContent();
+ QuestItemType qType = QuestItemType.smartValueOf(sType);
+ Attr att = document.createAttribute("resolves-to");
+ att.setValue(qType.getBazaarControllerClass().getCanonicalName());
+ attrs.setNamedItem(att);
+ QuestItemPassive ctrl = (QuestItemPassive) xs.fromXML(XmlUtil.nodeToString(n));
+ items.put(name, ctrl);
+ }
+
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
@@ -98,7 +115,8 @@ public class QuestStallManager {
/** Constant stalls. */
private final Map stalls = new TreeMap();
/** Constant items. */
- private final Map> items = new TreeMap>(String.CASE_INSENSITIVE_ORDER);
+ private final Map> itemsOnStalls = new TreeMap>(String.CASE_INSENSITIVE_ORDER);
+ private final Map items = new TreeMap();
/**
*
@@ -125,11 +143,10 @@ public class QuestStallManager {
final Map itemSet = new HashMap();
final QuestAssets qA = AllZone.getQuest().getAssets();
-
- for (QuestItemAbstract i : qA.getInventory().getItems()) { itemSet.put(i.getName(), i); }
for (QuestPetAbstract i : qA.getPetManager().getPetsAndPlants()) { itemSet.put(i.getName(), i); }
+ itemSet.putAll(items);
- items.clear();
+ itemsOnStalls.clear();
for (QuestStallDefinition thisStall : stalls.values()) {
TreeSet set = new TreeSet();
@@ -138,7 +155,7 @@ public class QuestStallManager {
IQuestStallPurchasable item = itemSet.get(itemName);
set.add(item);
}
- items.put(thisStall.getName(), set);
+ itemsOnStalls.put(thisStall.getName(), set);
}
}
@@ -154,7 +171,7 @@ public class QuestStallManager {
final List ret = new ArrayList();
QuestAssets qA = AllZone.getQuest().getAssets();
- for (final IQuestStallPurchasable purchasable : items.get(stallName)) {
+ for (final IQuestStallPurchasable purchasable : itemsOnStalls.get(stallName)) {
if (purchasable.isAvailableForPurchase(qA)) {
ret.add(purchasable);
}
diff --git a/src/main/java/forge/quest/QuestUtilCards.java b/src/main/java/forge/quest/QuestUtilCards.java
index 0db3f17311f..c8d49bc6577 100644
--- a/src/main/java/forge/quest/QuestUtilCards.java
+++ b/src/main/java/forge/quest/QuestUtilCards.java
@@ -27,6 +27,7 @@ import forge.quest.data.QuestAssets;
import forge.quest.data.QuestMode;
import forge.quest.data.QuestPreferences;
import forge.quest.data.QuestPreferences.QPref;
+import forge.quest.data.item.QuestItemType;
import forge.util.MyRandom;
import forge.util.Predicate;
import net.slightlymagic.braids.util.lambda.Lambda1;
@@ -285,7 +286,7 @@ public final class QuestUtilCards {
multi = 0.6;
}
- final int lvlEstates = this.qc.getMode() == QuestMode.Fantasy ? this.qa.getInventory().getItemLevel("Estates") : 0;
+ final int lvlEstates = this.qc.getMode() == QuestMode.Fantasy ? this.qa.getItemLevel(QuestItemType.ESTATES) : 0;
switch (lvlEstates) {
case 1:
multi += 0.01;
diff --git a/src/main/java/forge/quest/data/QuestAssets.java b/src/main/java/forge/quest/data/QuestAssets.java
index b202605ae52..c2178a46343 100644
--- a/src/main/java/forge/quest/data/QuestAssets.java
+++ b/src/main/java/forge/quest/data/QuestAssets.java
@@ -1,6 +1,8 @@
package forge.quest.data;
+import java.util.EnumMap;
import java.util.HashMap;
+import java.util.Map;
import forge.Singletons;
import forge.deck.Deck;
@@ -11,7 +13,7 @@ import forge.item.ItemPoolView;
import forge.quest.QuestDeckMap;
import forge.quest.QuestUtilCards;
import forge.quest.data.QuestPreferences.QPref;
-import forge.quest.data.item.QuestInventory;
+import forge.quest.data.item.QuestItemType;
import forge.quest.data.pet.QuestPetManager;
/**
@@ -27,10 +29,7 @@ public class QuestAssets {
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();
@@ -46,18 +45,42 @@ public class QuestAssets {
/** 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 Map inventoryItems = new EnumMap(QuestItemType.class);
+
+
+ public final boolean hasItem(final QuestItemType itemType) {
+ return this.inventoryItems.containsKey(itemType) && (this.inventoryItems.get(itemType).getLevel() > 0);
+ }
+
+
+ public final int getItemLevel(final QuestItemType itemType) {
+ final QuestItemCondition state = this.inventoryItems.get(itemType);
+ return state == null ? 0 : state.getLevel();
+ }
+
+ public final QuestItemCondition getItemCondition(final QuestItemType itemType) {
+ return this.inventoryItems.get(itemType);
+ }
+
+
+ public final void setItemLevel(final QuestItemType itemType, final int level) {
+ QuestItemCondition cond = this.inventoryItems.get(itemType);
+ if( null == cond ) {
+ try { // care to set appropriate state class here
+ cond = (QuestItemCondition) itemType.getModelClass().newInstance();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block ignores the exception, but sends it to System.err and probably forge.log.
+ e.printStackTrace();
+ cond = new QuestItemCondition();
+ }
+ this.inventoryItems.put(itemType, cond);
+ }
+ cond.setLevel(level);
+ }
+
+ public QuestAssets() {
final QuestPreferences prefs = Singletons.getModel().getQuestPreferences();
final ItemPoolView lands = QuestUtilCards.generateBasicLands(
prefs.getPreferenceInt(QPref.STARTING_BASIC_LANDS), prefs.getPreferenceInt(QPref.STARTING_SNOW_LANDS));
@@ -72,23 +95,16 @@ public class QuestAssets {
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;
+ public int getLife(QuestMode mode) {
+ int base = mode.equals(QuestMode.Fantasy) ? 15 : 20;
+ return base + getItemLevel(QuestItemType.ELIXIR_OF_LIFE) - getItemLevel(QuestItemType.POUND_FLESH);
}
/**
* Gets the new card list.
@@ -106,15 +122,7 @@ public class QuestAssets {
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.
*
diff --git a/src/main/java/forge/quest/data/QuestData.java b/src/main/java/forge/quest/data/QuestData.java
index 9f9e1635c68..4212b37f315 100644
--- a/src/main/java/forge/quest/data/QuestData.java
+++ b/src/main/java/forge/quest/data/QuestData.java
@@ -35,7 +35,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 = 3;
+ public static final int CURRENT_VERSION_NUMBER = 4;
// This field places the version number into QD instance,
// but only when the object is created through the constructor
@@ -66,7 +66,7 @@ public final class QuestData {
this.mode = mode2;
this.achievements = new QuestAchievements(diff);
- this.assets = new QuestAssets(mode2);
+ this.assets = new QuestAssets();
}
/**
diff --git a/src/main/java/forge/quest/data/QuestItemCondition.java b/src/main/java/forge/quest/data/QuestItemCondition.java
new file mode 100644
index 00000000000..41e8e10bc69
--- /dev/null
+++ b/src/main/java/forge/quest/data/QuestItemCondition.java
@@ -0,0 +1,21 @@
+package forge.quest.data;
+
+/**
+ * This class should store the quest items' properties that are to be serialized
+ *
+ */
+public class QuestItemCondition {
+ private int level;
+
+ /**
+ * TODO: Write javadoc for this method.
+ * @return
+ */
+ public int getLevel() {
+ return level;
+ }
+
+ public void setLevel(int level) {
+ this.level = level;
+ }
+}
diff --git a/src/main/java/forge/quest/data/QuestStallDefinition.java b/src/main/java/forge/quest/data/QuestStallDefinition.java
index 6a6202f8fe5..5037bf84947 100644
--- a/src/main/java/forge/quest/data/QuestStallDefinition.java
+++ b/src/main/java/forge/quest/data/QuestStallDefinition.java
@@ -24,7 +24,6 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import forge.gui.toolbox.FSkin.QuestIcons;
-import forge.gui.toolbox.FSkin.SkinProp;
/**
*
diff --git a/src/main/java/forge/quest/data/item/IQuestStallPurchasable.java b/src/main/java/forge/quest/data/item/IQuestStallPurchasable.java
index 663f8bd8f51..bdcb25497c4 100644
--- a/src/main/java/forge/quest/data/item/IQuestStallPurchasable.java
+++ b/src/main/java/forge/quest/data/item/IQuestStallPurchasable.java
@@ -44,7 +44,7 @@ public interface IQuestStallPurchasable extends Comparable