From b9d4a559f23fb01273afbe3c8a2da4b21a8bfd1b Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Fri, 24 Feb 2012 23:12:59 +0000 Subject: [PATCH] Editions, Boosters, Blocks - all moved to their own collections in FModel, using base classes from util --- .gitattributes | 5 +- .../java/forge/GuiDownloadSetPicturesLQ.java | 2 +- src/main/java/forge/card/BoosterData.java | 183 ++++++++++++++ .../java/forge/card/BoosterGenerator.java | 19 +- src/main/java/forge/card/CardBlock.java | 59 +++++ src/main/java/forge/card/CardEdition.java | 215 +++-------------- .../java/forge/card/EditionCollection.java | 81 +++++++ src/main/java/forge/card/EditionUtils.java | 224 ------------------ ...FormatUtils.java => FormatCollection.java} | 64 ++--- src/main/java/forge/deck/Deck.java | 9 + src/main/java/forge/deck/DeckGroup.java | 9 + .../forge/deck/io/DeckGroupSerializer.java | 2 +- .../java/forge/deck/io/DeckSerializer.java | 2 +- src/main/java/forge/game/GameFormat.java | 8 + .../java/forge/game/limited/BoosterDraft.java | 8 +- .../java/forge/game/limited/SealedDeck.java | 7 +- src/main/java/forge/gui/GuiUtils.java | 29 --- .../forge/gui/deckeditor/PresetColumns.java | 2 +- .../deckeditor/elements/CardPanelLite.java | 2 +- .../elements/FilterNameTypeSetPanel.java | 4 +- src/main/java/forge/item/BoosterPack.java | 45 ++-- src/main/java/forge/item/CardDb.java | 4 +- src/main/java/forge/item/PreconDeck.java | 11 +- src/main/java/forge/model/FModel.java | 42 +++- .../java/forge/quest/data/PreconReader.java | 2 +- .../java/forge/quest/data/QuestDeckMap.java | 8 + .../java/forge/quest/data/QuestUtilCards.java | 6 +- src/main/java/forge/util/FolderMapView.java | 12 +- src/main/java/forge/util/IFolderMapView.java | 4 +- src/main/java/forge/util/IItemReader.java | 2 +- src/main/java/forge/util/IItemSerializer.java | 2 +- .../java/forge/util/StorageReaderFile.java | 22 +- .../java/forge/util/StorageReaderFolder.java | 10 +- .../forge/view/match/QuestWinLoseHandler.java | 5 +- .../braids/util/UtilFunctions.java | 5 +- src/test/java/forge/BoosterDraftTest.java | 2 +- 36 files changed, 568 insertions(+), 548 deletions(-) create mode 100644 src/main/java/forge/card/BoosterData.java create mode 100644 src/main/java/forge/card/EditionCollection.java delete mode 100644 src/main/java/forge/card/EditionUtils.java rename src/main/java/forge/card/{FormatUtils.java => FormatCollection.java} (67%) diff --git a/.gitattributes b/.gitattributes index 0b2a5bd95d4..dc667cfa3b5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -11046,6 +11046,7 @@ src/main/java/forge/UndoCommand.java svneol=native#text/plain src/main/java/forge/Untap.java -text src/main/java/forge/Upkeep.java svneol=native#text/plain src/main/java/forge/ZCTrigger.java svneol=native#text/plain +src/main/java/forge/card/BoosterData.java -text src/main/java/forge/card/BoosterGenerator.java svneol=native#text/plain src/main/java/forge/card/CardBlock.java -text src/main/java/forge/card/CardCharacteristics.java -text @@ -11061,9 +11062,9 @@ src/main/java/forge/card/CardRules.java -text src/main/java/forge/card/CardRulesReader.java svneol=native#text/plain src/main/java/forge/card/CardSuperType.java -text src/main/java/forge/card/CardType.java -text +src/main/java/forge/card/EditionCollection.java svneol=native#text/plain src/main/java/forge/card/EditionInfo.java svneol=native#text/plain -src/main/java/forge/card/EditionUtils.java svneol=native#text/plain -src/main/java/forge/card/FormatUtils.java -text +src/main/java/forge/card/FormatCollection.java -text src/main/java/forge/card/MtgDataParser.java -text src/main/java/forge/card/TriggerReplacementBase.java -text src/main/java/forge/card/abilityfactory/AbilityFactory.java svneol=native#text/plain diff --git a/src/main/java/forge/GuiDownloadSetPicturesLQ.java b/src/main/java/forge/GuiDownloadSetPicturesLQ.java index 3ddb7a8e692..7e716b7644f 100644 --- a/src/main/java/forge/GuiDownloadSetPicturesLQ.java +++ b/src/main/java/forge/GuiDownloadSetPicturesLQ.java @@ -71,7 +71,7 @@ public class GuiDownloadSetPicturesLQ extends GuiDownloader { final String urlBase = ForgeProps.getProperty(NewConstants.CARDFORGE_URL) + "/fpics/"; final String setCode3 = c.getEdition(); - final CardEdition thisSet = Singletons.getModel().getEditions().getEditionByCode(setCode3); + final CardEdition thisSet = Singletons.getModel().getEditions().get(setCode3); final String setCode2 = thisSet.getCode2(); final String imgFN = CardUtil.buildFilename(c, cardName); diff --git a/src/main/java/forge/card/BoosterData.java b/src/main/java/forge/card/BoosterData.java new file mode 100644 index 00000000000..c85cc62917c --- /dev/null +++ b/src/main/java/forge/card/BoosterData.java @@ -0,0 +1,183 @@ +package forge.card; + +import forge.item.CardPrinted; +import forge.util.FileSection; +import forge.util.StorageReaderFile; +import net.slightlymagic.braids.util.lambda.Lambda1; +import net.slightlymagic.maxmtg.Predicate; + +/** + * The Class BoosterData. + */ +public class BoosterData { + private final String edition; + public final String getEdition() { + return edition; + } + + private final int nCommon; + private final int nUncommon; + private final int nRare; + private final int nSpecial; + private final int nDoubleFaced; + private final int nLand; + private final int foilRate; + private static final int CARDS_PER_BOOSTER = 15; + + // private final String landCode; + /** + * Instantiates a new booster data. + * + * @param nC + * the n c + * @param nU + * the n u + * @param nR + * the n r + * @param nS + * the n s + * @param nDF + * the n df + */ + public BoosterData(final String edition, final int nC, final int nU, final int nR, final int nS, final int nDF) { + // if this booster has more that 10 cards, there must be a land in + // 15th slot unless it's already taken + this(edition, nC, nU, nR, nS, nDF, (nC + nR + nU + nS + nDF) > 10 ? BoosterData.CARDS_PER_BOOSTER - nC - nR - nU + - nS - nDF : 0, 68); + } + + /** + * Instantiates a new booster data. + * + * @param nC + * the n c + * @param nU + * the n u + * @param nR + * the n r + * @param nS + * the n s + * @param nDF + * the n df + * @param nL + * the n l + * @param oneFoilPer + * the one foil per + */ + public BoosterData(final String edition0, final int nC, final int nU, final int nR, final int nS, final int nDF, final int nL, + final int oneFoilPer) { + this.nCommon = nC; + this.nUncommon = nU; + this.nRare = nR; + this.nSpecial = nS; + this.nDoubleFaced = nDF; + this.nLand = nL > 0 ? nL : 0; + this.foilRate = oneFoilPer; + this.edition = edition0; + } + + /** + * Gets the common. + * + * @return the common + */ + public final int getCommon() { + return this.nCommon; + } + + public final Predicate getEditionFilter() { + return CardPrinted.Predicates.printedInSets(edition); + } + + /** + * Gets the uncommon. + * + * @return the uncommon + */ + public final int getUncommon() { + return this.nUncommon; + } + + /** + * Gets the rare. + * + * @return the rare + */ + public final int getRare() { + return this.nRare; + } + + /** + * Gets the special. + * + * @return the special + */ + public final int getSpecial() { + return this.nSpecial; + } + + /** + * Gets the double faced. + * + * @return the double faced + */ + public final int getDoubleFaced() { + return this.nDoubleFaced; + } + + /** + * Gets the land. + * + * @return the land + */ + public final int getLand() { + return this.nLand; + } + + /** + * Gets the total. + * + * @return the total + */ + public final int getTotal() { + return this.nCommon + this.nUncommon + this.nRare + this.nSpecial + this.nDoubleFaced + this.nLand; + } + + /** + * Gets the foil chance. + * + * @return the foil chance + */ + public final int getFoilChance() { + return this.foilRate; + } + + public static final Lambda1 FN_GET_CODE = new Lambda1() { + + @Override + public String apply(BoosterData arg1) { + return arg1.edition; + } + }; + + public static final class Reader extends StorageReaderFile { + + public Reader(String pathname) { + super(pathname, BoosterData.FN_GET_CODE); + } + + /* (non-Javadoc) + * @see forge.util.StorageReaderFile#read(java.lang.String) + */ + @Override + protected BoosterData read(String line) { + final FileSection section = FileSection.parse(line, ":", "|"); + int nC = section.getInt("Commons", 0); + int nU = section.getInt("Uncommons", 0); + int nR = section.getInt("Rares", 0); + int nS = section.getInt("Special", 0); + int nDf = section.getInt("DoubleFaced", 0); + return new BoosterData(section.get("Set"), nC, nU, nR, nS, nDf); + } + } +} \ No newline at end of file diff --git a/src/main/java/forge/card/BoosterGenerator.java b/src/main/java/forge/card/BoosterGenerator.java index 47d25e98381..0286164b79c 100644 --- a/src/main/java/forge/card/BoosterGenerator.java +++ b/src/main/java/forge/card/BoosterGenerator.java @@ -17,7 +17,6 @@ */ package forge.card; -import java.security.InvalidParameterException; import java.util.ArrayList; import java.util.Collections; import java.util.EnumMap; @@ -132,20 +131,16 @@ public class BoosterGenerator { * @param cardSet * the card set */ - public BoosterGenerator(final CardEdition cardSet) { + public BoosterGenerator(BoosterData booster) { this(); - if (!cardSet.canGenerateBooster()) { - throw new InvalidParameterException("BoosterGenerator: Set " + cardSet + " cannot generate boosters!"); - } - final CardEdition.BoosterData bs = cardSet.getBoosterData(); - this.numCommons = bs.getCommon(); - this.numUncommons = bs.getUncommon(); - this.numRareSlots = bs.getRare(); - this.numSpecials = bs.getSpecial(); - this.numDoubleFaced = bs.getDoubleFaced(); + this.numCommons = booster.getCommon(); + this.numUncommons = booster.getUncommon(); + this.numRareSlots = booster.getRare(); + this.numSpecials = booster.getSpecial(); + this.numDoubleFaced = booster.getDoubleFaced(); - final Predicate filter = CardPrinted.Predicates.printedInSets(cardSet.getCode()); + final Predicate filter = booster.getEditionFilter(); final List cardsInThisSet = filter.select(CardDb.instance().getAllCards()); for (final CardPrinted c : cardsInThisSet) { diff --git a/src/main/java/forge/card/CardBlock.java b/src/main/java/forge/card/CardBlock.java index 732b82751b7..25333949bfb 100644 --- a/src/main/java/forge/card/CardBlock.java +++ b/src/main/java/forge/card/CardBlock.java @@ -20,8 +20,10 @@ package forge.card; import java.util.ArrayList; import java.util.List; +import net.slightlymagic.braids.util.lambda.Lambda1; import net.slightlymagic.maxmtg.Predicate; import forge.item.CardPrinted; +import forge.util.StorageReaderFile; /** * This is a CardBlock class. @@ -188,5 +190,62 @@ public final class CardBlock implements Comparable { public String toString() { return this.name + " (block)"; } + + public static final Lambda1 FN_GET_NAME = new Lambda1() { + + @Override + public String apply(CardBlock arg1) { + return arg1.getName(); + } + }; + + public static class Reader extends StorageReaderFile{ + private final EditionCollection editions; + /** + * TODO: Write javadoc for Constructor. + * @param pathname + * @param keySelector0 + */ + public Reader(String pathname, EditionCollection editions0) { + super(pathname, CardBlock.FN_GET_NAME); + editions = editions0; + } + + /* (non-Javadoc) + * @see forge.util.StorageReaderFile#read(java.lang.String) + */ + @Override + protected CardBlock read(String line) { + final String[] sParts = line.trim().split("\\|"); + + String name = null; + int index = -1; + final List sets = new ArrayList(4); + CardEdition landSet = null; + int draftBoosters = 3; + int sealedBoosters = 6; + + for (final String sPart : sParts) { + final String[] kv = sPart.split(":", 2); + final String key = kv[0].toLowerCase(); + if ("name".equals(key)) { + name = kv[1]; + } else if ("index".equals(key)) { + index = Integer.parseInt(kv[1]); + } else if ("set0".equals(key) || "set1".equals(key) || "set2".equals(key)) { + sets.add(editions.getEditionByCodeOrThrow(kv[1])); + } else if ("landsetcode".equals(key)) { + landSet = editions.getEditionByCodeOrThrow(kv[1]); + } else if ("draftpacks".equals(key)) { + draftBoosters = Integer.parseInt(kv[1]); + } else if ("sealedpacks".equals(key)) { + sealedBoosters = Integer.parseInt(kv[1]); + } + + } + return new CardBlock(index, name, sets, landSet, draftBoosters, sealedBoosters); + } + + } } diff --git a/src/main/java/forge/card/CardEdition.java b/src/main/java/forge/card/CardEdition.java index 08e48633ee8..c9a7f9382dd 100644 --- a/src/main/java/forge/card/CardEdition.java +++ b/src/main/java/forge/card/CardEdition.java @@ -19,7 +19,10 @@ package forge.card; import net.slightlymagic.braids.util.lambda.Lambda1; import net.slightlymagic.maxmtg.Predicate; +import forge.Singletons; import forge.game.GameFormat; +import forge.util.FileSection; +import forge.util.StorageReaderFile; /** *

