Added formats filter to deckeditor

removed hardcoded formats where they were known to me
This commit is contained in:
Maxmtg
2011-09-08 15:02:01 +00:00
parent 4af523872c
commit 9d1eb10027
15 changed files with 237 additions and 123 deletions

2
.gitattributes vendored
View File

@@ -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

View File

@@ -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
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

View File

@@ -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<String> setsToGive = null;
if (boosterTypes[2].equals(boosterType)) { // T2
setsToGive = new ArrayList<String>();
setsToGive.addAll(Arrays.asList(new String[]{"M12", "NPH", "MBS", "M11", "ROE", "WWK", "ZEN"}));
}
if (boosterTypes[1].equals(boosterType)) { // Ext
setsToGive = new ArrayList<String>();
setsToGive.addAll(Arrays.asList(new String[]{"M12","NPH","MBS","M11","ROE","WWK","ZEN","M10","ARB","CFX","ALA","MOR","SHM","EVE","LRW"}));
}
ArrayList<CardPrinted> cardsWon = model.quest.getCards().addCards(setsToGive);
ListChooser<GameFormat> ch = new ListChooser<GameFormat>("Choose prize booster format", 1, SetUtils.getFormats());
ch.show();
GameFormat selected = ch.getSelectedValue();
ArrayList<CardPrinted> 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();

View File

@@ -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;
/**
* <p>SetInfoUtil class.</p>
@@ -25,14 +28,29 @@ public final class SetUtils {
}
/** Constant <code>setData</code>. */
private static HashMap<String, CardSet> setsByCode = new HashMap<String, CardSet>();
private static Map<String, CardSet> setsByCode = new HashMap<String, CardSet>();
private static List<CardSet> allSets = new ArrayList<CardSet>();
private static List<CardBlock> allBlocks = new ArrayList<CardBlock>();
private static List<GameFormat> formats = new ArrayList<GameFormat>();
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<GameFormat> getFormats() { return formats; }
public static List<CardBlock> getBlocks() { return allBlocks; }
public static List<CardSet> 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<String> 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<CardBlock> getBlocks() {
if (allBlocks.isEmpty()) { loadBlockData(); }
return Collections.unmodifiableList(allBlocks);
}
// parser code - quite boring.
private static void loadSetData() {
ArrayList<String> 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<String> fData = FileUtil.readFile("res/blockdata/formats.txt");
for (String s : fData) {
if (StringUtils.isBlank(s)) { continue; }
String name = null;
List<String> sets = new ArrayList<String>(); // default: all sets allowed
List<String> bannedCards = new ArrayList<String>(); // 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);
}
}

View File

