From 9d1eb100277f9c194aed0c20c84245fd3ede551a Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Thu, 8 Sep 2011 15:02:01 +0000 Subject: [PATCH] Added formats filter to deckeditor removed hardcoded formats where they were known to me --- .gitattributes | 2 + res/blockdata/formats.txt | 6 +- src/main/java/forge/Gui_WinLose.java | 20 ++--- src/main/java/forge/SetUtils.java | 75 +++++++++++++------ src/main/java/forge/card/CardBlock.java | 34 +++++++-- src/main/java/forge/card/CardPrinted.java | 47 +++++++----- src/main/java/forge/card/CardRules.java | 41 +++++----- src/main/java/forge/card/CardSet.java | 5 ++ src/main/java/forge/game/GameFormat.java | 51 +++++++++++++ .../java/forge/gui/deckeditor/DeckEditor.java | 14 ---- .../deckeditor/FilterNameTypeSetPanel.java | 22 ++++-- src/main/java/forge/quest/data/QuestData.java | 5 +- .../java/forge/quest/data/QuestUtilCards.java | 4 +- .../net/slightlymagic/maxmtg/Predicate.java | 10 +-- .../slightlymagic/maxmtg/PredicateString.java | 24 ++++++ 15 files changed, 237 insertions(+), 123 deletions(-) create mode 100644 src/main/java/forge/game/GameFormat.java create mode 100644 src/main/java/net/slightlymagic/maxmtg/PredicateString.java diff --git a/.gitattributes b/.gitattributes index 1800752e6f3..778a76d62a9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -9781,6 +9781,7 @@ src/main/java/forge/error/ErrorViewer.java svneol=native#text/plain src/main/java/forge/error/ExceptionHandler.java svneol=native#text/plain src/main/java/forge/error/package-info.java svneol=native#text/plain src/main/java/forge/game/GameEndReason.java -text +src/main/java/forge/game/GameFormat.java -text src/main/java/forge/game/GameLossReason.java -text src/main/java/forge/game/GamePlayerRating.java -text src/main/java/forge/game/GameSummary.java svneol=native#text/plain @@ -9928,6 +9929,7 @@ src/main/java/net/slightlymagic/braids/util/progress_monitor/BraidsProgressMonit src/main/java/net/slightlymagic/braids/util/progress_monitor/StderrProgressMonitor.java svneol=native#text/plain src/main/java/net/slightlymagic/braids/util/progress_monitor/package-info.java svneol=native#text/plain src/main/java/net/slightlymagic/maxmtg/Predicate.java -text +src/main/java/net/slightlymagic/maxmtg/PredicateString.java -text src/main/java/treeProperties/PropertyElement.java svneol=native#text/plain src/main/java/treeProperties/PropertyType.java svneol=native#text/plain src/main/java/treeProperties/TreeProperties.java svneol=native#text/plain diff --git a/res/blockdata/formats.txt b/res/blockdata/formats.txt index 3d4c2d69aad..f4362b78fb4 100644 --- a/res/blockdata/formats.txt +++ b/res/blockdata/formats.txt @@ -1,5 +1,5 @@ -Name:Standard|Sets:ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12|Banned:Storeforge Mystic;Jace, the Mind Sculptor +Name:Standard|Sets:ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12|Banned:Storeforge Mystic; Jace, the Mind Sculptor Name:Extended|Sets:LRW, EVE, SHM, MOR, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12 Name:Modern|Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, PLC, FUT, 10E, LRW, EVE, SHM, MOR, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12|Banned:Ancestral Vision; Ancient Den; Bitterblossom; Chrome Mox; Dark Depths; Dread Return; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Hypergenesis; Jace, the Mind Sculptor; Mental Misstep; Seat of the Synod; Sensei's Divining Top; Stoneforge Mystic; Skullclamp; Sword of the Meek; Tree of Tales; Umezawa's Jitte; Valakut, the Molten Pinnacle; Vault of Whispers -Name:Legacy|Sets:(all)|Banned:Amulet of Quoz; Ancestral Recall; Balance; Bazaar of Baghdad; Black Lotus; Black Vise; Bronze Tablet; Channel; Chaos Orb; Contract from Below; Darkpact; Demonic Attorney; Demonic Consultation; Demonic Tutor; Earthcraft; Falling Star; Fastbond; Flash; Frantic Search; Goblin Recruiter; Gush; Hermit Druid; Imperial Seal; Jeweled Bird; Land Tax; Library of Alexandria; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mind Twist; Mind's Desire; Mishra's Workshop; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystical Tutor; Necropotence; Oath of Druids; Rebirth; Shahrazad; Skullclamp; Sol Ring; Strip Mine; Survival of the Fittest; Tempest Efreet; Time Vault; Time Walk; Timetwister; Timmerian Fiends; Tinker; Tolarian Academy; Vampiric Tutor; Wheel of Fortune; Windfall; Worldgorger Dragon; Yawgmoth's Bargain; Yawgmoth's Will -Name:Vintage|Sets:(all)|Banned:Amulet of Quoz; Bronze Tablet; Chaos Orb; Contract from Below; Darkpact; Demonic Attorney; Falling Star; Jeweled Bird; Rebirth; Shahrazad; Tempest Efreet; Timmerian Fiends \ No newline at end of file +Name:Legacy|Banned:Amulet of Quoz; Ancestral Recall; Balance; Bazaar of Baghdad; Black Lotus; Black Vise; Bronze Tablet; Channel; Chaos Orb; Contract from Below; Darkpact; Demonic Attorney; Demonic Consultation; Demonic Tutor; Earthcraft; Falling Star; Fastbond; Flash; Frantic Search; Goblin Recruiter; Gush; Hermit Druid; Imperial Seal; Jeweled Bird; Land Tax; Library of Alexandria; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mind Twist; Mind's Desire; Mishra's Workshop; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystical Tutor; Necropotence; Oath of Druids; Rebirth; Shahrazad; Skullclamp; Sol Ring; Strip Mine; Survival of the Fittest; Tempest Efreet; Time Vault; Time Walk; Timetwister; Timmerian Fiends; Tinker; Tolarian Academy; Vampiric Tutor; Wheel of Fortune; Windfall; Worldgorger Dragon; Yawgmoth's Bargain; Yawgmoth's Will +Name:Vintage|Banned:Amulet of Quoz; Bronze Tablet; Chaos Orb; Contract from Below; Darkpact; Demonic Attorney; Falling Star; Jeweled Bird; Rebirth; Shahrazad; Tempest Efreet; Timmerian Fiends \ No newline at end of file diff --git a/src/main/java/forge/Gui_WinLose.java b/src/main/java/forge/Gui_WinLose.java index 40325471012..85e9c1e4298 100644 --- a/src/main/java/forge/Gui_WinLose.java +++ b/src/main/java/forge/Gui_WinLose.java @@ -3,12 +3,14 @@ package forge; import forge.card.CardPrinted; import forge.error.ErrorViewer; import forge.game.GameEndReason; +import forge.game.GameFormat; import forge.game.GameLossReason; import forge.game.GamePlayerRating; import forge.game.GameSummary; import forge.game.PlayerIndex; import forge.gui.CardListViewer; import forge.gui.GuiUtils; +import forge.gui.ListChooser; import forge.properties.ForgeProps; import forge.properties.NewConstants; import forge.properties.NewConstants.LANG.Gui_WinLose.WINLOSE_TEXT; @@ -391,19 +393,11 @@ public class Gui_WinLose extends JFrame implements NewConstants { * TODO Write javadoc for this method. */ protected final void giveBooster() { - String[] boosterTypes = {"Legacy", "Extended", "Standard"}; - String boosterType = GuiUtils.getChoice("Choose prize booster format", boosterTypes); - List setsToGive = null; - if (boosterTypes[2].equals(boosterType)) { // T2 - setsToGive = new ArrayList(); - setsToGive.addAll(Arrays.asList(new String[]{"M12", "NPH", "MBS", "M11", "ROE", "WWK", "ZEN"})); - } - if (boosterTypes[1].equals(boosterType)) { // Ext - setsToGive = new ArrayList(); - setsToGive.addAll(Arrays.asList(new String[]{"M12","NPH","MBS","M11","ROE","WWK","ZEN","M10","ARB","CFX","ALA","MOR","SHM","EVE","LRW"})); - } - - ArrayList cardsWon = model.quest.getCards().addCards(setsToGive); + ListChooser ch = new ListChooser("Choose prize booster format", 1, SetUtils.getFormats()); + ch.show(); + GameFormat selected = ch.getSelectedValue(); + + ArrayList cardsWon = model.quest.getCards().addCards(selected.getFilter()); ImageIcon icon = getIcon("BookIcon.png"); CardListViewer c = new CardListViewer("Booster", "You have won the following new cards", cardsWon, icon); c.show(); diff --git a/src/main/java/forge/SetUtils.java b/src/main/java/forge/SetUtils.java index 9ff22bad451..4607c4e0578 100644 --- a/src/main/java/forge/SetUtils.java +++ b/src/main/java/forge/SetUtils.java @@ -1,9 +1,11 @@ package forge; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.Map; import org.apache.commons.lang3.StringUtils; @@ -11,6 +13,7 @@ import net.slightlymagic.maxmtg.Predicate; import forge.card.CardBlock; import forge.card.CardSet; +import forge.game.GameFormat; /** *