@@ -34,7 +37,7 @@ public final class CardEdition implements Comparable { // immutable private final String code; private final String code2; private final String name; - private final BoosterData boosterData; + private final String alias; /** * Instantiates a new card set. @@ -51,28 +54,13 @@ public final class CardEdition implements Comparable { // immutable public CardEdition(final int index, final String name, final String code, final String code2) { this(index, name, code, code2, null); } - - /** - * Instantiates a new card set. - * - * @param index - * the index - * @param name - * the name - * @param code - * the code - * @param code2 - * the code2 - * @param booster - * the booster - */ - public CardEdition(final int index, final String name, final String code, final String code2, - final BoosterData booster) { + + public CardEdition(final int index, final String name, final String code, final String code2, final String alias0) { this.code = code; this.code2 = code2; this.index = index; this.name = name; - this.boosterData = booster; + this.alias = alias0; } /** The Constant unknown. */ @@ -114,29 +102,11 @@ public final class CardEdition implements Comparable { // immutable return this.index; } - /** - * Can generate booster. - * - * @return true, if successful - */ - public boolean canGenerateBooster() { - return this.boosterData != null; - } - - /** - * Gets the booster data. - * - * @return the booster data - */ - public BoosterData getBoosterData() { - return this.boosterData; - } - /** The Constant fnGetName. */ - public static final Lambda1 FN_GET_NAME = new Lambda1() { + public static final Lambda1 FN_GET_CODE = new Lambda1() { @Override public String apply(final CardEdition arg1) { - return arg1.name; + return arg1.getCode(); } }; @@ -202,158 +172,26 @@ public final class CardEdition implements Comparable { // immutable return this.name + " (set)"; } - /** - * The Class BoosterData. - */ - public static class BoosterData { - private final int nCommon; - private final int nUncommon; - private final int nRare; - private final int nSpecial; - private final int nDoubleFaced; - private final int nLand; - private final int foilRate; - private static final int CARDS_PER_BOOSTER = 15; - - // private final String landCode; - /** - * Instantiates a new booster data. - * - * @param nC - * the n c - * @param nU - * the n u - * @param nR - * the n r - * @param nS - * the n s - * @param nDF - * the n df - */ - public BoosterData(final int nC, final int nU, final int nR, final int nS, final int nDF) { - // if this booster has more that 10 cards, there must be a land in - // 15th slot unless it's already taken - this(nC, nU, nR, nS, nDF, (nC + nR + nU + nS + nDF) > 10 ? BoosterData.CARDS_PER_BOOSTER - nC - nR - nU - - nS - nDF : 0, 68); - } - - /** - * Instantiates a new booster data. - * - * @param nC - * the n c - * @param nU - * the n u - * @param nR - * the n r - * @param nS - * the n s - * @param nDF - * the n df - * @param nL - * the n l - * @param oneFoilPer - * the one foil per - */ - public BoosterData(final int nC, final int nU, final int nR, final int nS, final int nDF, final int nL, - final int oneFoilPer) { - this.nCommon = nC; - this.nUncommon = nU; - this.nRare = nR; - this.nSpecial = nS; - this.nDoubleFaced = nDF; - this.nLand = nL > 0 ? nL : 0; - this.foilRate = oneFoilPer; - } - - /** - * Gets the common. - * - * @return the common - */ - public final int getCommon() { - return this.nCommon; - } - - /** - * Gets the uncommon. - * - * @return the uncommon - */ - public final int getUncommon() { - return this.nUncommon; - } - - /** - * Gets the rare. - * - * @return the rare - */ - public final int getRare() { - return this.nRare; - } - - /** - * Gets the special. - * - * @return the special - */ - public final int getSpecial() { - return this.nSpecial; - } - - /** - * Gets the double faced. - * - * @return the double faced - */ - public final int getDoubleFaced() { - return this.nDoubleFaced; - } - - /** - * Gets the land. - * - * @return the land - */ - public final int getLand() { - return this.nLand; - } - - /** - * Gets the total. - * - * @return the total - */ - public final int getTotal() { - return this.nCommon + this.nUncommon + this.nRare + this.nSpecial + this.nDoubleFaced + this.nLand; - } - - /** - * Gets the foil chance. - * - * @return the foil chance - */ - public final int getFoilChance() { - return this.foilRate; - } + public String getAlias() { + return alias; } /** * The Class Predicates. */ public abstract static class Predicates { - + /** The Constant canMakeBooster. */ public static final Predicate CAN_MAKE_BOOSTER = new CanMakeBooster(); private static class CanMakeBooster extends Predicate { @Override public boolean isTrue(final CardEdition subject) { - return subject.canGenerateBooster(); + return Singletons.getModel().getBoosters().get(subject.getCode()) != null; } } - + + /** * Checks if is legal in format. * @@ -377,4 +215,27 @@ public final class CardEdition implements Comparable { // immutable } } } + + public static class Reader extends StorageReaderFile { + + public Reader(String pathname) { + super(pathname, CardEdition.FN_GET_CODE); + } + + /* (non-Javadoc) + * @see forge.util.StorageReaderFile#read(java.lang.String) + */ + @Override + protected CardEdition read(String line) { + final FileSection section = FileSection.parse(line, ":", "|"); + final String code = section.get("code3"); + final int index = section.getInt("index", -1); + final String code2 = section.get("code2"); + final String name = section.get("name"); + final String alias = section.get("alias"); + + return new CardEdition(index, name, code, code2, alias); + } + + } } diff --git a/src/main/java/forge/card/EditionCollection.java b/src/main/java/forge/card/EditionCollection.java new file mode 100644 index 00000000000..a8fd8590362 --- /dev/null +++ b/src/main/java/forge/card/EditionCollection.java @@ -0,0 +1,81 @@ +/* + * 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.card; + +import java.util.Map; +import java.util.TreeMap; + +import forge.util.FolderMapView; + +public final class EditionCollection extends FolderMapView { + + private final Map aliasToEdition = new TreeMap(); + + public EditionCollection() { + super(new CardEdition.Reader("res/blockdata/setdata.txt")); + + for( CardEdition ee : this ) + { + String alias = ee.getAlias(); + if ( null != alias ) + aliasToEdition.put(alias, ee); + } + } + + /** + * Gets the sets the by code. + * + * @param code + * the code + * @return the sets the by code + */ + @Override + public CardEdition get(final String code) { + CardEdition baseResult = super.get(code); + return baseResult == null ? aliasToEdition.get(code) : baseResult; + } + + /** + * Gets the sets the by code or throw. + * + * @param code + * the code + * @return the sets the by code or throw + */ + public CardEdition getEditionByCodeOrThrow(final String code) { + final CardEdition set = this.get(code); + if (null == set) { + throw new RuntimeException(String.format("Edition with code '%s' not found", code)); + } + return set; + } + + // used by image generating code + /** + * Gets the code2 by code. + * + * @param code + * the code + * @return the code2 by code + */ + public String getCode2ByCode(final String code) { + final CardEdition set = this.get(code); + return set == null ? "" : set.getCode2(); + } +} + diff --git a/src/main/java/forge/card/EditionUtils.java b/src/main/java/forge/card/EditionUtils.java deleted file mode 100644 index 410a34c6e3b..00000000000 --- a/src/main/java/forge/card/EditionUtils.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * 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.card; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -import org.apache.commons.lang3.StringUtils; - -import forge.util.FileSection; -import forge.util.FileUtil; - -/** - *

- * SetInfoUtil class. - *

- * - * @author Forge - * @version $Id$ - */ -public final class EditionUtils { - - private final List allSets; - - /** - * Gets the all sets. - * - * @return the all sets - */ - public List getAllSets() { - return this.allSets; - } - - /** - * Instantiates a new edition utils. - */ - public EditionUtils() { - this.allSets = this.loadSetData(this.loadBoosterData()); - this.allBlocks = this.loadBlockData(); - } - - /** Constant setData. */ - private final Map setsByCode = new TreeMap(String.CASE_INSENSITIVE_ORDER); - private final List allBlocks; - - /** - * Gets the blocks. - * - * @return the blocks - */ - public List getBlocks() { - return this.allBlocks; - } - - /** - * Gets the sets the by code. - * - * @param code - * the code - * @return the sets the by code - */ - public CardEdition getEditionByCode(final String code) { - return this.setsByCode.get(code); - } - - /** - * Gets the sets the by code or throw. - * - * @param code - * the code - * @return the sets the by code or throw - */ - public CardEdition getEditionByCodeOrThrow(final String code) { - final CardEdition set = this.setsByCode.get(code); - if (null == set) { - throw new RuntimeException(String.format("Edition with code '%s' not found", code)); - } - return set; - } - - // used by image generating code - /** - * Gets the code2 by code. - * - * @param code - * the code - * @return the code2 by code - */ - public String getCode2ByCode(final String code) { - final CardEdition set = this.setsByCode.get(code); - return set == null ? "" : set.getCode2(); - } - - private Map loadBoosterData() { - final ArrayList fData = FileUtil.readFile("res/blockdata/boosters.txt"); - final Map result = new HashMap(); - - for (final String s : fData) { - if (StringUtils.isBlank(s)) { - continue; - } - - final String[] sParts = s.trim().split("\\|"); - String code = null; - int nC = 0, nU = 0, nR = 0, nS = 0, nDF = 0; - for (final String sPart : sParts) { - final String[] kv = sPart.split(":", 2); - final String key = kv[0].toLowerCase(); - - if (key.equalsIgnoreCase("Set")) { - code = kv[1]; - } - if (key.equalsIgnoreCase("Commons")) { - nC = Integer.parseInt(kv[1]); - } - if (key.equalsIgnoreCase("Uncommons")) { - nU = Integer.parseInt(kv[1]); - } - if (key.equalsIgnoreCase("Rares")) { - nR = Integer.parseInt(kv[1]); - } - if (key.equalsIgnoreCase("Special")) { - nS = Integer.parseInt(kv[1]); - } - if (key.equalsIgnoreCase("DoubleFaced")) { - nDF = Integer.parseInt(kv[1]); - } - } - result.put(code, new CardEdition.BoosterData(nC, nU, nR, nS, nDF)); - } - return result; - } - - // parser code - quite boring. - private List loadSetData(final Map boosters) { - final ArrayList fData = FileUtil.readFile("res/blockdata/setdata.txt"); - - final List allSets = new ArrayList(); - for (final String s : fData) { - if (StringUtils.isBlank(s)) { - continue; - } - - final FileSection section = FileSection.parse(s, ":", "|"); - final String code = section.get("code3"); - final int index = section.getInt("index", -1); - final String code2 = section.get("code2"); - final String name = section.get("name"); - final String alias = section.get("alias"); - - final CardEdition set = new CardEdition(index, name, code, code2, boosters.get(code)); - // boosters.remove(code); - this.setsByCode.put(code, set); - if (alias != null) { - this.setsByCode.put(alias, set); - } - allSets.add(set); - } - assert boosters.isEmpty(); - return allSets; - } - - private List loadBlockData() { - final ArrayList fData = FileUtil.readFile("res/blockdata/blocks.txt"); - final List theBlocks = new ArrayList(); - - for (final String s : fData) { - if (StringUtils.isBlank(s)) { - continue; - } - - final String[] sParts = s.trim().split("\\|"); - - String name = null; - int index = -1; - final List sets = new ArrayList(4); - CardEdition landSet = null; - int draftBoosters = 3; - int sealedBoosters = 6; - - for (final String sPart : sParts) { - final String[] kv = sPart.split(":", 2); - final String key = kv[0].toLowerCase(); - if ("name".equals(key)) { - name = kv[1]; - } else if ("index".equals(key)) { - index = Integer.parseInt(kv[1]); - } else if ("set0".equals(key) || "set1".equals(key) || "set2".equals(key)) { - sets.add(this.getEditionByCodeOrThrow(kv[1])); - } else if ("landsetcode".equals(key)) { - landSet = this.getEditionByCodeOrThrow(kv[1]); - } else if ("draftpacks".equals(key)) { - draftBoosters = Integer.parseInt(kv[1]); - } else if ("sealedpacks".equals(key)) { - sealedBoosters = Integer.parseInt(kv[1]); - } - - } - theBlocks.add(new CardBlock(index, name, sets, landSet, draftBoosters, sealedBoosters)); - } - Collections.reverse(theBlocks); - return Collections.unmodifiableList(theBlocks); - } - -} diff --git a/src/main/java/forge/card/FormatUtils.java b/src/main/java/forge/card/FormatCollection.java similarity index 67% rename from src/main/java/forge/card/FormatUtils.java rename to src/main/java/forge/card/FormatCollection.java index 59cc47b19ce..3976107cf73 100644 --- a/src/main/java/forge/card/FormatUtils.java +++ b/src/main/java/forge/card/FormatCollection.java @@ -19,22 +19,25 @@ package forge.card; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -import org.apache.commons.lang3.StringUtils; - import forge.game.GameFormat; -import forge.util.FileUtil; +import forge.util.FolderMapView; +import forge.util.StorageReaderFile; /** * The Class FormatUtils. */ -public final class FormatUtils { +public final class FormatCollection extends FolderMapView { - private final Map formats = new TreeMap(String.CASE_INSENSITIVE_ORDER); + + + /** + * TODO: Write javadoc for Constructor. + * @param io + */ + public FormatCollection(String filename) { + super(new FormatReader(filename)); + } /** * Gets the standard. @@ -42,7 +45,7 @@ public final class FormatUtils { * @return the standard */ public GameFormat getStandard() { - return formats.get("Standard"); + return getMap().get("Standard"); } /** @@ -51,7 +54,7 @@ public final class FormatUtils { * @return the extended */ public GameFormat getExtended() { - return formats.get("Extended"); + return getMap().get("Extended"); } /** @@ -60,30 +63,29 @@ public final class FormatUtils { * @return the modern */ public GameFormat getModern() { - return formats.get("Modern"); - } - - // list are immutable, no worries - /** - * Gets the formats. - * - * @return the formats - */ - public Collection getFormats() { - return formats.values(); + return getMap().get("Modern"); } /** * Instantiates a new format utils. */ - public FormatUtils() { - final List fData = FileUtil.readFile("res/blockdata/formats.txt"); + + public static class FormatReader extends StorageReaderFile { - for (final String s : fData) { - if (StringUtils.isBlank(s)) { - continue; - } + /** + * TODO: Write javadoc for Constructor. + * @param file0 + * @param keySelector0 + */ + public FormatReader(String file0) { + super(file0, GameFormat.FN_GET_NAME); + } + /* (non-Javadoc) + * @see forge.util.StorageReaderFile#read(java.lang.String) + */ + @Override + protected GameFormat read(String line) { String name = null; final List sets = new ArrayList(); // default: all // sets @@ -92,7 +94,7 @@ public final class FormatUtils { // nothing // banned - final String[] sParts = s.trim().split("\\|"); + final String[] sParts = line.trim().split("\\|"); for (final String sPart : sParts) { final String[] kv = sPart.split(":", 2); final String key = kv[0].toLowerCase(); @@ -107,10 +109,10 @@ public final class FormatUtils { if (name == null) { throw new RuntimeException("Format must have a name! Check formats.txt file"); } - final GameFormat thisFormat = new GameFormat(name, sets, bannedCards); + return new GameFormat(name, sets, bannedCards); - formats.put(name, thisFormat); } + } } diff --git a/src/main/java/forge/deck/Deck.java b/src/main/java/forge/deck/Deck.java index af2ef2ad6e5..896766a75a0 100644 --- a/src/main/java/forge/deck/Deck.java +++ b/src/main/java/forge/deck/Deck.java @@ -28,6 +28,8 @@ import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern; +import net.slightlymagic.braids.util.lambda.Lambda1; + import org.apache.commons.lang3.StringUtils; import forge.deck.io.DeckFileHeader; @@ -270,4 +272,11 @@ public class Deck extends DeckBase implements Serializable, IHasName { out.addAll(Deck.writeCardPool(this.getSideboard())); return out; } + + public final static Lambda1 FN_NAME_SELECTOR = new Lambda1() { + @Override + public String apply(Deck arg1) { + return arg1.getName(); + } + }; } diff --git a/src/main/java/forge/deck/DeckGroup.java b/src/main/java/forge/deck/DeckGroup.java index 276649442af..9181f514a17 100644 --- a/src/main/java/forge/deck/DeckGroup.java +++ b/src/main/java/forge/deck/DeckGroup.java @@ -20,6 +20,8 @@ package forge.deck; import java.util.ArrayList; import java.util.List; +import net.slightlymagic.braids.util.lambda.Lambda1; + import forge.item.CardPrinted; import forge.item.ItemPoolView; import forge.util.IHasName; @@ -110,5 +112,12 @@ public class DeckGroup extends DeckBase implements IHasName { protected DeckBase newInstance(final String name0) { return new DeckGroup(name0); } + + public final static Lambda1 FN_NAME_SELECTOR = new Lambda1() { + @Override + public String apply(DeckGroup arg1) { + return arg1.getName(); + } + }; } diff --git a/src/main/java/forge/deck/io/DeckGroupSerializer.java b/src/main/java/forge/deck/io/DeckGroupSerializer.java index faa3209e3e8..e2d789917d8 100644 --- a/src/main/java/forge/deck/io/DeckGroupSerializer.java +++ b/src/main/java/forge/deck/io/DeckGroupSerializer.java @@ -42,7 +42,7 @@ public class DeckGroupSerializer extends StorageReaderFolder implemen * @param deckDir0 the deck dir0 */ public DeckGroupSerializer(final File deckDir0) { - super(deckDir0); + super(deckDir0, DeckGroup.FN_NAME_SELECTOR); } /** The Constant MAX_DRAFT_PLAYERS. */ diff --git a/src/main/java/forge/deck/io/DeckSerializer.java b/src/main/java/forge/deck/io/DeckSerializer.java index c806b5aa81a..ac7b4e00ce4 100644 --- a/src/main/java/forge/deck/io/DeckSerializer.java +++ b/src/main/java/forge/deck/io/DeckSerializer.java @@ -59,7 +59,7 @@ public class DeckSerializer extends StorageReaderFolder implements IItemSe * @param deckDir0 the deck dir0 */ public DeckSerializer(final File deckDir0) { - super(deckDir0); + super(deckDir0, Deck.FN_NAME_SELECTOR); } /** Constant DCKFileFilter. */ diff --git a/src/main/java/forge/game/GameFormat.java b/src/main/java/forge/game/GameFormat.java index 8e6f6879dc8..2c2f7271acb 100644 --- a/src/main/java/forge/game/GameFormat.java +++ b/src/main/java/forge/game/GameFormat.java @@ -20,6 +20,7 @@ package forge.game; import java.util.Collections; import java.util.List; +import net.slightlymagic.braids.util.lambda.Lambda1; import net.slightlymagic.maxmtg.Predicate; import forge.card.CardRules; import forge.item.CardPrinted; @@ -118,5 +119,12 @@ public final class GameFormat { public String toString() { return this.name + " (format)"; } + + public static final Lambda1 FN_GET_NAME = new Lambda1() { + @Override + public String apply(GameFormat arg1) { + return arg1.getName(); + } + }; } diff --git a/src/main/java/forge/game/limited/BoosterDraft.java b/src/main/java/forge/game/limited/BoosterDraft.java index e0762cbb1fa..e7c25b3befd 100644 --- a/src/main/java/forge/game/limited/BoosterDraft.java +++ b/src/main/java/forge/game/limited/BoosterDraft.java @@ -28,6 +28,7 @@ import java.util.TreeMap; import javax.swing.JOptionPane; +import net.slightlymagic.braids.util.UtilFunctions; import net.slightlymagic.braids.util.lambda.Lambda1; import net.slightlymagic.maxmtg.Closure1; @@ -93,9 +94,8 @@ public final class BoosterDraft implements IBoosterDraft { break; case Block: // Draft from cards by block or set - final List blocks = Singletons.getModel().getEditions().getBlocks(); - final Object o = GuiUtils.getChoice("Choose Block", blocks.toArray()); + final Object o = GuiUtils.getChoice("Choose Block", UtilFunctions.iteratorToArray(Singletons.getModel().getBlocks().iterator(), new CardBlock[]{})); final CardBlock block = (CardBlock) o; final CardEdition[] cardSets = block.getSets(); @@ -124,12 +124,12 @@ public final class BoosterDraft implements IBoosterDraft { final Object p = GuiUtils.getChoice("Choose Set Combination", setCombos.toArray()); final String[] pp = p.toString().split("/"); for (int i = 0; i < nPacks; i++) { - final BoosterGenerator bpMulti = new BoosterGenerator(Singletons.getModel().getEditions().getEditionByCode(pp[i])); + final BoosterGenerator bpMulti = new BoosterGenerator(Singletons.getModel().getBoosters().get(pp[i])); this.packs.add(BoosterGenerator.getSimplePicker(bpMulti)); } } else { - final BoosterGenerator bpOne = new BoosterGenerator(Singletons.getModel().getEditions().getEditionByCode(sets[0])); + final BoosterGenerator bpOne = new BoosterGenerator(Singletons.getModel().getBoosters().get(sets[0])); final Closure1, BoosterGenerator> pick1 = BoosterGenerator.getSimplePicker(bpOne); for (int i = 0; i < nPacks; i++) { this.packs.add(pick1); diff --git a/src/main/java/forge/game/limited/SealedDeck.java b/src/main/java/forge/game/limited/SealedDeck.java index fdff7123f06..09a29d6f307 100644 --- a/src/main/java/forge/game/limited/SealedDeck.java +++ b/src/main/java/forge/game/limited/SealedDeck.java @@ -23,6 +23,7 @@ import java.util.List; import javax.swing.JOptionPane; +import net.slightlymagic.braids.util.UtilFunctions; import net.slightlymagic.braids.util.lambda.Lambda1; import net.slightlymagic.maxmtg.Closure1; import forge.AllZone; @@ -79,7 +80,7 @@ public class SealedDeck { this.getLandSetCode()[0] = CardDb.instance().getCard("Plains").getEdition(); } else if (sealedType.equals("Block")) { - final Object o = GuiUtils.getChoice("Choose Block", Singletons.getModel().getEditions().getBlocks().toArray()); + final Object o = GuiUtils.getChoice("Choose Block", UtilFunctions.iteratorToArray(Singletons.getModel().getBlocks().iterator(), new CardBlock[]{})); final CardBlock block = (CardBlock) o; final CardEdition[] cardSets = block.getSets(); @@ -106,11 +107,11 @@ public class SealedDeck { final String[] pp = p.toString().split("/"); for (int i = 0; i < nPacks; i++) { - final BoosterGenerator bpMulti = new BoosterGenerator(Singletons.getModel().getEditions().getEditionByCode(pp[i])); + final BoosterGenerator bpMulti = new BoosterGenerator(Singletons.getModel().getBoosters().get(pp[i])); this.packs.add(BoosterGenerator.getSimplePicker(bpMulti)); } } else { - final BoosterGenerator bpOne = new BoosterGenerator(Singletons.getModel().getEditions().getEditionByCode(sets[0])); + final BoosterGenerator bpOne = new BoosterGenerator(Singletons.getModel().getBoosters().get(sets[0])); final Closure1, BoosterGenerator> picker = BoosterGenerator.getSimplePicker(bpOne); for (int i = 0; i < nPacks; i++) { this.packs.add(picker); diff --git a/src/main/java/forge/gui/GuiUtils.java b/src/main/java/forge/gui/GuiUtils.java index bafafd0169b..51540e6fc28 100644 --- a/src/main/java/forge/gui/GuiUtils.java +++ b/src/main/java/forge/gui/GuiUtils.java @@ -31,7 +31,6 @@ import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Collection; -import java.util.Iterator; import java.util.List; import javax.swing.Box; @@ -45,7 +44,6 @@ import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import net.miginfocom.swing.MigLayout; -import net.slightlymagic.braids.util.UtilFunctions; import forge.Card; import forge.Singletons; import forge.properties.ForgeProps; @@ -259,33 +257,6 @@ public final class GuiUtils { return choice.isEmpty() ? null : choice.get(0); } // getChoiceOptional(String,T...) - /** - * Like getChoiceOptional, but this takes an Iterator instead of a variable - * number of arguments. - * - * @param - * is automatically inferred. - * @param message - * a {@link java.lang.String} object. - * @param choices - * an Iterator over T objects. - * @return null if choices is missing, empty, or if the users' choices are - * empty; otherwise, returns the first item in the List returned by - * getChoices. - */ - public static T getChoiceOptional(final String message, final Iterator choices) { - if ((choices == null) | !choices.hasNext()) { - return null; - } - - // TODO this is an expensive operation; it would be better to - // update getChoices to accept an Iterator. - final T[] choicesArray = UtilFunctions.iteratorToArray(choices); - - final List choice = GuiUtils.getChoices(message, 0, 1, choicesArray); - return choice.isEmpty() ? null : choice.get(0); - } // getChoiceOptional(String,Iterator) - // returned Object will never be null /** *

diff --git a/src/main/java/forge/gui/deckeditor/PresetColumns.java b/src/main/java/forge/gui/deckeditor/PresetColumns.java index 1101e35c497..e1af3a01f29 100644 --- a/src/main/java/forge/gui/deckeditor/PresetColumns.java +++ b/src/main/java/forge/gui/deckeditor/PresetColumns.java @@ -56,7 +56,7 @@ public abstract class PresetColumns { private static CardEdition toSetCmp(final InventoryItem i) { return i instanceof InventoryItemFromSet ? Singletons.getModel().getEditions() - .getEditionByCode(((InventoryItemFromSet) i).getEdition()) : CardEdition.UNKNOWN; + .get(((InventoryItemFromSet) i).getEdition()) : CardEdition.UNKNOWN; } private static String toSetStr(final InventoryItem i) { diff --git a/src/main/java/forge/gui/deckeditor/elements/CardPanelLite.java b/src/main/java/forge/gui/deckeditor/elements/CardPanelLite.java index 1b04794acd8..ce2696422aa 100644 --- a/src/main/java/forge/gui/deckeditor/elements/CardPanelLite.java +++ b/src/main/java/forge/gui/deckeditor/elements/CardPanelLite.java @@ -118,7 +118,7 @@ public class CardPanelLite extends CardPanelBase { final BoosterPack booster = (BoosterPack) card; final CardEdition set = Singletons.getModel().getEditions().getEditionByCodeOrThrow(booster.getEdition()); final String tpl = "%s booster pack.%n%nContains %d cards.%n%nBuy it to reveal the cards and add them to your inventory."; - this.description.setText(String.format(tpl, set.getName(), set.getBoosterData().getTotal())); + this.description.setText(String.format(tpl, set.getName(), booster.getTotalCards())); } else if (card instanceof PreconDeck) { final PreconDeck deck = (PreconDeck) card; final String desc = deck.getDescription(); diff --git a/src/main/java/forge/gui/deckeditor/elements/FilterNameTypeSetPanel.java b/src/main/java/forge/gui/deckeditor/elements/FilterNameTypeSetPanel.java index 822dc875ec2..b38591300b3 100644 --- a/src/main/java/forge/gui/deckeditor/elements/FilterNameTypeSetPanel.java +++ b/src/main/java/forge/gui/deckeditor/elements/FilterNameTypeSetPanel.java @@ -91,10 +91,10 @@ public class FilterNameTypeSetPanel extends JComponent { this.searchSetCombo.removeAllItems(); this.searchSetCombo.addItem("(all sets and formats)"); - for (final GameFormat s : Singletons.getModel().getFormats().getFormats()) { + for (final GameFormat s : Singletons.getModel().getFormats()) { this.searchSetCombo.addItem(s); } - for (final CardEdition s : Singletons.getModel().getEditions().getAllSets()) { + for (final CardEdition s : Singletons.getModel().getEditions()) { this.searchSetCombo.addItem(s); } diff --git a/src/main/java/forge/item/BoosterPack.java b/src/main/java/forge/item/BoosterPack.java index 9e9f478a100..48478bcf714 100644 --- a/src/main/java/forge/item/BoosterPack.java +++ b/src/main/java/forge/item/BoosterPack.java @@ -17,11 +17,14 @@ */ package forge.item; +import java.util.Arrays; import java.util.List; +import net.slightlymagic.braids.util.UtilFunctions; import net.slightlymagic.braids.util.lambda.Lambda1; import net.slightlymagic.maxmtg.Predicate; import forge.Singletons; +import forge.card.BoosterData; import forge.card.BoosterGenerator; import forge.card.CardRules; import forge.card.CardEdition; @@ -40,7 +43,7 @@ public class BoosterPack implements InventoryItemFromSet { } }; - private final CardEdition cardSet; + private final BoosterData contents; private final String name; private List cards = null; @@ -62,8 +65,8 @@ public class BoosterPack implements InventoryItemFromSet { * the set */ public BoosterPack(final CardEdition set) { - this.cardSet = set; - this.name = this.cardSet.getName() + " Booster Pack"; + this.contents = Singletons.getModel().getBoosters().get(set.getCode()); + this.name = set.getName() + " Booster Pack"; } /* @@ -78,7 +81,7 @@ public class BoosterPack implements InventoryItemFromSet { */ @Override public final String getEdition() { - return this.cardSet.getCode(); + return this.contents.getEdition(); } /* @@ -108,7 +111,7 @@ public class BoosterPack implements InventoryItemFromSet { */ @Override public final String getImageFilename() { - return "booster/" + this.cardSet.getCode() + ".png"; + return "booster/" + this.contents.getEdition() + ".png"; } private CardPrinted getRandomBasicLand(final CardEdition set) { @@ -118,23 +121,23 @@ public class BoosterPack implements InventoryItemFromSet { } private CardPrinted getLandFromNearestSet() { - final List sets = Singletons.getModel().getEditions().getAllSets(); - final int iThisSet = sets.indexOf(this.cardSet); - for (int iSet = iThisSet; iSet < sets.size(); iSet++) { - final CardPrinted land = this.getRandomBasicLand(sets.get(iSet)); + final CardEdition[] editions = UtilFunctions.iteratorToArray(Singletons.getModel().getEditions().iterator(), new CardEdition[]{}); + final int iThisSet = Arrays.binarySearch(editions, this.contents); + for (int iSet = iThisSet; iSet < editions.length; iSet++) { + final CardPrinted land = this.getRandomBasicLand(editions[iSet]); if (null != land) { return land; } } // if not found (though that's impossible) - return this.getRandomBasicLand(Singletons.getModel().getEditions().getEditionByCode("M12")); + return this.getRandomBasicLand(Singletons.getModel().getEditions().get("M12")); } private void generate() { - final BoosterGenerator gen = new BoosterGenerator(this.cardSet); + final BoosterGenerator gen = new BoosterGenerator(this.contents); this.cards = gen.getBoosterPack(); - final int cntLands = this.cardSet.getBoosterData().getLand(); + final int cntLands = this.contents.getLand(); if (cntLands > 0) { this.cards.add(this.getLandFromNearestSet()); } @@ -166,7 +169,7 @@ public class BoosterPack implements InventoryItemFromSet { public final int hashCode() { final int prime = 31; int result = 1; - result = (prime * result) + ((this.cardSet == null) ? 0 : this.cardSet.hashCode()); + result = (prime * result) + ((this.contents == null) ? 0 : this.contents.hashCode()); return result; } @@ -187,11 +190,11 @@ public class BoosterPack implements InventoryItemFromSet { return false; } final BoosterPack other = (BoosterPack) obj; - if (this.cardSet == null) { - if (other.cardSet != null) { + if (this.contents == null) { + if (other.contents != null) { return false; } - } else if (!this.cardSet.equals(other.cardSet)) { + } else if (!this.contents.equals(other.contents)) { return false; } return true; @@ -224,8 +227,16 @@ public class BoosterPack implements InventoryItemFromSet { */ @Override public final Object clone() { - return new BoosterPack(this.cardSet); // it's ok to share a reference to + return new BoosterPack(Singletons.getModel().getEditions().getEditionByCodeOrThrow(this.contents.getEdition())); // it's ok to share a reference to // cardSet which is static anyway } + /** + * TODO: Write javadoc for this method. + * @return + */ + public int getTotalCards() { + return contents.getTotal(); + } + } diff --git a/src/main/java/forge/item/CardDb.java b/src/main/java/forge/item/CardDb.java index 7a81f6b793a..d10fe7dd098 100644 --- a/src/main/java/forge/item/CardDb.java +++ b/src/main/java/forge/item/CardDb.java @@ -392,10 +392,10 @@ public final class CardDb { // Find card with maximal set index result = namedCards.get(0); - int resIndex = Singletons.getModel().getEditions().getEditionByCode((result).getEdition()).getIndex(); + int resIndex = Singletons.getModel().getEditions().get((result).getEdition()).getIndex(); for (final CardPrinted card : namedCards) { - final int thisIndex = Singletons.getModel().getEditions().getEditionByCode((card).getEdition()).getIndex(); + final int thisIndex = Singletons.getModel().getEditions().get((card).getEdition()).getIndex(); if (thisIndex > resIndex) { result = card; resIndex = thisIndex; diff --git a/src/main/java/forge/item/PreconDeck.java b/src/main/java/forge/item/PreconDeck.java index e2e007f5c93..463300067a3 100644 --- a/src/main/java/forge/item/PreconDeck.java +++ b/src/main/java/forge/item/PreconDeck.java @@ -21,6 +21,8 @@ import java.io.File; import java.util.List; import java.util.Map; +import net.slightlymagic.braids.util.lambda.Lambda1; + import forge.Singletons; import forge.deck.Deck; import forge.quest.SellRules; @@ -88,7 +90,7 @@ public class PreconDeck implements InventoryItemFromSet { imageFilename = kv.get("Image"); description = kv.get("Description"); - if (Singletons.getModel().getEditions().getEditionByCode(kv.get("set").toUpperCase()) != null) { + if (Singletons.getModel().getEditions().get(kv.get("set").toUpperCase()) != null) { setProxy = kv.get("set"); } @@ -133,5 +135,12 @@ public class PreconDeck implements InventoryItemFromSet { public final String getDescription() { return this.description; } + + public final static Lambda1 FN_NAME_SELECTOR = new Lambda1() { + @Override + public String apply(PreconDeck arg1) { + return arg1.getName(); + } + }; } diff --git a/src/main/java/forge/model/FModel.java b/src/main/java/forge/model/FModel.java index 09b95b58bc1..c0654527c3c 100644 --- a/src/main/java/forge/model/FModel.java +++ b/src/main/java/forge/model/FModel.java @@ -34,8 +34,10 @@ import forge.Constant; import forge.ConstantStringArrayList; import forge.GameAction; import forge.Singletons; -import forge.card.EditionUtils; -import forge.card.FormatUtils; +import forge.card.BoosterData; +import forge.card.CardBlock; +import forge.card.EditionCollection; +import forge.card.FormatCollection; import forge.control.input.InputControl; import forge.deck.CardCollections; import forge.game.GameState; @@ -47,7 +49,9 @@ import forge.properties.NewConstants; import forge.quest.data.QuestEventManager; import forge.quest.data.QuestPreferences; import forge.util.FileUtil; +import forge.util.FolderMapView; import forge.util.HttpUtil; +import forge.util.IFolderMapView; import forge.view.match.ViewField; import forge.view.match.ViewTabber; import forge.view.toolbox.FSkin; @@ -79,13 +83,16 @@ public enum FModel { private final GameState gameState; private final FMatchState matchState; - private final EditionUtils setUtils; - private final FormatUtils formats; - + private final EditionCollection editions; + private final FormatCollection formats; + private final IFolderMapView boosters; + private final FolderMapView blocks; + // have to implement lazy initialization - at the moment of FModel.ctor() // CardDb is not ready yet. private CardCollections decks; + /** * Constructor. * @@ -124,9 +131,12 @@ public enum FModel { this.matchState = new FMatchState(); this.questPreferences = new QuestPreferences(); this.questEventManager = new QuestEventManager(); - this.setUtils = new EditionUtils(); - this.formats = new FormatUtils(); - + this.editions = new EditionCollection(); + this.formats = new FormatCollection("res/blockdata/formats.txt"); + this.boosters = new FolderMapView(new BoosterData.Reader("res/blockdata/boosters.txt")); + this.blocks = new FolderMapView(new CardBlock.Reader("res/blockdata/blocks.txt", editions)); + + // TODO this single setting from preferences should not be here, or, // it should be here with all the other settings at the same time. // Unfortunately, they're tied up in legacy code in the Display @@ -156,6 +166,10 @@ public enum FModel { FModel.loadDynamicGamedata(); } + public final IFolderMapView getBoosters() { + return boosters; + } + /** * Load dynamic gamedata. */ @@ -374,8 +388,8 @@ public enum FModel { * @return the editions */ - public final EditionUtils getEditions() { - return this.setUtils; + public final EditionCollection getEditions() { + return this.editions; } /** @@ -383,7 +397,7 @@ public enum FModel { * * @return the formats */ - public final FormatUtils getFormats() { + public final FormatCollection getFormats() { return this.formats; } @@ -502,4 +516,10 @@ public enum FModel { // ignored } } + + public FolderMapView getBlocks() { + return blocks; + } + + } diff --git a/src/main/java/forge/quest/data/PreconReader.java b/src/main/java/forge/quest/data/PreconReader.java index 9b6ed2a873e..79b18b7941d 100644 --- a/src/main/java/forge/quest/data/PreconReader.java +++ b/src/main/java/forge/quest/data/PreconReader.java @@ -36,7 +36,7 @@ public class PreconReader extends StorageReaderFolder { * @param deckDir0 the deck dir0 */ public PreconReader(final File deckDir0) { - super(deckDir0); + super(deckDir0, PreconDeck.FN_NAME_SELECTOR); } /* diff --git a/src/main/java/forge/quest/data/QuestDeckMap.java b/src/main/java/forge/quest/data/QuestDeckMap.java index 1f36a859343..80937ec93bc 100644 --- a/src/main/java/forge/quest/data/QuestDeckMap.java +++ b/src/main/java/forge/quest/data/QuestDeckMap.java @@ -109,4 +109,12 @@ public class QuestDeckMap implements IFolderMap { return !this.map.containsKey(name); } + /* (non-Javadoc) + * @see forge.util.IFolderMapView#any(java.lang.String) + */ + @Override + public boolean any(String name) { + return map.containsKey(name); + } + } diff --git a/src/main/java/forge/quest/data/QuestUtilCards.java b/src/main/java/forge/quest/data/QuestUtilCards.java index 5bb0d22139c..fe3bd62abdb 100644 --- a/src/main/java/forge/quest/data/QuestUtilCards.java +++ b/src/main/java/forge/quest/data/QuestUtilCards.java @@ -26,7 +26,7 @@ import net.slightlymagic.maxmtg.Predicate; import forge.Singletons; import forge.card.BoosterGenerator; import forge.card.CardEdition; -import forge.card.FormatUtils; +import forge.card.FormatCollection; import forge.deck.Deck; import forge.item.BoosterPack; import forge.item.CardDb; @@ -313,7 +313,7 @@ public final class QuestUtilCards { /** * Generate cards in shop. */ - private final FormatUtils formats = Singletons.getModel().getFormats(); + private final FormatCollection formats = Singletons.getModel().getFormats(); private final Predicate filterExt = CardEdition.Predicates.isLegalInFormat(this.formats.getExtended()); /** The filter t2booster. */ @@ -342,7 +342,7 @@ public final class QuestUtilCards { final Predicate filter = rollD100 < 40 ? this.filterT2booster : (rollD100 < 75 ? this.filterExtButT2 : this.filterNotExt); this.q.getShopList().addAllFlat( - filter.random(Singletons.getModel().getEditions().getAllSets(), 1, BoosterPack.FN_FROM_SET)); + filter.random(Singletons.getModel().getEditions(), 1, BoosterPack.FN_FROM_SET)); } } diff --git a/src/main/java/forge/util/FolderMapView.java b/src/main/java/forge/util/FolderMapView.java index 04d29566582..204cc49378c 100644 --- a/src/main/java/forge/util/FolderMapView.java +++ b/src/main/java/forge/util/FolderMapView.java @@ -32,7 +32,7 @@ import java.util.Map; * @author Forge * @version $Id: DeckManager.java 13590 2012-01-27 20:46:27Z Max mtg $ */ -public class FolderMapView implements Iterable, IFolderMapView { +public class FolderMapView implements Iterable, IFolderMapView { private final Map map; /** @@ -52,7 +52,7 @@ public class FolderMapView implements Iterable, IFolderMa * @see forge.deck.IFolderMapView#get(java.lang.String) */ @Override - public final T get(final String name) { + public T get(final String name) { return this.map.get(name); } @@ -89,4 +89,12 @@ public class FolderMapView implements Iterable, IFolderMa public Iterator iterator() { return this.map.values().iterator(); } + + /* (non-Javadoc) + * @see forge.util.IFolderMapView#any(java.lang.String) + */ + @Override + public boolean any(String name) { + return this.map.containsKey(name); + } } diff --git a/src/main/java/forge/util/IFolderMapView.java b/src/main/java/forge/util/IFolderMapView.java index a93622ac2de..e17be5f8959 100644 --- a/src/main/java/forge/util/IFolderMapView.java +++ b/src/main/java/forge/util/IFolderMapView.java @@ -24,7 +24,7 @@ import java.util.Collection; * * @param the generic type */ -public interface IFolderMapView extends Iterable { +public interface IFolderMapView extends Iterable { /** *

@@ -42,5 +42,7 @@ public interface IFolderMapView extends Iterable { * @return a ArrayList */ Collection getNames(); + + boolean any(final String name); } diff --git a/src/main/java/forge/util/IItemReader.java b/src/main/java/forge/util/IItemReader.java index 86ee3c8ff50..a840f3d1bce 100644 --- a/src/main/java/forge/util/IItemReader.java +++ b/src/main/java/forge/util/IItemReader.java @@ -24,7 +24,7 @@ import java.util.Map; * * @param the generic type */ -public interface IItemReader { +public interface IItemReader { /** * Read all. diff --git a/src/main/java/forge/util/IItemSerializer.java b/src/main/java/forge/util/IItemSerializer.java index 01bab2cbb7d..6c68c764d43 100644 --- a/src/main/java/forge/util/IItemSerializer.java +++ b/src/main/java/forge/util/IItemSerializer.java @@ -22,7 +22,7 @@ package forge.util; * * @param the generic type */ -public interface IItemSerializer extends IItemReader { +public interface IItemSerializer extends IItemReader { /** * Save. diff --git a/src/main/java/forge/util/StorageReaderFile.java b/src/main/java/forge/util/StorageReaderFile.java index 24fb5c2778a..0275c05e64e 100644 --- a/src/main/java/forge/util/StorageReaderFile.java +++ b/src/main/java/forge/util/StorageReaderFile.java @@ -24,6 +24,8 @@ import java.util.TreeMap; import javax.swing.JOptionPane; +import net.slightlymagic.braids.util.lambda.Lambda1; + import org.apache.commons.lang3.StringUtils; /** @@ -31,25 +33,25 @@ import org.apache.commons.lang3.StringUtils; * * @param the generic type */ -public abstract class StorageReaderFile implements IItemReader { +public abstract class StorageReaderFile implements IItemReader { private final File file; + private final Lambda1 keySelector; /** * Instantiates a new storage reader file. * * @param file0 the file0 */ - public StorageReaderFile(final File file0) { - this.file = file0; + public StorageReaderFile(final String pathname, Lambda1 keySelector0) { + this(new File(pathname), keySelector0); } - // only accepts numbers, letters or dashes up to 20 characters in length - /** - * Clean deck name. - * - * @return a String - */ + + public StorageReaderFile(final File file0, Lambda1 keySelector0) { + this.file = file0; + keySelector = keySelector0; + } @Override public Map readAll() { @@ -69,7 +71,7 @@ public abstract class StorageReaderFile implements IItemRead continue; } - result.put(item.getName(), item); + result.put(keySelector.apply(item), item); } return result; diff --git a/src/main/java/forge/util/StorageReaderFolder.java b/src/main/java/forge/util/StorageReaderFolder.java index f898ca67b3c..ba92009f9e7 100644 --- a/src/main/java/forge/util/StorageReaderFolder.java +++ b/src/main/java/forge/util/StorageReaderFolder.java @@ -28,6 +28,8 @@ import java.util.TreeMap; import javax.swing.JOptionPane; +import net.slightlymagic.braids.util.lambda.Lambda1; + import org.apache.commons.lang3.StringUtils; import forge.deck.io.OldDeckFileFormatException; @@ -40,9 +42,10 @@ import forge.error.ErrorViewer; * * @param the generic type */ -public abstract class StorageReaderFolder implements IItemReader { +public abstract class StorageReaderFolder implements IItemReader { private final File directory; + private final Lambda1 keySelector; /** * Gets the directory. @@ -58,9 +61,10 @@ public abstract class StorageReaderFolder implements IItemRe * * @param deckDir0 the deck dir0 */ - public StorageReaderFolder(final File deckDir0) { + public StorageReaderFolder(final File deckDir0, Lambda1 keySelector0) { this.directory = deckDir0; + keySelector = keySelector0; if (this.directory == null) { throw new IllegalArgumentException("No deck directory specified"); @@ -99,7 +103,7 @@ public abstract class StorageReaderFolder implements IItemRe JOptionPane.showMessageDialog(null, msg); continue; } - result.put(newDeck.getName(), newDeck); + result.put(keySelector.apply(newDeck), newDeck); } catch (final OldDeckFileFormatException ex) { if (!hasWarnedOfOldFormat) { JOptionPane diff --git a/src/main/java/forge/view/match/QuestWinLoseHandler.java b/src/main/java/forge/view/match/QuestWinLoseHandler.java index f31031fc325..357fc56dc0b 100644 --- a/src/main/java/forge/view/match/QuestWinLoseHandler.java +++ b/src/main/java/forge/view/match/QuestWinLoseHandler.java @@ -27,6 +27,8 @@ import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.SwingConstants; +import net.slightlymagic.braids.util.UtilFunctions; + import forge.AllZone; import forge.CardList; import forge.Constant; @@ -518,8 +520,7 @@ public class QuestWinLoseHandler extends ControlWinLose { * */ private void awardBooster() { - final GameFormat[] emptyFormatArray = {}; - final GameFormat[] formats = Singletons.getModel().getFormats().getFormats().toArray(emptyFormatArray); + final GameFormat[] formats = UtilFunctions.iteratorToArray(Singletons.getModel().getFormats().iterator(), new GameFormat[]{}); final ListChooser ch = new ListChooser("Choose bonus booster format", 1, formats); String prefferedFormat = Singletons.getModel().getQuestPreferences().getPreference(QPref.BOOSTER_FORMAT); diff --git a/src/main/java/net/slightlymagic/braids/util/UtilFunctions.java b/src/main/java/net/slightlymagic/braids/util/UtilFunctions.java index 5296d2e64c7..508d9752301 100644 --- a/src/main/java/net/slightlymagic/braids/util/UtilFunctions.java +++ b/src/main/java/net/slightlymagic/braids/util/UtilFunctions.java @@ -123,7 +123,7 @@ public final class UtilFunctions { * * @return an array of (the rest of) the iterator's values */ - public static T[] iteratorToArray(final Iterator iter) { + public static T[] iteratorToArray(final Iterator iter, T[] destArray) { final ArrayList list = new ArrayList(); T item; @@ -132,8 +132,7 @@ public final class UtilFunctions { list.add(item); } - @SuppressWarnings("unchecked") - final T[] result = (T[]) list.toArray(); + final T[] result = list.toArray(destArray); return result; } diff --git a/src/test/java/forge/BoosterDraftTest.java b/src/test/java/forge/BoosterDraftTest.java index ad0c8137bda..bffa15b3a76 100644 --- a/src/test/java/forge/BoosterDraftTest.java +++ b/src/test/java/forge/BoosterDraftTest.java @@ -46,7 +46,7 @@ public class BoosterDraftTest implements IBoosterDraft { @Override public ItemPoolView nextChoice() { this.n--; - final BoosterGenerator pack = new BoosterGenerator(Singletons.getModel().getEditions().getEditionByCode("M11")); + final BoosterGenerator pack = new BoosterGenerator(Singletons.getModel().getBoosters().get("M11")); return ItemPool.createFrom(pack.getBoosterPack(), CardPrinted.class); }