diff --git a/src/main/java/forge/AllZone.java b/src/main/java/forge/AllZone.java index 42f3f4bb9d3..c0c93fff6ef 100644 --- a/src/main/java/forge/AllZone.java +++ b/src/main/java/forge/AllZone.java @@ -6,7 +6,6 @@ import java.util.Map; import net.slightlymagic.braids.util.UtilFunctions; import forge.card.cardFactory.CardFactoryInterface; -import forge.card.cardFactory.LazyCardFactory; import forge.card.cardFactory.PreloadingCardFactory; import forge.card.mana.ManaPool; import forge.card.trigger.TriggerHandler; diff --git a/src/main/java/forge/CardUtil.java b/src/main/java/forge/CardUtil.java index 04428a05c71..24f6524b2c2 100644 --- a/src/main/java/forge/CardUtil.java +++ b/src/main/java/forge/CardUtil.java @@ -1,5 +1,6 @@ package forge; +import forge.card.CardPrinted; import forge.card.mana.ManaCost; import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbilityList; @@ -11,10 +12,13 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; +import org.apache.commons.lang3.StringUtils; + /** *

CardUtil class.

@@ -489,80 +493,52 @@ public final class CardUtil { * @return a {@link java.lang.String} object. */ public static String buildFilename(final Card card) { - File path = null; - if (card.isToken() && !card.isCopiedToken()) { - path = ForgeProps.getFile(NewConstants.IMAGE_TOKEN); - } else { - path = ForgeProps.getFile(NewConstants.IMAGE_BASE); - } + boolean token = card.isToken() && !card.isCopiedToken(); + return buildFilename(card.getName(), card.getCurSetCode(), card.getRandomPicture(), token); + } - StringBuilder sbKey = new StringBuilder(); + public static String buildFilename(final CardPrinted card) { + return buildFilename(card.getName(), card.getSet(), card.getArtIndex(), false); + } + + private static String buildFilename(final String cardName, final String setName, + final int artIndex, final boolean isToken) + { + File path = ForgeProps.getFile(isToken ? NewConstants.IMAGE_TOKEN : NewConstants.IMAGE_BASE); + String nn = artIndex > 0 ? Integer.toString(artIndex) : ""; + String cleanCardName = GuiDisplayUtil.cleanString(cardName); File f = null; - if (!card.getCurSetCode().equals("")) { - String nn = ""; - if (card.getRandomPicture() > 0) { - nn = Integer.toString(card.getRandomPicture()); - } + if (StringUtils.isNotBlank(setName)) { + String mwsCardName = GuiDisplayUtil.cleanStringMWS(cardName); - //First try 3 letter set code with MWS filename format - sbKey.append(card.getCurSetCode() + "/"); - sbKey.append(GuiDisplayUtil.cleanStringMWS(card.getName()) + nn + ".full"); - - f = new File(path, sbKey.toString() + ".jpg"); - if (f.exists()) { - return sbKey.toString(); - } - - sbKey = new StringBuilder(); + //First, try 3 letter set code with MWS filename format + String mwsSet3 = String.format("%s/%s%s.full", setName, mwsCardName, nn); + f = new File(path, mwsSet3 + ".jpg"); + if (f.exists()) { return mwsSet3; } //Second, try 2 letter set code with MWS filename format - sbKey.append(SetInfoUtil.getSetCode2_SetCode3(card.getCurSetCode()) + "/"); - sbKey.append(GuiDisplayUtil.cleanStringMWS(card.getName()) + nn + ".full"); - - f = new File(path, sbKey.toString() + ".jpg"); - if (f.exists()) { - return sbKey.toString(); - } - - sbKey = new StringBuilder(); + String mwsSet2 = String.format("%s/%s%s.full", SetInfoUtil.getCode2ByCode(setName), mwsCardName, nn); + f = new File(path, mwsSet2 + ".jpg"); + if (f.exists()) { return mwsSet2; } //Third, try 3 letter set code with Forge filename format - sbKey.append(card.getCurSetCode() + "/"); - sbKey.append(GuiDisplayUtil.cleanString(card.getName()) + nn); - - f = new File(path, sbKey.toString() + ".jpg"); - if (f.exists()) { - return sbKey.toString(); - } - - sbKey = new StringBuilder(); - + String forgeSet3 = String.format("%s/%s%s", setName, cleanCardName, nn); + f = new File(path, forgeSet3 + ".jpg"); + if (f.exists()) { return forgeSet3; } } //Last, give up with set images, go with the old picture type - sbKey.append(GuiDisplayUtil.cleanString(card.getImageName())); - if (card.getRandomPicture() > 1) { - sbKey.append(card.getRandomPicture()); - } + String forgePlain = String.format("%s%s", cleanCardName, nn); - f = new File(path, sbKey.toString() + ".jpg"); - if (f.exists()) { - return sbKey.toString(); - } + f = new File(path, forgePlain + ".jpg"); + if (f.exists()) { return forgePlain; } - sbKey = new StringBuilder(); - - //Really last-ditch effort, forget the picture number - sbKey.append(GuiDisplayUtil.cleanString(card.getImageName())); - - f = new File(path, sbKey.toString() + ".jpg"); - if (f.exists()) { - return sbKey.toString(); - } + // give up with art index + f = new File(path, cleanCardName + ".jpg"); + if (f.exists()) { return cleanCardName; } //if still no file, download if option enabled? - return "none"; } diff --git a/src/main/java/forge/Gui_DeckEditor.java b/src/main/java/forge/Gui_DeckEditor.java index 5128c1b0151..c68ee8ff611 100644 --- a/src/main/java/forge/Gui_DeckEditor.java +++ b/src/main/java/forge/Gui_DeckEditor.java @@ -17,6 +17,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.util.List; import java.util.Random; import javax.swing.BorderFactory; @@ -389,7 +390,7 @@ public class Gui_DeckEditor extends JFrame implements CardContainer, DeckDisplay String SC = ""; if (!(searchSetCombo.getSelectedItem().toString().equals(""))) { - SC = SetInfoUtil.getSetCode3_SetName(searchSetCombo.getSelectedItem().toString()); + SC = SetInfoUtil.getCode3ByName(searchSetCombo.getSelectedItem().toString()); boolean result = false; @@ -959,8 +960,11 @@ public class Gui_DeckEditor extends JFrame implements CardContainer, DeckDisplay searchSetCombo.removeAllItems(); searchSetCombo.addItem(""); - for (int i = 0; i < SetInfoUtil.getSetNameList().size(); i++) - searchSetCombo.addItem(SetInfoUtil.getSetNameList().get(i)); + List allSetsNames = SetInfoUtil.getNameList(); + for (String s : allSetsNames) { + searchSetCombo.addItem(s); + } + this.getContentPane().add(searchSetCombo, "wmin 150, grow"); this.getContentPane().add(statsLabel2, "cell 0 4"); diff --git a/src/main/java/forge/Gui_DownloadSetPictures_LQ.java b/src/main/java/forge/Gui_DownloadSetPictures_LQ.java index 66816771af5..dfdfbcc94cb 100644 --- a/src/main/java/forge/Gui_DownloadSetPictures_LQ.java +++ b/src/main/java/forge/Gui_DownloadSetPictures_LQ.java @@ -394,7 +394,7 @@ public class Gui_DownloadSetPictures_LQ extends DefaultBoundedRangeModel impleme for (int j = 0; j < cSetInfo.size(); j++) { c.setCurSetCode(cSetInfo.get(j).Code); String SC3 = c.getCurSetCode(); - String SC2 = SetInfoUtil.getSetCode2_SetCode3(c.getCurSetCode()); + String SC2 = SetInfoUtil.getCode2ByCode(c.getCurSetCode()); int n = 0; if (cSetInfo.get(j).PicCount > 0) { diff --git a/src/main/java/forge/Gui_MigrateLocalMWSSetPictures_HQ.java b/src/main/java/forge/Gui_MigrateLocalMWSSetPictures_HQ.java index 165c1b78b75..5b7a8799b49 100644 --- a/src/main/java/forge/Gui_MigrateLocalMWSSetPictures_HQ.java +++ b/src/main/java/forge/Gui_MigrateLocalMWSSetPictures_HQ.java @@ -402,7 +402,7 @@ public class Gui_MigrateLocalMWSSetPictures_HQ extends DefaultBoundedRangeModel for (int j = 0; j < cSetInfo.size(); j++) { c.setCurSetCode(cSetInfo.get(j).Code); String SC3 = c.getCurSetCode(); - String SC2 = SetInfoUtil.getSetCode2_SetCode3(c.getCurSetCode()); + String SC2 = SetInfoUtil.getCode2ByCode(c.getCurSetCode()); int n = 0; if (cSetInfo.get(j).PicCount > 0) { diff --git a/src/main/java/forge/SetInfoUtil.java b/src/main/java/forge/SetInfoUtil.java index 5c0b8c296b2..04229d95514 100644 --- a/src/main/java/forge/SetInfoUtil.java +++ b/src/main/java/forge/SetInfoUtil.java @@ -1,7 +1,14 @@ package forge; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; +import java.util.List; + +import net.slightlymagic.maxmtg.Predicate; + +import forge.card.CardSet; /** *

SetInfoUtil class.

@@ -11,7 +18,8 @@ import java.util.HashMap; */ public class SetInfoUtil { /** Constant setData */ - private static ArrayList> setData = new ArrayList>(); + private static HashMap setsByCode = new HashMap(); + private static List allSets = new ArrayList(); /** *

loadSetData.

@@ -19,57 +27,51 @@ public class SetInfoUtil { private static void loadSetData() { ArrayList fData = FileUtil.readFile("res/blockdata/setdata.txt"); - if (fData.size() > 0) { - for (int i = 0; i < fData.size(); i++) { - String s = fData.get(i); - if (s.length() > 5) { - HashMap sm = new HashMap(); + for (String s : fData) { + if (s.length() < 6) { continue; } - String ss[] = s.split("\\|"); - for (int j = 0; j < ss.length; j++) { - String kv[] = ss[j].split(":"); - sm.put(kv[0], kv[1]); - } + String[] sParts = s.trim().split("\\|"); + String code = null, code2 = null, name = null; - setData.add(sm); + int index = -1; + String alias = null; + for (String sPart : sParts) { + String[] kv = sPart.split(":", 2); + String key = kv[0].toLowerCase(); + if ("code3".equals(key)) { + code = kv[1]; + } else if ("code2".equals(key)) { + code2 = kv[1]; + } else if ("name".equals(key)) { + name = kv[1]; + } else if ("index".equals(key)) { + index = Integer.parseInt(kv[1]); + } else if ("alias".equals(key)) { + alias = kv[1]; } } - + CardSet set = new CardSet(index, name, code, code2); + setsByCode.put(code, set); + if (alias != null) { setsByCode.put(alias, set); } + allSets.add(set); } + Collections.sort(allSets); } - /** - *

getSetCode2List.

- * - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getSetCode2List() { - ArrayList scl = new ArrayList(); - - if (setData.size() == 0) - loadSetData(); - - for (int i = 0; i < setData.size(); i++) - scl.add(setData.get(i).get("Code2")); - - return scl; + public static CardSet getSetByCode(final String code) { + if (setsByCode.isEmpty()) { loadSetData(); } + return setsByCode.get(code); + } + public static CardSet getSetByCodeOrThrow(final String code) { + if (setsByCode.isEmpty()) { loadSetData(); } + CardSet set = setsByCode.get(code); + if (null == set) { throw new RuntimeException(String.format("Set with code '%s' not found", code)); } + return set; } - /** - *

getSetCode3List.

- * - * @return a {@link java.util.ArrayList} object. - */ - public static ArrayList getSetCode3List() { - ArrayList scl = new ArrayList(); - - if (setData.size() == 0) - loadSetData(); - - for (int i = 0; i < setData.size(); i++) - scl.add(setData.get(i).get("Code3")); - - return scl; + public static List getCodeList() { + if (setsByCode.isEmpty()) { loadSetData(); } + return new ArrayList(setsByCode.keySet()); } /** @@ -77,101 +79,26 @@ public class SetInfoUtil { * * @return a {@link java.util.ArrayList} object. */ - public static ArrayList getSetNameList() { - ArrayList snl = new ArrayList(); + public static List getNameList() { + if (setsByCode.isEmpty()) { loadSetData(); } - if (setData.size() == 0) - loadSetData(); - - for (int i = 0; i < setData.size(); i++) - snl.add(setData.get(i).get("Name")); - - return snl; + return Predicate.getTrue(CardSet.class).select(allSets, CardSet.fn1, CardSet.fnGetName); } - /** - *

getSetCode2_SetName.

- * - * @param SetName a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getSetCode2_SetName(String SetName) { - if (setData.size() == 0) - loadSetData(); + public static String getCode3ByName(final String setName) { + if (setsByCode.isEmpty()) { loadSetData(); } - for (int i = 0; i < setData.size(); i++) - if (setData.get(i).get("Name").equals(SetName)) - return setData.get(i).get("Code2"); + for (CardSet s : setsByCode.values()) { + if (s.getName().equals(setName)) { return s.getCode(); } + } return ""; } - /** - *

getSetCode3_SetName.

- * - * @param SetName a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getSetCode3_SetName(String SetName) { - if (setData.size() == 0) - loadSetData(); - - for (int i = 0; i < setData.size(); i++) - if (setData.get(i).get("Name").equals(SetName)) - return setData.get(i).get("Code3"); - - return ""; - } - - /** - *

getSetCode2_SetCode3.

- * - * @param SetCode3 a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getSetCode2_SetCode3(String SetCode3) { - if (setData.size() == 0) - loadSetData(); - - for (int i = 0; i < setData.size(); i++) - if (setData.get(i).get("Code3").equals(SetCode3)) - return setData.get(i).get("Code2"); - - return ""; - } - - /** - *

getSetCode3_SetCode2.

- * - * @param SetCode2 a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getSetCode3_SetCode2(String SetCode2) { - if (setData.size() == 0) - loadSetData(); - - for (int i = 0; i < setData.size(); i++) - if (setData.get(i).get("Code2").equals(SetCode2)) - return setData.get(i).get("Code3"); - - return ""; - } - - /** - *

getSetName_SetCode2.

- * - * @param SetCode2 a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public static String getSetName_SetCode2(String SetCode2) { - if (setData.size() == 0) - loadSetData(); - - for (int i = 0; i < setData.size(); i++) - if (setData.get(i).get("Code2").equals(SetCode2)) - return setData.get(i).get("Name"); - - return ""; + public static String getCode2ByCode(final String code) { + if (setsByCode.isEmpty()) { loadSetData(); } + CardSet set = setsByCode.get(code); + return set == null ? "" : set.getCode2(); } /** @@ -180,15 +107,10 @@ public class SetInfoUtil { * @param SetCode3 a {@link java.lang.String} object. * @return a {@link java.lang.String} object. */ - public static String getSetName_SetCode3(String SetCode3) { - if (setData.size() == 0) - loadSetData(); - - for (int i = 0; i < setData.size(); i++) - if (setData.get(i).get("Code3").equals(SetCode3)) - return setData.get(i).get("Name"); - - return ""; + public static String getNameByCode(String code) { + if (setsByCode.isEmpty()) { loadSetData(); } + CardSet set = setsByCode.get(code); + return set == null ? "" : set.getName(); } /** @@ -197,28 +119,18 @@ public class SetInfoUtil { * @param alSI a {@link java.util.ArrayList} object. * @return a {@link java.lang.String} object. */ - public static String getMostRecentSet(ArrayList alSI) { - if (setData.size() == 0) - loadSetData(); + public static String getMostRecentSet(final ArrayList alSI) { + if (setsByCode.isEmpty()) { loadSetData(); } - int mostRecent = -1; + int size = alSI.size(); + if (size == 0) { return ""; } + if (size == 1) { return alSI.get(0).Code; } - for (SetInfo s : alSI) { - for (int j = 0; j < setData.size(); j++) { - if (setData.get(j).get("Code3").equals(s.Code)) { - if (j > mostRecent) { - mostRecent = j; - break; - } - } - } + CardSet[] sets = new CardSet[size]; + for (int i = 0; i < size; i++) { sets[i] = setsByCode.get(alSI.get(i).Code); } + Arrays.sort(sets); - } - - if (mostRecent > -1) - return setData.get(mostRecent).get("Code3"); - - return ""; + return sets[sets.length - 1].getCode(); } /** @@ -233,8 +145,7 @@ public class SetInfoUtil { for (int i = 0; i < SetList.size(); i++) { si = SetList.get(i); - if (si.Code.equals(SetCode)) - return si; + if (si.Code.equals(SetCode)) { return si; } } return null; @@ -246,16 +157,10 @@ public class SetInfoUtil { * @param SetCode a {@link java.lang.String} object. * @return a int. */ - public static int getSetIndex(String SetCode) { - if (setData.size() == 0) - loadSetData(); - - for (int i = 0; i < setData.size(); i++) { - if (setData.get(i).get("Code3").equals(SetCode)) - return Integer.parseInt(setData.get(i).get("Index")); - } - - return 0; + public static int getIndexByCode(final String code) { + if (setsByCode.isEmpty()) { loadSetData(); } + CardSet set = setsByCode.get(code); + return set == null ? 0 : set.getIndex(); } /** Constant blockData */ diff --git a/src/main/java/forge/TableSorter.java b/src/main/java/forge/TableSorter.java index 29e07f8b14c..20ef64d58c9 100644 --- a/src/main/java/forge/TableSorter.java +++ b/src/main/java/forge/TableSorter.java @@ -119,8 +119,8 @@ public class TableSorter implements Comparator, NewConstants { bCom = getValue(b); } else if (column == 7 && col7mod == true)//Set { - aCom = SetInfoUtil.getSetIndex(a.getCurSetCode()); - bCom = SetInfoUtil.getSetIndex(b.getCurSetCode()); + aCom = SetInfoUtil.getIndexByCode(a.getCurSetCode()); + bCom = SetInfoUtil.getIndexByCode(b.getCurSetCode()); } else if (column == 8)//AI { aCom = getAI(a); diff --git a/src/main/java/forge/card/CardManaCost.java b/src/main/java/forge/card/CardManaCost.java index ab3339ea472..0eab45247c9 100644 --- a/src/main/java/forge/card/CardManaCost.java +++ b/src/main/java/forge/card/CardManaCost.java @@ -4,8 +4,6 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import org.apache.commons.lang3.StringUtils; - /** *

CardManaCost class.

* diff --git a/src/main/java/forge/card/CardPrinted.java b/src/main/java/forge/card/CardPrinted.java index 1f699b9b2c1..c0a18d3be90 100644 --- a/src/main/java/forge/card/CardPrinted.java +++ b/src/main/java/forge/card/CardPrinted.java @@ -1,11 +1,13 @@ package forge.card; import java.util.Arrays; +import java.util.List; import net.slightlymagic.braids.util.lambda.Lambda1; import net.slightlymagic.maxmtg.Predicate; import forge.AllZone; import forge.Card; +import forge.CardUtil; /** *

CardReference class.

@@ -27,7 +29,10 @@ public final class CardPrinted implements Comparable { private final transient CardRarity rarity; // rarity is given in ctor when set is assigned // need this to be sure that different cased names won't break the system (and create uniqie cardref entries) - private final transient String _name_lcase; + private final transient String nameLcase; + + // image filename is calculated only after someone request it + private transient String imageFilename = null; // field RO accessors public String getName() { return name; } @@ -36,22 +41,27 @@ public final class CardPrinted implements Comparable { public boolean isFoil() { return foiled; } public CardRules getCard() { return card; } public CardRarity getRarity() { return rarity; } - + public String getImageFilename() { + if (imageFilename == null) { imageFilename = CardUtil.buildFilename(this); } + return imageFilename; + } - // Lambda to get rules for selects from list of printed cards + // Lambda to get rules for selects from list of printed cards public static final Lambda1 fnGetRules = new Lambda1() { @Override public CardRules apply(final CardPrinted from) { return from.card; } }; // Constructor is private. All non-foiled instances are stored in CardDb - private CardPrinted(final CardRules c, final String set, final CardRarity rare, final int index, boolean foil) { + private CardPrinted(final CardRules c, final String set, final CardRarity rare, + final int index, final boolean foil) + { card = c; name = c.getName(); cardSet = set; artIndex = index; foiled = foil; rarity = rare; - _name_lcase = name.toLowerCase(); + nameLcase = name.toLowerCase(); } /* package visibility */ @@ -81,7 +91,7 @@ public final class CardPrinted implements Comparable { @Override public int hashCode() { - int code = _name_lcase.hashCode() * 11 + cardSet.hashCode() * 59 + artIndex * 2; + int code = nameLcase.hashCode() * 11 + cardSet.hashCode() * 59 + artIndex * 2; if (foiled) { return code + 1; } return code; } @@ -93,13 +103,18 @@ public final class CardPrinted implements Comparable { public Card toForgeCard() { Card c = AllZone.getCardFactory().getCard(name, null); - c.setCurSetCode(getSet()); + if (c != null) { + c.setCurSetCode(getSet()); + c.setRandomPicture(artIndex); + c.setImageFilename(getImageFilename()); + } + // else throw "Unsupported card"; return c; } @Override public int compareTo(final CardPrinted o) { - int nameCmp = _name_lcase.compareTo(o._name_lcase); + int nameCmp = nameLcase.compareTo(o.nameLcase); if (0 != nameCmp) { return nameCmp; } // TODO: compare sets properly return cardSet.compareTo(o.cardSet); @@ -111,9 +126,9 @@ public final class CardPrinted implements Comparable { { return new PredicateRarity(value, isEqual); } - public static Predicate printedInSets(final String[] value) + public static Predicate printedInSets(final List value, final boolean shouldContain) { - return new PredicateSets(value); + return new PredicateSets(value, shouldContain); } private static class PredicateRarity extends Predicate { @@ -132,16 +147,20 @@ public final class CardPrinted implements Comparable { } private static class PredicateSets extends Predicate { - private final String[] sets; + private final List sets; + private final boolean mustContain; @Override public boolean isTrue(final CardPrinted card) { - return Arrays.binarySearch(sets, card.rarity) >= 0; + return sets.contains(card.cardSet) == mustContain; } - public PredicateSets(final String[] wantSets) { - sets = wantSets.clone(); - Arrays.sort(sets); + public PredicateSets(final List wantSets, boolean shouldContain) { + sets = wantSets; // maybe should make a copy here? + mustContain = shouldContain; } } + /** + * Pre-built predicates are stored here to allow their re-usage and easier access from code + */ public abstract static class Presets { // Think twice before using these, since rarity is a prop of printed card. public static final Predicate isCommon = rarity(true, CardRarity.Common); @@ -149,14 +168,12 @@ public final class CardPrinted implements Comparable { public static final Predicate isRare = rarity(true, CardRarity.Rare); public static final Predicate isMythicRare = rarity(true, CardRarity.MythicRare); public static final Predicate isRareOrMythic = Predicate.or(isRare, isMythicRare); - public static final Predicate isSpecial = rarity(true, CardRarity.Special); - public static final Predicate exceptLands = rarity(false, CardRarity.BasicLand); // TODO: Update this code on each rotation (or move this list to a file) public static final Predicate isStandard = printedInSets( - new String[] {"M12", "NPH", "MBS", "SOM", "M11", "ROE", "WWK", "ZEN"}); + Arrays.asList(new String[] {"M12", "NPH", "MBS", "SOM", "M11", "ROE", "WWK", "ZEN"}), true); } } diff --git a/src/main/java/forge/card/CardRulesReader.java b/src/main/java/forge/card/CardRulesReader.java index 18d1707bdbf..c076ce0457c 100644 --- a/src/main/java/forge/card/CardRulesReader.java +++ b/src/main/java/forge/card/CardRulesReader.java @@ -1,25 +1,11 @@ package forge.card; -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.Charset; -//import java.util.Enumeration; -import java.util.Locale; import java.util.Map; import java.util.TreeMap; -import java.util.regex.Pattern; - import org.apache.commons.lang3.StringUtils; -//import java.util.zip.ZipEntry; -//import java.util.zip.ZipFile; import forge.card.CardManaCost.ManaParser; -import forge.error.ErrorViewer; -import forge.properties.NewConstants; /**