From 8ac8b22ed7ffd9200a434d252499a42d45bc7490 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Tue, 12 Feb 2013 22:18:35 +0000 Subject: [PATCH] deck API changes. Deck is now a map of sections to cardpools. Schemes and planes have their own sections --- .gitattributes | 1 + .../card/ability/effects/MillEffect.java | 1 - src/main/java/forge/deck/CardPool.java | 160 ++++++++++++++++ src/main/java/forge/deck/Deck.java | 123 ++++++------ src/main/java/forge/deck/DeckFormat.java | 34 ++-- src/main/java/forge/deck/DeckSection.java | 175 +++--------------- src/main/java/forge/deck/DeckgenUtil.java | 59 +++--- src/main/java/forge/game/GameFormat.java | 2 +- src/main/java/forge/game/GameNew.java | 38 ++-- src/main/java/forge/game/MatchController.java | 7 +- .../java/forge/game/limited/LimitedDeck.java | 7 +- .../game/player/PlayerControllerHuman.java | 19 +- src/main/java/forge/gauntlet/GauntletIO.java | 8 +- .../java/forge/gui/deckeditor/DeckImport.java | 3 +- .../controllers/CEditorConstructed.java | 3 +- .../controllers/CEditorDraftingProcess.java | 15 +- .../controllers/CEditorLimited.java | 3 +- .../deckeditor/controllers/CEditorQuest.java | 5 +- .../controllers/CEditorQuestCardShop.java | 25 ++- .../controllers/CEditorVariant.java | 3 +- .../gui/home/quest/CSubmenuQuestData.java | 18 +- .../gui/home/sanctioned/CSubmenuSealed.java | 5 +- .../gui/home/variant/CSubmenuArchenemy.java | 16 +- .../gui/home/variant/CSubmenuPlanechase.java | 13 +- .../gui/home/variant/CSubmenuVanguard.java | 6 +- .../java/forge/gui/toolbox/DeckLister.java | 3 +- src/main/java/forge/quest/QuestUtilCards.java | 16 +- src/main/java/forge/quest/io/QuestDataIO.java | 10 +- 28 files changed, 410 insertions(+), 368 deletions(-) create mode 100644 src/main/java/forge/deck/CardPool.java 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");