SetInfoUtil class.

@@ -25,14 +28,29 @@ public final class SetUtils { } /** Constant setData. */ - private static HashMap setsByCode = new HashMap(); + private static Map setsByCode = new HashMap(); private static List allSets = new ArrayList(); private static List allBlocks = new ArrayList(); + + private static List formats = new ArrayList(); + private static GameFormat fmtStandard = null; + private static GameFormat fmtExtended = null; + private static GameFormat fmtModern = null; + + public static GameFormat getStandard() { return fmtStandard; } + public static GameFormat getExtended() { return fmtExtended; } + public static GameFormat getModern() { return fmtModern; } + // list are immutable, no worries + public static List getFormats() { return formats; } + public static List getBlocks() { return allBlocks; } + public static List getAllSets() { return allSets; } + // Perform that first of all static { loadSetData(); loadBlockData(); + loadFormatData(); } public static CardSet getSetByCode(final String code) { @@ -45,33 +63,12 @@ public final class SetUtils { return set; } - // deckeditor again - public static List getNameList() { - return Predicate.getTrue(CardSet.class).select(allSets, CardSet.fn1, CardSet.fnGetName); - } - - // deckeditor needs this - public static String getCode3ByName(final String setName) { - for (CardSet s : setsByCode.values()) { - if (s.getName().equals(setName)) { return s.getCode(); } - } - - return ""; - } - - // used by image generating code public static String getCode2ByCode(final String code) { CardSet set = setsByCode.get(code); return set == null ? "" : set.getCode2(); } - public static List getBlocks() { - if (allBlocks.isEmpty()) { loadBlockData(); } - return Collections.unmodifiableList(allBlocks); - } - - // parser code - quite boring. private static void loadSetData() { ArrayList fData = FileUtil.readFile("res/blockdata/setdata.txt"); @@ -105,6 +102,7 @@ public final class SetUtils { allSets.add(set); } Collections.sort(allSets); + allSets = Collections.unmodifiableList(allSets); } @@ -144,6 +142,39 @@ public final class SetUtils { allBlocks.add(new CardBlock(index, name, sets , landSet, draftBoosters, sealedBoosters)); } Collections.reverse(allBlocks); + allBlocks = Collections.unmodifiableList(allBlocks); + } + + private static void loadFormatData() { + ArrayList fData = FileUtil.readFile("res/blockdata/formats.txt"); + + for (String s : fData) { + if (StringUtils.isBlank(s)) { continue; } + + String name = null; + List sets = new ArrayList(); // default: all sets allowed + List bannedCards = new ArrayList(); // default: nothing banned + + String[] sParts = s.trim().split("\\|"); + for (String sPart : sParts) { + String[] kv = sPart.split(":", 2); + String key = kv[0].toLowerCase(); + if ("name".equals(key)) { + name = kv[1]; + } else if ("sets".equals(key)) { + sets.addAll(Arrays.asList(kv[1].split(", "))); + } else if ("banned".equals(key)) { + bannedCards.addAll(Arrays.asList(kv[1].split("; "))); + } + } + if( name == null ) { throw new RuntimeException("Format must have a name! Check formats.txt file"); } + GameFormat thisFormat = new GameFormat(name, sets, bannedCards); + if ( name.equalsIgnoreCase("Standard") ) { fmtStandard = thisFormat; } + if ( name.equalsIgnoreCase("Modern") ) { fmtModern = thisFormat; } + if ( name.equalsIgnoreCase("Extended") ) { fmtExtended = thisFormat; } + formats.add(thisFormat); + } + formats = Collections.unmodifiableList(formats); } } diff --git a/src/main/java/forge/card/CardBlock.java b/src/main/java/forge/card/CardBlock.java index d160d2101da..de2d49a3411 100644 --- a/src/main/java/forge/card/CardBlock.java +++ b/src/main/java/forge/card/CardBlock.java @@ -1,11 +1,15 @@ package forge.card; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import net.slightlymagic.maxmtg.Predicate; + /** * This is a CardBlock class. */ -public class CardBlock implements Comparable { +public final class CardBlock implements Comparable { private static final CardSet[] EMPTY_SET_ARRAY = new CardSet[]{}; private final int orderNum; @@ -14,6 +18,7 @@ public class CardBlock implements Comparable { private final CardSet landSet; private final int cntBoostersDraft; private final int cntBoostersSealed; + private Predicate filter = null; public CardBlock(final int index, final String name, final List sets, final CardSet landSet, final int cntBoostersDraft, final int cntBoostersSealed) { @@ -25,25 +30,40 @@ public class CardBlock implements Comparable { this.cntBoostersSealed = cntBoostersSealed; } - public final String getName() { + public String getName() { return name; } - public final CardSet[] getSets() { + public CardSet[] getSets() { return sets; } - public final CardSet getLandSet() { + public CardSet getLandSet() { return landSet; } - public final int getCntBoostersDraft() { + public int getCntBoostersDraft() { return cntBoostersDraft; } - public final int getCntBoostersSealed() { + public int getCntBoostersSealed() { return cntBoostersSealed; } + + public Predicate getFilter() + { + if (filter == null) { filter = buildFilter(); } + return filter; + } + + private Predicate buildFilter() + { + List setCodes = new ArrayList(); + for (int i = 0; i < sets.length; i++) { + setCodes.add(sets[i].getCode()); + } + return CardPrinted.Predicates.printedInSets(setCodes, true); + } @Override public int hashCode() { @@ -72,6 +92,6 @@ public class CardBlock implements Comparable { } @Override - public String toString() { return name; } + public String toString() { return name + " (block)"; } } diff --git a/src/main/java/forge/card/CardPrinted.java b/src/main/java/forge/card/CardPrinted.java index 305a792b6b4..2740ea279ab 100644 --- a/src/main/java/forge/card/CardPrinted.java +++ b/src/main/java/forge/card/CardPrinted.java @@ -3,11 +3,12 @@ package forge.card; import java.util.Arrays; import java.util.List; -import org.apache.commons.lang3.StringUtils; +import org.apache.axis.utils.ArrayUtil; +import org.apache.commons.lang3.ArrayUtils; import net.slightlymagic.braids.util.lambda.Lambda1; import net.slightlymagic.maxmtg.Predicate; -import net.slightlymagic.maxmtg.Predicate.StringOp; +import net.slightlymagic.maxmtg.PredicateString; import forge.AllZone; import forge.Card; import forge.CardUtil; @@ -146,9 +147,12 @@ public final class CardPrinted implements Comparable { } return new PredicateSets(Arrays.asList(new String[]{value}), true); } - public static Predicate name(final StringOp op, final String what) { + public static Predicate name(final PredicateString.StringOp op, final String what) { return new PredicateName(op, what); } + public static Predicate namesExcept(final List what) { + return new PredicateNamesExcept(what); + } private static class PredicateRarity extends Predicate { private final CardRarity operand; @@ -177,31 +181,38 @@ public final class CardPrinted implements Comparable { } } - private static class PredicateName extends Predicate { + private static class PredicateName extends PredicateString { private final String operand; - private final StringOp operator; @Override public boolean isTrue(final CardPrinted card) { return op(card.getName(), operand); } - private boolean op(final String op1, final String op2) { - switch (operator) { - case CONTAINS: return StringUtils.containsIgnoreCase(op1, op2); - case NOT_CONTAINS: return !StringUtils.containsIgnoreCase(op1, op2); - case EQUALS: return op1.equalsIgnoreCase(op2); - default: return false; - } - } - - public PredicateName(final StringOp operator, final String operand) + public PredicateName(final PredicateString.StringOp operator, final String operand) { + super(operator); this.operand = operand; - this.operator = operator; } } + + private static class PredicateNamesExcept extends PredicateString { + private final String[] operand; + @Override + public boolean isTrue(final CardPrinted card) { + for(int i = 0; i < operand.length; i++) { + if ( op(card.getName(), operand[i]) ) return false; + } + return true; + } + + public PredicateNamesExcept(final List operand) + { + super(StringOp.EQUALS); + this.operand = operand.toArray(ArrayUtils.EMPTY_STRING_ARRAY); + } + } /** * Pre-built predicates are stored here to allow their re-usage and easier access from code. */ @@ -215,10 +226,6 @@ public final class CardPrinted implements Comparable { 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( - Arrays.asList(new String[] {"M12", "NPH", "MBS", "SOM", "M11", "ROE", "WWK", "ZEN"}), true); - public static final Predicate isTrue = Predicate.getTrue(CardPrinted.class); } } diff --git a/src/main/java/forge/card/CardRules.java b/src/main/java/forge/card/CardRules.java index f8d6d85810c..bbb15707efe 100644 --- a/src/main/java/forge/card/CardRules.java +++ b/src/main/java/forge/card/CardRules.java @@ -9,7 +9,7 @@ import java.util.Set; import net.slightlymagic.maxmtg.Predicate; import net.slightlymagic.maxmtg.Predicate.ComparableOp; import net.slightlymagic.maxmtg.Predicate.PredicatesOp; -import net.slightlymagic.maxmtg.Predicate.StringOp; +import net.slightlymagic.maxmtg.PredicateString; import org.apache.commons.lang3.StringUtils; @@ -139,21 +139,21 @@ public final class CardRules { } // Power // Toughness - public static Predicate rules(final StringOp op, final String what) { + public static Predicate rules(final PredicateString.StringOp op, final String what) { return new LeafString(LeafString.CardField.RULES, op, what); } - public static Predicate name(final StringOp op, final String what) { + public static Predicate name(final PredicateString.StringOp op, final String what) { return new LeafString(LeafString.CardField.NAME, op, what); } - public static Predicate subType(final StringOp op, final String what) { + public static Predicate subType(final PredicateString.StringOp op, final String what) { return new LeafString(LeafString.CardField.SUBTYPE, op, what); } - public static Predicate joinedType(final StringOp op, final String what) { + public static Predicate joinedType(final PredicateString.StringOp op, final String what) { return new LeafString(LeafString.CardField.JOINED_TYPE, op, what); } - public static Predicate wasPrintedInSet(final String setCode) { - return new PredicateExitsInSet(setCode); + public static Predicate wasPrintedInSets(final List setCodes) { + return new PredicateExitsInSets(setCodes); } public static Predicate coreType(final boolean isEqual, final String what) @@ -191,7 +191,7 @@ public final class CardRules { return new LeafColor(LeafColor.ColorOperator.CountColorsGreaterOrEqual, cntColors); } - private static class LeafString extends Predicate { + private static class LeafString extends PredicateString { public enum CardField { RULES, NAME, @@ -200,7 +200,6 @@ public final class CardRules { } private final String operand; - private final StringOp operator; private final CardField field; @Override @@ -222,20 +221,11 @@ public final class CardRules { } } - private boolean op(final String op1, final String op2) { - switch (operator) { - case CONTAINS: return StringUtils.containsIgnoreCase(op1, op2); - case NOT_CONTAINS: return !StringUtils.containsIgnoreCase(op1, op2); - case EQUALS: return op1.equalsIgnoreCase(op2); - default: return false; - } - } - public LeafString(final CardField field, final StringOp operator, final String operand) { + super(operator); this.field = field; this.operand = operand; - this.operator = operator; } } @@ -353,15 +343,18 @@ public final class CardRules { } } - private static class PredicateExitsInSet extends Predicate { - private final String setCode; - public PredicateExitsInSet(final String setsCode) { - setCode = setsCode; + private static class PredicateExitsInSets extends Predicate { + private final List sets; + public PredicateExitsInSets(final List wantSets) { + sets = wantSets; // maybe should make a copy here? } @Override public boolean isTrue(final CardRules subject) { - return subject.setsPrinted.containsKey(setCode); + for (String s : sets) { + if (subject.setsPrinted.containsKey(s)) return true; + } + return false; } } diff --git a/src/main/java/forge/card/CardSet.java b/src/main/java/forge/card/CardSet.java index fed03350a8d..b192038f37f 100644 --- a/src/main/java/forge/card/CardSet.java +++ b/src/main/java/forge/card/CardSet.java @@ -52,4 +52,9 @@ public final class CardSet implements Comparable { // immutable CardSet other = (CardSet) obj; return other.name.equals(this.name) && this.code.equals(other.code); } + + @Override + public String toString() { + return this.name + " (set)"; + } } diff --git a/src/main/java/forge/game/GameFormat.java b/src/main/java/forge/game/GameFormat.java new file mode 100644 index 00000000000..592e5fa0c67 --- /dev/null +++ b/src/main/java/forge/game/GameFormat.java @@ -0,0 +1,51 @@ +package forge.game; + +import java.util.Collections; +import java.util.List; + +import net.slightlymagic.maxmtg.Predicate; + +import forge.card.CardPrinted; +import forge.card.CardRules; + +/** + * TODO: Write javadoc for this type. + * + */ +public final class GameFormat { + + private final String name; + // contains allowed sets, when empty allows all sets + private final List allowedSetCodes; + private final List bannedCardNames; + + private final Predicate filter; + + + public GameFormat(final String fName, final List sets, final List bannedCards) + { + name = fName; + allowedSetCodes = Collections.unmodifiableList(sets); + bannedCardNames = Collections.unmodifiableList(bannedCards); + filter = buildFilter(); + } + + + private Predicate buildFilter() { + Predicate banNames = CardPrinted.Predicates.namesExcept(bannedCardNames); + Predicate allowSets = allowedSetCodes == null || allowedSetCodes.isEmpty() + ? CardPrinted.Predicates.Presets.isTrue + : Predicate.brigde(CardRules.Predicates.wasPrintedInSets(allowedSetCodes), CardPrinted.fnGetRules); + return Predicate.and(banNames, allowSets); + } + + public String getName() { return name; } + public Predicate getFilter() { return filter; } + + @Override + public String toString() + { + return name + " (format)"; + } + +} diff --git a/src/main/java/forge/gui/deckeditor/DeckEditor.java b/src/main/java/forge/gui/deckeditor/DeckEditor.java index dc227990547..83f4b15aa17 100644 --- a/src/main/java/forge/gui/deckeditor/DeckEditor.java +++ b/src/main/java/forge/gui/deckeditor/DeckEditor.java @@ -4,8 +4,6 @@ import java.awt.Container; import java.awt.Font; import java.awt.Frame; import java.awt.event.ActionEvent; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; @@ -15,23 +13,11 @@ import java.util.List; import javax.swing.JButton; import javax.swing.JCheckBox; -import javax.swing.JComboBox; import javax.swing.JLabel; -import javax.swing.JTextField; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -//import javax.swing.text.BadLocationException; -//import javax.swing.text.Document; - -import org.apache.commons.lang3.StringUtils; - import net.miginfocom.swing.MigLayout; import net.slightlymagic.maxmtg.Predicate; -import net.slightlymagic.maxmtg.Predicate.StringOp; import forge.Command; import forge.Constant; -import forge.SetUtils; -import forge.card.CardRules; import forge.card.CardDb; import forge.card.CardPrinted; import forge.deck.Deck; diff --git a/src/main/java/forge/gui/deckeditor/FilterNameTypeSetPanel.java b/src/main/java/forge/gui/deckeditor/FilterNameTypeSetPanel.java index a7dc0cd9e87..7cfcd3261d2 100644 --- a/src/main/java/forge/gui/deckeditor/FilterNameTypeSetPanel.java +++ b/src/main/java/forge/gui/deckeditor/FilterNameTypeSetPanel.java @@ -12,13 +12,15 @@ import javax.swing.event.DocumentListener; import net.miginfocom.swing.MigLayout; import net.slightlymagic.maxmtg.Predicate; -import net.slightlymagic.maxmtg.Predicate.StringOp; +import net.slightlymagic.maxmtg.PredicateString.StringOp; import org.apache.commons.lang3.StringUtils; import forge.SetUtils; import forge.card.CardPrinted; import forge.card.CardRules; +import forge.card.CardSet; +import forge.game.GameFormat; /** * A panel that holds Name, Type, Rules text fields aligned horizontally together with set filter @@ -58,9 +60,13 @@ public class FilterNameTypeSetPanel extends JComponent{ searchSetCombo.removeAllItems(); - searchSetCombo.addItem(""); - for (int i = 0; i < SetUtils.getNameList().size(); i++) - searchSetCombo.addItem(SetUtils.getNameList().get(i)); + searchSetCombo.addItem("(all sets and formats)"); + for (GameFormat s : SetUtils.getFormats()) { + searchSetCombo.addItem(s); + } + for (CardSet s : SetUtils.getAllSets()) { + searchSetCombo.addItem(s); + } this.add(searchSetCombo, "wmin 150, grow"); } @@ -88,8 +94,12 @@ public class FilterNameTypeSetPanel extends JComponent{ } if (searchSetCombo.getSelectedIndex() != 0) { - String setCode = SetUtils.getCode3ByName(searchSetCombo.getSelectedItem().toString()); - rules.add(CardPrinted.Predicates.printedInSets(setCode)); + Object selected = searchSetCombo.getSelectedItem(); + if (selected instanceof CardSet) { + rules.add(CardPrinted.Predicates.printedInSets(((CardSet) selected).getCode())); + } else if (selected instanceof GameFormat) { + rules.add(((GameFormat) selected).getFilter()); + } } switch (rules.size()){ diff --git a/src/main/java/forge/quest/data/QuestData.java b/src/main/java/forge/quest/data/QuestData.java index 18e633f6ed3..6515b217e7f 100644 --- a/src/main/java/forge/quest/data/QuestData.java +++ b/src/main/java/forge/quest/data/QuestData.java @@ -1,6 +1,7 @@ package forge.quest.data; import forge.MyRandom; +import forge.SetUtils; import forge.card.CardPool; import forge.card.CardPrinted; import forge.deck.Deck; @@ -122,9 +123,7 @@ public final class QuestData { public void newGame(final int diff, final String m0de, final boolean standardStart) { setDifficulty(diff); - Predicate filter = standardStart - ? CardPrinted.Predicates.Presets.isStandard - : Predicate.getTrue(CardPrinted.class); + Predicate filter = standardStart ? SetUtils.getStandard().getFilter() : CardPrinted.Predicates.Presets.isTrue; myCards.setupNewGameCardPool(filter, diff); credits = QuestPreferences.getStartingCredits(); diff --git a/src/main/java/forge/quest/data/QuestUtilCards.java b/src/main/java/forge/quest/data/QuestUtilCards.java index 38aeb553e0e..0e994583186 100644 --- a/src/main/java/forge/quest/data/QuestUtilCards.java +++ b/src/main/java/forge/quest/data/QuestUtilCards.java @@ -44,13 +44,11 @@ public final class QuestUtilCards { /** *