@@ -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<CardBlock> {
public final class CardBlock implements Comparable<CardBlock> {
private static final CardSet[] EMPTY_SET_ARRAY = new CardSet[]{};
private final int orderNum;
@@ -14,6 +18,7 @@ public class CardBlock implements Comparable<CardBlock> {
private final CardSet landSet;
private final int cntBoostersDraft;
private final int cntBoostersSealed;
private Predicate<CardPrinted> filter = null;
public CardBlock(final int index, final String name, final List<CardSet> sets,
final CardSet landSet, final int cntBoostersDraft, final int cntBoostersSealed) {
@@ -25,25 +30,40 @@ public class CardBlock implements Comparable<CardBlock> {
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<CardPrinted> getFilter()
{
if (filter == null) { filter = buildFilter(); }
return filter;
}
private Predicate<CardPrinted> buildFilter()
{
List<String> setCodes = new ArrayList<String>();
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<CardBlock> {
}
@Override
public String toString() { return name; }
public String toString() { return name + " (block)"; }
}

View File

@@ -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<CardPrinted> {
}
return new PredicateSets(Arrays.asList(new String[]{value}), true);
}
public static Predicate<CardPrinted> name(final StringOp op, final String what) {
public static Predicate<CardPrinted> name(final PredicateString.StringOp op, final String what) {
return new PredicateName(op, what);
}
public static Predicate<CardPrinted> namesExcept(final List<String> what) {
return new PredicateNamesExcept(what);
}
private static class PredicateRarity extends Predicate<CardPrinted> {
private final CardRarity operand;
@@ -177,31 +181,38 @@ public final class CardPrinted implements Comparable<CardPrinted> {
}
}
private static class PredicateName extends Predicate<CardPrinted> {
private static class PredicateName extends PredicateString<CardPrinted> {
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<CardPrinted> {
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<String> 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<CardPrinted> {
public static final Predicate<CardPrinted> isSpecial = rarity(true, CardRarity.Special);
public static final Predicate<CardPrinted> exceptLands = rarity(false, CardRarity.BasicLand);
// TODO: Update this code on each rotation (or move this list to a file)
public static final Predicate<CardPrinted> isStandard = printedInSets(
Arrays.asList(new String[] {"M12", "NPH", "MBS", "SOM", "M11", "ROE", "WWK", "ZEN"}), true);
public static final Predicate<CardPrinted> isTrue = Predicate.getTrue(CardPrinted.class);
}
}

View File

@@ -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<CardRules> rules(final StringOp op, final String what) {
public static Predicate<CardRules> rules(final PredicateString.StringOp op, final String what) {
return new LeafString(LeafString.CardField.RULES, op, what);
}
public static Predicate<CardRules> name(final StringOp op, final String what) {
public static Predicate<CardRules> name(final PredicateString.StringOp op, final String what) {
return new LeafString(LeafString.CardField.NAME, op, what);
}
public static Predicate<CardRules> subType(final StringOp op, final String what) {
public static Predicate<CardRules> subType(final PredicateString.StringOp op, final String what) {
return new LeafString(LeafString.CardField.SUBTYPE, op, what);
}
public static Predicate<CardRules> joinedType(final StringOp op, final String what) {
public static Predicate<CardRules> joinedType(final PredicateString.StringOp op, final String what) {
return new LeafString(LeafString.CardField.JOINED_TYPE, op, what);
}
public static Predicate<CardRules> wasPrintedInSet(final String setCode) {
return new PredicateExitsInSet(setCode);
public static Predicate<CardRules> wasPrintedInSets(final List<String> setCodes) {
return new PredicateExitsInSets(setCodes);
}
public static Predicate<CardRules> 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<CardRules> {
private static class LeafString extends PredicateString<CardRules> {
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<CardRules> {
private final String setCode;
public PredicateExitsInSet(final String setsCode) {
setCode = setsCode;
private static class PredicateExitsInSets extends Predicate<CardRules> {
private final List<String> sets;
public PredicateExitsInSets(final List<String> 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;
}
}

View File

@@ -52,4 +52,9 @@ public final class CardSet implements Comparable<CardSet> { // immutable
CardSet other = (CardSet) obj;
return other.name.equals(this.name) && this.code.equals(other.code);
}
@Override
public String toString() {
return this.name + " (set)";
}
}

View File

@@ -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<String> allowedSetCodes;
private final List<String> bannedCardNames;
private final Predicate<CardPrinted> filter;
public GameFormat(final String fName, final List<String> sets, final List<String> bannedCards)
{
name = fName;
allowedSetCodes = Collections.unmodifiableList(sets);
bannedCardNames = Collections.unmodifiableList(bannedCards);
filter = buildFilter();
}
private Predicate<CardPrinted> buildFilter() {
Predicate<CardPrinted> banNames = CardPrinted.Predicates.namesExcept(bannedCardNames);
Predicate<CardPrinted> 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<CardPrinted> getFilter() { return filter; }
@Override
public String toString()
{
return name + " (format)";
}
}

View File

@@ -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;

View File

@@ -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()){

View File

@@ -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<CardPrinted> filter = standardStart
? CardPrinted.Predicates.Presets.isStandard
: Predicate.getTrue(CardPrinted.class);
Predicate<CardPrinted> filter = standardStart ? SetUtils.getStandard().getFilter() : CardPrinted.Predicates.Presets.isTrue;
myCards.setupNewGameCardPool(filter, diff);
credits = QuestPreferences.getStartingCredits();

View File

@@ -44,13 +44,11 @@ public final class QuestUtilCards {
/**
* <p>addCards.</p>
*/
public ArrayList<CardPrinted> addCards(final List<String> setsFilter) {
public ArrayList<CardPrinted> addCards(final Predicate<CardPrinted> fSets) {
int nCommon = QuestPreferences.getNumCommon();
int nUncommon = QuestPreferences.getNumUncommon();
int nRare = QuestPreferences.getNumRare();
Predicate<CardPrinted> fSets = CardPrinted.Predicates.printedInSets(setsFilter, true);
ArrayList<CardPrinted> newCards = new ArrayList<CardPrinted>();
newCards.addAll(QuestBoosterPack.generateCards(fSets, nCommon, CardRarity.Common, null));
newCards.addAll(QuestBoosterPack.generateCards(fSets, nUncommon, CardRarity.Uncommon, null));

View File

@@ -30,12 +30,6 @@ public abstract class Predicate<T> {
*/
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<T> {
// Predefined operators: and, or
public static <T> Predicate<T> and(final Predicate<T> operand1, final Predicate<T> operand2) {
if (operand1.is1()) { return operand2; }
if (operand2.is1()) { return operand1; }
if (operand2 == null || operand2.is1()) { return operand1; }
return new NodeAnd<T>(operand1, operand2);
}
public static <T> Predicate<T> and(final Iterable<Predicate<T>> operand) { return new MultiNodeAnd<T>(operand); }
@@ -330,7 +324,7 @@ public abstract class Predicate<T> {
@Override public boolean isTrue(final T card) { return bValue; }
public LeafConstant(final boolean value) { bValue = value; }
}
public static <T> Predicate<T> getTrue(final Class<T> cls) { return new LeafConstant<T>(true); }
public static <T> Predicate<T> getFalse(final Class<T> cls) { return new LeafConstant<T>(false); }
}

View File

@@ -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<T> extends Predicate<T> {
/** 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; }
}