diff --git a/src/main/java/forge/AllZoneUtil.java b/src/main/java/forge/AllZoneUtil.java
index 63730c5d273..c8e27c55d09 100644
--- a/src/main/java/forge/AllZoneUtil.java
+++ b/src/main/java/forge/AllZoneUtil.java
@@ -20,6 +20,7 @@ package forge;
import java.util.ArrayList;
import java.util.List;
+import forge.CardPredicates.Presets;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
import forge.util.closures.Predicate;
@@ -86,7 +87,7 @@ public abstract class AllZoneUtil {
* @return a CardList with all cards currently in a graveyard
*/
public static CardList getCardsIn(final ZoneType zone, final String cardName) {
- return AllZoneUtil.getCardsIn(zone).getName(cardName);
+ return AllZoneUtil.getCardsIn(zone).filter(CardPredicates.nameEquals(cardName));
}
// ////////// Creatures
@@ -99,7 +100,7 @@ public abstract class AllZoneUtil {
*/
public static CardList getCreaturesInPlay() {
final CardList creats = AllZoneUtil.getCardsIn(ZoneType.Battlefield);
- return creats.filter(CardPredicates.CREATURES);
+ return creats.filter(Presets.CREATURES);
}
/**
@@ -111,7 +112,7 @@ public abstract class AllZoneUtil {
*/
public static CardList getCreaturesInPlay(final Player player) {
final CardList creats = player.getCardsIn(ZoneType.Battlefield);
- return creats.filter(CardPredicates.CREATURES);
+ return creats.filter(Presets.CREATURES);
}
// /////////////// Lands
@@ -124,7 +125,7 @@ public abstract class AllZoneUtil {
* @return a CardList containing all lands the given player has in play
*/
public static CardList getPlayerLandsInPlay(final Player player) {
- return player.getCardsIn(ZoneType.Battlefield).filter(CardPredicates.LANDS);
+ return player.getCardsIn(ZoneType.Battlefield).filter(Presets.LANDS);
}
/**
@@ -133,7 +134,7 @@ public abstract class AllZoneUtil {
* @return a CardList of all lands on the battlefield
*/
public static CardList getLandsInPlay() {
- return AllZoneUtil.getCardsIn(ZoneType.Battlefield).filter(CardPredicates.LANDS);
+ return AllZoneUtil.getCardsIn(ZoneType.Battlefield).filter(Presets.LANDS);
}
// =============================================================================
diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java
index dccf1b743c1..2ebeacad486 100644
--- a/src/main/java/forge/Card.java
+++ b/src/main/java/forge/Card.java
@@ -57,6 +57,7 @@ import forge.game.player.Player;
import forge.game.zone.ZoneType;
import forge.item.CardDb;
import forge.util.MyRandom;
+import forge.util.closures.PredicateString;
/**
*
@@ -6228,25 +6229,6 @@ public class Card extends GameEntity implements Comparable {
return -1;
}
- /**
- *
- * keywordsContain.
- *
- *
- * @param keyword
- * a {@link java.lang.String} object.
- * @return a boolean.
- */
- public final boolean keywordsContain(final String keyword) {
- final ArrayList a = this.getKeyword();
- for (int i = 0; i < a.size(); i++) {
- if (a.get(i).toString().contains(keyword)) {
- return true;
- }
- }
- return false;
- }
-
/**
*
* hasAnyKeyword.
@@ -6658,13 +6640,13 @@ public class Card extends GameEntity implements Comparable {
}
} else if (property.startsWith("Above")) { // "Are Above" Source
final CardList list = this.getOwner().getCardsIn(ZoneType.Graveyard);
- if (!list.getAbove(source, this)) {
+ if (list.indexOf(source) >= list.indexOf(this)) {
return false;
}
} else if (property.startsWith("DirectlyAbove")) { // "Are Directly Above"
// Source
final CardList list = this.getOwner().getCardsIn(ZoneType.Graveyard);
- if (!list.getDirectlyAbove(source, this)) {
+ if (list.indexOf(this) - list.indexOf(source) != 1) {
return false;
}
} else if (property.startsWith("TopGraveyardCreature")) {
diff --git a/src/main/java/forge/CardList.java b/src/main/java/forge/CardList.java
index d54dbefb1b6..fb47b45d057 100644
--- a/src/main/java/forge/CardList.java
+++ b/src/main/java/forge/CardList.java
@@ -121,90 +121,6 @@ public class CardList implements Iterable {
this.list = new ArrayList(size);
}
- /**
- *
- * getColor.
- *
- *
- * @param cardColor
- * a {@link java.lang.String} object.
- * @return a {@link forge.CardList} object.
- */
- public final CardList getColor(final String cardColor) {
- final CardList list = new CardList();
- for (final Card c : this) {
- if (cardColor.equals("Multicolor") && (c.getColor().size() > 1)) {
- list.add(c);
- } else if (c.isColor(cardColor) && (c.getColor().size() == 1)) {
- list.add(c);
- }
- }
- return list;
- } // getColor()
-
- /**
- * Get cards that match the given color string. Use the card's ManaCost
- * to determine color.
- * @param cardColor desired color
- * @return CardList
- */
- public final CardList getColorByManaCost(final String cardColor) {
- final CardList ret = new CardList();
- for (final Card c : this) {
- ArrayList colors = CardUtil.getOnlyColors(c);
- if (colors.contains(cardColor)) {
- ret.add(c);
- }
- }
- return ret;
- } // getColorByManaCost()
-
- /**
- *
- * getOnly2Colors.
- *
- *
- * @param clr1
- * a {@link java.lang.String} object.
- * @param clr2
- * a {@link java.lang.String} object.
- * @return a {@link forge.CardList} object.
- */
- public final CardList getOnly2Colors(final String clr1, final String clr2) {
- final CardList list = new CardList();
- list.addAll(this);
-
- final Predicate clrF = new Predicate() {
- @Override
- public boolean isTrue(final Card c) {
- if (c.isColorless()) {
- return true;
- }
- final ArrayList cClrs = c.getColor();
- for (int i = 0; i < cClrs.size(); i++) {
- CardColor cc = cClrs.get(i);
- for (final String s : cc.toStringArray()) {
- if (!s.equals(clr1) && !s.equals(clr2)) {
- return false;
- }
- }
- }
- return true;
- }
- };
-
- return list.filter(clrF);
- }
-
- /**
- *
- * reverse.
- *
- */
- public final void reverse() {
- Collections.reverse(this.list);
- }
-
/** {@inheritDoc} */
@Override
public final boolean equals(final Object a) {
@@ -213,13 +129,13 @@ public class CardList implements Iterable {
if (this.list.size() != b.size()) {
return false;
}
-
+
for (int i = 0; i < this.list.size(); i++) {
if (!this.list.get(i).equals(b.get(i))) {
return false;
}
}
-
+
return true;
} else {
return false;
@@ -236,43 +152,6 @@ public class CardList implements Iterable {
return (41 * (41 + this.list.size() + this.list.hashCode()));
}
- // removes one copy of that card
- /**
- *
- * remove.
- *
- *
- * @param cardName
- * a {@link java.lang.String} object.
- */
- public final void remove(final String cardName) {
- final CardList find = this.filter(new Predicate() {
- @Override
- public boolean isTrue(final Card c) {
- return c.getName().equals(cardName);
- }
- });
-
- if (0 < find.size()) {
- this.remove(find.get(0));
- } else {
- throw new RuntimeException("CardList : remove(String cardname), error - card name not found: " + cardName
- + " - contents of Arraylist:" + this.list);
- }
-
- } // remove(String cardName)
-
- /**
- *
- * size.
- *
- *
- * @return a int.
- */
- public final int size() {
- return this.list.size();
- }
-
/**
*
* add.
@@ -325,374 +204,6 @@ public class CardList implements Iterable {
}
}
- /**
- *
- * contains.
- *
- *
- * @param c
- * a {@link forge.Card} object.
- * @return a boolean.
- */
- public final boolean contains(final Card c) {
- return this.list.contains(c);
- }
-
- // probably remove getCard() in the future
- /**
- *
- * getCard.
- *
- *
- * @param index
- * a int.
- * @return a {@link forge.Card} object.
- */
- public final Card getCard(final int index) {
- return this.list.get(index);
- }
-
- /**
- *
- * get.
- *
- *
- * @param i
- * a int.
- * @return a {@link forge.Card} object.
- */
- public final Card get(final int i) {
- return this.getCard(i);
- }
-
- /**
- *
- * containsName.
- *
- *
- * @param c
- * a {@link forge.Card} object.
- * @return a boolean.
- */
- public final boolean containsName(final Card c) {
- return this.containsName(c.getName());
- }
-
- /**
- *
- * containsName.
- *
- *
- * @param name
- * a {@link java.lang.String} object.
- * @return a boolean.
- */
- public final boolean containsName(final String name) {
- for (int i = 0; i < this.size(); i++) {
- if (this.getCard(i).getName().equals(name)) {
- return true;
- }
- }
-
- return false;
- }
-
- // returns new subset of all the cards with the same name
- /**
- *
- * getName.
- *
- *
- * @param name
- * a {@link java.lang.String} object.
- * @return a {@link forge.CardList} object.
- */
- public final CardList getName(final String name) {
- final CardList c = new CardList();
-
- for (int i = 0; i < this.size(); i++) {
- if (this.getCard(i).getName().equals(name)) {
- c.add(this.getCard(i));
- }
- }
-
- return c;
- }
-
- // returns new subset of all the cards that have a different name
- /**
- *
- * getNotName.
- *
- *
- * @param name
- * a {@link java.lang.String} object.
- * @return a {@link forge.CardList} object.
- */
- public final CardList getNotName(final String name) {
- final CardList c = new CardList();
-
- for (int i = 0; i < this.size(); i++) {
- if (!this.getCard(i).getName().equals(name)) {
- c.add(this.getCard(i));
- }
- }
-
- return c;
- }
-
- /**
- *
- * getImageName.
- *
- *
- * @param name
- * a {@link java.lang.String} object.
- * @return a {@link forge.CardList} object.
- */
- public final CardList getImageName(final String name) {
- final CardList c = new CardList();
-
- for (int i = 0; i < this.size(); i++) {
- if (this.getCard(i).getImageName().equals(name)) {
- c.add(this.getCard(i));
- }
- }
-
- return c;
- }
-
- /**
- *
- * getController.
- *
- *
- * @param player
- * a {@link forge.game.player.Player} object.
- * @return a {@link forge.CardList} object.
- */
- public final CardList getController(final Player player) {
- return this.filter(new Predicate() {
- @Override
- public boolean isTrue(final Card c) {
- return c.getController().isPlayer(player);
- }
- });
- }
-
- /**
- *
- * getOwner.
- *
- *
- * @param player
- * a {@link forge.game.player.Player} object.
- * @return a {@link forge.CardList} object.
- */
- public final CardList getOwner(final Player player) {
- return this.filter(new Predicate() {
- @Override
- public boolean isTrue(final Card c) {
- return c.getOwner().isPlayer(player);
- }
- });
- }
-
- // cardType is like "Land" or "Goblin", returns a new CardList that is a
- // subset of current CardList
- /**
- *
- * getType.
- *
- *
- * @param cardType
- * a {@link java.lang.String} object.
- * @return a {@link forge.CardList} object.
- */
- public final CardList getType(final String cardType) {
- return this.filter(new Predicate() {
- @Override
- public boolean isTrue(final Card c) {
- return c.isType(cardType);
- }
- });
- }
-
- // cardType is like "Land" or "Goblin", returns a new CardList with cards
- // that do not have this type
- /**
- *
- * getNotType.
- *
- *
- * @param cardType
- * a {@link java.lang.String} object.
- * @return a {@link forge.CardList} object.
- */
- public final CardList getNotType(final String cardType) {
- return this.filter(new Predicate() {
- @Override
- public boolean isTrue(final Card c) {
- return !c.isType(cardType);
- }
- });
- }
-
- /**
- *
- * getPermanents.
- *
- *
- * @return a {@link forge.CardList} object.
- */
- public final CardList getPermanents() {
- return this.filter(new Predicate() {
- @Override
- public boolean isTrue(final Card c) {
- return c.isPermanent();
- }
- });
- }
-
- /**
- *
- * getKeyword.
- *
- *
- * @param keyword
- * a {@link java.lang.String} object.
- * @return a {@link forge.CardList} object.
- */
- public final CardList getKeyword(final String keyword) {
- return this.filter(new Predicate() {
- @Override
- public boolean isTrue(final Card c) {
- return c.hasKeyword(keyword);
- }
- });
- }
-
- /**
- *
- * getNotKeyword.
- *
- *
- * @param keyword
- * a {@link java.lang.String} object.
- * @return a {@link forge.CardList} object.
- */
- public final CardList getNotKeyword(final String keyword) {
- return this.filter(new Predicate() {
- @Override
- public boolean isTrue(final Card c) {
- return !c.hasKeyword(keyword);
- }
- });
- }
-
- // get all cards that have this string in their keywords
- /**
- *
- * getKeywordsContain.
- *
- *
- * @param keyword
- * a {@link java.lang.String} object.
- * @return a {@link forge.CardList} object.
- */
- public final CardList getKeywordsContain(final String keyword) {
- return this.filter(new Predicate() {
- @Override
- public boolean isTrue(final Card c) {
- return c.keywordsContain(keyword);
- }
- });
- }
-
- // get all cards that don't have this string in their keywords
- /**
- *
- * getKeywordsDontContain.
- *
- *
- * @param keyword
- * a {@link java.lang.String} object.
- * @return a {@link forge.CardList} object.
- */
- public final CardList getKeywordsDontContain(final String keyword) {
- return this.filter(new Predicate() {
- @Override
- public boolean isTrue(final Card c) {
- return !c.keywordsContain(keyword);
- }
- });
- }
-
- /**
- *
- * getTokens.
- *
- *
- * @return a {@link forge.CardList} object.
- */
- public final CardList getTokens() {
- return this.filter(new Predicate() {
- @Override
- public boolean isTrue(final Card c) {
- return c.isToken();
- }
- });
- }
-
- /**
- * Create a new list of cards by applying a filter to this one.
- *
- * @param filt
- * determines which cards are present in the resulting list
- *
- * @return a subset of this CardList whose items meet the filtering
- * criteria; may be empty, but never null.
- */
- public final CardList filter(final Predicate filt) {
- final CardList result = new CardList();
- for (final Card card : this) {
- if (filt.isTrue(card)) {
- result.add(card);
- }
- }
- return result;
- }
-
- /**
- *
- * toArray.
- *
- *
- * @return an array of {@link forge.Card} objects.
- */
- public final Card[] toArray() {
- final Card[] c = new Card[this.list.size()];
- this.list.toArray(c);
- return c;
- }
-
- /** {@inheritDoc} */
- @Override
- public final String toString() {
- return this.list.toString();
- }
-
- /**
- *
- * isEmpty.
- *
- *
- * @return a boolean.
- */
- public final boolean isEmpty() {
- return this.list.isEmpty();
- }
-
/**
*
* remove.
@@ -746,6 +257,45 @@ public class CardList implements Iterable {
}
}
+ /**
+ *
+ * isEmpty.
+ *
+ *
+ * @return a boolean.
+ */
+ public final boolean isEmpty() {
+ return this.list.isEmpty();
+ }
+
+ /**
+ *
+ * size.
+ *
+ *
+ * @return a int.
+ */
+ public final int size() {
+ return this.list.size();
+ }
+
+ public final int indexOf(Card obj) {
+ return list.indexOf(obj);
+ }
+
+ /**
+ *
+ * get.
+ *
+ *
+ * @param i
+ * a int.
+ * @return a {@link forge.Card} object.
+ */
+ public final Card get(final int i) {
+ return this.list.get(i);
+ }
+
/**
*
* clear.
@@ -768,6 +318,28 @@ public class CardList implements Iterable {
Collections.shuffle(this.list, MyRandom.getRandom());
}
+ /**
+ *
+ * reverse.
+ *
+ */
+ public final void reverse() {
+ Collections.reverse(this.list);
+ }
+
+ /**
+ *
+ * toArray.
+ *
+ *
+ * @return an array of {@link forge.Card} objects.
+ */
+ public final Card[] toArray() {
+ final Card[] c = new Card[this.list.size()];
+ this.list.toArray(c);
+ return c;
+ }
+
/**
*
* sort.
@@ -780,22 +352,84 @@ public class CardList implements Iterable {
Collections.sort(this.list, c);
}
+ /** {@inheritDoc} */
+ @Override
+ public final String toString() {
+ return this.list.toString();
+ }
+
+ /**
+ * Create a new list of cards by applying a filter to this one.
+ *
+ * @param filt
+ * determines which cards are present in the resulting list
+ *
+ * @return a subset of this CardList whose items meet the filtering
+ * criteria; may be empty, but never null.
+ */
+ public final CardList filter(final Predicate filt) {
+ return new CardList(filt.select(this));
+ }
+
/**
*
- * getTargetableCards.
+ * getColor.
*
*
- * @param source
- * a {@link forge.Card} object.
+ * @param cardColor
+ * a {@link java.lang.String} object.
* @return a {@link forge.CardList} object.
*/
- public final CardList getTargetableCards(final SpellAbility source) {
- return this.filter(new Predicate() {
- @Override
- public boolean isTrue(final Card c) {
- return source.canTarget(c);
+ public final CardList getColor(final String cardColor) {
+ final CardList list = new CardList();
+ for (final Card c : this) {
+ if (cardColor.equals("Multicolor") && (c.getColor().size() > 1)) {
+ list.add(c);
+ } else if (c.isColor(cardColor) && (c.getColor().size() == 1)) {
+ list.add(c);
}
- });
+ }
+ return list;
+ } // getColor()
+
+
+
+
+ public final boolean contains(final Card c) {
+ return this.list.contains(c);
+ }
+
+ public final boolean containsName(final String name) {
+ return CardPredicates.nameEquals(name).any(list);
+ }
+
+ public final CardList getController(final Player player) {
+ return this.filter(CardPredicates.isController(player));
+ }
+
+
+ // cardType is like "Land" or "Goblin", returns a new CardList that is a
+ // subset of current CardList
+ public final CardList getType(final String cardType) {
+ return this.filter(CardPredicates.isType(cardType));
+ }
+
+ // cardType is like "Land" or "Goblin", returns a new CardList with cards
+ // that do not have this type
+ public final CardList getNotType(final String cardType) {
+ return this.filter(Predicate.not(CardPredicates.isType(cardType)));
+ }
+
+ public final CardList getKeyword(final String keyword) {
+ return this.filter(CardPredicates.hasKeyword(keyword));
+ }
+
+ public final CardList getNotKeyword(final String keyword) {
+ return this.filter(Predicate.not(CardPredicates.hasKeyword(keyword)));
+ }
+
+ public final CardList getTargetableCards(final SpellAbility source) {
+ return this.filter(CardPredicates.isTargetableBy(source));
}
/**
@@ -855,40 +489,6 @@ public class CardList implements Iterable {
});
}
- /**
- *
- * getEquipMagnets.
- *
- *
- * @return a {@link forge.CardList} object.
- */
- public final CardList getEquipMagnets() {
- return this.filter(new Predicate() {
- @Override
- public boolean isTrue(final Card c) {
- return (c.isCreature() && (c.getSVar("EquipMe").equals("Multiple") || (c.getSVar("EquipMe").equals(
- "Once") && !c.isEquipped())));
- }
- });
- }
-
- /**
- *
- * getEnchantMagnets.
- *
- *
- * @return a {@link forge.CardList} object.
- */
- public final CardList getEnchantMagnets() {
- return this.filter(new Predicate() {
- @Override
- public boolean isTrue(final Card c) {
- return (c.isCreature() && (c.getSVar("EnchantMe").equals("Multiple") || (c.getSVar("EnchantMe").equals(
- "Once") && !c.isEnchanted())));
- }
- });
- }
-
/**
*
* getPossibleBlockers.
@@ -986,58 +586,5 @@ public class CardList implements Iterable {
});
}
- /**
- * getAbove.
- *
- * @param source
- * a Card object
- * @param compared
- * a Card object
- * @return a boolean
- */
- public final boolean getAbove(final Card source, final Card compared) {
- if (source.equals(compared)) {
- return false;
- }
-
- for (final Card itr : this) {
- if (itr.equals(source)) {
- return true;
- } else if (itr.equals(compared)) {
- return false;
- }
- }
- return false;
- }
-
- /**
- * getDirectlyAbove.
- *
- * @param source
- * a Card object
- * @param compared
- * a Card object
- * @return a boolean
- */
- public final boolean getDirectlyAbove(final Card source, final Card compared) {
- if (source.equals(compared)) {
- return false;
- }
-
- boolean checkNext = false;
- for (final Card itr : this) {
- if (checkNext) {
- if (itr.equals(compared)) {
- return true;
- }
- return false;
- } else if (itr.equals(source)) {
- checkNext = true;
- } else if (itr.equals(compared)) {
- return false;
- }
- }
- return false;
- }
} // end class CardList
diff --git a/src/main/java/forge/CardPredicates.java b/src/main/java/forge/CardPredicates.java
index 0a0b853652c..b5419933c9d 100644
--- a/src/main/java/forge/CardPredicates.java
+++ b/src/main/java/forge/CardPredicates.java
@@ -17,7 +17,10 @@
*/
package forge;
+import forge.card.spellability.SpellAbility;
+import forge.game.player.Player;
import forge.util.closures.Predicate;
+import forge.util.closures.PredicateString;
/**
*
@@ -28,205 +31,253 @@ import forge.util.closures.Predicate;
* @version $Id$
*/
public final class CardPredicates {
- /**
- * a Predicate to get all cards that are tapped.
- */
- public static Predicate TAPPED = new Predicate() {
- @Override
- public boolean isTrue(Card c) {
- return c.isTapped();
- }
- };
+
+ public static Predicate isController(final Player p) {
+ return new Predicate() {
+ @Override
+ public boolean isTrue(final Card c) {
+ return c.getController().isPlayer(p);
+ }
+ };
+ }
+ public static Predicate isOwner(final Player p) {
+ return new Predicate() {
+ @Override
+ public boolean isTrue(final Card c) {
+ return c.getOwner().isPlayer(p);
+ }
+ };
+ }
+
+ public static Predicate isType(final String cardType) {
+ return new Predicate() {
+ @Override
+ public boolean isTrue(final Card c) {
+ return c.isType(cardType);
+ }
+ };
+ }
+
+ public static Predicate hasKeyword(final String keyword) {
+ return new Predicate() {
+ @Override
+ public boolean isTrue(final Card c) {
+ return c.hasKeyword(keyword);
+ }
+ };
+ }
+
+ public static Predicate containsKeyword(final String keyword) {
+ return new Predicate() {
+ @Override
+ public boolean isTrue(final Card c) {
+ return PredicateString.contains(keyword).any(c.getKeyword());
+ }
+ };
+ }
+
+ public static Predicate isTargetableBy(final SpellAbility source) {
+ return new Predicate() {
+ @Override
+ public boolean isTrue(final Card c) {
+ return source.canTarget(c);
+ }
+ };
+ }
+
+ public static Predicate nameEquals(final String name) {
+ return new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ return c.getName().equals(name);
+ }
+ };
+ }
+
+ public static class Presets {
- /**
- * a Predicate to get all cards that are untapped.
- */
- public static Predicate UNTAPPED = new Predicate() {
- @Override
- public boolean isTrue(Card c) {
- return c.isUntapped();
- }
- };
-
- /**
- * a Predicate to get all creatures.
- */
- public static Predicate CREATURES = new Predicate() {
- @Override
- public boolean isTrue(Card c) {
- return c.isCreature();
- }
- };
-
- /**
- * a Predicate to get all enchantments.
- */
- public static Predicate ENCHANTMENTS = new Predicate() {
- @Override
- public boolean isTrue(Card c) {
- return c.isEnchantment();
- }
- };
-
- /**
- * a Predicate to get all equipment.
- */
- public static Predicate EQUIPMENT = new Predicate() {
- @Override
- public boolean isTrue(Card c) {
- return c.isEquipment();
- }
- };
-
- /**
- * a Predicate to get all unenchanted cards in a list.
- */
- public static Predicate UNENCHANTED = new Predicate() {
- @Override
- public boolean isTrue(Card c) {
- return !c.isEnchanted();
- }
- };
-
- /**
- * a Predicate to get all enchanted cards in a list.
- */
- public static Predicate ENCHANTED = new Predicate() {
- @Override
- public boolean isTrue(Card c) {
- return c.isEnchanted();
- }
- };
-
- /**
- * a Predicate to get all nontoken cards.
- */
- public static Predicate NON_TOKEN = new Predicate() {
- @Override
- public boolean isTrue(Card c) {
- return !c.isToken();
- }
- };
-
- /**
- * a Predicate to get all token cards.
- */
- public static Predicate TOKEN = new Predicate() {
- @Override
- public boolean isTrue(Card c) {
- return c.isToken();
- }
- };
-
- /**
- * a Predicate to get all nonbasic lands.
- */
- public static Predicate NON_BASIC_LAND = new Predicate() {
- @Override
- public boolean isTrue(Card c) {
- return !c.isBasicLand();
- }
- };
-
- /**
- * a Predicate to get all basicLands.
- */
- public static Predicate BASIC_LANDS = new Predicate() {
- @Override
- public boolean isTrue(Card c) {
- // the isBasicLand() check here may be sufficient...
- return c.isLand() && c.isBasicLand();
- }
- };
-
- /**
- * a Predicate to get all artifacts.
- */
- public static Predicate ARTIFACTS = new Predicate() {
- @Override
- public boolean isTrue(Card c) {
- return c.isArtifact();
- }
- };
-
- /**
- * a Predicate to get all nonartifacts.
- */
- public static Predicate NON_ARTIFACTS = new Predicate() {
- @Override
- public boolean isTrue(Card c) {
- return !c.isArtifact();
- }
- };
-
- /**
- * a Predicate to get all lands.
- */
- public static Predicate LANDS = new Predicate() {
- @Override
- public boolean isTrue(Card c) {
- return c.isLand();
- }
- };
-
- /**
- * a Predicate to get all nonlands.
- */
- public static Predicate NON_LANDS = new Predicate() {
- @Override
- public boolean isTrue(Card c) {
- return !c.isLand();
- }
- };
-
- /**
- * a Predicate to get all cards that are black.
- */
- public static Predicate BLACK = new Predicate() {
- @Override
- public boolean isTrue(Card c) {
- return c.isBlack();
- }
- };
-
- /**
- * a Predicate to get all cards that are blue.
- */
- public static Predicate BLUE = new Predicate() {
- @Override
- public boolean isTrue(Card c) {
- return c.isBlue();
- }
- };
-
- /**
- * a Predicate to get all cards that are green.
- */
- public static Predicate GREEN = new Predicate() {
- @Override
- public boolean isTrue(Card c) {
- return c.isGreen();
- }
- };
-
- /**
- * a Predicate to get all cards that are red.
- */
- public static Predicate RED = new Predicate() {
- @Override
- public boolean isTrue(Card c) {
- return c.isRed();
- }
- };
-
- /**
- * a Predicate to get all cards that are white.
- */
- public static Predicate WHITE = new Predicate() {
- @Override
- public boolean isTrue(Card c) {
- return c.isWhite();
- }
- };
+ /**
+ * a Predicate to get all cards that are tapped.
+ */
+ public static Predicate TAPPED = new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ return c.isTapped();
+ }
+ };
+ /**
+ * a Predicate to get all cards that are untapped.
+ */
+ public static Predicate UNTAPPED = new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ return c.isUntapped();
+ }
+ };
+ /**
+ * a Predicate to get all creatures.
+ */
+ public static Predicate CREATURES = new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ return c.isCreature();
+ }
+ };
+ /**
+ * a Predicate to get all enchantments.
+ */
+ public static Predicate ENCHANTMENTS = new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ return c.isEnchantment();
+ }
+ };
+ /**
+ * a Predicate to get all equipment.
+ */
+ public static Predicate EQUIPMENT = new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ return c.isEquipment();
+ }
+ };
+ /**
+ * a Predicate to get all unenchanted cards in a list.
+ */
+ public static Predicate UNENCHANTED = new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ return !c.isEnchanted();
+ }
+ };
+ /**
+ * a Predicate to get all enchanted cards in a list.
+ */
+ public static Predicate ENCHANTED = new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ return c.isEnchanted();
+ }
+ };
+ /**
+ * a Predicate to get all nontoken cards.
+ */
+ public static Predicate NON_TOKEN = new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ return !c.isToken();
+ }
+ };
+ /**
+ * a Predicate to get all token cards.
+ */
+ public static Predicate TOKEN = new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ return c.isToken();
+ }
+ };
+ /**
+ * a Predicate to get all nonbasic lands.
+ */
+ public static Predicate NON_BASIC_LAND = new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ return !c.isBasicLand();
+ }
+ };
+ /**
+ * a Predicate to get all basicLands.
+ */
+ public static Predicate BASIC_LANDS = new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ // the isBasicLand() check here may be sufficient...
+ return c.isLand() && c.isBasicLand();
+ }
+ };
+ /**
+ * a Predicate to get all artifacts.
+ */
+ public static Predicate ARTIFACTS = new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ return c.isArtifact();
+ }
+ };
+ /**
+ * a Predicate to get all nonartifacts.
+ */
+ public static Predicate NON_ARTIFACTS = new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ return !c.isArtifact();
+ }
+ };
+ /**
+ * a Predicate to get all lands.
+ */
+ public static Predicate LANDS = new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ return c.isLand();
+ }
+ };
+ /**
+ * a Predicate to get all nonlands.
+ */
+ public static Predicate NON_LANDS = new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ return !c.isLand();
+ }
+ };
+ /**
+ * a Predicate to get all cards that are black.
+ */
+ public static Predicate BLACK = new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ return c.isBlack();
+ }
+ };
+ /**
+ * a Predicate to get all cards that are blue.
+ */
+ public static Predicate BLUE = new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ return c.isBlue();
+ }
+ };
+ /**
+ * a Predicate to get all cards that are green.
+ */
+ public static Predicate GREEN = new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ return c.isGreen();
+ }
+ };
+ /**
+ * a Predicate to get all cards that are red.
+ */
+ public static Predicate RED = new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ return c.isRed();
+ }
+ };
+ /**
+ * a Predicate to get all cards that are white.
+ */
+ public static Predicate WHITE = new Predicate() {
+ @Override
+ public boolean isTrue(Card c) {
+ return c.isWhite();
+ }
+ };
+
+ }
}
diff --git a/src/main/java/forge/GameActionUtil.java b/src/main/java/forge/GameActionUtil.java
index b8a93394bc5..fd263d2162d 100644
--- a/src/main/java/forge/GameActionUtil.java
+++ b/src/main/java/forge/GameActionUtil.java
@@ -22,6 +22,7 @@ import java.util.HashMap;
import javax.swing.JOptionPane;
+import forge.CardPredicates.Presets;
import forge.card.abilityfactory.AbilityFactory;
import forge.card.cardfactory.CardFactoryUtil;
import forge.card.cost.Cost;
@@ -849,37 +850,34 @@ public final class GameActionUtil {
return;
}
- final CardList playerPerms = player.getCardsIn(ZoneType.Battlefield);
+ final CardList playerLiches = player.getCardsIn(ZoneType.Battlefield, "Lich");
- if (AllZoneUtil.isCardInPlay("Lich", player)) {
- final CardList lichs = playerPerms.getName("Lich");
- for (final Card crd : lichs) {
- final Card lich = crd;
- final SpellAbility ability = new Ability(lich, "0") {
- @Override
- public void resolve() {
- for (int i = 0; i < damage; i++) {
- CardList nonTokens = player.getCardsIn(ZoneType.Battlefield);
- nonTokens = nonTokens.filter(CardPredicates.NON_TOKEN);
- if (nonTokens.size() == 0) {
- player.loseConditionMet(GameLossReason.SpellEffect, lich.getName());
- } else {
- player.sacrificePermanent("Select a permanent to sacrifice", nonTokens);
- }
+ for (final Card lich : playerLiches) {
+ final SpellAbility ability = new Ability(lich, "0") {
+ @Override
+ public void resolve() {
+ for (int i = 0; i < damage; i++) {
+ CardList nonTokens = player.getCardsIn(ZoneType.Battlefield);
+ nonTokens = nonTokens.filter(Presets.NON_TOKEN);
+ if (nonTokens.size() == 0) {
+ player.loseConditionMet(GameLossReason.SpellEffect, lich.getName());
+ } else {
+ player.sacrificePermanent("Select a permanent to sacrifice", nonTokens);
}
}
- };
+ }
+ };
- final StringBuilder sb = new StringBuilder();
- sb.append(lich.getName()).append(" - ").append(lich.getController());
- sb.append(" sacrifices ").append(damage).append(" nontoken permanents.");
- ability.setStackDescription(sb.toString());
+ final StringBuilder sb = new StringBuilder();
+ sb.append(lich.getName()).append(" - ").append(lich.getController());
+ sb.append(" sacrifices ").append(damage).append(" nontoken permanents.");
+ ability.setStackDescription(sb.toString());
- AllZone.getStack().addSimultaneousStackEntry(ability);
+ AllZone.getStack().addSimultaneousStackEntry(ability);
- }
}
+
if (c.getName().equals("Whirling Dervish") || c.getName().equals("Dunerider Outlaw")) {
GameActionUtil.playerCombatDamageWhirlingDervish(c);
}
@@ -1155,7 +1153,7 @@ public final class GameActionUtil {
produces.put("Swamp", "B");
CardList lands = AllZoneUtil.getCardsInGame();
- lands = lands.filter(CardPredicates.LANDS);
+ lands = lands.filter(Presets.LANDS);
// remove all abilities granted by this Command
for (final Card land : lands) {
@@ -1250,12 +1248,9 @@ public final class GameActionUtil {
@Override
public void execute() {
- final CardList alphaStatuses = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield)
- .getName("Alpha Status");
- alphaStatuses.addAll(AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield).getName("Alpha Status"));
+ final CardList alphaStatuses = AllZoneUtil.getCardsIn(ZoneType.Battlefield, "Alpha Status");
- final CardList allCreatures = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield).getType("Creature");
- allCreatures.addAll(AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield).getType("Creature"));
+ final CardList allCreatures = AllZoneUtil.getCreaturesInPlay();
for (int i = 0; i < this.previouslyPumped.size(); i++) {
this.previouslyPumped.get(i).addSemiPermanentAttackBoost(0 - this.previouslyPumpedValue.get(i));
@@ -1408,8 +1403,7 @@ public final class GameActionUtil {
}
private int countSoundTheCalls() {
- CardList list = AllZoneUtil.getCardsIn(ZoneType.Graveyard);
- list = list.getName("Sound the Call");
+ CardList list = AllZoneUtil.getCardsIn(ZoneType.Graveyard, "Sound the Call");
return list.size();
}
diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryAttach.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryAttach.java
index d600cf04749..eb50be46faa 100644
--- a/src/main/java/forge/card/abilityfactory/AbilityFactoryAttach.java
+++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryAttach.java
@@ -27,7 +27,7 @@ import forge.AllZone;
import forge.AllZoneUtil;
import forge.Card;
import forge.CardList;
-import forge.CardPredicates;
+import forge.CardPredicates.Presets;
import forge.CardUtil;
import forge.Command;
import forge.GameActionUtil;
@@ -579,10 +579,24 @@ public class AbilityFactoryAttach {
String stCheck = null;
if (attachSource.isAura()) {
stCheck = "EnchantedBy";
- magnetList = list.getEnchantMagnets();
+ magnetList = list.filter(new Predicate() {
+ @Override
+ public boolean isTrue(final Card c) {
+ if ( !c.isCreature() ) return false;
+ String sVar = c.getSVar("EnchantMe");
+ return sVar.equals("Multiple") || (sVar.equals("Once") && !c.isEnchanted());
+ }
+ });
} else if (attachSource.isEquipment()) {
stCheck = "EquippedBy";
- magnetList = list.getEquipMagnets();
+ magnetList = list.filter(new Predicate() {
+ @Override
+ public boolean isTrue(final Card c) {
+ if ( !c.isCreature() ) return false;
+ String sVar = c.getSVar("EquipMe");
+ return sVar.equals("Multiple") || (sVar.equals("Once") && !c.isEquipped());
+ }
+ });
}
if ((magnetList != null) && !magnetList.isEmpty()) {
@@ -682,7 +696,7 @@ public class AbilityFactoryAttach {
if (attachSource.isAura()) {
// TODO For Auras like Rancor, that aren't as likely to lead to
// card disadvantage, this check should be skipped
- prefList = prefList.filter(Predicate.not(CardPredicates.ENCHANTED));
+ prefList = prefList.filter(Predicate.not(Presets.ENCHANTED));
}
if (!grantingAbilities) {
diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java
index c4c65dca237..882387ed2f7 100644
--- a/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java
+++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java
@@ -27,8 +27,9 @@ import forge.AllZoneUtil;
import forge.Card;
import forge.CardCharacteristicName;
import forge.CardList;
-import forge.CardPredicates;
import forge.CardListUtil;
+import forge.CardPredicates;
+import forge.CardPredicates.Presets;
import forge.CardUtil;
import forge.GameActionUtil;
import forge.GameEntity;
@@ -494,7 +495,7 @@ public final class AbilityFactoryChangeZone {
if (params.containsKey("Ninjutsu")) {
if (source.isType("Legendary") && !AllZoneUtil.isCardInPlay("Mirror Gallery")) {
final CardList list = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield);
- if (list.containsName(source.getName())) {
+ if (CardPredicates.nameEquals(source.getName()).any(list)) {
return false;
}
}
@@ -1205,14 +1206,15 @@ public final class AbilityFactoryChangeZone {
c = CardFactoryUtil.getBestAI(fetchList);
} else {
// Don't fetch another tutor with the same name
- if (origin.contains(ZoneType.Library) && !fetchList.getNotName(card.getName()).isEmpty()) {
- fetchList = fetchList.getNotName(card.getName());
+ CardList sameNamed = fetchList.filter(Predicate.not(CardPredicates.nameEquals(card.getName())));
+ if (origin.contains(ZoneType.Library) && !sameNamed.isEmpty()) {
+ fetchList = sameNamed;
}
Player ai = AllZone.getComputerPlayer();
// Does AI need a land?
CardList hand = ai.getCardsIn(ZoneType.Hand);
- System.out.println("Lands in hand = " + hand.filter(CardPredicates.LANDS).size() + ", on battlefield = " + ai.getCardsIn(ZoneType.Battlefield).filter(CardPredicates.LANDS).size());
- if (hand.filter(CardPredicates.LANDS).size() == 0 && ai.getCardsIn(ZoneType.Battlefield).filter(CardPredicates.LANDS).size() < 4) {
+ System.out.println("Lands in hand = " + hand.filter(Presets.LANDS).size() + ", on battlefield = " + ai.getCardsIn(ZoneType.Battlefield).filter(Presets.LANDS).size());
+ if (hand.filter(Presets.LANDS).size() == 0 && ai.getCardsIn(ZoneType.Battlefield).filter(Presets.LANDS).size() < 4) {
boolean canCastSomething = false;
for (Card cardInHand : hand) {
canCastSomething |= ComputerUtil.payManaCost(cardInHand.getFirstSpellAbility(), AllZone.getComputerPlayer(), true, 0, false);
@@ -1646,7 +1648,7 @@ public final class AbilityFactoryChangeZone {
CardList list = AllZoneUtil.getCardsIn(origin);
list = list.getValidCards(tgt.getValidTgts(), AllZone.getComputerPlayer(), source);
if (source.isInZone(ZoneType.Hand)) {
- list = list.getNotName(source.getName()); // Don't get the same card back.
+ list = list.filter(Predicate.not(CardPredicates.nameEquals(source.getName()))); // Don't get the same card back.
}
if (list.size() < tgt.getMinTargets(sa.getSourceCard(), sa)) {
@@ -2958,10 +2960,10 @@ public final class AbilityFactoryChangeZone {
// if Shuffle parameter exists, and any amount of cards were owned by
// that player, then shuffle that library
if (params.containsKey("Shuffle")) {
- if (cards.getOwner(AllZone.getHumanPlayer()).size() > 0) {
+ if (cards.filter(CardPredicates.isOwner(AllZone.getHumanPlayer())).size() > 0) {
AllZone.getHumanPlayer().shuffle();
}
- if (cards.getOwner(AllZone.getComputerPlayer()).size() > 0) {
+ if (cards.filter(CardPredicates.isOwner(AllZone.getComputerPlayer())).size() > 0) {
AllZone.getComputerPlayer().shuffle();
}
}
diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java
index 7d68ba093f5..6b61d5b5711 100644
--- a/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java
+++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java
@@ -33,7 +33,7 @@ import forge.AllZone;
import forge.AllZoneUtil;
import forge.Card;
import forge.CardList;
-import forge.CardPredicates;
+import forge.CardPredicates.Presets;
import forge.CardUtil;
import forge.Constant;
import forge.card.cardfactory.CardFactoryUtil;
@@ -1643,7 +1643,7 @@ public final class AbilityFactoryChoose {
}
} else {
CardList list = AllZoneUtil.getCardsInGame().getController(AllZone.getHumanPlayer());
- list = list.filter(Predicate.not(CardPredicates.LANDS));
+ list = list.filter(Predicate.not(Presets.LANDS));
if (!list.isEmpty()) {
chosen = list.get(0).getName();
}
@@ -1976,8 +1976,8 @@ public final class AbilityFactoryChoose {
}
} else { // Computer
if (params.containsKey("AILogic") && params.get("AILogic").equals("BestBlocker")) {
- if (choices.filter(CardPredicates.UNTAPPED).isEmpty()) {
- choices = choices.filter(CardPredicates.UNTAPPED);
+ if (choices.filter(Presets.UNTAPPED).isEmpty()) {
+ choices = choices.filter(Presets.UNTAPPED);
}
chosen.add(CardFactoryUtil.getBestCreatureAI(choices));
} else {
diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryCopy.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryCopy.java
index 37a8efeea4f..fb2c76c9ce7 100644
--- a/src/main/java/forge/card/abilityfactory/AbilityFactoryCopy.java
+++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryCopy.java
@@ -28,7 +28,7 @@ import forge.AllZoneUtil;
import forge.Card;
import forge.CardCharacteristicName;
import forge.CardList;
-import forge.CardPredicates;
+import forge.CardPredicates.Presets;
import forge.Command;
import forge.Singletons;
import forge.card.cost.Cost;
@@ -323,7 +323,7 @@ public final class AbilityFactoryCopy {
}
Card choice;
- if (list.filter(CardPredicates.CREATURES).size() > 0) {
+ if (list.filter(Presets.CREATURES).size() > 0) {
choice = CardFactoryUtil.getBestCreatureAI(list);
} else {
choice = CardFactoryUtil.getMostExpensivePermanentAI(list, sa, true);
diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryPermanentState.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryPermanentState.java
index e013f28a094..13bb1d263ad 100644
--- a/src/main/java/forge/card/abilityfactory/AbilityFactoryPermanentState.java
+++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryPermanentState.java
@@ -26,7 +26,7 @@ import forge.AllZone;
import forge.AllZoneUtil;
import forge.Card;
import forge.CardList;
-import forge.CardPredicates;
+import forge.CardPredicates.Presets;
import forge.Singletons;
import forge.card.cardfactory.CardFactoryUtil;
import forge.card.cost.Cost;
@@ -403,7 +403,7 @@ public class AbilityFactoryPermanentState {
untapList = untapList.getTargetableCards(sa);
untapList = untapList.getValidCards(tgt.getValidTgts(), source.getController(), source);
- untapList = untapList.filter(CardPredicates.TAPPED);
+ untapList = untapList.filter(Presets.TAPPED);
// filter out enchantments and planeswalkers, their tapped state doesn't
// matter.
final String[] tappablePermanents = { "Creature", "Land", "Artifact" };
@@ -486,7 +486,7 @@ public class AbilityFactoryPermanentState {
}
// try to just tap already tapped things
- tapList = list.filter(CardPredicates.UNTAPPED);
+ tapList = list.filter(Presets.UNTAPPED);
if (AbilityFactoryPermanentState.untapTargetList(source, tgt, af, sa, mandatory, tapList)) {
return true;
@@ -634,7 +634,7 @@ public class AbilityFactoryPermanentState {
} else {
CardList list = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield);
list = list.getType(valid);
- list = list.filter(CardPredicates.TAPPED);
+ list = list.filter(Presets.TAPPED);
int count = 0;
while ((list.size() != 0) && (count < num)) {
@@ -996,7 +996,7 @@ public class AbilityFactoryPermanentState {
private static boolean tapPrefTargeting(final Card source, final Target tgt, final AbilityFactory af,
final SpellAbility sa, final boolean mandatory) {
CardList tapList = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield);
- tapList = tapList.filter(CardPredicates.UNTAPPED);
+ tapList = tapList.filter(Presets.UNTAPPED);
tapList = tapList.getValidCards(tgt.getValidTgts(), source.getController(), source);
// filter out enchantments and planeswalkers, their tapped state doesn't matter.
final String[] tappablePermanents = { "Creature", "Land", "Artifact" };
@@ -1133,7 +1133,7 @@ public class AbilityFactoryPermanentState {
}
// try to just tap already tapped things
- tapList = list.filter(CardPredicates.TAPPED);
+ tapList = list.filter(Presets.TAPPED);
if (AbilityFactoryPermanentState.tapTargetList(af, sa, tapList, mandatory)) {
return true;
@@ -1752,7 +1752,7 @@ public class AbilityFactoryPermanentState {
}
validTappables = validTappables.getValidCards(valid, source.getController(), source);
- validTappables = validTappables.filter(CardPredicates.UNTAPPED);
+ validTappables = validTappables.filter(Presets.UNTAPPED);
final Random r = MyRandom.getRandom();
boolean rr = false;
@@ -1794,7 +1794,7 @@ public class AbilityFactoryPermanentState {
private static CardList getTapAllTargets(final String valid, final Card source) {
CardList tmpList = AllZoneUtil.getCardsIn(ZoneType.Battlefield);
tmpList = tmpList.getValidCards(valid, source.getController(), source);
- tmpList = tmpList.filter(CardPredicates.UNTAPPED);
+ tmpList = tmpList.filter(Presets.UNTAPPED);
return tmpList;
}
diff --git a/src/main/java/forge/card/cardfactory/CardFactoryArtifacts.java b/src/main/java/forge/card/cardfactory/CardFactoryArtifacts.java
index 93c3ff9fe5e..7560e22d54d 100644
--- a/src/main/java/forge/card/cardfactory/CardFactoryArtifacts.java
+++ b/src/main/java/forge/card/cardfactory/CardFactoryArtifacts.java
@@ -6,7 +6,7 @@ import forge.AllZone;
import forge.AllZoneUtil;
import forge.Card;
import forge.CardList;
-import forge.CardPredicates;
+import forge.CardPredicates.Presets;
import forge.Command;
import forge.Counters;
import forge.Singletons;
@@ -352,7 +352,7 @@ class CardFactoryArtifacts {
final Player player = this.getTargetPlayer();
CardList lands = player.getCardsIn(ZoneType.Graveyard);
- lands = lands.filter(CardPredicates.BASIC_LANDS);
+ lands = lands.filter(Presets.BASIC_LANDS);
if (card.getController().isHuman()) {
// now, select up to four lands
int end = -1;
diff --git a/src/main/java/forge/card/cardfactory/CardFactoryAuras.java b/src/main/java/forge/card/cardfactory/CardFactoryAuras.java
index cdaad6e6756..4938d30f95b 100644
--- a/src/main/java/forge/card/cardfactory/CardFactoryAuras.java
+++ b/src/main/java/forge/card/cardfactory/CardFactoryAuras.java
@@ -26,8 +26,8 @@ import forge.AllZone;
import forge.AllZoneUtil;
import forge.Card;
import forge.CardList;
-import forge.CardPredicates;
import forge.CardListUtil;
+import forge.CardPredicates.Presets;
import forge.CardUtil;
import forge.Command;
import forge.Singletons;
@@ -422,7 +422,7 @@ class CardFactoryAuras {
// This includes creatures Animate Dead can't enchant once
// in play.
// The human may try to Animate them, the AI will not.
- return AllZoneUtil.getCardsIn(ZoneType.Graveyard).filter(CardPredicates.CREATURES);
+ return AllZoneUtil.getCardsIn(ZoneType.Graveyard).filter(Presets.CREATURES);
}
@Override
diff --git a/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java b/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java
index 22e784ac2d3..661a67e0e81 100644
--- a/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java
+++ b/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java
@@ -23,6 +23,7 @@ import java.util.List;
import javax.swing.JOptionPane;
import com.esotericsoftware.minlog.Log;
+import com.google.common.base.Predicates;
import forge.AllZone;
import forge.AllZoneUtil;
@@ -30,6 +31,7 @@ import forge.Card;
import forge.CardCharacteristicName;
import forge.CardList;
import forge.CardPredicates;
+import forge.CardPredicates.Presets;
import forge.CardUtil;
import forge.Command;
import forge.Constant;
@@ -73,8 +75,8 @@ public class CardFactoryCreatures {
@Override
public boolean canPlayAI() {
final CardList list = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield);
+ return Predicate.or(CardPredicates.nameEquals("Glorious Anthem"), CardPredicates.nameEquals("Gaea's Anthem")).any(list);
- return list.containsName("Glorious Anthem") || list.containsName("Gaea's Anthem");
}
};
// Do not remove SpellAbilities created by AbilityFactory or
@@ -223,7 +225,7 @@ public class CardFactoryCreatures {
} else { // computer
CardList art = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield);
- art = art.filter(CardPredicates.ARTIFACTS);
+ art = art.filter(Presets.ARTIFACTS);
CardList list = new CardList(art);
list = list.filter(new Predicate() {
@@ -316,12 +318,11 @@ public class CardFactoryCreatures {
list.addAll(AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield));
color[0] = Constant.Color.WHITE;
- int max = list.getKeywordsContain(color[0]).size();
+ int max = 0;
+ list.filter(CardPredicates.containsKeyword(color[0])).size();
- final String[] colors = { Constant.Color.BLUE, Constant.Color.BLACK, Constant.Color.RED,
- Constant.Color.GREEN };
- for (final String c : colors) {
- final int cmp = list.getKeywordsContain(c).size();
+ for (final String c : Constant.Color.ONLY_COLORS) {
+ final int cmp = list.filter(CardPredicates.containsKeyword(c)).size();
if (cmp > max) {
max = cmp;
color[0] = c;
@@ -420,7 +421,7 @@ public class CardFactoryCreatures {
@Override
public void resolve() {
CardList allTokens = AllZoneUtil.getCreaturesInPlay(card.getController());
- allTokens = allTokens.filter(CardPredicates.TOKEN);
+ allTokens = allTokens.filter(Presets.TOKEN);
CardFactoryUtil.copyTokens(allTokens);
}
@@ -428,7 +429,7 @@ public class CardFactoryCreatures {
@Override
public boolean canPlayAI() {
CardList allTokens = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer());
- allTokens = allTokens.filter(CardPredicates.TOKEN);
+ allTokens = allTokens.filter(Presets.TOKEN);
return allTokens.size() >= 2;
}
@@ -1043,7 +1044,7 @@ public class CardFactoryCreatures {
public boolean canPlayAI() {
// get all creatures
CardList list = AllZone.getComputerPlayer().getCardsIn(ZoneType.Graveyard);
- list = list.filter(CardPredicates.CREATURES);
+ list = list.filter(Presets.CREATURES);
return 0 < list.size();
}
});
@@ -1065,12 +1066,12 @@ public class CardFactoryCreatures {
final Player opp = player.getOpponent();
int max = 0;
CardList play = opp.getCardsIn(ZoneType.Battlefield);
- play = play.filter(CardPredicates.NON_TOKEN);
- play = play.filter(CardPredicates.WHITE);
+ play = play.filter(Presets.NON_TOKEN);
+ play = play.filter(Presets.WHITE);
max += play.size();
CardList grave = opp.getCardsIn(ZoneType.Graveyard);
- grave = grave.filter(CardPredicates.WHITE);
+ grave = grave.filter(Presets.WHITE);
max += grave.size();
final String[] life = new String[max + 1];
diff --git a/src/main/java/forge/card/cardfactory/CardFactoryInstants.java b/src/main/java/forge/card/cardfactory/CardFactoryInstants.java
index df160818986..5e6586ed26f 100644
--- a/src/main/java/forge/card/cardfactory/CardFactoryInstants.java
+++ b/src/main/java/forge/card/cardfactory/CardFactoryInstants.java
@@ -21,7 +21,7 @@ import forge.AllZone;
import forge.AllZoneUtil;
import forge.Card;
import forge.CardList;
-import forge.CardPredicates;
+import forge.CardPredicates.Presets;
import forge.Command;
import forge.Singletons;
import forge.card.cost.Cost;
@@ -417,7 +417,7 @@ public class CardFactoryInstants {
@Override
public void resolve() {
final Player you = card.getController();
- final CardList ens = AllZoneUtil.getCardsIn(ZoneType.Battlefield).filter(CardPredicates.ENCHANTMENTS);
+ final CardList ens = AllZoneUtil.getCardsIn(ZoneType.Battlefield).filter(Presets.ENCHANTMENTS);
final CardList toReturn = ens.filter(new Predicate() {
@Override
public boolean isTrue(final Card c) {
diff --git a/src/main/java/forge/card/cardfactory/CardFactoryLands.java b/src/main/java/forge/card/cardfactory/CardFactoryLands.java
index 5015ec6dce4..d1c113183e4 100644
--- a/src/main/java/forge/card/cardfactory/CardFactoryLands.java
+++ b/src/main/java/forge/card/cardfactory/CardFactoryLands.java
@@ -23,7 +23,7 @@ import forge.AllZone;
import forge.AllZoneUtil;
import forge.Card;
import forge.CardList;
-import forge.CardPredicates;
+import forge.CardPredicates.Presets;
import forge.Command;
import forge.Counters;
import forge.GameActionUtil;
@@ -250,7 +250,7 @@ class CardFactoryLands {
}
} // selectCard()
}; // Input
- if ((AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer()).filter(CardPredicates.UNTAPPED)
+ if ((AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer()).filter(Presets.UNTAPPED)
.size() < 2)) {
Singletons.getModel().getGameAction().sacrifice(card, null);
return;
@@ -297,7 +297,7 @@ class CardFactoryLands {
if (this.player.isComputer()) {
if (land.size() > 0) {
CardList tappedLand = new CardList(land);
- tappedLand = tappedLand.filter(CardPredicates.TAPPED);
+ tappedLand = tappedLand.filter(Presets.TAPPED);
// if any are tapped, sacrifice it
// else sacrifice random
if (tappedLand.size() > 0) {
@@ -378,7 +378,7 @@ class CardFactoryLands {
@Override
public void execute() {
CardList plains = AllZoneUtil.getPlayerLandsInPlay(card.getController());
- plains = plains.filter(CardPredicates.UNTAPPED);
+ plains = plains.filter(Presets.UNTAPPED);
if (this.player.isComputer()) {
if (plains.size() > 1) {
@@ -397,7 +397,7 @@ class CardFactoryLands {
}
} else { // this is the human resolution
final int[] paid = { 0 };
- if ((AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer()).filter(CardPredicates.UNTAPPED)
+ if ((AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer()).filter(Presets.UNTAPPED)
.size() < 2)) {
Singletons.getModel().getGameAction().sacrifice(card, null);
return;
diff --git a/src/main/java/forge/card/cardfactory/CardFactorySorceries.java b/src/main/java/forge/card/cardfactory/CardFactorySorceries.java
index 7b456e3bd3f..978c644cf45 100644
--- a/src/main/java/forge/card/cardfactory/CardFactorySorceries.java
+++ b/src/main/java/forge/card/cardfactory/CardFactorySorceries.java
@@ -30,8 +30,9 @@ import forge.AllZone;
import forge.AllZoneUtil;
import forge.Card;
import forge.CardList;
-import forge.CardPredicates;
import forge.CardListUtil;
+import forge.CardPredicates;
+import forge.CardPredicates.Presets;
import forge.CardUtil;
import forge.Command;
import forge.Singletons;
@@ -310,10 +311,10 @@ public class CardFactorySorceries {
@Override
public boolean canPlayAI() {
CardList humTokenCreats = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer());
- humTokenCreats = humTokenCreats.filter(CardPredicates.TOKEN);
+ humTokenCreats = humTokenCreats.filter(Presets.TOKEN);
CardList compTokenCreats = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer());
- compTokenCreats = compTokenCreats.filter(CardPredicates.TOKEN);
+ compTokenCreats = compTokenCreats.filter(Presets.TOKEN);
return compTokenCreats.size() > humTokenCreats.size();
} // canPlayAI()
@@ -321,7 +322,7 @@ public class CardFactorySorceries {
@Override
public void resolve() {
CardList tokens = AllZoneUtil.getCreaturesInPlay();
- tokens = tokens.filter(CardPredicates.TOKEN);
+ tokens = tokens.filter(Presets.TOKEN);
CardFactoryUtil.copyTokens(tokens);
@@ -564,7 +565,7 @@ public class CardFactorySorceries {
final CardList lib = player.getCardsIn(ZoneType.Library);
for (final Card c : grave) {
- final CardList remLib = lib.getName(c.getName());
+ final CardList remLib = lib.filter(CardPredicates.nameEquals(c.getName()));
for (final Card rem : remLib) {
Singletons.getModel().getGameAction().exile(rem);
lib.remove(rem);
@@ -1404,7 +1405,7 @@ public class CardFactorySorceries {
@Override
public void showMessage() {
CardList grave = card.getController().getCardsIn(ZoneType.Graveyard);
- grave = grave.filter(CardPredicates.CREATURES);
+ grave = grave.filter(Presets.CREATURES);
grave = grave.filter(new Predicate() {
@Override
public boolean isTrue(final Card c) {
@@ -1554,7 +1555,7 @@ public class CardFactorySorceries {
// get all
final CardList creatures = AllZoneUtil.getCreaturesInPlay();
CardList grave = card.getController().getCardsIn(ZoneType.Graveyard);
- grave = grave.filter(CardPredicates.CREATURES);
+ grave = grave.filter(Presets.CREATURES);
if (AllZone.getHumanPlayer().canBeTargetedBy(spell)
|| AllZone.getComputerPlayer().canBeTargetedBy(spell)) {
@@ -1635,7 +1636,7 @@ public class CardFactorySorceries {
// Sacrifice an artifact
CardList arts = p.getCardsIn(ZoneType.Battlefield);
- arts = arts.filter(CardPredicates.ARTIFACTS);
+ arts = arts.filter(Presets.ARTIFACTS);
final Object toSac = GuiUtils.chooseOneOrNone("Sacrifice an artifact", arts.toArray());
if (toSac != null) {
final Card c = (Card) toSac;
@@ -1648,7 +1649,7 @@ public class CardFactorySorceries {
// Search your library for an artifact
final CardList lib = p.getCardsIn(ZoneType.Library);
GuiUtils.chooseOneOrNone("Looking at Library", lib.toArray());
- final CardList libArts = lib.filter(CardPredicates.ARTIFACTS);
+ final CardList libArts = lib.filter(Presets.ARTIFACTS);
final Object o = GuiUtils.chooseOneOrNone("Search for artifact", libArts.toArray());
if (o != null) {
newArtifact[0] = (Card) o;
diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java
index ba153230b1d..2a72bcfc0c7 100644
--- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java
+++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java
@@ -32,8 +32,8 @@ import forge.AllZoneUtil;
import forge.Card;
import forge.CardCharacteristicName;
import forge.CardList;
-import forge.CardPredicates;
import forge.CardListUtil;
+import forge.CardPredicates.Presets;
import forge.CardUtil;
import forge.Command;
import forge.CommandArgs;
@@ -2576,7 +2576,7 @@ public class CardFactoryUtil {
// Count$ColoredCreatures *a DOMAIN for creatures*
if (sq[0].contains("ColoredCreatures")) {
someCards.addAll(cardController.getCardsIn(ZoneType.Battlefield));
- someCards = someCards.filter(CardPredicates.CREATURES);
+ someCards = someCards.filter(Presets.CREATURES);
final String[] colors = { "green", "white", "red", "blue", "black" };
@@ -3082,11 +3082,11 @@ public class CardFactoryUtil {
// "Untapped Lands" - Count$UntappedTypeYouCtrl.Land
if (sq[0].contains("Untapped")) {
- someCards = someCards.filter(CardPredicates.UNTAPPED);
+ someCards = someCards.filter(Presets.UNTAPPED);
}
if (sq[0].contains("Tapped")) {
- someCards = someCards.filter(CardPredicates.TAPPED);
+ someCards = someCards.filter(Presets.TAPPED);
}
// String sq0 = sq[0].toLowerCase();
@@ -3096,23 +3096,23 @@ public class CardFactoryUtil {
// }
// "White Creatures" - Count$WhiteTypeYouCtrl.Creature
if (sq[0].contains("White")) {
- someCards = someCards.filter(CardPredicates.WHITE);
+ someCards = someCards.filter(Presets.WHITE);
}
if (sq[0].contains("Blue")) {
- someCards = someCards.filter(CardPredicates.BLUE);
+ someCards = someCards.filter(Presets.BLUE);
}
if (sq[0].contains("Black")) {
- someCards = someCards.filter(CardPredicates.BLACK);
+ someCards = someCards.filter(Presets.BLACK);
}
if (sq[0].contains("Red")) {
- someCards = someCards.filter(CardPredicates.RED);
+ someCards = someCards.filter(Presets.RED);
}
if (sq[0].contains("Green")) {
- someCards = someCards.filter(CardPredicates.GREEN);
+ someCards = someCards.filter(Presets.GREEN);
}
if (sq[0].contains("Multicolor")) {
@@ -3147,7 +3147,7 @@ public class CardFactoryUtil {
int mmc = 0;
int cmc = 0;
for (int i = 0; i < someCards.size(); i++) {
- cmc = someCards.getCard(i).getManaCost().getCMC();
+ cmc = someCards.get(i).getManaCost().getCMC();
if (cmc > mmc) {
mmc = cmc;
}
@@ -3628,7 +3628,7 @@ public class CardFactoryUtil {
final CardList list = new CardList();
for (int tokenAdd = 0; tokenAdd < tokenList.size(); tokenAdd++) {
- final Card thisToken = tokenList.getCard(tokenAdd);
+ final Card thisToken = tokenList.get(tokenAdd);
final ArrayList tal = thisToken.getType();
final String[] tokenTypes = new String[tal.size()];
diff --git a/src/main/java/forge/card/cost/CostTapType.java b/src/main/java/forge/card/cost/CostTapType.java
index 89514788498..c3d77a5f976 100644
--- a/src/main/java/forge/card/cost/CostTapType.java
+++ b/src/main/java/forge/card/cost/CostTapType.java
@@ -19,7 +19,7 @@ package forge.card.cost;
import forge.Card;
import forge.CardList;
-import forge.CardPredicates;
+import forge.CardPredicates.Presets;
import forge.card.abilityfactory.AbilityFactory;
import forge.card.spellability.SpellAbility;
import forge.control.input.Input;
@@ -119,7 +119,7 @@ public class CostTapType extends CostPartWithList {
if (cost.getTap()) {
typeList.remove(source);
}
- typeList = typeList.filter(CardPredicates.UNTAPPED);
+ typeList = typeList.filter(Presets.UNTAPPED);
final Integer amount = this.convertAmount();
if ((typeList.size() == 0) || ((amount != null) && (typeList.size() < amount))) {
@@ -154,7 +154,7 @@ public class CostTapType extends CostPartWithList {
CardList typeList = ability.getActivatingPlayer().getCardsIn(ZoneType.Battlefield);
typeList = typeList.getValidCards(this.getType().split(";"), ability.getActivatingPlayer(),
ability.getSourceCard());
- typeList = typeList.filter(CardPredicates.UNTAPPED);
+ typeList = typeList.filter(Presets.UNTAPPED);
final String amount = this.getAmount();
Integer c = this.convertAmount();
if (c == null) {
@@ -189,7 +189,7 @@ public class CostTapType extends CostPartWithList {
CardList typeList = ability.getActivatingPlayer().getCardsIn(ZoneType.Battlefield);
typeList = typeList.getValidCards(this.getType().split(";"), ability.getActivatingPlayer(),
ability.getSourceCard());
- typeList = typeList.filter(CardPredicates.UNTAPPED);
+ typeList = typeList.filter(Presets.UNTAPPED);
c = typeList.size();
source.setSVar("ChosenX", "Number$" + Integer.toString(c));
}
diff --git a/src/main/java/forge/card/cost/CostUntapType.java b/src/main/java/forge/card/cost/CostUntapType.java
index 6ac21e6981c..51d76a1870b 100644
--- a/src/main/java/forge/card/cost/CostUntapType.java
+++ b/src/main/java/forge/card/cost/CostUntapType.java
@@ -20,7 +20,7 @@ package forge.card.cost;
import forge.AllZoneUtil;
import forge.Card;
import forge.CardList;
-import forge.CardPredicates;
+import forge.CardPredicates.Presets;
import forge.card.abilityfactory.AbilityFactory;
import forge.card.spellability.SpellAbility;
import forge.control.input.Input;
@@ -124,7 +124,7 @@ public class CostUntapType extends CostPartWithList {
if (cost.getUntap()) {
typeList.remove(source);
}
- typeList = typeList.filter(CardPredicates.TAPPED);
+ typeList = typeList.filter(Presets.TAPPED);
final Integer amount = this.convertAmount();
if ((typeList.size() == 0) || ((amount != null) && (typeList.size() < amount))) {
@@ -160,7 +160,7 @@ public class CostUntapType extends CostPartWithList {
CardList typeList = AllZoneUtil.getCardsIn(ZoneType.Battlefield);
typeList = typeList.getValidCards(this.getType().split(";"), ability.getActivatingPlayer(),
ability.getSourceCard());
- typeList = typeList.filter(CardPredicates.TAPPED);
+ typeList = typeList.filter(Presets.TAPPED);
if (untap) {
typeList.remove(source);
}
@@ -201,7 +201,7 @@ public class CostUntapType extends CostPartWithList {
if (untap) {
typeList.remove(source);
}
- typeList = typeList.filter(CardPredicates.TAPPED);
+ typeList = typeList.filter(Presets.TAPPED);
c = typeList.size();
source.setSVar("ChosenX", "Number$" + Integer.toString(c));
}
diff --git a/src/main/java/forge/card/spellability/SpellPermanent.java b/src/main/java/forge/card/spellability/SpellPermanent.java
index ed5492925f1..3e605b56535 100644
--- a/src/main/java/forge/card/spellability/SpellPermanent.java
+++ b/src/main/java/forge/card/spellability/SpellPermanent.java
@@ -23,6 +23,7 @@ import forge.AllZone;
import forge.AllZoneUtil;
import forge.Card;
import forge.CardList;
+import forge.CardPredicates;
import forge.Command;
import forge.CommandReturn;
import forge.Singletons;
@@ -339,7 +340,7 @@ public class SpellPermanent extends Spell {
// check on legendary
if (card.isType("Legendary") && !AllZoneUtil.isCardInPlay("Mirror Gallery")) {
final CardList list = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield);
- if (list.containsName(card.getName())) {
+ if (CardPredicates.nameEquals(card.getName()).any(list)) {
return false;
}
}
diff --git a/src/main/java/forge/game/GameNew.java b/src/main/java/forge/game/GameNew.java
index 4f02e6369fa..b9f7b10b970 100644
--- a/src/main/java/forge/game/GameNew.java
+++ b/src/main/java/forge/game/GameNew.java
@@ -11,7 +11,7 @@ import javax.swing.JOptionPane;
import forge.AllZone;
import forge.Card;
import forge.CardList;
-import forge.CardPredicates;
+import forge.CardPredicates.Presets;
import forge.CardUtil;
import forge.Constant;
import forge.GameAction;
@@ -446,9 +446,9 @@ public class GameNew {
private static void seeWhoPlaysFirst() {
final GameAction ga = Singletons.getModel().getGameAction();
CardList hLibrary = AllZone.getHumanPlayer().getCardsIn(ZoneType.Library);
- hLibrary = hLibrary.filter(CardPredicates.NON_LANDS);
+ hLibrary = hLibrary.filter(Presets.NON_LANDS);
CardList cLibrary = AllZone.getComputerPlayer().getCardsIn(ZoneType.Library);
- cLibrary = cLibrary.filter(CardPredicates.NON_LANDS);
+ cLibrary = cLibrary.filter(Presets.NON_LANDS);
final boolean starterDetermined = false;
int cutCount = 0;
diff --git a/src/main/java/forge/game/phase/Combat.java b/src/main/java/forge/game/phase/Combat.java
index 5eac5b03f83..e62d508f58b 100644
--- a/src/main/java/forge/game/phase/Combat.java
+++ b/src/main/java/forge/game/phase/Combat.java
@@ -852,7 +852,7 @@ public class Combat {
if (bFirstStrike) {
CombatUtil.checkUnblockedAttackers(unblocked.get(j));
} else {
- if (!unblocked.getCard(j).hasFirstStrike() && !unblocked.getCard(j).hasDoubleStrike()) {
+ if (!unblocked.get(j).hasFirstStrike() && !unblocked.get(j).hasDoubleStrike()) {
CombatUtil.checkUnblockedAttackers(unblocked.get(j));
}
}
diff --git a/src/main/java/forge/game/phase/PhaseUtil.java b/src/main/java/forge/game/phase/PhaseUtil.java
index f5b56582b78..bfc2df9f9a3 100644
--- a/src/main/java/forge/game/phase/PhaseUtil.java
+++ b/src/main/java/forge/game/phase/PhaseUtil.java
@@ -23,7 +23,7 @@ import forge.AllZone;
import forge.AllZoneUtil;
import forge.Card;
import forge.CardList;
-import forge.CardPredicates;
+import forge.CardPredicates.Presets;
import forge.Singletons;
import forge.card.trigger.TriggerType;
import forge.game.player.Player;
@@ -101,7 +101,7 @@ public class PhaseUtil {
Singletons.getModel().getGameAction().resetActivationsPerTurn();
- final CardList lands = AllZoneUtil.getPlayerLandsInPlay(turn).filter(CardPredicates.UNTAPPED);
+ final CardList lands = AllZoneUtil.getPlayerLandsInPlay(turn).filter(Presets.UNTAPPED);
turn.setNumPowerSurgeLands(lands.size());
// anything before this point happens regardless of whether the Untap
diff --git a/src/main/java/forge/game/phase/Untap.java b/src/main/java/forge/game/phase/Untap.java
index b1feb4a4999..1adeb7ecb38 100644
--- a/src/main/java/forge/game/phase/Untap.java
+++ b/src/main/java/forge/game/phase/Untap.java
@@ -23,7 +23,7 @@ import forge.AllZone;
import forge.AllZoneUtil;
import forge.Card;
import forge.CardList;
-import forge.CardPredicates;
+import forge.CardPredicates.Presets;
import forge.Counters;
import forge.GameActionUtil;
import forge.GameEntity;
@@ -195,7 +195,7 @@ public class Untap extends Phase implements java.io.Serializable {
if (Singletons.getModel().getGameState().getPhaseHandler().getPlayerTurn().isComputer()) {
// search for lands the computer has and only untap 1
CardList landList = AllZoneUtil.getPlayerLandsInPlay(AllZone.getComputerPlayer());
- landList = landList.filter(CardPredicates.TAPPED).filter(new Predicate() {
+ landList = landList.filter(Presets.TAPPED).filter(new Predicate() {
@Override
public boolean isTrue(final Card c) {
return Untap.canUntap(c);
@@ -228,7 +228,7 @@ public class Untap extends Phase implements java.io.Serializable {
} // selectCard()
}; // Input
CardList landList = AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer());
- landList = landList.filter(CardPredicates.TAPPED).filter(new Predicate() {
+ landList = landList.filter(Presets.TAPPED).filter(new Predicate() {
@Override
public boolean isTrue(final Card c) {
return Untap.canUntap(c);
@@ -242,8 +242,8 @@ public class Untap extends Phase implements java.io.Serializable {
if (AllZoneUtil.isCardInPlay("Damping Field") || AllZoneUtil.isCardInPlay("Imi Statue")) {
if (Singletons.getModel().getGameState().getPhaseHandler().getPlayerTurn().isComputer()) {
CardList artList = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield);
- artList = artList.filter(CardPredicates.ARTIFACTS);
- artList = artList.filter(CardPredicates.TAPPED).filter(new Predicate() {
+ artList = artList.filter(Presets.ARTIFACTS);
+ artList = artList.filter(Presets.TAPPED).filter(new Predicate() {
@Override
public boolean isTrue(final Card c) {
return Untap.canUntap(c);
@@ -277,8 +277,8 @@ public class Untap extends Phase implements java.io.Serializable {
} // selectCard()
}; // Input
CardList artList = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield);
- artList = artList.filter(CardPredicates.ARTIFACTS);
- artList = artList.filter(CardPredicates.TAPPED).filter(new Predicate() {
+ artList = artList.filter(Presets.ARTIFACTS);
+ artList = artList.filter(Presets.TAPPED).filter(new Predicate() {
@Override
public boolean isTrue(final Card c) {
return Untap.canUntap(c);
@@ -292,7 +292,7 @@ public class Untap extends Phase implements java.io.Serializable {
if ((AllZoneUtil.isCardInPlay("Smoke") || AllZoneUtil.isCardInPlay("Stoic Angel"))) {
if (Singletons.getModel().getGameState().getPhaseHandler().getPlayerTurn().isComputer()) {
CardList creatures = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer());
- creatures = creatures.filter(CardPredicates.TAPPED).filter(new Predicate() {
+ creatures = creatures.filter(Presets.TAPPED).filter(new Predicate() {
@Override
public boolean isTrue(final Card c) {
return Untap.canUntap(c);
@@ -326,7 +326,7 @@ public class Untap extends Phase implements java.io.Serializable {
} // selectCard()
}; // Input
CardList creatures = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer());
- creatures = creatures.filter(CardPredicates.TAPPED).filter(new Predicate() {
+ creatures = creatures.filter(Presets.TAPPED).filter(new Predicate() {
@Override
public boolean isTrue(final Card c) {
return Untap.canUntap(c);
diff --git a/src/main/java/forge/game/phase/Upkeep.java b/src/main/java/forge/game/phase/Upkeep.java
index fc1f6846553..c6bece2dc4b 100644
--- a/src/main/java/forge/game/phase/Upkeep.java
+++ b/src/main/java/forge/game/phase/Upkeep.java
@@ -23,8 +23,9 @@ import forge.AllZone;
import forge.AllZoneUtil;
import forge.Card;
import forge.CardList;
-import forge.CardPredicates;
import forge.CardListUtil;
+import forge.CardPredicates;
+import forge.CardPredicates.Presets;
import forge.Command;
import forge.Counters;
import forge.GameAction;
@@ -481,7 +482,7 @@ public class Upkeep extends Phase implements java.io.Serializable {
final Card abyss = c;
final CardList abyssGetTargets = AllZoneUtil.getCreaturesInPlay(player)
- .filter(CardPredicates.NON_ARTIFACTS);
+ .filter(Presets.NON_ARTIFACTS);
final Ability sacrificeCreature = new Ability(abyss, "") {
@Override
@@ -2277,9 +2278,9 @@ public class Upkeep extends Phase implements java.io.Serializable {
enchantmentsInLibrary = enchantmentsInLibrary.filter(new Predicate() {
@Override
public boolean isTrue(final Card c) {
- return (c.isEnchantment() && c.hasKeyword("Enchant player")
+ return c.isEnchantment() && c.hasKeyword("Enchant player")
&& !source.getEnchantingPlayer().hasProtectionFrom(c)
- && !enchantmentsAttached.containsName(c));
+ && !CardPredicates.nameEquals(c.getName()).any(enchantmentsAttached);
}
});
final Player player = source.getController();
diff --git a/src/main/java/forge/game/player/AIPlayer.java b/src/main/java/forge/game/player/AIPlayer.java
index 8dd1d1e6647..7dfd4e3d00f 100644
--- a/src/main/java/forge/game/player/AIPlayer.java
+++ b/src/main/java/forge/game/player/AIPlayer.java
@@ -22,8 +22,9 @@ import java.util.Random;
import forge.AllZone;
import forge.Card;
import forge.CardList;
-import forge.CardPredicates;
import forge.CardListUtil;
+import forge.CardPredicates;
+import forge.CardPredicates.Presets;
import forge.Singletons;
import forge.card.cardfactory.CardFactoryUtil;
import forge.card.spellability.SpellAbility;
@@ -201,13 +202,13 @@ public class AIPlayer extends Player {
boolean bottom = false;
if (topN.get(i).isBasicLand()) {
CardList bl = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield);
- bl = bl.filter(CardPredicates.BASIC_LANDS);
+ bl = bl.filter(CardPredicates.Presets.BASIC_LANDS);
bottom = bl.size() > 5; // if control more than 5 Basic land,
// probably don't need more
} else if (topN.get(i).isCreature()) {
CardList cl = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield);
- cl = cl.filter(CardPredicates.CREATURES);
+ cl = cl.filter(CardPredicates.Presets.CREATURES);
bottom = cl.size() > 5; // if control more than 5 Creatures,
// probably don't need more
}
diff --git a/src/main/java/forge/game/player/ComputerUtil.java b/src/main/java/forge/game/player/ComputerUtil.java
index b9bb06d132d..5fec5bce756 100644
--- a/src/main/java/forge/game/player/ComputerUtil.java
+++ b/src/main/java/forge/game/player/ComputerUtil.java
@@ -26,8 +26,8 @@ import forge.AllZone;
import forge.AllZoneUtil;
import forge.Card;
import forge.CardList;
-import forge.CardPredicates;
import forge.CardListUtil;
+import forge.CardPredicates.Presets;
import forge.CardUtil;
import forge.GameActionUtil;
import forge.Singletons;
@@ -1213,7 +1213,7 @@ public class ComputerUtil {
return false;
}
CardList landList = computer.getCardsIn(ZoneType.Hand);
- landList = landList.filter(CardPredicates.LANDS);
+ landList = landList.filter(Presets.LANDS);
final CardList lands = computer.getCardsIn(ZoneType.Graveyard);
for (final Card crd : lands) {
@@ -1631,7 +1631,7 @@ public class ComputerUtil {
typeList = typeList.getValidCards(type.split(","), activate.getController(), activate);
// is this needed?
- typeList = typeList.filter(CardPredicates.UNTAPPED);
+ typeList = typeList.filter(Presets.UNTAPPED);
if (tap) {
typeList.remove(activate);
@@ -1671,7 +1671,7 @@ public class ComputerUtil {
typeList = typeList.getValidCards(type.split(","), activate.getController(), activate);
// is this needed?
- typeList = typeList.filter(CardPredicates.TAPPED);
+ typeList = typeList.filter(Presets.TAPPED);
if (untap) {
typeList.remove(activate);
diff --git a/src/main/java/forge/game/player/ComputerUtilAttack.java b/src/main/java/forge/game/player/ComputerUtilAttack.java
index 77e6bcc35a3..7b8be44d656 100644
--- a/src/main/java/forge/game/player/ComputerUtilAttack.java
+++ b/src/main/java/forge/game/player/ComputerUtilAttack.java
@@ -373,8 +373,7 @@ public class ComputerUtilAttack {
// Beastmaster Ascension
if (AllZoneUtil.isCardInPlay("Beastmaster Ascension", AllZone.getComputerPlayer())
&& (this.attackers.size() > 1)) {
- final CardList beastions = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield)
- .getName("Beastmaster Ascension");
+ final CardList beastions = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield, "Beastmaster Ascension");
int minCreatures = 7;
for (final Card beastion : beastions) {
final int counters = beastion.getCounters(Counters.QUEST);
@@ -681,7 +680,7 @@ public class ComputerUtilAttack {
// get the list of attackers up to the first blocked one
final CardList attritionalAttackers = new CardList();
for (int x = 0; x < (this.attackers.size() - humanForces); x++) {
- attritionalAttackers.add(this.attackers.getCard(x));
+ attritionalAttackers.add(this.attackers.get(x));
}
// until the attackers are used up or the player would run out of life
int attackRounds = 1;
@@ -689,7 +688,7 @@ public class ComputerUtilAttack {
// sum attacker damage
int damageThisRound = 0;
for (int y = 0; y < attritionalAttackers.size(); y++) {
- damageThisRound += attritionalAttackers.getCard(y).getNetCombatDamage();
+ damageThisRound += attritionalAttackers.get(y).getNetCombatDamage();
}
// remove from player life
humanLife -= damageThisRound;
diff --git a/src/main/java/forge/game/player/ComputerUtilBlock.java b/src/main/java/forge/game/player/ComputerUtilBlock.java
index 0220a350e67..902349a35d1 100644
--- a/src/main/java/forge/game/player/ComputerUtilBlock.java
+++ b/src/main/java/forge/game/player/ComputerUtilBlock.java
@@ -23,6 +23,7 @@ import forge.AllZone;
import forge.Card;
import forge.CardList;
import forge.CardListUtil;
+import forge.CardPredicates;
import forge.Counters;
import forge.GameEntity;
import forge.card.cardfactory.CardFactoryUtil;
@@ -397,9 +398,9 @@ public class ComputerUtilBlock {
private static Combat makeGangBlocks(final Combat combat) {
CardList currentAttackers = new CardList(ComputerUtilBlock.getAttackersLeft());
- currentAttackers = currentAttackers.getKeywordsDontContain("Rampage");
currentAttackers = currentAttackers
- .getKeywordsDontContain("CARDNAME can't be blocked by more than one creature.");
+ .filter(Predicate.not(CardPredicates.containsKeyword("Rampage")))
+ .filter(Predicate.not(CardPredicates.containsKeyword("CARDNAME can't be blocked by more than one creature.")));
CardList blockers;
// Try to block an attacker without first strike with a gang of first strikers
@@ -596,9 +597,10 @@ public class ComputerUtilBlock {
CardList chumpBlockers;
CardList tramplingAttackers = ComputerUtilBlock.getAttackers().getKeyword("Trample");
- tramplingAttackers = tramplingAttackers.getKeywordsDontContain("Rampage"); // Don't make it worse
tramplingAttackers = tramplingAttackers
- .getKeywordsDontContain("CARDNAME can't be blocked by more than one creature.");
+ .filter(Predicate.not(CardPredicates.containsKeyword("Rampage")))
+ .filter(Predicate.not(CardPredicates.containsKeyword("CARDNAME can't be blocked by more than one creature.")));
+
// TODO - should check here for a "rampage-like" trigger that replaced
// the keyword:
// "Whenever CARDNAME becomes blocked, it gets +1/+1 until end of turn for each creature blocking it."
@@ -643,12 +645,11 @@ public class ComputerUtilBlock {
CardList safeBlockers;
CardList blockers;
- CardList targetAttackers = ComputerUtilBlock.getBlockedButUnkilled().getKeywordsDontContain("Rampage"); // Don't
- // make
- // it
- // worse
- targetAttackers = targetAttackers
- .getKeywordsDontContain("CARDNAME can't be blocked by more than one creature.");
+
+ CardList targetAttackers = ComputerUtilBlock.getBlockedButUnkilled()
+ .filter(Predicate.not(CardPredicates.containsKeyword("Rampage")))
+ .filter(Predicate.not(CardPredicates.containsKeyword("CARDNAME can't be blocked by more than one creature.")));
+
// TODO - should check here for a "rampage-like" trigger that replaced
// the keyword:
// "Whenever CARDNAME becomes blocked, it gets +1/+1 until end of turn for each creature blocking it."
diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java
index 0c27822150c..849a9278d54 100644
--- a/src/main/java/forge/game/player/Player.java
+++ b/src/main/java/forge/game/player/Player.java
@@ -32,6 +32,7 @@ import forge.AllZone;
import forge.AllZoneUtil;
import forge.Card;
import forge.CardList;
+import forge.CardPredicates;
import forge.CardUtil;
import forge.Constant;
import forge.GameActionUtil;
@@ -1415,7 +1416,7 @@ public abstract class Player extends GameEntity implements Comparable {
* @return a CardList with all the cards currently in that player's library
*/
public final CardList getCardsIn(final ZoneType zone, final String cardName) {
- return this.getCardsIn(zone).getName(cardName);
+ return this.getCardsIn(zone).filter(CardPredicates.nameEquals(cardName));
}
/**
diff --git a/src/main/java/forge/game/zone/MagicStack.java b/src/main/java/forge/game/zone/MagicStack.java
index f9695222d35..b8895ceb1a7 100644
--- a/src/main/java/forge/game/zone/MagicStack.java
+++ b/src/main/java/forge/game/zone/MagicStack.java
@@ -28,7 +28,7 @@ import forge.AllZone;
import forge.AllZoneUtil;
import forge.Card;
import forge.CardList;
-import forge.CardPredicates;
+import forge.CardPredicates.Presets;
import forge.Command;
import forge.GameActionUtil;
import forge.Singletons;
@@ -762,7 +762,7 @@ public class MagicStack extends MyObservable {
if (sp.isSpell() && AllZoneUtil.isCardInPlay("Bazaar of Wonders")) {
boolean found = false;
CardList all = AllZoneUtil.getCardsIn(ZoneType.Battlefield);
- all = all.filter(CardPredicates.NON_TOKEN);
+ all = all.filter(Presets.NON_TOKEN);
final CardList graves = AllZoneUtil.getCardsIn(ZoneType.Graveyard);
all.addAll(graves);
diff --git a/src/main/java/forge/game/zone/PlayerZoneComesIntoPlay.java b/src/main/java/forge/game/zone/PlayerZoneComesIntoPlay.java
index be09e4e30d4..371818ed62b 100644
--- a/src/main/java/forge/game/zone/PlayerZoneComesIntoPlay.java
+++ b/src/main/java/forge/game/zone/PlayerZoneComesIntoPlay.java
@@ -24,7 +24,7 @@ import forge.AllZone;
import forge.AllZoneUtil;
import forge.Card;
import forge.CardList;
-import forge.CardPredicates;
+import forge.CardPredicates.Presets;
import forge.Command;
import forge.GameActionUtil;
import forge.card.spellability.Ability;
@@ -163,7 +163,7 @@ public class PlayerZoneComesIntoPlay extends DefaultPlayerZone {
@Override
public void resolve() {
CardList lands = tisLand.getController().getCardsIn(ZoneType.Battlefield);
- lands = lands.filter(CardPredicates.LANDS);
+ lands = lands.filter(Presets.LANDS);
for (final Card land : lands) {
land.tap();
}
diff --git a/src/main/java/forge/gui/deckeditor/SEditorUtil.java b/src/main/java/forge/gui/deckeditor/SEditorUtil.java
index 4b7891f6dc4..cb919bed396 100644
--- a/src/main/java/forge/gui/deckeditor/SEditorUtil.java
+++ b/src/main/java/forge/gui/deckeditor/SEditorUtil.java
@@ -89,43 +89,43 @@ public final class SEditorUtil {
view.getLblTotal().setText(String.valueOf(deck.countAll()));
view.getLblCreature().setText(String.valueOf(CardRules.Predicates.Presets
- .IS_CREATURE.aggregate(deck, deck.getFnToCard(), deck.getFnToCount())));
+ .IS_CREATURE.sum(deck, deck.getFnToCard(), deck.getFnToCount())));
view.getLblLand().setText(String.valueOf(CardRules.Predicates.Presets
- .IS_LAND.aggregate(deck, deck.getFnToCard(), deck.getFnToCount())));
+ .IS_LAND.sum(deck, deck.getFnToCard(), deck.getFnToCount())));
view.getLblEnchantment().setText(String.valueOf(CardRules.Predicates.Presets
- .IS_ENCHANTMENT.aggregate(deck, deck.getFnToCard(), deck.getFnToCount())));
+ .IS_ENCHANTMENT.sum(deck, deck.getFnToCard(), deck.getFnToCount())));
view.getLblArtifact().setText(String.valueOf(CardRules.Predicates.Presets
- .IS_ARTIFACT.aggregate(deck, deck.getFnToCard(), deck.getFnToCount())));
+ .IS_ARTIFACT.sum(deck, deck.getFnToCard(), deck.getFnToCount())));
view.getLblInstant().setText(String.valueOf(CardRules.Predicates.Presets
- .IS_INSTANT.aggregate(deck, deck.getFnToCard(), deck.getFnToCount())));
+ .IS_INSTANT.sum(deck, deck.getFnToCard(), deck.getFnToCount())));
view.getLblSorcery().setText(String.valueOf(CardRules.Predicates.Presets
- .IS_SORCERY.aggregate(deck, deck.getFnToCard(), deck.getFnToCount())));
+ .IS_SORCERY.sum(deck, deck.getFnToCard(), deck.getFnToCount())));
view.getLblPlaneswalker().setText(String.valueOf(CardRules.Predicates.Presets
- .IS_PLANESWALKER.aggregate(deck, deck.getFnToCard(), deck.getFnToCount())));
+ .IS_PLANESWALKER.sum(deck, deck.getFnToCard(), deck.getFnToCount())));
view.getLblColorless().setText(String.valueOf(CardRules.Predicates.Presets
- .IS_COLORLESS.aggregate(deck, deck.getFnToCard(), deck.getFnToCount())));
+ .IS_COLORLESS.sum(deck, deck.getFnToCard(), deck.getFnToCount())));
view.getLblBlack().setText(String.valueOf(CardRules.Predicates.Presets
- .IS_BLACK.aggregate(deck, deck.getFnToCard(), deck.getFnToCount())));
+ .IS_BLACK.sum(deck, deck.getFnToCard(), deck.getFnToCount())));
view.getLblBlue().setText(String.valueOf(CardRules.Predicates.Presets
- .IS_BLUE.aggregate(deck, deck.getFnToCard(), deck.getFnToCount())));
+ .IS_BLUE.sum(deck, deck.getFnToCard(), deck.getFnToCount())));
view.getLblGreen().setText(String.valueOf(CardRules.Predicates.Presets
- .IS_GREEN.aggregate(deck, deck.getFnToCard(), deck.getFnToCount())));
+ .IS_GREEN.sum(deck, deck.getFnToCard(), deck.getFnToCount())));
view.getLblRed().setText(String.valueOf(CardRules.Predicates.Presets
- .IS_RED.aggregate(deck, deck.getFnToCard(), deck.getFnToCount())));
+ .IS_RED.sum(deck, deck.getFnToCard(), deck.getFnToCount())));
view.getLblWhite().setText(String.valueOf(CardRules.Predicates.Presets
- .IS_WHITE.aggregate(deck, deck.getFnToCard(), deck.getFnToCount())));
+ .IS_WHITE.sum(deck, deck.getFnToCard(), deck.getFnToCount())));
} // getStats()
/**
diff --git a/src/main/java/forge/gui/deckeditor/controllers/CStatistics.java b/src/main/java/forge/gui/deckeditor/controllers/CStatistics.java
index 71e26e70f9f..c1c129dbed2 100644
--- a/src/main/java/forge/gui/deckeditor/controllers/CStatistics.java
+++ b/src/main/java/forge/gui/deckeditor/controllers/CStatistics.java
@@ -70,81 +70,81 @@ public enum CStatistics implements ICDoc {
if (total == 0) { total = 1; }
tmp = CardRules.Predicates.Presets.IS_MULTICOLOR
- .aggregate(deck, deck.getFnToCard(), deck.getFnToCount());
+ .sum(deck, deck.getFnToCard(), deck.getFnToCount());
VStatistics.SINGLETON_INSTANCE.getLblMulti().setText(String.valueOf(tmp));
tmp = CardRules.Predicates.Presets.IS_CREATURE
- .aggregate(deck, deck.getFnToCard(), deck.getFnToCount());
+ .sum(deck, deck.getFnToCard(), deck.getFnToCount());
VStatistics.SINGLETON_INSTANCE.getLblCreature().setText(
tmp + " (" + SEditorUtil.calculatePercentage(tmp, total) + "%)");
tmp = CardRules.Predicates.Presets.IS_LAND
- .aggregate(deck, deck.getFnToCard(), deck.getFnToCount());
+ .sum(deck, deck.getFnToCard(), deck.getFnToCount());
VStatistics.SINGLETON_INSTANCE.getLblLand().setText(
tmp + " (" + SEditorUtil.calculatePercentage(tmp, total) + "%)");
tmp = CardRules.Predicates.Presets.IS_ENCHANTMENT
- .aggregate(deck, deck.getFnToCard(), deck.getFnToCount());
+ .sum(deck, deck.getFnToCard(), deck.getFnToCount());
VStatistics.SINGLETON_INSTANCE.getLblEnchantment().setText(
tmp + " (" + SEditorUtil.calculatePercentage(tmp, total) + "%)");
tmp = CardRules.Predicates.Presets.IS_ARTIFACT
- .aggregate(deck, deck.getFnToCard(), deck.getFnToCount());
+ .sum(deck, deck.getFnToCard(), deck.getFnToCount());
VStatistics.SINGLETON_INSTANCE.getLblArtifact().setText(
tmp + " (" + SEditorUtil.calculatePercentage(tmp, total) + "%)");
tmp = CardRules.Predicates.Presets.IS_INSTANT
- .aggregate(deck, deck.getFnToCard(), deck.getFnToCount());
+ .sum(deck, deck.getFnToCard(), deck.getFnToCount());
VStatistics.SINGLETON_INSTANCE.getLblInstant().setText(
tmp + " (" + SEditorUtil.calculatePercentage(tmp, total) + "%)");
tmp = CardRules.Predicates.Presets.IS_SORCERY
- .aggregate(deck, deck.getFnToCard(), deck.getFnToCount());
+ .sum(deck, deck.getFnToCard(), deck.getFnToCount());
VStatistics.SINGLETON_INSTANCE.getLblSorcery().setText(
tmp + " (" + SEditorUtil.calculatePercentage(tmp, total) + "%)");
tmp = CardRules.Predicates.Presets.IS_PLANESWALKER
- .aggregate(deck, deck.getFnToCard(), deck.getFnToCount());
+ .sum(deck, deck.getFnToCard(), deck.getFnToCount());
VStatistics.SINGLETON_INSTANCE.getLblPlaneswalker().setText(
tmp + " (" + SEditorUtil.calculatePercentage(tmp, total) + "%)");
tmp = CardRules.Predicates.Presets.IS_COLORLESS
- .aggregate(deck, deck.getFnToCard(), deck.getFnToCount());
+ .sum(deck, deck.getFnToCard(), deck.getFnToCount());
VStatistics.SINGLETON_INSTANCE.getLblColorless().setText(
tmp + " (" + SEditorUtil.calculatePercentage(tmp, total) + "%)");
tmp = Predicate.and(
Predicates.isColor(CardColor.BLACK),
Predicates.hasCntColors((byte) 1))
- .aggregate(deck, deck.getFnToCard(), deck.getFnToCount());
+ .sum(deck, deck.getFnToCard(), deck.getFnToCount());
VStatistics.SINGLETON_INSTANCE.getLblBlack().setText(
tmp + " (" + SEditorUtil.calculatePercentage(tmp, total) + "%)");
tmp = Predicate.and(
Predicates.isColor(CardColor.BLUE),
Predicates.hasCntColors((byte) 1))
- .aggregate(deck, deck.getFnToCard(), deck.getFnToCount());
+ .sum(deck, deck.getFnToCard(), deck.getFnToCount());
VStatistics.SINGLETON_INSTANCE.getLblBlue().setText(
tmp + " (" + SEditorUtil.calculatePercentage(tmp, total) + "%)");
tmp = Predicate.and(
Predicates.isColor(CardColor.GREEN),
Predicates.hasCntColors((byte) 1))
- .aggregate(deck, deck.getFnToCard(), deck.getFnToCount());
+ .sum(deck, deck.getFnToCard(), deck.getFnToCount());
VStatistics.SINGLETON_INSTANCE.getLblGreen().setText(
tmp + " (" + SEditorUtil.calculatePercentage(tmp, total) + "%)");
tmp = Predicate.and(
Predicates.isColor(CardColor.RED),
Predicates.hasCntColors((byte) 1))
- .aggregate(deck, deck.getFnToCard(), deck.getFnToCount());
+ .sum(deck, deck.getFnToCard(), deck.getFnToCount());
VStatistics.SINGLETON_INSTANCE.getLblRed().setText(
tmp + " (" + SEditorUtil.calculatePercentage(tmp, total) + "%)");
tmp = Predicate.and(
Predicates.isColor(CardColor.WHITE),
Predicates.hasCntColors((byte) 1))
- .aggregate(deck, deck.getFnToCard(), deck.getFnToCount());
+ .sum(deck, deck.getFnToCard(), deck.getFnToCount());
VStatistics.SINGLETON_INSTANCE.getLblWhite().setText(
tmp + " (" + SEditorUtil.calculatePercentage(tmp, total) + "%)");
diff --git a/src/main/java/forge/gui/match/controllers/CDock.java b/src/main/java/forge/gui/match/controllers/CDock.java
index b1741b8bb31..e4df86cef64 100644
--- a/src/main/java/forge/gui/match/controllers/CDock.java
+++ b/src/main/java/forge/gui/match/controllers/CDock.java
@@ -33,7 +33,7 @@ import javax.swing.SwingWorker;
import forge.AllZone;
import forge.Card;
-import forge.CardPredicates;
+import forge.CardPredicates.Presets;
import forge.Command;
import forge.Constant;
import forge.Singletons;
@@ -149,7 +149,7 @@ public enum CDock implements ICDoc {
Player human = AllZone.getHumanPlayer();
if (ph.is(PhaseType.COMBAT_DECLARE_ATTACKERS, human)) {
- for(Card c : human.getCardsIn(ZoneType.Battlefield).filter(CardPredicates.CREATURES)) {
+ for(Card c : human.getCardsIn(ZoneType.Battlefield).filter(Presets.CREATURES)) {
if (!c.isAttacking() && CombatUtil.canAttack(c, AllZone.getCombat())) {
AllZone.getCombat().addAttacker(c);
}
diff --git a/src/main/java/forge/util/closures/Predicate.java b/src/main/java/forge/util/closures/Predicate.java
index 7652935e8d3..8b56be2fe2c 100644
--- a/src/main/java/forge/util/closures/Predicate.java
+++ b/src/main/java/forge/util/closures/Predicate.java
@@ -539,7 +539,7 @@ public abstract class Predicate {
* the value accessor
* @return the int
*/
- public final int aggregate(final Iterable source, final Lambda1 accessor,
+ public final int sum(final Iterable source, final Lambda1 accessor,
final Lambda1 valueAccessor) {
int result = 0;
if (source != null) {
@@ -552,6 +552,38 @@ public abstract class Predicate {
return result;
}
+ public final int sum(final Iterable source, final Lambda1 valueAccessor) {
+ int result = 0;
+ if (source != null) {
+ for (final T c : source) {
+ if (this.isTrue(c)) {
+ result += valueAccessor.apply(c);
+ }
+ }
+ }
+ return result;
+ }
+
+ // Returns the element matching predicate conditions with the maximum value of whatever valueAccessor returns.
+ public final T max(final Iterable source, final Lambda1 valueAccessor) {
+ if (source == null) { return null; }
+
+ T result = null;
+ int max = Integer.MIN_VALUE;
+
+ for (final T c : source) {
+ if (!this.isTrue(c)) { continue; }
+
+ int value = valueAccessor.apply(c);
+ if ( value > max ) {
+ result = c;
+ max = value;
+ }
+ }
+ return result;
+ }
+
+
// Random - algorithm adapted from Braid's GeneratorFunctions
/**
* Random.
diff --git a/src/main/java/forge/util/closures/PredicateString.java b/src/main/java/forge/util/closures/PredicateString.java
index 7b8f8b33407..dd24d572386 100644
--- a/src/main/java/forge/util/closures/PredicateString.java
+++ b/src/main/java/forge/util/closures/PredicateString.java
@@ -28,15 +28,14 @@ import org.apache.commons.lang3.StringUtils;
public abstract class PredicateString extends Predicate {
/** Possible operators for string operands. */
public enum StringOp {
-
/** The CONTAINS. */
CONTAINS,
- /** The NO t_ contains. */
- NOT_CONTAINS,
+ /** The CONTAINS ignore case. */
+ CONTAINS_IC,
/** The EQUALS. */
EQUALS,
- /** The NO t_ equals. */
- NOT_EQUALS
+ /** The EQUALS. */
+ EQUALS_IC
}
/** The operator. */
@@ -53,13 +52,13 @@ public abstract class PredicateString extends Predicate {
*/
protected final boolean op(final String op1, final String op2) {
switch (this.getOperator()) {
- case CONTAINS:
+ case CONTAINS_IC:
return StringUtils.containsIgnoreCase(op1, op2);
- case NOT_CONTAINS:
- return !StringUtils.containsIgnoreCase(op1, op2);
+ case CONTAINS:
+ return StringUtils.contains(op1, op2);
case EQUALS:
- return op1.equalsIgnoreCase(op2);
- case NOT_EQUALS:
+ return op1.equals(op2);
+ case EQUALS_IC:
return op1.equalsIgnoreCase(op2);
default:
return false;
@@ -82,4 +81,38 @@ public abstract class PredicateString extends Predicate {
public StringOp getOperator() {
return operator;
}
+
+ public static PredicateString contains(final String what) {
+ return new PredicateString(StringOp.CONTAINS) {
+ @Override
+ public boolean isTrue(String subject) {
+ return op(subject, what);
+ }
+ };
+ }
+ public static PredicateString containsIgnoreCase(final String what) {
+ return new PredicateString(StringOp.CONTAINS_IC) {
+ @Override
+ public boolean isTrue(String subject) {
+ return op(subject, what);
+ }
+ };
+ }
+ public static PredicateString equals(final String what) {
+ return new PredicateString(StringOp.EQUALS) {
+ @Override
+ public boolean isTrue(String subject) {
+ return op(subject, what);
+ }
+ };
+ }
+ public static PredicateString equalsIgnoreCase(final String what) {
+ return new PredicateString(StringOp.EQUALS_IC) {
+ @Override
+ public boolean isTrue(String subject) {
+ return op(subject, what);
+ }
+ };
+ }
+
}