addCards.

*/ - public ArrayList addCards(final List setsFilter) { + public ArrayList addCards(final Predicate fSets) { int nCommon = QuestPreferences.getNumCommon(); int nUncommon = QuestPreferences.getNumUncommon(); int nRare = QuestPreferences.getNumRare(); - Predicate fSets = CardPrinted.Predicates.printedInSets(setsFilter, true); - ArrayList newCards = new ArrayList(); newCards.addAll(QuestBoosterPack.generateCards(fSets, nCommon, CardRarity.Common, null)); newCards.addAll(QuestBoosterPack.generateCards(fSets, nUncommon, CardRarity.Uncommon, null)); diff --git a/src/main/java/net/slightlymagic/maxmtg/Predicate.java b/src/main/java/net/slightlymagic/maxmtg/Predicate.java index a83234826e8..1d62f99c401 100644 --- a/src/main/java/net/slightlymagic/maxmtg/Predicate.java +++ b/src/main/java/net/slightlymagic/maxmtg/Predicate.java @@ -30,12 +30,6 @@ public abstract class Predicate { */ public enum ComparableOp { EQUALS, NOT_EQUALS, GREATER_THAN, LESS_THAN, GT_OR_EQUAL, LT_OR_EQUAL } - /** - * Possible operators for string operands. - * @author Max - * - */ - public enum StringOp { CONTAINS, NOT_CONTAINS, EQUALS } // This is the main method, predicates were made for. public abstract boolean isTrue(T subject); @@ -214,7 +208,7 @@ public abstract class Predicate { // Predefined operators: and, or public static Predicate and(final Predicate operand1, final Predicate operand2) { if (operand1.is1()) { return operand2; } - if (operand2.is1()) { return operand1; } + if (operand2 == null || operand2.is1()) { return operand1; } return new NodeAnd(operand1, operand2); } public static Predicate and(final Iterable> operand) { return new MultiNodeAnd(operand); } @@ -330,7 +324,7 @@ public abstract class Predicate { @Override public boolean isTrue(final T card) { return bValue; } public LeafConstant(final boolean value) { bValue = value; } } - + public static Predicate getTrue(final Class cls) { return new LeafConstant(true); } public static Predicate getFalse(final Class cls) { return new LeafConstant(false); } } diff --git a/src/main/java/net/slightlymagic/maxmtg/PredicateString.java b/src/main/java/net/slightlymagic/maxmtg/PredicateString.java new file mode 100644 index 00000000000..e0d26f27e03 --- /dev/null +++ b/src/main/java/net/slightlymagic/maxmtg/PredicateString.java @@ -0,0 +1,24 @@ +package net.slightlymagic.maxmtg; + +import org.apache.commons.lang3.StringUtils; + +/** + * Special predicate class to perform string operations. + */ +public abstract class PredicateString extends Predicate { + /** Possible operators for string operands. */ + public enum StringOp { CONTAINS, NOT_CONTAINS, EQUALS, NOT_EQUALS } + + protected final StringOp operator; + protected final boolean op(final String op1, final String op2) { + switch (operator) { + case CONTAINS: return StringUtils.containsIgnoreCase(op1, op2); + case NOT_CONTAINS: return !StringUtils.containsIgnoreCase(op1, op2); + case EQUALS: return op1.equalsIgnoreCase(op2); + case NOT_EQUALS: return op1.equalsIgnoreCase(op2); + default: return false; + } + } + + public PredicateString(final StringOp operator) {this.operator = operator; } +} \ No newline at end of file