diff --git a/.gitattributes b/.gitattributes
index e20320cc21a..cd17846a0d3 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -13915,6 +13915,7 @@ src/main/java/forge/control/input/InputSelectManyPlayers.java -text
src/main/java/forge/control/input/package-info.java svneol=native#text/plain
src/main/java/forge/control/package-info.java -text
src/main/java/forge/deck/CardCollections.java -text
+src/main/java/forge/deck/CardPool.java -text
src/main/java/forge/deck/Deck.java svneol=native#text/plain
src/main/java/forge/deck/DeckBase.java -text
src/main/java/forge/deck/DeckFormat.java -text
diff --git a/src/main/java/forge/card/ability/effects/MillEffect.java b/src/main/java/forge/card/ability/effects/MillEffect.java
index a6deeb3b1f3..98a548dccb3 100644
--- a/src/main/java/forge/card/ability/effects/MillEffect.java
+++ b/src/main/java/forge/card/ability/effects/MillEffect.java
@@ -4,7 +4,6 @@ import java.util.List;
import forge.Card;
import forge.CardCharacteristicName;
-import forge.Singletons;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellEffect;
import forge.card.spellability.SpellAbility;
diff --git a/src/main/java/forge/deck/CardPool.java b/src/main/java/forge/deck/CardPool.java
new file mode 100644
index 00000000000..bdc6fee3f8e
--- /dev/null
+++ b/src/main/java/forge/deck/CardPool.java
@@ -0,0 +1,160 @@
+/*
+ * Forge: Play Magic: the Gathering.
+ * Copyright (C) 2011 Forge Team
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package forge.deck;
+
+import java.util.List;
+import java.util.Map.Entry;
+
+import forge.Card;
+
+import forge.item.CardDb;
+import forge.item.CardPrinted;
+import forge.item.ItemPool;
+
+/**
+ * Deck section.
+ *
+ */
+public class CardPool extends ItemPool {
+
+ /**
+ * Instantiates a new deck section.
+ */
+ public CardPool() {
+ super(CardPrinted.class);
+ }
+
+ /**
+ * Instantiates a new deck section.
+ *
+ * @param cards the cards
+ */
+ public CardPool(final Iterable> cards) {
+ this();
+ this.addAll(cards);
+ }
+
+ /**
+ * Sets the.
+ *
+ * @param cardNames
+ * the card names
+ */
+ public void set(final Iterable cardNames) {
+ this.clear();
+ for (final String name : cardNames) {
+ this.add(CardDb.instance().getCard(name));
+ }
+ }
+
+ /**
+ * Adds the.
+ *
+ * @param card
+ * the card
+ */
+ public void add(final Card card) {
+ this.add(CardDb.instance().getCard(card));
+ }
+
+ /**
+ * Adds the.
+ *
+ * @param cardName
+ * the card name
+ * @param setCode
+ * the set code
+ */
+ public void add(final String cardName, final String setCode) {
+ this.add(CardDb.instance().getCard(cardName, setCode));
+ }
+
+ /**
+ * Adds the.
+ *
+ * @param cardName the card name
+ * @param setCode the set code
+ * @param amount the amount
+ */
+ public void add(final String cardName, final String setCode, final int amount) {
+ this.add(CardDb.instance().getCard(cardName, setCode), amount);
+ }
+
+ /**
+ * Adds the.
+ *
+ * @param cardList
+ * the card list
+ */
+ public void add(final List cardList) {
+ for (final Card c : cardList) {
+ this.add(c);
+ }
+ }
+
+ /**
+ * Add all from a List of CardPrinted.
+ *
+ * @param list
+ * CardPrinteds to add
+ */
+ public void add(final Iterable list) {
+ for (CardPrinted cp : list) {
+ this.add(cp);
+ }
+ }
+
+ /**
+ * TODO: Write javadoc for this method.
+ *
+ * @param cardName the card name
+ */
+ public void add(final String cardName) {
+ this.add(CardDb.instance().getCard(cardName));
+ }
+
+ /**
+ * returns n-th card from this DeckSection. LINEAR time. No fixed order between changes
+ * @param i
+ * @return
+ */
+ public CardPrinted get(int n) {
+ for(Entry e : this)
+ {
+ n -= e.getValue();
+ if ( n <= 0 ) return e.getKey();
+ }
+ return null;
+ }
+
+ @Override
+ public String toString() {
+ if (this.isEmpty()) return "[]";
+
+ boolean isFirst = true;
+ StringBuilder sb = new StringBuilder();
+ sb.append('[');
+ for (Entry e : this) {
+ if ( isFirst ) isFirst = false;
+ else sb.append(", ");
+
+ sb.append(e.getValue()).append(" x ").append(e.getKey().getName());
+ }
+ return sb.append(']').toString();
+ }
+}
diff --git a/src/main/java/forge/deck/Deck.java b/src/main/java/forge/deck/Deck.java
index 0f723449820..56972557740 100644
--- a/src/main/java/forge/deck/Deck.java
+++ b/src/main/java/forge/deck/Deck.java
@@ -20,6 +20,7 @@ package forge.deck;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.EnumMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -34,7 +35,6 @@ import com.google.common.base.Function;
import forge.deck.io.DeckFileHeader;
import forge.deck.io.DeckSerializer;
import forge.gui.deckeditor.tables.TableSorter;
-import forge.item.CardDb;
import forge.item.CardPrinted;
import forge.item.ItemPoolView;
import forge.util.FileSection;
@@ -53,16 +53,13 @@ import forge.util.FileUtil;
* @author Forge
* @version $Id$
*/
-public class Deck extends DeckBase {
+public class Deck extends DeckBase implements Iterable> {
/**
*
*/
private static final long serialVersionUID = -7478025567887481994L;
- private final DeckSection main;
- private final DeckSection sideboard; // commander, planes or schemes are also stored here
- private CardPrinted avatar;
- private CardPrinted commander;
+ private final Map parts = new EnumMap(DeckSection.class);
// gameType is from Constant.GameType, like GameType.Regular
/**
@@ -81,18 +78,10 @@ public class Deck extends DeckBase {
*/
public Deck(final String name0) {
super(name0);
- this.main = new DeckSection();
- this.sideboard = new DeckSection();
- this.avatar = null;
+ getOrCreate(DeckSection.Main);
}
- /**
- *
- * hashCode.
- *
- *
- * @return a int.
- */
+
@Override
public int hashCode() {
return this.getName().hashCode();
@@ -104,13 +93,28 @@ public class Deck extends DeckBase {
return this.getName();
}
- public DeckSection getMain() {
- return this.main;
+ public CardPool getMain() {
+ return this.parts.get(DeckSection.Main);
}
- // variants' extra deck sections used instead of sideboard (planes, commander, schemes) are here as well as usual sideboards
- public DeckSection getSideboard() {
- return this.sideboard;
+ // may return nulls
+ public CardPool get(DeckSection deckSection) {
+ return this.parts.get(deckSection);
+ }
+
+ public boolean has(DeckSection deckSection) {
+ final CardPool cp = get(deckSection);
+ return cp != null && !cp.isEmpty();
+ }
+
+ // will return new if it was absent
+ public CardPool getOrCreate(DeckSection deckSection) {
+ CardPool p = get(deckSection);
+ if ( p != null )
+ return p;
+ p = new CardPool();
+ this.parts.put(deckSection, p);
+ return p;
}
/*
@@ -120,7 +124,7 @@ public class Deck extends DeckBase {
*/
@Override
public ItemPoolView getCardPool() {
- return this.main;
+ return this.parts.get(DeckSection.Main);
}
/* (non-Javadoc)
@@ -130,10 +134,11 @@ public class Deck extends DeckBase {
protected void cloneFieldsTo(final DeckBase clone) {
super.cloneFieldsTo(clone);
final Deck result = (Deck) clone;
- result.main.addAll(this.main);
- result.sideboard.addAll(this.sideboard);
- result.avatar = this.avatar;
- result.commander = this.commander;
+ for(Entry kv : parts.entrySet()) {
+ CardPool cp = new CardPool();
+ result.parts.put(kv.getKey(), cp);
+ cp.addAll(kv.getValue());
+ }
}
/*
@@ -186,20 +191,23 @@ public class Deck extends DeckBase {
final Deck d = new Deck(dh.getName());
d.setComment(dh.getComment());
- d.getMain().set(Deck.readCardList(sections.get("main")));
- d.getSideboard().set(Deck.readCardList(sections.get("sideboard")));
- // try also earlier deck formats
- if ( d.getSideboard().isEmpty() ) { d.getSideboard().set(Deck.readCardList(sections.get("schemes"))); }
- if ( d.getSideboard().isEmpty() ) { d.getSideboard().set(Deck.readCardList(sections.get("planes"))); }
-
- List av = Deck.readCardList(sections.get("avatar"));
- String avName = av.isEmpty() ? null : av.get(0);
- d.avatar = CardDb.instance().isCardSupported(avName) ? CardDb.instance().getCard(avName) : null;
+ for(Entry> s : sections.entrySet()) {
+ DeckSection sec = DeckSection.smartValueOf(s.getKey());
+ if ( null == sec )
+ continue;
+
+ CardPool pool = new CardPool();
+ pool.set(Deck.readCardList(s.getValue()));
- List cmd = Deck.readCardList(sections.get("commander"));
- String cmdName = cmd.isEmpty() ? null : cmd.get(0);
- d.commander = CardDb.instance().isCardSupported(cmdName) ? CardDb.instance().getCard(cmdName) : null;
+ // I used to store planes and schemes under sideboard header, so this will assign them to a correct section
+ CardPrinted sample = pool.get(0);
+ if ( sample != null && ( sample.getCard().getType().isPlane() || sample.getCard().getType().isPhenomenon() ) )
+ sec = DeckSection.Planes;
+ if ( sample != null && sample.getCard().getType().isScheme() )
+ sec = DeckSection.Schemes;
+ d.parts.put(sec, pool);
+ }
return d;
}
@@ -270,38 +278,13 @@ public class Deck extends DeckBase {
out.add(String.format("%s=%s", DeckFileHeader.COMMENT, this.getComment().replaceAll("\n", "")));
}
- out.add(String.format("%s", "[main]"));
- out.addAll(Deck.writeCardPool(this.getMain()));
-
- out.add("[sideboard]");
- out.addAll(Deck.writeCardPool(this.getSideboard()));
-
- if (getAvatar() != null) {
- out.add("[avatar]");
- out.add(Deck.serializeSingleCard(getAvatar(), 1));
- }
-
- if (getCommander() != null) {
- out.add("[commander]");
- out.add(Deck.serializeSingleCard(getCommander(), 1));
+ for(Entry s : parts.entrySet()) {
+ out.add(String.format("[%s]", s.getKey().toString()));
+ out.addAll(Deck.writeCardPool(s.getValue()));
}
return out;
}
- /**
- * @return the commander
- */
- public CardPrinted getCommander() {
- return commander;
- }
-
-
- /**
- * @return the avatar
- */
- public CardPrinted getAvatar() {
- return avatar;
- }
public static final Function FN_NAME_SELECTOR = new Function() {
@Override
@@ -309,4 +292,12 @@ public class Deck extends DeckBase {
return arg1.getName();
}
};
+
+ /* (non-Javadoc)
+ * @see java.lang.Iterable#iterator()
+ */
+ @Override
+ public Iterator> iterator() {
+ return parts.entrySet().iterator();
+ }
}
diff --git a/src/main/java/forge/deck/DeckFormat.java b/src/main/java/forge/deck/DeckFormat.java
index 7d43e271905..f570e606020 100644
--- a/src/main/java/forge/deck/DeckFormat.java
+++ b/src/main/java/forge/deck/DeckFormat.java
@@ -132,28 +132,31 @@ public enum DeckFormat {
switch(this) {
case Commander: //Must contain exactly 1 legendary Commander and a sideboard of 10 or zero cards.
- //TODO:Enforce color identity
- if (null == deck.getCommander()) {
+ final CardPool cmd = deck.get(DeckSection.Commander);
+ if (null == cmd || cmd.isEmpty()) {
return "is missing a commander";
}
- if (!deck.getCommander().getCard().getType().isLegendary()) {
+ if (!cmd.get(0).getCard().getType().isLegendary()) {
return "has a commander that is not a legendary creature";
}
+ //TODO:Enforce color identity
+
break;
case Planechase: //Must contain at least 10 planes/phenomenons, but max 2 phenomenons. Singleton.
- if (deck.getSideboard().countAll() < 10) {
+ final CardPool planes = deck.get(DeckSection.Planes);
+ if (planes == null || planes.countAll() < 10) {
return "should gave at least 10 planes";
}
int phenoms = 0;
- for (Entry cp : deck.getSideboard()) {
+ for (Entry cp : planes) {
if (cp.getKey().getCard().getType().typeContains(CardCoreType.Phenomenon)) {
phenoms++;
}
if (cp.getValue() > 1) {
- return "must not contain multiple copies of any Phenomena";
+ return "must not contain multiple copies of any Plane or Phenomena";
}
}
@@ -163,13 +166,14 @@ public enum DeckFormat {
break;
case Archenemy: //Must contain at least 20 schemes, max 2 of each.
- if (deck.getSideboard().countAll() < 20) {
+ final CardPool schemes = deck.get(DeckSection.Schemes);
+ if (schemes == null || schemes.countAll() < 20) {
return "must contain at least 20 schemes";
}
- for (Entry cp : deck.getSideboard()) {
+ for (Entry cp : schemes) {
if (cp.getValue() > 2) {
- return "must not contain more than 2 copies of any Scheme";
+ return String.format("must not contain more than 2 copies of any Scheme, but has %d of '%s'", cp.getValue(), cp.getKey().getName());
}
}
break;
@@ -181,11 +185,11 @@ public enum DeckFormat {
//shared among the main deck and sideboard, except
//basic lands and Relentless Rats
- DeckSection tmp = new DeckSection(deck.getMain());
- tmp.addAll(deck.getSideboard());
- if (null != deck.getCommander() && this == Commander) {
- tmp.add(deck.getCommander());
- }
+ CardPool tmp = new CardPool(deck.getMain());
+ if ( deck.has(DeckSection.Sideboard))
+ tmp.addAll(deck.get(DeckSection.Sideboard));
+ if ( deck.has(DeckSection.Commander) && this == Commander)
+ tmp.addAll(deck.get(DeckSection.Commander));
List limitExceptions = Arrays.asList("Relentless Rats");
@@ -202,7 +206,7 @@ public enum DeckFormat {
}
// The sideboard must contain either 0 or 15 cards
- int sideboardSize = deck.getSideboard().countAll();
+ int sideboardSize = deck.has(DeckSection.Sideboard) ? deck.get(DeckSection.Sideboard).countAll() : 0;
IntRange sbRange = getSideRange();
if (sbRange != null && sideboardSize > 0 && !sbRange.containsInteger(sideboardSize)) {
return sbRange.getMinimumInteger() == sbRange.getMaximumInteger()
diff --git a/src/main/java/forge/deck/DeckSection.java b/src/main/java/forge/deck/DeckSection.java
index 73b46ac2f1d..b0716ab6647 100644
--- a/src/main/java/forge/deck/DeckSection.java
+++ b/src/main/java/forge/deck/DeckSection.java
@@ -1,160 +1,35 @@
-/*
- * Forge: Play Magic: the Gathering.
- * Copyright (C) 2011 Forge Team
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
package forge.deck;
-import java.util.List;
-import java.util.Map.Entry;
-
-import forge.Card;
-
-import forge.item.CardDb;
-import forge.item.CardPrinted;
-import forge.item.ItemPool;
-
-/**
- * Deck section.
- *
+/**
+ * TODO: Write javadoc for this type.
+ *
*/
-public class DeckSection extends ItemPool {
+public enum DeckSection {
+
+ Avatar(1),
+ Commander(1),
+ Main(60),
+ Sideboard(15),
+ Planes(10),
+ Schemes(20);
- /**
- * Instantiates a new deck section.
- */
- public DeckSection() {
- super(CardPrinted.class);
+ private final int typicalSize; // Rules enforcement is done in DeckFormat class, this is for reference only
+ private DeckSection(int commonSize) {
+ typicalSize = commonSize;
}
-
- /**
- * Instantiates a new deck section.
- *
- * @param cards the cards
- */
- public DeckSection(final Iterable> cards) {
- this();
- this.addAll(cards);
- }
-
- /**
- * Sets the.
- *
- * @param cardNames
- * the card names
- */
- public void set(final Iterable cardNames) {
- this.clear();
- for (final String name : cardNames) {
- this.add(CardDb.instance().getCard(name));
+
+ public boolean isSingleCard() { return typicalSize == 1; }
+
+ public static DeckSection smartValueOf(String value) {
+ if (value == null) {
+ return null;
}
- }
-
- /**
- * Adds the.
- *
- * @param card
- * the card
- */
- public void add(final Card card) {
- this.add(CardDb.instance().getCard(card));
- }
-
- /**
- * Adds the.
- *
- * @param cardName
- * the card name
- * @param setCode
- * the set code
- */
- public void add(final String cardName, final String setCode) {
- this.add(CardDb.instance().getCard(cardName, setCode));
- }
-
- /**
- * Adds the.
- *
- * @param cardName the card name
- * @param setCode the set code
- * @param amount the amount
- */
- public void add(final String cardName, final String setCode, final int amount) {
- this.add(CardDb.instance().getCard(cardName, setCode), amount);
- }
-
- /**
- * Adds the.
- *
- * @param cardList
- * the card list
- */
- public void add(final List cardList) {
- for (final Card c : cardList) {
- this.add(c);
- }
- }
-
- /**
- * Add all from a List of CardPrinted.
- *
- * @param list
- * CardPrinteds to add
- */
- public void add(final Iterable list) {
- for (CardPrinted cp : list) {
- this.add(cp);
- }
- }
-
- /**
- * TODO: Write javadoc for this method.
- *
- * @param cardName the card name
- */
- public void add(final String cardName) {
- this.add(CardDb.instance().getCard(cardName));
- }
-
- /**
- * returns n-th card from this DeckSection. LINEAR time.
- * @param i
- * @return
- */
- public CardPrinted get(int n) {
- for(Entry e : this)
- {
- n -= e.getValue();
- if ( n <= 0 ) return e.getKey();
+ final String valToCompate = value.trim();
+ for (final DeckSection v : DeckSection.values()) {
+ if (v.name().compareToIgnoreCase(valToCompate) == 0) {
+ return v;
+ }
}
return null;
}
-
- @Override
- public String toString() {
- if (this.isEmpty()) return "[]";
-
- boolean isFirst = true;
- StringBuilder sb = new StringBuilder();
- sb.append('[');
- for (Entry e : this) {
- if ( isFirst ) isFirst = false;
- else sb.append(", ");
-
- sb.append(e.getValue()).append(" x ").append(e.getKey().getName());
- }
- return sb.append(']').toString();
- }
}
diff --git a/src/main/java/forge/deck/DeckgenUtil.java b/src/main/java/forge/deck/DeckgenUtil.java
index f08d39d432d..6bfe6e2a247 100644
--- a/src/main/java/forge/deck/DeckgenUtil.java
+++ b/src/main/java/forge/deck/DeckgenUtil.java
@@ -235,32 +235,37 @@ public class DeckgenUtil {
}
// Dump into map and display.
- final Map deckMap = new TreeMap();
-
- for (final Entry s : deck.getMain()) {
- deckMap.put(s.getKey().getName(), s.getValue());
- }
-
final String nl = System.getProperty("line.separator");
final StringBuilder deckList = new StringBuilder();
final String dName = deck.getName();
-
deckList.append(dName == null ? "" : dName + nl + nl);
- if (deck.getAvatar() != null) {
- deckList.append("Avatar: " + deck.getAvatar().getName() + nl + nl);
- }
- if (deck.getCommander() != null) {
- deckList.append("Commander: " + deck.getCommander().getName() + nl + nl);
+ int nLines = 0;
+ for(DeckSection s : DeckSection.values()){
+ CardPool cp = deck.get(s);
+ if ( cp == null || cp.isEmpty() )
+ continue;
+
+ deckList.append(s.toString()).append(": ");
+ if ( s.isSingleCard() ) {
+ deckList.append(cp.get(0).getName()).append(nl);
+ nLines++;
+ } else {
+ deckList.append(nl);
+ nLines++;
+ for (final Entry ev : cp) {
+ deckList.append(ev.getValue()).append(" x ").append(ev.getKey()).append(nl);
+ nLines++;
+ }
+ }
+ deckList.append(nl);
+ nLines++;
}
- for (final Entry ev : deckMap.entrySet()) {
- deckList.append(ev.getValue() + " x " + ev.getKey() + nl);
- }
final StringBuilder msg = new StringBuilder();
- if (deckMap.keySet().size() <= 32) {
- msg.append(deckList.toString() + nl);
+ if (nLines <= 32) {
+ msg.append(deckList.toString());
} else {
msg.append("Decklist too long for dialog." + nl + nl);
}
@@ -308,8 +313,8 @@ public class DeckgenUtil {
return result;
}
- public static Deck generateSchemeDeck() {
- Deck res = new Deck();
+ public static CardPool generateSchemeDeck() {
+ CardPool schemes = new CardPool();
List allSchemes = new ArrayList();
for (CardPrinted c : CardDb.instance().getAllNonTraditionalCards()) {
if (c.getCard().getType().isScheme()) {
@@ -321,20 +326,20 @@ public class DeckgenUtil {
int attemptsLeft = 100; // to avoid endless loop
while (schemesToAdd > 0 && attemptsLeft > 0) {
CardPrinted cp = Aggregates.random(allSchemes);
- int appearances = res.getSideboard().count(cp) + 1;
+ int appearances = schemes.count(cp) + 1;
if (appearances < 2) {
- res.getSideboard().add(cp);
+ schemes.add(cp);
schemesToAdd--;
} else {
attemptsLeft--;
}
}
- return res;
+ return schemes;
}
- public static Deck generatePlanarDeck() {
- Deck res = new Deck();
+ public static CardPool generatePlanarDeck() {
+ CardPool res = new CardPool();
List allPlanars = new ArrayList();
for (CardPrinted c : CardDb.instance().getAllNonTraditionalCards()) {
if (c.getCard().getType().isPlane() || c.getCard().getType().isPhenomenon()) {
@@ -351,15 +356,15 @@ public class DeckgenUtil {
if(rndPlane.getCard().getType().isPhenomenon() && phenoms < 2)
{
- res.getSideboard().add(rndPlane);
+ res.add(rndPlane);
phenoms++;
}
else if (rndPlane.getCard().getType().isPlane())
{
- res.getSideboard().add(rndPlane);
+ res.add(rndPlane);
}
- if(allPlanars.isEmpty() || res.getSideboard().countAll() == targetsize)
+ if(allPlanars.isEmpty() || res.countAll() == targetsize)
{
break;
}
diff --git a/src/main/java/forge/game/GameFormat.java b/src/main/java/forge/game/GameFormat.java
index 7b4ef2b8b1c..afa3f49a7d7 100644
--- a/src/main/java/forge/game/GameFormat.java
+++ b/src/main/java/forge/game/GameFormat.java
@@ -57,7 +57,7 @@ public class GameFormat {
* @param bannedCards
* the banned cards
*/
- public GameFormat(final String fName, final List sets, final List bannedCards) {
+ public GameFormat(final String fName, final Iterable sets, final List bannedCards) {
this.name = fName;
this.allowedSetCodes = Lists.newArrayList(sets);
this.bannedCardNames = bannedCards == null ? new ArrayList() : Lists.newArrayList(bannedCards);
diff --git a/src/main/java/forge/game/GameNew.java b/src/main/java/forge/game/GameNew.java
index d7b0187f23a..b11b6632e14 100644
--- a/src/main/java/forge/game/GameNew.java
+++ b/src/main/java/forge/game/GameNew.java
@@ -28,6 +28,7 @@ import forge.card.trigger.TriggerType;
import forge.control.input.InputControl;
import forge.control.input.InputMulligan;
import forge.deck.Deck;
+import forge.deck.CardPool;
import forge.deck.DeckSection;
import forge.game.event.FlipCoinEvent;
import forge.game.phase.PhaseHandler;
@@ -49,7 +50,7 @@ import forge.util.MyRandom;
*/
public class GameNew {
- private static void preparePlayerLibrary(Player player, final ZoneType zoneType, DeckSection secion, boolean canRandomFoil, Random generator) {
+ private static void preparePlayerLibrary(Player player, final ZoneType zoneType, CardPool secion, boolean canRandomFoil, Random generator) {
PlayerZone library = player.getZone(zoneType);
for (final Entry stackOfCards : secion) {
final CardPrinted cardPrinted = stackOfCards.getKey();
@@ -112,7 +113,7 @@ public class GameNew {
GameType gameType = Singletons.getModel().getMatch().getGameType();
boolean isFirstGame = Singletons.getModel().getMatch().getPlayedGames().isEmpty();
- boolean hasSideboard = !psc.getOriginalDeck().getSideboard().isEmpty();
+ boolean hasSideboard = psc.getOriginalDeck().has(DeckSection.Sideboard);
boolean canSideBoard = !isFirstGame && gameType.isSideboardingAllowed() && hasSideboard;
if (canSideBoard) {
@@ -126,7 +127,8 @@ public class GameNew {
Random generator = MyRandom.getRandom();
preparePlayerLibrary(player, ZoneType.Library, myDeck.getMain(), canRandomFoil, generator);
- preparePlayerLibrary(player, ZoneType.Sideboard, myDeck.getSideboard(), canRandomFoil, generator);
+ if(hasSideboard)
+ preparePlayerLibrary(player, ZoneType.Sideboard, myDeck.get(DeckSection.Sideboard), canRandomFoil, generator);
// Shuffling
if (player instanceof AIPlayer && Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_SMOOTH_LAND)) {
@@ -190,13 +192,12 @@ public class GameNew {
private static List getCardsAiCantPlayWell(final Deck toUse) {
List result = new ArrayList();
- for (Entry cp : toUse.getMain()) {
- if ( cp.getKey().getCard().getRemAIDecks() )
- result.add(cp.getKey());
- }
- for (Entry cp : toUse.getSideboard()) {
- if ( cp.getKey().getCard().getRemAIDecks() )
- result.add(cp.getKey());
+
+ for ( Entry ds : toUse ) {
+ for (Entry cp : ds.getValue()) {
+ if ( cp.getKey().getCard().getRemAIDecks() )
+ result.add(cp.getKey());
+ }
}
return result;
}
@@ -204,18 +205,17 @@ public class GameNew {
private static Set getRemovedAnteCards(Deck toUse) {
final String keywordToRemove = "Remove CARDNAME from your deck before playing if you're not playing for ante.";
Set myRemovedAnteCards = new HashSet();
- for (Entry cp : toUse.getMain()) {
- if ( cp.getKey().getCard().rulesContain(keywordToRemove) )
- myRemovedAnteCards.add(cp.getKey());
- }
- for (Entry cp : toUse.getSideboard()) {
- if ( cp.getKey().getCard().rulesContain(keywordToRemove) )
- myRemovedAnteCards.add(cp.getKey());
+ for ( Entry ds : toUse ) {
+ for (Entry cp : ds.getValue()) {
+ if ( cp.getKey().getCard().rulesContain(keywordToRemove) )
+ myRemovedAnteCards.add(cp.getKey());
+ }
}
for(CardPrinted cp: myRemovedAnteCards) {
- toUse.getMain().remove(cp, 4);
- toUse.getSideboard().remove(cp, 4);
+ for ( Entry ds : toUse ) {
+ ds.getValue().remove(cp, Integer.MAX_VALUE);
+ }
}
return myRemovedAnteCards;
}
diff --git a/src/main/java/forge/game/MatchController.java b/src/main/java/forge/game/MatchController.java
index 0dba737fa01..3f5dee6ab7a 100644
--- a/src/main/java/forge/game/MatchController.java
+++ b/src/main/java/forge/game/MatchController.java
@@ -112,16 +112,17 @@ public class MatchController {
String statsSummary = ForgeProps.getLocalized(WinLoseText.WON) + humanWins
+ ForgeProps.getLocalized(WinLoseText.LOST) + humanLosses;
game.getGameLog().add("Final", statsSummary, 0);
-
+
+
ViewWinLose v = new ViewWinLose(this);
v.setTitle(title);
v.setOutcomes(outcomes);
v.setStatsSummary(statsSummary);
// Play the win/lose sound
- boolean humanWon = result.isWinner(human);
- game.getEvents().post(new DuelOutcomeEvent(humanWon));
+ game.getEvents().post(new DuelOutcomeEvent(result.isWinner(human)));
}
+
/**
* TODO: Write javadoc for this method.
diff --git a/src/main/java/forge/game/limited/LimitedDeck.java b/src/main/java/forge/game/limited/LimitedDeck.java
index d3f1289c960..1aed3adefde 100644
--- a/src/main/java/forge/game/limited/LimitedDeck.java
+++ b/src/main/java/forge/game/limited/LimitedDeck.java
@@ -25,7 +25,9 @@ import forge.card.CardRules;
import forge.card.CardRulesPredicates;
import forge.card.DeckHints;
import forge.card.mana.ManaCostShard;
+import forge.deck.CardPool;
import forge.deck.Deck;
+import forge.deck.DeckSection;
import forge.deck.generate.GenerateDeckUtil;
import forge.item.CardDb;
import forge.item.CardPrinted;
@@ -170,8 +172,9 @@ public class LimitedDeck {
if (deckList.size() == 40) {
Deck result = new Deck(generateName());
result.getMain().add(deckList);
- result.getSideboard().add(aiPlayables);
- result.getSideboard().add(availableList);
+ CardPool cp = result.getOrCreate(DeckSection.Sideboard);
+ cp.add(aiPlayables);
+ cp.add(availableList);
if (Preferences.DEV_MODE) {
debugFinalDeck();
}
diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java
index a6426b2d304..17b0f5ff974 100644
--- a/src/main/java/forge/game/player/PlayerControllerHuman.java
+++ b/src/main/java/forge/game/player/PlayerControllerHuman.java
@@ -15,6 +15,7 @@ import forge.control.input.InputBlock;
import forge.control.input.InputCleanup;
import forge.control.input.InputPassPriority;
import forge.deck.Deck;
+import forge.deck.CardPool;
import forge.deck.DeckSection;
import forge.game.GameState;
import forge.game.GameType;
@@ -138,14 +139,15 @@ public class PlayerControllerHuman extends PlayerController {
*/
@Override
public Deck sideboard(Deck deck, GameType gameType) {
- DeckSection sideboard = deck.getSideboard();
+ CardPool sideboard = deck.get(DeckSection.Sideboard);
+ CardPool main = deck.get(DeckSection.Main);
// + deck.getSideboard().countAll()
- int deckMinSize = Math.min(deck.getMain().countAll(), gameType.getDecksFormat().getMainRange().getMinimumInteger());
+ int deckMinSize = Math.min(main.countAll(), gameType.getDecksFormat().getMainRange().getMinimumInteger());
//IntRange sbRange = gameType.getDecksFormat().getSideRange();
int sideboardSize = sideboard.countAll();
- DeckSection newSb = new DeckSection();
+ CardPool newSb = new CardPool();
List newMain = null;
@@ -156,20 +158,21 @@ public class PlayerControllerHuman extends PlayerController {
JOptionPane.showMessageDialog(null, errMsg, "Invalid deck", JOptionPane.ERROR_MESSAGE);
}
- newMain = GuiChoose.order("Sideboard", "Main Deck", sideboardSize, deck.getSideboard().toFlatList(), deck.getMain().toFlatList(), null, true);
+ newMain = GuiChoose.order("Sideboard", "Main Deck", sideboardSize, sideboard.toFlatList(), main.toFlatList(), null, true);
}
newSb.clear();
- newSb.addAll(deck.getMain());
- newSb.addAll(deck.getSideboard());
+ newSb.addAll(main);
+ newSb.addAll(sideboard);
for(CardPrinted c : newMain)
newSb.remove(c);
Deck res = (Deck) deck.copyTo(deck.getName());
res.getMain().clear();
res.getMain().add(newMain);
- res.getSideboard().clear();
- res.getSideboard().addAll(newSb);
+ CardPool resSb = res.getOrCreate(DeckSection.Sideboard);
+ resSb.clear();
+ resSb.addAll(newSb);
return res;
}
diff --git a/src/main/java/forge/gauntlet/GauntletIO.java b/src/main/java/forge/gauntlet/GauntletIO.java
index 612449fb1a6..b05367c6e27 100644
--- a/src/main/java/forge/gauntlet/GauntletIO.java
+++ b/src/main/java/forge/gauntlet/GauntletIO.java
@@ -20,7 +20,7 @@ import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
-import forge.deck.DeckSection;
+import forge.deck.CardPool;
import forge.error.ErrorViewer;
import forge.item.CardDb;
import forge.item.CardPrinted;
@@ -164,12 +164,12 @@ public class GauntletIO {
@SuppressWarnings("rawtypes")
@Override
public boolean canConvert(final Class clasz) {
- return clasz.equals(DeckSection.class);
+ return clasz.equals(CardPool.class);
}
@Override
public void marshal(final Object source, final HierarchicalStreamWriter writer, final MarshallingContext context) {
- for (final Entry e : (DeckSection) source) {
+ for (final Entry e : (CardPool) source) {
this.writeCardPrinted(e.getKey(), e.getValue(), writer);
}
@@ -177,7 +177,7 @@ public class GauntletIO {
@Override
public Object unmarshal(final HierarchicalStreamReader reader, final UnmarshallingContext context) {
- final DeckSection result = new DeckSection();
+ final CardPool result = new CardPool();
while (reader.hasMoreChildren()) {
reader.moveDown();
final String sCnt = reader.getAttribute("n");
diff --git a/src/main/java/forge/gui/deckeditor/DeckImport.java b/src/main/java/forge/gui/deckeditor/DeckImport.java
index 0ac27a7483b..69d02986828 100644
--- a/src/main/java/forge/gui/deckeditor/DeckImport.java
+++ b/src/main/java/forge/gui/deckeditor/DeckImport.java
@@ -44,6 +44,7 @@ import net.miginfocom.swing.MigLayout;
import forge.deck.Deck;
import forge.deck.DeckBase;
import forge.deck.DeckRecognizer;
+import forge.deck.DeckSection;
import forge.deck.DeckRecognizer.TokenType;
import forge.gui.GuiUtils;
import forge.gui.deckeditor.controllers.ACEditorBase;
@@ -230,7 +231,7 @@ public class DeckImport ex
if (isMain) {
result.getMain().add(crd, t.getNumber());
} else {
- result.getSideboard().add(crd, t.getNumber());
+ result.getOrCreate(DeckSection.Sideboard).add(crd, t.getNumber());
}
}
return result;
diff --git a/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java b/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java
index 18bf82cfeae..f20d5238ef8 100644
--- a/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java
+++ b/src/main/java/forge/gui/deckeditor/controllers/CEditorConstructed.java
@@ -24,6 +24,7 @@ import forge.Command;
import forge.Singletons;
import forge.deck.Deck;
+import forge.deck.DeckSection;
import forge.gui.deckeditor.SEditorIO;
import forge.gui.deckeditor.SEditorIO.EditorPreference;
import forge.gui.deckeditor.SEditorUtil;
@@ -155,7 +156,7 @@ public final class CEditorConstructed extends ACEditorBase {
this.getTableCatalog().setAvailableColumns(lstCatalogCols);
this.getTableCatalog().setDeck(this.controller.getModel().getMain());
- this.getTableDeck().setDeck(this.controller.getModel().getSideboard());
+ this.getTableDeck().setDeck(this.controller.getModel().getOrCreate(DeckSection.Sideboard));
} else {
lstCatalogCols.remove(SColumnUtil.getColumn(ColumnName.CAT_QUANTITY));
this.getTableCatalog().setAvailableColumns(lstCatalogCols);
diff --git a/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java b/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java
index 3ad6904bffb..2ab66749732 100644
--- a/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java
+++ b/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java
@@ -22,8 +22,10 @@ import javax.swing.SwingUtilities;
import forge.Singletons;
import forge.control.FControl;
+import forge.deck.CardPool;
import forge.deck.Deck;
import forge.deck.DeckGroup;
+import forge.deck.DeckSection;
import forge.game.limited.BoosterDraft;
import forge.game.limited.IBoosterDraft;
import forge.gui.deckeditor.tables.DeckController;
@@ -171,15 +173,16 @@ public class CEditorDraftingProcess extends ACEditorBase
final Deck deck = new Deck();
// add sideboard to deck
- deck.getSideboard().addAll(this.getTableDeck().getCards());
+ CardPool side = deck.getOrCreate(DeckSection.Sideboard);
+ side.addAll(this.getTableDeck().getCards());
final String landSet = IBoosterDraft.LAND_SET_CODE[0];
final int landsCount = 20;
- deck.getSideboard().add(CardDb.instance().getCard("Forest", landSet), landsCount);
- deck.getSideboard().add(CardDb.instance().getCard("Mountain", landSet), landsCount);
- deck.getSideboard().add(CardDb.instance().getCard("Swamp", landSet), landsCount);
- deck.getSideboard().add(CardDb.instance().getCard("Island", landSet), landsCount);
- deck.getSideboard().add(CardDb.instance().getCard("Plains", landSet), landsCount);
+ side.add(CardDb.instance().getCard("Forest", landSet), landsCount);
+ side.add(CardDb.instance().getCard("Mountain", landSet), landsCount);
+ side.add(CardDb.instance().getCard("Swamp", landSet), landsCount);
+ side.add(CardDb.instance().getCard("Island", landSet), landsCount);
+ side.add(CardDb.instance().getCard("Plains", landSet), landsCount);
return deck;
} // getPlayersDeck()
diff --git a/src/main/java/forge/gui/deckeditor/controllers/CEditorLimited.java b/src/main/java/forge/gui/deckeditor/controllers/CEditorLimited.java
index 0532874a8b9..6d005b37e4a 100644
--- a/src/main/java/forge/gui/deckeditor/controllers/CEditorLimited.java
+++ b/src/main/java/forge/gui/deckeditor/controllers/CEditorLimited.java
@@ -22,6 +22,7 @@ import forge.Command;
import forge.deck.Deck;
import forge.deck.DeckGroup;
+import forge.deck.DeckSection;
import forge.gui.deckeditor.SEditorIO;
import forge.gui.deckeditor.SEditorUtil;
import forge.gui.deckeditor.tables.DeckController;
@@ -129,7 +130,7 @@ public final class CEditorLimited extends ACEditorBase {
@Override
public void resetTables() {
final Deck toEdit = this.getSelectedDeck(this.controller.getModel());
- this.getTableCatalog().setDeck(toEdit.getSideboard());
+ this.getTableCatalog().setDeck(toEdit.getOrCreate(DeckSection.Sideboard));
this.getTableDeck().setDeck(toEdit.getMain());
}
diff --git a/src/main/java/forge/gui/deckeditor/controllers/CEditorQuest.java b/src/main/java/forge/gui/deckeditor/controllers/CEditorQuest.java
index 7457fee6c6f..22cabbb1c76 100644
--- a/src/main/java/forge/gui/deckeditor/controllers/CEditorQuest.java
+++ b/src/main/java/forge/gui/deckeditor/controllers/CEditorQuest.java
@@ -29,6 +29,7 @@ import forge.Command;
import forge.Singletons;
import forge.deck.Deck;
+import forge.deck.DeckSection;
import forge.gui.deckeditor.SEditorIO;
import forge.gui.deckeditor.SEditorUtil;
import forge.gui.deckeditor.tables.DeckController;
@@ -180,7 +181,7 @@ public final class CEditorQuest extends ACEditorBase {
// remove bottom cards that are in the deck from the card pool
cardpool.removeAll(deck.getMain());
// remove sideboard cards from the catalog
- cardpool.removeAll(deck.getSideboard());
+ cardpool.removeAll(deck.getOrCreate(DeckSection.Sideboard));
// show cards, makes this user friendly
this.getTableCatalog().setDeck(cardpool);
this.getTableDeck().setDeck(deck.getMain());
@@ -204,7 +205,7 @@ public final class CEditorQuest extends ACEditorBase {
public void switchEditorMode(boolean isSideboarding) {
if (isSideboarding) {
this.getTableCatalog().setDeck(this.controller.getModel().getMain());
- this.getTableDeck().setDeck(this.controller.getModel().getSideboard());
+ this.getTableDeck().setDeck(this.controller.getModel().getOrCreate(DeckSection.Sideboard));
} else {
resetTables();
}
diff --git a/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java b/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java
index d6247e7743e..ba5e9b2fdb2 100644
--- a/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java
+++ b/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java
@@ -19,7 +19,6 @@ package forge.gui.deckeditor.controllers;
import java.text.DecimalFormat;
import java.text.NumberFormat;
-import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -36,6 +35,7 @@ import forge.Command;
import forge.Singletons;
import forge.deck.Deck;
import forge.deck.DeckBase;
+import forge.deck.DeckSection;
import forge.gui.CardListViewer;
import forge.gui.deckeditor.SEditorUtil;
import forge.gui.deckeditor.tables.DeckController;
@@ -99,7 +99,7 @@ public final class CEditorQuestCardShop extends ACEditorBase mapPrices = this.r.getPriceList();
- private Map decksUsingMyCards;
+ private ItemPool decksUsingMyCards;
// remember changed gui elements
private String CCTabLabel = new String();
@@ -205,19 +205,16 @@ public final class CEditorQuestCardShop extends ACEditorBase countDecksForEachCard() {
- final Map result = new HashMap();
+ private ItemPool countDecksForEachCard() {
+ final ItemPool result = new ItemPool(InventoryItem.class);
for (final Deck deck : this.questData.getMyDecks()) {
for (final Entry e : deck.getMain()) {
- final CardPrinted card = e.getKey();
- final Integer amount = result.get(card);
- result.put(card, Integer.valueOf(amount == null ? 1 : 1 + amount.intValue()));
- }
- for (final Entry e : deck.getSideboard()) {
- final CardPrinted card = e.getKey();
- final Integer amount = result.get(card);
- result.put(card, Integer.valueOf(amount == null ? 1 : 1 + amount.intValue()));
+ result.add(e.getKey());
}
+ if ( deck.has(DeckSection.Sideboard))
+ for (final Entry e : deck.get(DeckSection.Sideboard)) {
+ result.add(e.getKey());
+ }
}
return result;
}
@@ -281,14 +278,14 @@ public final class CEditorQuestCardShop extends ACEditorBase, Comparable>> fnDeckCompare = new Function, Comparable>>() {
@Override
public Comparable> apply(final Entry from) {
- final Integer iValue = CEditorQuestCardShop.this.decksUsingMyCards.get(from.getKey());
+ final Integer iValue = CEditorQuestCardShop.this.decksUsingMyCards.count(from.getKey());
return iValue == null ? Integer.valueOf(0) : iValue;
}
};
private final Function, Object> fnDeckGet = new Function, Object>() {
@Override
public Object apply(final Entry from) {
- final Integer iValue = CEditorQuestCardShop.this.decksUsingMyCards.get(from.getKey());
+ final Integer iValue = CEditorQuestCardShop.this.decksUsingMyCards.count(from.getKey());
return iValue == null ? "" : iValue.toString();
}
};
diff --git a/src/main/java/forge/gui/deckeditor/controllers/CEditorVariant.java b/src/main/java/forge/gui/deckeditor/controllers/CEditorVariant.java
index 4bfd4681bc0..5d04fd0738a 100644
--- a/src/main/java/forge/gui/deckeditor/controllers/CEditorVariant.java
+++ b/src/main/java/forge/gui/deckeditor/controllers/CEditorVariant.java
@@ -25,6 +25,7 @@ import com.google.common.collect.Iterables;
import forge.Singletons;
import forge.deck.Deck;
+import forge.deck.DeckSection;
import forge.gui.deckeditor.SEditorIO;
import forge.gui.deckeditor.SEditorUtil;
import forge.gui.deckeditor.tables.DeckController;
@@ -131,7 +132,7 @@ public final class CEditorVariant extends ACEditorBase {
allNT = Iterables.filter(allNT, cardPoolCondition);
this.getTableCatalog().setDeck(ItemPool.createFrom(allNT, CardPrinted.class), true);
- this.getTableDeck().setDeck(this.controller.getModel().getSideboard());
+ this.getTableDeck().setDeck(this.controller.getModel().getOrCreate(DeckSection.Sideboard));
}
/*
diff --git a/src/main/java/forge/gui/home/quest/CSubmenuQuestData.java b/src/main/java/forge/gui/home/quest/CSubmenuQuestData.java
index f55fc87166d..814e76127aa 100644
--- a/src/main/java/forge/gui/home/quest/CSubmenuQuestData.java
+++ b/src/main/java/forge/gui/home/quest/CSubmenuQuestData.java
@@ -4,14 +4,17 @@ import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.Set;
import javax.swing.JOptionPane;
import forge.Command;
import forge.deck.Deck;
+import forge.deck.DeckSection;
import forge.Singletons;
import forge.game.GameFormat;
import forge.gui.framework.ICDoc;
@@ -225,19 +228,14 @@ public enum CSubmenuQuestData implements ICDoc {
if (null == prizedPoolType) {
fmtPrizes = fmtStartPool;
if (null == fmtPrizes && dckStartPool != null) { // build it form deck
- List sets = new ArrayList();
+ Set sets = new HashSet();
for (Entry c : dckStartPool.getMain()) {
- String edition = c.getKey().getEdition();
- if (!sets.contains(edition)) {
- sets.add(edition);
- }
+ sets.add(c.getKey().getEdition());
}
- for (Entry c : dckStartPool.getSideboard()) {
- String edition = c.getKey().getEdition();
- if (!sets.contains(edition)) {
- sets.add(edition);
+ if (dckStartPool.has(DeckSection.Sideboard))
+ for (Entry c : dckStartPool.get(DeckSection.Sideboard)) {
+ sets.add(c.getKey().getEdition());
}
- }
fmtPrizes = new GameFormat("From deck", sets, null);
}
} else {
diff --git a/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java b/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java
index fddc817b0ea..015762be4ba 100644
--- a/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java
+++ b/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java
@@ -20,6 +20,7 @@ import forge.control.FControl;
import forge.deck.Deck;
import forge.deck.DeckBase;
import forge.deck.DeckGroup;
+import forge.deck.DeckSection;
import forge.game.limited.ReadDraftRankings;
import forge.game.GameType;
import forge.game.limited.SealedDeck;
@@ -202,10 +203,10 @@ public enum CSubmenuSealed implements ICDoc {
ItemPool aiDecks = sd.getCardpool(false);
final Deck deck = new Deck(sDeckName);
- deck.getSideboard().addAll(sDeck);
+ deck.getOrCreate(DeckSection.Sideboard).addAll(sDeck);
for (final String element : Constant.Color.BASIC_LANDS) {
- deck.getSideboard().add(element, sd.getLandSetCode()[0], 18);
+ deck.get(DeckSection.Sideboard).add(element, sd.getLandSetCode()[0], 18);
}
final DeckGroup sealed = new DeckGroup(sDeckName);
diff --git a/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java b/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java
index df6c23e35f6..6056ae0a490 100644
--- a/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java
+++ b/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java
@@ -14,6 +14,7 @@ import forge.Singletons;
import forge.control.FControl;
import forge.control.Lobby;
import forge.deck.Deck;
+import forge.deck.DeckSection;
import forge.deck.DeckgenUtil;
import forge.game.GameType;
import forge.game.MatchController;
@@ -162,34 +163,31 @@ public enum CSubmenuArchenemy implements ICDoc {
Object obj = view.getArchenemySchemes().getSelectedValue();
boolean useDefault = VSubmenuArchenemy.SINGLETON_INSTANCE.getCbUseDefaultSchemes().isSelected();
- useDefault &= !playerDecks.get(0).getSideboard().isEmpty();
+ useDefault &= playerDecks.get(0).has(DeckSection.Schemes);
System.out.println(useDefault);
if (useDefault) {
-
- schemes = playerDecks.get(0).getSideboard().toFlatList();
+ schemes = playerDecks.get(0).get(DeckSection.Schemes).toFlatList();
System.out.println(schemes.toString());
usedDefaults = true;
-
} else {
-
if (obj instanceof String) {
String sel = (String) obj;
if (sel.equals("Random")) {
if (view.getAllSchemeDecks().isEmpty()) {
//Generate if no constructed scheme decks are available
System.out.println("Generating scheme deck - no others available");
- schemes = DeckgenUtil.generateSchemeDeck().getSideboard().toFlatList();
+ schemes = DeckgenUtil.generateSchemeDeck().toFlatList();
} else {
System.out.println("Using scheme deck: " + Aggregates.random(view.getAllSchemeDecks()).getName());
- schemes = Aggregates.random(view.getAllSchemeDecks()).getSideboard().toFlatList();
+ schemes = Aggregates.random(view.getAllSchemeDecks()).get(DeckSection.Schemes).toFlatList();
}
} else {
//Generate
- schemes = DeckgenUtil.generateSchemeDeck().getSideboard().toFlatList();
+ schemes = DeckgenUtil.generateSchemeDeck().toFlatList();
}
} else {
- schemes = ((Deck) obj).getSideboard().toFlatList();
+ schemes = ((Deck) obj).get(DeckSection.Schemes).toFlatList();
}
}
if (schemes == null) {
diff --git a/src/main/java/forge/gui/home/variant/CSubmenuPlanechase.java b/src/main/java/forge/gui/home/variant/CSubmenuPlanechase.java
index bf5be3d3d8b..9158cab3369 100644
--- a/src/main/java/forge/gui/home/variant/CSubmenuPlanechase.java
+++ b/src/main/java/forge/gui/home/variant/CSubmenuPlanechase.java
@@ -14,6 +14,7 @@ import forge.Singletons;
import forge.control.FControl;
import forge.control.Lobby;
import forge.deck.Deck;
+import forge.deck.DeckSection;
import forge.deck.DeckgenUtil;
import forge.game.GameType;
import forge.game.MatchController;
@@ -163,12 +164,12 @@ public enum CSubmenuPlanechase implements ICDoc {
Object obj = view.getPlanarDeckLists().get(i).getSelectedValue();
boolean useDefault = VSubmenuPlanechase.SINGLETON_INSTANCE.getCbUseDefaultPlanes().isSelected();
- useDefault &= !playerDecks.get(i).getSideboard().isEmpty();
+ useDefault &= playerDecks.get(i).has(DeckSection.Planes);
System.out.println(useDefault);
if (useDefault) {
- planes = playerDecks.get(i).getSideboard().toFlatList();
+ planes = playerDecks.get(i).get(DeckSection.Planes).toFlatList();
System.out.println(planes.toString());
} else {
@@ -179,19 +180,19 @@ public enum CSubmenuPlanechase implements ICDoc {
if (view.getAllPlanarDecks().isEmpty()) {
//Generate if no constructed scheme decks are available
System.out.println("Generating planar deck - no others available");
- planes = DeckgenUtil.generatePlanarDeck().getSideboard().toFlatList();
+ planes = DeckgenUtil.generatePlanarDeck().toFlatList();
} else {
System.out.println("Using planar deck: " + Aggregates.random(view.getAllPlanarDecks()).getName());
- planes = Aggregates.random(view.getAllPlanarDecks()).getSideboard().toFlatList();
+ planes = Aggregates.random(view.getAllPlanarDecks()).get(DeckSection.Planes).toFlatList();
}
} else {
//Generate
- planes = DeckgenUtil.generatePlanarDeck().getSideboard().toFlatList();
+ planes = DeckgenUtil.generatePlanarDeck().toFlatList();
}
} else {
- planes = ((Deck) obj).getSideboard().toFlatList();
+ planes = ((Deck) obj).get(DeckSection.Planes).toFlatList();
}
}
if (planes == null) {
diff --git a/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java b/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java
index 9cf83310f41..9896579e1d6 100644
--- a/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java
+++ b/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java
@@ -15,6 +15,7 @@ import forge.Command;
import forge.Singletons;
import forge.control.Lobby;
import forge.deck.Deck;
+import forge.deck.DeckSection;
import forge.game.GameType;
import forge.game.MatchController;
import forge.game.MatchStartHelper;
@@ -137,11 +138,10 @@ public enum CSubmenuVanguard implements ICDoc {
Object obj = view.getAvatarLists().get(i).getSelectedValue();
boolean useDefault = VSubmenuVanguard.SINGLETON_INSTANCE.getCbDefaultAvatars().isSelected();
- useDefault &= playerDecks.get(i).getAvatar() != null;
+ useDefault &= playerDecks.get(i).get(DeckSection.Avatar) != null;
if (useDefault) {
-
- avatar = playerDecks.get(i).getAvatar();
+ avatar = playerDecks.get(i).get(DeckSection.Avatar).get(0);
defaultAvatarInfo.append("Player " + (i + 1) + ": ");
defaultAvatarInfo.append(avatar.getName() + nl);
usedDefaults = true;
diff --git a/src/main/java/forge/gui/toolbox/DeckLister.java b/src/main/java/forge/gui/toolbox/DeckLister.java
index 8916abf793d..ca99fdd00de 100644
--- a/src/main/java/forge/gui/toolbox/DeckLister.java
+++ b/src/main/java/forge/gui/toolbox/DeckLister.java
@@ -42,6 +42,7 @@ import forge.control.FControl;
import forge.deck.CardCollections;
import forge.deck.Deck;
import forge.deck.DeckBase;
+import forge.deck.DeckSection;
import forge.game.GameType;
import forge.gui.deckeditor.CDeckEditorUI;
import forge.gui.deckeditor.controllers.ACEditorBase;
@@ -151,7 +152,7 @@ public class DeckLister extends JPanel implements ILocalRepaint {
row.add(new EditButton(row), "w 10%!, h 20px!, gaptop 5px");
row.add(new GenericLabel(d.getName()), "w 58%!, h 20px!, gaptop 5px");
row.add(new MainLabel(String.valueOf(d.getMain().countAll())), "w 10%, h 20px!, gaptop 5px");
- row.add(new GenericLabel(String.valueOf(d.getSideboard().countAll())), "w 10%!, h 20px!, gaptop 5px");
+ row.add(new GenericLabel(d.has(DeckSection.Sideboard) ? String.valueOf(d.get(DeckSection.Sideboard).countAll()) : "none"), "w 10%!, h 20px!, gaptop 5px");
this.add(row, "w 98%!, h 30px!, gapleft 1%");
tempRows.add(row);
}
diff --git a/src/main/java/forge/quest/QuestUtilCards.java b/src/main/java/forge/quest/QuestUtilCards.java
index f1f8003179b..3b5c932ae18 100644
--- a/src/main/java/forge/quest/QuestUtilCards.java
+++ b/src/main/java/forge/quest/QuestUtilCards.java
@@ -32,6 +32,7 @@ import forge.card.CardEdition;
import forge.card.CardRarity;
import forge.card.FormatCollection;
import forge.deck.Deck;
+import forge.deck.DeckSection;
import forge.item.BoosterPack;
import forge.item.CardDb;
import forge.item.CardPrinted;
@@ -283,16 +284,10 @@ public final class QuestUtilCards {
if (this.qa.getCredits() >= value) {
this.qa.setCredits(this.qa.getCredits() - value);
this.qa.getShopList().remove(precon);
- addPreconDeck(precon);
+ this.addDeck(precon.getDeck());
}
}
- void addPreconDeck(PreconDeck precon) {
- this.qc.getMyDecks().add(precon.getDeck());
- this.addAllCards(precon.getDeck().getMain().toFlatList());
- this.addAllCards(precon.getDeck().getSideboard().toFlatList());
- }
-
/**
* Import an existing deck.
*
@@ -305,7 +300,8 @@ public final class QuestUtilCards {
}
this.qc.getMyDecks().add(fromDeck);
this.addAllCards(fromDeck.getMain().toFlatList());
- this.addAllCards(fromDeck.getSideboard().toFlatList());
+ if (fromDeck.has(DeckSection.Sideboard))
+ this.addAllCards(fromDeck.get(DeckSection.Sideboard).toFlatList());
}
/**
@@ -348,13 +344,13 @@ public final class QuestUtilCards {
// remove sold cards from all decks:
for (final Deck deck : this.qc.getMyDecks()) {
int cntInMain = deck.getMain().count(card);
- int cntInSb = deck.getSideboard().count(card);
+ int cntInSb = deck.has(DeckSection.Sideboard) ? deck.get(DeckSection.Sideboard).count(card) : 0;
int nToRemoveFromThisDeck = cntInMain + cntInSb - leftInPool;
if ( nToRemoveFromThisDeck <= 0 ) continue; // this is not the deck you are looking for
int nToRemoveFromSb = cntInSb - nToRemoveFromThisDeck;
if( nToRemoveFromSb > 0 ) {
- deck.getSideboard().remove(card, nToRemoveFromSb);
+ deck.get(DeckSection.Sideboard).remove(card, nToRemoveFromSb);
nToRemoveFromThisDeck -= cntInSb; // actual removed count should be, but I take upper bound here
if ( nToRemoveFromThisDeck <= 0 ) continue; // done here
}
diff --git a/src/main/java/forge/quest/io/QuestDataIO.java b/src/main/java/forge/quest/io/QuestDataIO.java
index 0b6fc05a5c2..de8fc97fced 100644
--- a/src/main/java/forge/quest/io/QuestDataIO.java
+++ b/src/main/java/forge/quest/io/QuestDataIO.java
@@ -55,7 +55,7 @@ import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import forge.Singletons;
import forge.card.CardEdition;
-import forge.deck.DeckSection;
+import forge.deck.CardPool;
import forge.error.ErrorViewer;
import forge.quest.data.GameFormatQuest;
import forge.item.BoosterPack;
@@ -102,7 +102,7 @@ public class QuestDataIO {
xStream.registerConverter(new QuestModeToXml());
xStream.autodetectAnnotations(true);
xStream.alias("CardPool", ItemPool.class);
- xStream.alias("DeckSection", DeckSection.class);
+ xStream.alias("DeckSection", CardPool.class);
return xStream;
}
@@ -610,12 +610,12 @@ public class QuestDataIO {
@SuppressWarnings("rawtypes")
@Override
public boolean canConvert(final Class clasz) {
- return clasz.equals(DeckSection.class);
+ return clasz.equals(CardPool.class);
}
@Override
public void marshal(final Object source, final HierarchicalStreamWriter writer, final MarshallingContext context) {
- for (final Entry e : (DeckSection) source) {
+ for (final Entry e : (CardPool) source) {
this.write(e.getKey(), e.getValue(), writer);
}
@@ -623,7 +623,7 @@ public class QuestDataIO {
@Override
public Object unmarshal(final HierarchicalStreamReader reader, final UnmarshallingContext context) {
- final DeckSection result = new DeckSection();
+ final CardPool result = new CardPool();
while (reader.hasMoreChildren()) {
reader.moveDown();
final String sCnt = reader.getAttribute("n");