diff --git a/.gitattributes b/.gitattributes index aac5e238cf9..fc7d5a59af5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -11998,9 +11998,9 @@ src/main/java/forge/CardColor.java svneol=native#text/plain src/main/java/forge/CardDamageHistory.java -text src/main/java/forge/CardKeywords.java svneol=native#text/plain src/main/java/forge/CardList.java svneol=native#text/plain -src/main/java/forge/CardListFilter.java svneol=native#text/plain src/main/java/forge/CardListUtil.java svneol=native#text/plain src/main/java/forge/CardPowerToughness.java svneol=native#text/plain +src/main/java/forge/CardPredicates.java svneol=native#text/plain src/main/java/forge/CardType.java svneol=native#text/plain src/main/java/forge/CardUtil.java svneol=native#text/plain src/main/java/forge/Color.java svneol=native#text/plain diff --git a/src/main/java/forge/AllZoneUtil.java b/src/main/java/forge/AllZoneUtil.java index 0d755595d17..63730c5d273 100644 --- a/src/main/java/forge/AllZoneUtil.java +++ b/src/main/java/forge/AllZoneUtil.java @@ -22,6 +22,7 @@ import java.util.List; import forge.game.player.Player; import forge.game.zone.ZoneType; +import forge.util.closures.Predicate; /** * AllZoneUtil contains static functions used to get CardLists of various cards @@ -98,7 +99,7 @@ public abstract class AllZoneUtil { */ public static CardList getCreaturesInPlay() { final CardList creats = AllZoneUtil.getCardsIn(ZoneType.Battlefield); - return creats.filter(CardListFilter.CREATURES); + return creats.filter(CardPredicates.CREATURES); } /** @@ -110,7 +111,7 @@ public abstract class AllZoneUtil { */ public static CardList getCreaturesInPlay(final Player player) { final CardList creats = player.getCardsIn(ZoneType.Battlefield); - return creats.filter(CardListFilter.CREATURES); + return creats.filter(CardPredicates.CREATURES); } // /////////////// Lands @@ -123,7 +124,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(CardListFilter.LANDS); + return player.getCardsIn(ZoneType.Battlefield).filter(CardPredicates.LANDS); } /** @@ -132,7 +133,7 @@ public abstract class AllZoneUtil { * @return a CardList of all lands on the battlefield */ public static CardList getLandsInPlay() { - return AllZoneUtil.getCardsIn(ZoneType.Battlefield).filter(CardListFilter.LANDS); + return AllZoneUtil.getCardsIn(ZoneType.Battlefield).filter(CardPredicates.LANDS); } // ============================================================================= @@ -231,9 +232,9 @@ public abstract class AllZoneUtil { */ public static CardList getPlayerColorInPlay(final Player player, final String color) { CardList cards = player.getCardsIn(ZoneType.Battlefield); - cards = cards.filter(new CardListFilter() { + cards = cards.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { final List colorList = CardUtil.getColors(c); return colorList.contains(color); } diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index faa3acb506d..dccf1b743c1 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -8795,10 +8795,6 @@ public class Card extends GameEntity implements Comparable { if (source.isGreen() && !source.getName().equals("Green Ward")) { return true; } - } else if (kw.equals("Protection from green")) { - if (source.isGreen() && !source.getName().equals("Green Ward")) { - return true; - } } else if (kw.equals("Protection from creatures")) { if (source.isCreature()) { return true; diff --git a/src/main/java/forge/CardList.java b/src/main/java/forge/CardList.java index 9b3e7da95ce..d54dbefb1b6 100644 --- a/src/main/java/forge/CardList.java +++ b/src/main/java/forge/CardList.java @@ -28,6 +28,7 @@ import forge.card.spellability.SpellAbility; import forge.game.phase.CombatUtil; import forge.game.player.Player; import forge.util.MyRandom; +import forge.util.closures.Predicate; /** *

@@ -173,9 +174,9 @@ public class CardList implements Iterable { final CardList list = new CardList(); list.addAll(this); - final CardListFilter clrF = new CardListFilter() { + final Predicate clrF = new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (c.isColorless()) { return true; } @@ -245,9 +246,9 @@ public class CardList implements Iterable { * a {@link java.lang.String} object. */ public final void remove(final String cardName) { - final CardList find = this.filter(new CardListFilter() { + final CardList find = this.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getName().equals(cardName); } }); @@ -471,9 +472,9 @@ public class CardList implements Iterable { * @return a {@link forge.CardList} object. */ public final CardList getController(final Player player) { - return this.filter(new CardListFilter() { + return this.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getController().isPlayer(player); } }); @@ -489,9 +490,9 @@ public class CardList implements Iterable { * @return a {@link forge.CardList} object. */ public final CardList getOwner(final Player player) { - return this.filter(new CardListFilter() { + return this.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getOwner().isPlayer(player); } }); @@ -509,9 +510,9 @@ public class CardList implements Iterable { * @return a {@link forge.CardList} object. */ public final CardList getType(final String cardType) { - return this.filter(new CardListFilter() { + return this.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.isType(cardType); } }); @@ -529,9 +530,9 @@ public class CardList implements Iterable { * @return a {@link forge.CardList} object. */ public final CardList getNotType(final String cardType) { - return this.filter(new CardListFilter() { + return this.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !c.isType(cardType); } }); @@ -545,9 +546,9 @@ public class CardList implements Iterable { * @return a {@link forge.CardList} object. */ public final CardList getPermanents() { - return this.filter(new CardListFilter() { + return this.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.isPermanent(); } }); @@ -563,9 +564,9 @@ public class CardList implements Iterable { * @return a {@link forge.CardList} object. */ public final CardList getKeyword(final String keyword) { - return this.filter(new CardListFilter() { + return this.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.hasKeyword(keyword); } }); @@ -581,9 +582,9 @@ public class CardList implements Iterable { * @return a {@link forge.CardList} object. */ public final CardList getNotKeyword(final String keyword) { - return this.filter(new CardListFilter() { + return this.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !c.hasKeyword(keyword); } }); @@ -600,9 +601,9 @@ public class CardList implements Iterable { * @return a {@link forge.CardList} object. */ public final CardList getKeywordsContain(final String keyword) { - return this.filter(new CardListFilter() { + return this.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.keywordsContain(keyword); } }); @@ -619,9 +620,9 @@ public class CardList implements Iterable { * @return a {@link forge.CardList} object. */ public final CardList getKeywordsDontContain(final String keyword) { - return this.filter(new CardListFilter() { + return this.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !c.keywordsContain(keyword); } }); @@ -635,9 +636,9 @@ public class CardList implements Iterable { * @return a {@link forge.CardList} object. */ public final CardList getTokens() { - return this.filter(new CardListFilter() { + return this.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.isToken(); } }); @@ -652,16 +653,16 @@ public class CardList implements Iterable { * @return a subset of this CardList whose items meet the filtering * criteria; may be empty, but never null. */ - public final CardList filter(final CardListFilter filt) { + public final CardList filter(final Predicate filt) { final CardList result = new CardList(); for (final Card card : this) { - if (filt.addCard(card)) { + if (filt.isTrue(card)) { result.add(card); } } return result; - } - + } + /** *

* toArray. @@ -789,9 +790,9 @@ public class CardList implements Iterable { * @return a {@link forge.CardList} object. */ public final CardList getTargetableCards(final SpellAbility source) { - return this.filter(new CardListFilter() { + return this.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return source.canTarget(c); } }); @@ -807,9 +808,9 @@ public class CardList implements Iterable { * @return a {@link forge.CardList} object. */ public final CardList getUnprotectedCards(final Card source) { - return this.filter(new CardListFilter() { + return this.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !c.hasProtectionFrom(source); } }); @@ -846,9 +847,9 @@ public class CardList implements Iterable { * @return a {@link forge.CardList} object. */ public final CardList getValidCards(final String[] restrictions, final Player sourceController, final Card source) { - return this.filter(new CardListFilter() { + return this.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (c != null) && c.isValid(restrictions, sourceController, source); } }); @@ -862,9 +863,9 @@ public class CardList implements Iterable { * @return a {@link forge.CardList} object. */ public final CardList getEquipMagnets() { - return this.filter(new CardListFilter() { + return this.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (c.isCreature() && (c.getSVar("EquipMe").equals("Multiple") || (c.getSVar("EquipMe").equals( "Once") && !c.isEquipped()))); } @@ -879,9 +880,9 @@ public class CardList implements Iterable { * @return a {@link forge.CardList} object. */ public final CardList getEnchantMagnets() { - return this.filter(new CardListFilter() { + return this.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (c.isCreature() && (c.getSVar("EnchantMe").equals("Multiple") || (c.getSVar("EnchantMe").equals( "Once") && !c.isEnchanted()))); } @@ -896,9 +897,9 @@ public class CardList implements Iterable { * @return a {@link forge.CardList} object. */ public final CardList getPossibleBlockers(final Card attacker) { - return this.filter(new CardListFilter() { + return this.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (c.isCreature() && CombatUtil.canBlock(attacker, c)); } }); @@ -960,9 +961,9 @@ public class CardList implements Iterable { * @return a {@link forge.CardList} object. */ public final CardList getColored() { - return this.filter(new CardListFilter() { + return this.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (!c.isColorless()); } }); @@ -977,9 +978,9 @@ public class CardList implements Iterable { * @return a {@link forge.CardList} object. */ public final CardList getMonoColored(final boolean includeColorless) { - return this.filter(new CardListFilter() { + return this.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (CardUtil.getColors(c).size() == 1 && (includeColorless || !c.isColorless())); } }); diff --git a/src/main/java/forge/CardListFilter.java b/src/main/java/forge/CardListFilter.java deleted file mode 100644 index fc9c85ba165..00000000000 --- a/src/main/java/forge/CardListFilter.java +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Forge: Play Magic: the Gathering. - * Copyright (C) 2011 Forge Team - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package forge; - -/** - *

- * CardListFilter interface. - *

- * - * @author Forge - * @version $Id$ - */ -public interface CardListFilter { - /** - *

- * addCard. - *

- * - * @param c - * a {@link forge.Card} object. - * @return a boolean. - */ - boolean addCard(Card c); - - /** - * a CardListFilter to get all cards that are tapped. - */ - CardListFilter TAPPED = new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return c.isTapped(); - } - }; - - /** - * a CardListFilter to get all cards that are untapped. - */ - CardListFilter UNTAPPED = new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return c.isUntapped(); - } - }; - - /** - * a CardListFilter to get all creatures. - */ - CardListFilter CREATURES = new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return c.isCreature(); - } - }; - - /** - * a CardListFilter to get all enchantments. - */ - CardListFilter ENCHANTMENTS = new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return c.isEnchantment(); - } - }; - - /** - * a CardListFilter to get all equipment. - */ - CardListFilter EQUIPMENT = new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return c.isEquipment(); - } - }; - - /** - * a CardListFilter to get all unenchanted cards in a list. - */ - CardListFilter UNENCHANTED = new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return !c.isEnchanted(); - } - }; - - /** - * a CardListFilter to get all enchanted cards in a list. - */ - CardListFilter ENCHANTED = new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return c.isEnchanted(); - } - }; - - /** - * a CardListFilter to get all nontoken cards. - */ - CardListFilter NON_TOKEN = new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return !c.isToken(); - } - }; - - /** - * a CardListFilter to get all token cards. - */ - CardListFilter TOKEN = new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return c.isToken(); - } - }; - - /** - * a CardListFilter to get all nonbasic lands. - */ - CardListFilter NON_BASIC_LAND = new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return !c.isBasicLand(); - } - }; - - /** - * a CardListFilter to get all basicLands. - */ - CardListFilter BASIC_LANDS = new CardListFilter() { - @Override - public boolean addCard(final Card c) { - // the isBasicLand() check here may be sufficient... - return c.isLand() && c.isBasicLand(); - } - }; - - /** - * a CardListFilter to get all artifacts. - */ - CardListFilter ARTIFACTS = new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return c.isArtifact(); - } - }; - - /** - * a CardListFilter to get all nonartifacts. - */ - CardListFilter NON_ARTIFACTS = new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return !c.isArtifact(); - } - }; - - /** - * a CardListFilter to get all lands. - */ - CardListFilter LANDS = new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return c.isLand(); - } - }; - - /** - * a CardListFilter to get all nonlands. - */ - CardListFilter NON_LANDS = new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return !c.isLand(); - } - }; - - /** - * a CardListFilter to get all cards that are black. - */ - CardListFilter BLACK = new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return c.isBlack(); - } - }; - - /** - * a CardListFilter to get all cards that are blue. - */ - CardListFilter BLUE = new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return c.isBlue(); - } - }; - - /** - * a CardListFilter to get all cards that are green. - */ - CardListFilter GREEN = new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return c.isGreen(); - } - }; - - /** - * a CardListFilter to get all cards that are red. - */ - CardListFilter RED = new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return c.isRed(); - } - }; - - /** - * a CardListFilter to get all cards that are white. - */ - CardListFilter WHITE = new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return c.isWhite(); - } - }; - -} diff --git a/src/main/java/forge/CardListUtil.java b/src/main/java/forge/CardListUtil.java index 0d3fe65e9bd..2b151d86a8f 100644 --- a/src/main/java/forge/CardListUtil.java +++ b/src/main/java/forge/CardListUtil.java @@ -23,6 +23,7 @@ import java.util.Comparator; import com.esotericsoftware.minlog.Log; import forge.card.cardfactory.CardFactoryUtil; +import forge.util.closures.Predicate; /** *

@@ -441,9 +442,9 @@ public class CardListUtil { * @return a {@link forge.CardList} object. */ public static CardList getColor(final CardList list, final String color) { - return list.filter(new CardListFilter() { + return list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return CardUtil.getColors(c).contains(color); } }); @@ -459,9 +460,9 @@ public class CardListUtil { * @return a {@link forge.CardList} object. */ public static CardList getGoldCards(final CardList list) { - return list.filter(new CardListFilter() { + return list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return CardUtil.getColors(c).size() >= 2; } }); diff --git a/src/main/java/forge/CardPredicates.java b/src/main/java/forge/CardPredicates.java new file mode 100644 index 00000000000..0a0b853652c --- /dev/null +++ b/src/main/java/forge/CardPredicates.java @@ -0,0 +1,232 @@ +/* + * Forge: Play Magic: the Gathering. + * Copyright (C) 2011 Forge Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package forge; + +import forge.util.closures.Predicate; + +/** + *

+ * Predicate interface. + *

+ * + * @author Forge + * @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(); + } + }; + + /** + * 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/GameAction.java b/src/main/java/forge/GameAction.java index 2da76bc58a6..66428eb0f62 100644 --- a/src/main/java/forge/GameAction.java +++ b/src/main/java/forge/GameAction.java @@ -58,6 +58,7 @@ import forge.game.zone.PlayerZoneComesIntoPlay; import forge.game.zone.ZoneType; import forge.gui.GuiUtils; import forge.gui.match.ViewWinLose; +import forge.util.closures.Predicate; /** * Methods for common actions performed during a game. @@ -1166,13 +1167,13 @@ public class GameAction { } // for q=0;q<2 /* //Experiment Kraj experiment - CardList krajs = AllZoneUtil.getCardsIn(ZoneType.Battlefield).filter(new CardListFilter() { + CardList krajs = AllZoneUtil.getCardsIn(ZoneType.Battlefield).filter(new Predicate() { @Override public boolean addCard(Card c) { return c.getName().equals("Experiment Kraj"); } }); - CardList P1P1s = AllZoneUtil.getCardsIn(ZoneType.Battlefield).filter(new CardListFilter() { + CardList P1P1s = AllZoneUtil.getCardsIn(ZoneType.Battlefield).filter(new Predicate() { @Override public boolean addCard(Card c) { return c.getCounters(Counters.P1P1) > 0; @@ -1255,9 +1256,9 @@ public class GameAction { while (!a.isEmpty()) { CardList b = AllZoneUtil.getCardsIn(ZoneType.Battlefield, a.get(0).getName()); b = b.getType("Legendary"); - b = b.filter(new CardListFilter() { + b = b.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !c.isFaceDown(); } }); @@ -1317,9 +1318,9 @@ public class GameAction { if (c.isEnchanted()) { CardList list = new CardList(c.getEnchantedBy()); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card crd) { + public boolean isTrue(final Card crd) { return crd.hasKeyword("Totem armor"); } }); @@ -1500,9 +1501,9 @@ public class GameAction { if (c.isEnchanted()) { CardList list = new CardList(c.getEnchantedBy()); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card crd) { + public boolean isTrue(final Card crd) { return crd.hasKeyword("Totem armor"); } }); @@ -1770,9 +1771,9 @@ public class GameAction { } } else if (spell.getSourceCard().hasKeyword("Convoke")) { CardList untappedCreats = spell.getActivatingPlayer().getCardsIn(ZoneType.Battlefield).getType("Creature"); - untappedCreats = untappedCreats.filter(new CardListFilter() { + untappedCreats = untappedCreats.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !c.isTapped(); } }); diff --git a/src/main/java/forge/GameActionUtil.java b/src/main/java/forge/GameActionUtil.java index a13afc5f87e..b8a93394bc5 100644 --- a/src/main/java/forge/GameActionUtil.java +++ b/src/main/java/forge/GameActionUtil.java @@ -52,6 +52,7 @@ import forge.game.zone.ZoneType; import forge.gui.GuiUtils; import forge.gui.match.CMatchUI; import forge.util.MyRandom; +import forge.util.closures.Predicate; /** *

@@ -859,7 +860,7 @@ public final class GameActionUtil { public void resolve() { for (int i = 0; i < damage; i++) { CardList nonTokens = player.getCardsIn(ZoneType.Battlefield); - nonTokens = nonTokens.filter(CardListFilter.NON_TOKEN); + nonTokens = nonTokens.filter(CardPredicates.NON_TOKEN); if (nonTokens.size() == 0) { player.loseConditionMet(GameLossReason.SpellEffect, lich.getName()); } else { @@ -1154,7 +1155,7 @@ public final class GameActionUtil { produces.put("Swamp", "B"); CardList lands = AllZoneUtil.getCardsInGame(); - lands = lands.filter(CardListFilter.LANDS); + lands = lands.filter(CardPredicates.LANDS); // remove all abilities granted by this Command for (final Card land : lands) { @@ -1308,9 +1309,9 @@ public final class GameActionUtil { public void execute() { CardList list = AllZoneUtil.getCardsIn(ZoneType.Battlefield); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getName().equals("Avatar") && c.getImageName().equals("W N N Avatar"); } }); @@ -1370,9 +1371,9 @@ public final class GameActionUtil { private boolean getsBonus(final Card c) { CardList list = c.getController().getCardsIn(ZoneType.Battlefield); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getName().equals("Guan Yu, Sainted Warrior") || c.getName().equals("Zhang Fei, Fierce Warrior"); } @@ -1390,9 +1391,9 @@ public final class GameActionUtil { @Override public void execute() { CardList list = AllZoneUtil.getCardsIn(ZoneType.Battlefield); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getName().equals("Wolf") && c.hasKeyword("This creature gets +1/+1 for each card " + "named Sound the Call in each graveyard."); @@ -1521,9 +1522,9 @@ public final class GameActionUtil { public static void doPowerSink(final Player p) { // get all lands with mana abilities CardList lands = AllZoneUtil.getPlayerLandsInPlay(p); - lands = lands.filter(new CardListFilter() { + lands = lands.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getManaAbility().size() > 0; } }); diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryAttach.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryAttach.java index cefd26262c0..d600cf04749 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.CardListFilter; +import forge.CardPredicates; import forge.CardUtil; import forge.Command; import forge.GameActionUtil; @@ -49,6 +49,7 @@ import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.GuiUtils; import forge.util.MyRandom; +import forge.util.closures.Predicate; /** * The Class AbilityFactory_Attach. @@ -501,9 +502,9 @@ public class AbilityFactoryAttach { // AI For choosing a Card to Animate. CardList betterList = list.getNotType("Creature"); if (sa.getSourceCard().getName().equals("Animate Artifact")) { - betterList = betterList.filter(new CardListFilter() { + betterList = betterList.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getCMC() > 0; } }); @@ -589,9 +590,9 @@ public class AbilityFactoryAttach { // Probably want to "weight" the list by amount of Enchantments and // choose the "lightest" - magnetList = magnetList.filter(new CardListFilter() { + magnetList = magnetList.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return CombatUtil.canAttack(c); } }); @@ -635,9 +636,9 @@ public class AbilityFactoryAttach { if (totToughness < 0) { // Don't kill my own stuff with Negative toughness Auras final int tgh = totToughness; - prefList = prefList.filter(new CardListFilter() { + prefList = prefList.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getLethalDamage() > Math.abs(tgh); } }); @@ -654,11 +655,11 @@ public class AbilityFactoryAttach { } if (!keywords.isEmpty()) { final ArrayList finalKWs = keywords; - prefList = prefList.filter(new CardListFilter() { + prefList = prefList.filter(new Predicate() { // If Aura grants only Keywords, don't Stack unstackable // keywords @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { for (final String kw : finalKWs) { if (c.hasKeyword(kw)) { return false; @@ -671,9 +672,9 @@ public class AbilityFactoryAttach { } // Don't pump cards that will die. - prefList = prefList.filter(new CardListFilter() { + prefList = prefList.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !c.getSVar("Targeting").equals("Dies"); } }); @@ -681,21 +682,15 @@ 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(new CardListFilter() { - - @Override - public boolean addCard(final Card c) { - return !c.isEnchanted(); - } - }); + prefList = prefList.filter(Predicate.not(CardPredicates.ENCHANTED)); } if (!grantingAbilities) { // Probably prefer to Enchant Creatures that Can Attack // Filter out creatures that can't Attack or have Defender - prefList = prefList.filter(new CardListFilter() { + prefList = prefList.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !c.isCreature() || CombatUtil.canAttack(c); } }); @@ -776,9 +771,9 @@ public class AbilityFactoryAttach { if (totToughness < 0) { // Kill a creature if we can final int tgh = totToughness; - prefList = list.filter(new CardListFilter() { + prefList = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (!c.hasKeyword("Indestructible") && (c.getLethalDamage() <= Math.abs(tgh))) { return true; } @@ -802,9 +797,9 @@ public class AbilityFactoryAttach { // things to begin with if (keywords.contains("CARDNAME can't attack.") || keywords.contains("Defender") || keywords.contains("CARDNAME attacks each turn if able.")) { - prefList = prefList.filter(new CardListFilter() { + prefList = prefList.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !(c.hasKeyword("CARDNAME can't attack.") || c.hasKeyword("Defender")); } }); @@ -880,9 +875,9 @@ public class AbilityFactoryAttach { public static Card attachAIKeepTappedPreference(final SpellAbility sa, final CardList list, final boolean mandatory, final Card attachSource) { // AI For Cards like Paralyzing Grasp and Glimmerdust Nap - final CardList prefList = list.filter(new CardListFilter() { + final CardList prefList = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { // Don't do Untapped Vigilance cards if (c.isCreature() && c.hasKeyword("Vigilance") && c.isUntapped()) { return false; diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java index ac7faee662b..c4c65dca237 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java @@ -27,7 +27,7 @@ import forge.AllZoneUtil; import forge.Card; import forge.CardCharacteristicName; import forge.CardList; -import forge.CardListFilter; +import forge.CardPredicates; import forge.CardListUtil; import forge.CardUtil; import forge.GameActionUtil; @@ -55,6 +55,7 @@ import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; import forge.gui.GuiUtils; import forge.util.MyRandom; +import forge.util.closures.Predicate; /** *

@@ -1165,9 +1166,9 @@ public final class AbilityFactoryChangeZone { // Save a card as a default, in case we can't find anything suitable. Card first = fetchList.get(0); if (ZoneType.Battlefield.equals(destination)) { - fetchList = fetchList.filter(new CardListFilter() { + fetchList = fetchList.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (c.isType("Legendary")) { if (!AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield, c.getName()).isEmpty()) { return false; @@ -1177,9 +1178,9 @@ public final class AbilityFactoryChangeZone { } }); if (player.isHuman() && params.containsKey("GainControl")) { - fetchList = fetchList.filter(new CardListFilter() { + fetchList = fetchList.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (!c.getSVar("RemAIDeck").equals("") || !c.getSVar("RemRandomDeck").equals("")) { return false; } @@ -1210,8 +1211,8 @@ public final class AbilityFactoryChangeZone { Player ai = AllZone.getComputerPlayer(); // Does AI need a land? CardList hand = ai.getCardsIn(ZoneType.Hand); - System.out.println("Lands in hand = " + hand.filter(CardListFilter.LANDS).size() + ", on battlefield = " + ai.getCardsIn(ZoneType.Battlefield).filter(CardListFilter.LANDS).size()); - if (hand.filter(CardListFilter.LANDS).size() == 0 && ai.getCardsIn(ZoneType.Battlefield).filter(CardListFilter.LANDS).size() < 4) { + 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) { boolean canCastSomething = false; for (Card cardInHand : hand) { canCastSomething |= ComputerUtil.payManaCost(cardInHand.getFirstSpellAbility(), AllZone.getComputerPlayer(), true, 0, false); @@ -1659,9 +1660,9 @@ public final class AbilityFactoryChangeZone { CardList aiPermanents = list.getController(AllZone.getComputerPlayer()); // Don't blink cards that will die. - aiPermanents = aiPermanents.filter(new CardListFilter() { + aiPermanents = aiPermanents.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !c.getSVar("Targeting").equals("Dies"); } }); @@ -1704,9 +1705,9 @@ public final class AbilityFactoryChangeZone { } // Blink permanents with ETB triggers else if (sa.isAbility() && (sa.getPayCosts() != null) && AbilityFactory.playReusable(sa)) { - aiPermanents = aiPermanents.filter(new CardListFilter() { + aiPermanents = aiPermanents.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (c.getNumberOfCounters() > 0) { return false; // don't blink something with } @@ -1753,9 +1754,9 @@ public final class AbilityFactoryChangeZone { return false; } list = list.getController(AllZone.getHumanPlayer()); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { for (Card aura : c.getEnchantedBy()) { if (c.getOwner().isHuman() && aura.getController().isComputer()) { return false; diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java index 7c227f04c8f..7d68ba093f5 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.CardListFilter; +import forge.CardPredicates; import forge.CardUtil; import forge.Constant; import forge.card.cardfactory.CardFactoryUtil; @@ -51,6 +51,7 @@ import forge.gui.ListChooser; import forge.item.CardDb; import forge.item.CardPrinted; import forge.util.MyRandom; +import forge.util.closures.Predicate; /** *

@@ -1642,12 +1643,7 @@ public final class AbilityFactoryChoose { } } else { CardList list = AllZoneUtil.getCardsInGame().getController(AllZone.getHumanPlayer()); - list = list.filter(new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return !c.isLand(); - } - }); + list = list.filter(Predicate.not(CardPredicates.LANDS)); if (!list.isEmpty()) { chosen = list.get(0).getName(); } @@ -1980,8 +1976,8 @@ public final class AbilityFactoryChoose { } } else { // Computer if (params.containsKey("AILogic") && params.get("AILogic").equals("BestBlocker")) { - if (choices.filter(CardListFilter.UNTAPPED).isEmpty()) { - choices = choices.filter(CardListFilter.UNTAPPED); + if (choices.filter(CardPredicates.UNTAPPED).isEmpty()) { + choices = choices.filter(CardPredicates.UNTAPPED); } chosen.add(CardFactoryUtil.getBestCreatureAI(choices)); } else { diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryCombat.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryCombat.java index 91a455c9580..cd9a3a1821b 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryCombat.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryCombat.java @@ -23,7 +23,6 @@ import java.util.HashMap; import forge.AllZone; import forge.Card; import forge.CardList; -import forge.CardListFilter; import forge.Singletons; import forge.card.cardfactory.CardFactoryUtil; import forge.card.spellability.AbilityActivated; @@ -37,6 +36,7 @@ import forge.game.phase.PhaseType; import forge.game.player.ComputerUtil; import forge.game.player.Player; import forge.game.zone.ZoneType; +import forge.util.closures.Predicate; /** *

@@ -1060,9 +1060,9 @@ public final class AbilityFactoryCombat { CardList list = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield).getType("Creature"); list = list.getTargetableCards(sa); list = list.getValidCards(abTgt.getValidTgts(), source.getController(), source); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { boolean tapped = c.isTapped(); c.setTapped(false); if (!CombatUtil.canBlock(definedAttacker, c)) { diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryCopy.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryCopy.java index cdb07ddd0e3..37a8efeea4f 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.CardListFilter; +import forge.CardPredicates; import forge.Command; import forge.Singletons; import forge.card.cost.Cost; @@ -323,7 +323,7 @@ public final class AbilityFactoryCopy { } Card choice; - if (list.filter(CardListFilter.CREATURES).size() > 0) { + if (list.filter(CardPredicates.CREATURES).size() > 0) { choice = CardFactoryUtil.getBestCreatureAI(list); } else { choice = CardFactoryUtil.getMostExpensivePermanentAI(list, sa, true); diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryCounters.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryCounters.java index f1e3a50e041..109ceeb2d6f 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryCounters.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryCounters.java @@ -28,7 +28,6 @@ import forge.AllZone; import forge.AllZoneUtil; import forge.Card; import forge.CardList; -import forge.CardListFilter; import forge.Counters; import forge.Singletons; import forge.card.cardfactory.CardFactoryUtil; @@ -49,6 +48,7 @@ import forge.game.zone.ZoneType; import forge.gui.GuiUtils; import forge.gui.match.CMatchUI; import forge.util.MyRandom; +import forge.util.closures.Predicate; import forge.view.ButtonUtil; /** @@ -310,9 +310,9 @@ public class AbilityFactoryCounters { final Player player = af.isCurse() ? AllZone.getHumanPlayer() : AllZone.getComputerPlayer(); list = player.getCardsIn(ZoneType.Battlefield); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.canBeTargetedBy(sa) && !c.hasKeyword("CARDNAME can't have counters placed on it.") && !(c.hasKeyword("CARDNAME can't have -1/-1 counters placed on it.") && type.equals("M1M1")); } @@ -474,9 +474,9 @@ public class AbilityFactoryCounters { abTgt.resetTargets(); // target loop while (abTgt.getNumTargeted() < abTgt.getMaxTargets(sa.getSourceCard(), sa)) { - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return sa.canTarget(c); } }); @@ -656,9 +656,9 @@ public class AbilityFactoryCounters { Card choice; if (type.equals("M1M1")) { // try to kill the best killable creature, or reduce the best one - final CardList killable = list.filter(new CardListFilter() { + final CardList killable = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getNetDefense() <= amount; } }); @@ -690,9 +690,9 @@ public class AbilityFactoryCounters { if (type.equals("P1P1")) { choice = CardFactoryUtil.getBestCreatureAI(list); } else if (type.equals("DIVINITY")) { - final CardList boon = list.filter(new CardListFilter() { + final CardList boon = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getCounters(Counters.DIVINITY) == 0; } }); @@ -1445,9 +1445,9 @@ public class AbilityFactoryCounters { } CardList hperms = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); CardList cperms = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield); - cperms = cperms.filter(new CardListFilter() { + cperms = cperms.filter(new Predicate() { @Override - public boolean addCard(final Card crd) { + public boolean isTrue(final Card crd) { for (final Counters c1 : Counters.values()) { if (crd.getCounters(c1) != 0 && !CardFactoryUtil.isNegativeCounter(c1)) { return true; @@ -1457,9 +1457,9 @@ public class AbilityFactoryCounters { } }); - hperms = hperms.filter(new CardListFilter() { + hperms = hperms.filter(new Predicate() { @Override - public boolean addCard(final Card crd) { + public boolean isTrue(final Card crd) { for (final Counters c1 : Counters.values()) { if (crd.getCounters(c1) != 0 && CardFactoryUtil.isNegativeCounter(c1)) { return true; @@ -1573,9 +1573,9 @@ public class AbilityFactoryCounters { } }); } else { // Compy - cperms = cperms.filter(new CardListFilter() { + cperms = cperms.filter(new Predicate() { @Override - public boolean addCard(final Card crd) { + public boolean isTrue(final Card crd) { for (final Counters c1 : Counters.values()) { if (crd.getCounters(c1) != 0) { if (!CardFactoryUtil.isNegativeCounter(c1)) { @@ -1587,9 +1587,9 @@ public class AbilityFactoryCounters { } }); - hperms = hperms.filter(new CardListFilter() { + hperms = hperms.filter(new Predicate() { @Override - public boolean addCard(final Card crd) { + public boolean isTrue(final Card crd) { for (final Counters c1 : Counters.values()) { if (crd.getCounters(c1) != 0) { if (CardFactoryUtil.isNegativeCounter(c1)) { @@ -1916,9 +1916,9 @@ public class AbilityFactoryCounters { if (curse) { if (type.equals("M1M1")) { - final CardList killable = hList.filter(new CardListFilter() { + final CardList killable = hList.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getNetDefense() <= amount; } }); diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryDealDamage.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryDealDamage.java index 8228320c11a..7d4912a41e7 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryDealDamage.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryDealDamage.java @@ -25,7 +25,6 @@ import forge.AllZone; import forge.AllZoneUtil; import forge.Card; import forge.CardList; -import forge.CardListFilter; import forge.CardUtil; import forge.Singletons; import forge.card.cardfactory.CardFactoryUtil; @@ -43,6 +42,7 @@ import forge.game.player.ComputerUtil; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.util.MyRandom; +import forge.util.closures.Predicate; /** *

@@ -534,9 +534,9 @@ public class AbilityFactoryDealDamage { } hPlay = hPlay.getTargetableCards(saMe); - final CardList killables = hPlay.filter(new CardListFilter() { + final CardList killables = hPlay.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (c.getEnoughDamageToKill(d, source, false, noPrevention) <= d) && !ComputerUtil.canRegenerate(c) && !(c.getSVar("SacMe").length() > 0); } @@ -1231,9 +1231,9 @@ public class AbilityFactoryDealDamage { CardList list = player.getCardsIn(ZoneType.Battlefield); list = list.getValidCards(validC.split(","), source.getController(), source); - final CardListFilter filterKillable = new CardListFilter() { + final Predicate filterKillable = new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (c.predictDamage(dmg, source, false) >= c.getKillDamage()); } }; @@ -1863,9 +1863,9 @@ public class AbilityFactoryDealDamage { CardList aiCreatures = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); aiCreatures = aiCreatures.getTargetableCards(sa); - aiCreatures = aiCreatures.filter(new CardListFilter() { + aiCreatures = aiCreatures.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !c.getSVar("Targeting").equals("Dies"); } }); diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryDebuff.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryDebuff.java index 22e470bd698..76d89ddbccd 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryDebuff.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryDebuff.java @@ -27,7 +27,6 @@ import forge.AllZone; import forge.AllZoneUtil; import forge.Card; import forge.CardList; -import forge.CardListFilter; import forge.Command; import forge.Singletons; import forge.card.cardfactory.CardFactoryUtil; @@ -44,6 +43,7 @@ import forge.game.phase.PhaseType; import forge.game.player.ComputerUtil; import forge.game.zone.ZoneType; import forge.util.MyRandom; +import forge.util.closures.Predicate; /** *

@@ -448,9 +448,9 @@ public final class AbilityFactoryDebuff { list = list.getTargetableCards(sa); if (!list.isEmpty()) { - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.hasAnyKeyword(kws); // don't add duplicate negative // keywords } @@ -797,9 +797,9 @@ public final class AbilityFactoryDebuff { // TODO - add blocking situations here also // only count creatures that can attack - human = human.filter(new CardListFilter() { + human = human.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return CombatUtil.canAttack(c); } }); diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryDestroy.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryDestroy.java index 0a6051fa6a8..70e9e117f96 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryDestroy.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryDestroy.java @@ -26,7 +26,6 @@ import forge.AllZone; import forge.AllZoneUtil; import forge.Card; import forge.CardList; -import forge.CardListFilter; import forge.CardUtil; import forge.Counters; import forge.Singletons; @@ -42,6 +41,7 @@ import forge.game.player.ComputerUtil; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.util.MyRandom; +import forge.util.closures.Predicate; /** *

@@ -252,9 +252,9 @@ public class AbilityFactoryDestroy { } list = list.getNotKeyword("Indestructible"); if (!AbilityFactory.playReusable(sa)) { - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (!c.hasKeyword("Undying") || c.getCounters(Counters.P1P1) > 0); } }); @@ -264,9 +264,9 @@ public class AbilityFactoryDestroy { // regeneration shield if (!noRegen) { // TODO filter out things that might be tougher? - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return ((c.getShield() == 0) && !ComputerUtil.canRegenerate(c)); } }); @@ -392,9 +392,9 @@ public class AbilityFactoryDestroy { if (!noRegen) { // TODO filter out things that could regenerate in response? // might be tougher? - preferred = preferred.filter(new CardListFilter() { + preferred = preferred.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getShield() == 0; } }); @@ -860,15 +860,15 @@ public class AbilityFactoryDestroy { } humanlist = humanlist.getValidCards(valid.split(","), source.getController(), source); computerlist = computerlist.getValidCards(valid.split(","), source.getController(), source); - humanlist = humanlist.filter(new CardListFilter() { + humanlist = humanlist.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !(c.hasKeyword("Indestructible") || c.getSVar("SacMe").length() > 0); } }); - computerlist = computerlist.filter(new CardListFilter() { + computerlist = computerlist.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !(c.hasKeyword("Indestructible") || c.getSVar("SacMe").length() > 0); } }); @@ -943,15 +943,15 @@ public class AbilityFactoryDestroy { humanlist = humanlist.getValidCards(valid.split(","), source.getController(), source); computerlist = computerlist.getValidCards(valid.split(","), source.getController(), source); - humanlist = humanlist.filter(new CardListFilter() { + humanlist = humanlist.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !(c.hasKeyword("Indestructible") || c.getSVar("SacMe").length() > 0); } }); - computerlist = computerlist.filter(new CardListFilter() { + computerlist = computerlist.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !(c.hasKeyword("Indestructible") || c.getSVar("SacMe").length() > 0); } }); diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryEffect.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryEffect.java index f499c8e2024..5e34fac7801 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryEffect.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryEffect.java @@ -25,7 +25,6 @@ import forge.AllZone; import forge.AllZoneUtil; import forge.Card; import forge.CardList; -import forge.CardListFilter; import forge.Command; import forge.Singletons; import forge.card.cardfactory.CardFactoryUtil; @@ -47,6 +46,7 @@ import forge.game.player.ComputerUtil; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.util.MyRandom; +import forge.util.closures.Predicate; /** *

@@ -299,15 +299,15 @@ public class AbilityFactoryEffect { CardList human = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield).getType("Creature"); // only count creatures that can attack or block - comp = comp.filter(new CardListFilter() { + comp = comp.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return CombatUtil.canAttack(c); } }); - human = human.filter(new CardListFilter() { + human = human.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return CombatUtil.canBlock(c); } }); diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryGainControl.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryGainControl.java index aa63af01ab5..3391d4d1eeb 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryGainControl.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryGainControl.java @@ -26,7 +26,6 @@ import forge.AllZone; import forge.AllZoneUtil; import forge.Card; import forge.CardList; -import forge.CardListFilter; import forge.Command; import forge.GameEntity; import forge.Singletons; @@ -43,6 +42,7 @@ import forge.game.player.ComputerUtil; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.util.MyRandom; +import forge.util.closures.Predicate; //AB:GainControl|ValidTgts$Creature|TgtPrompt$Select target legendary creature|LoseControl$Untap,LoseControl|SpellDescription$Gain control of target xxxxxxx @@ -335,9 +335,9 @@ public class AbilityFactoryGainControl { list = list.getValidCards(tgt.getValidTgts(), sa.getSourceCard().getController(), sa.getSourceCard()); // AI won't try to grab cards that are filtered out of AI decks on // purpose - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { final Map vars = c.getSVars(); return !vars.containsKey("RemAIDeck") && c.canBeTargetedBy(sa); } @@ -854,9 +854,9 @@ public class AbilityFactoryGainControl { list = list.getValidCards(tgt.getValidTgts(), AllZone.getComputerPlayer(), sa.getSourceCard()); // AI won't try to grab cards that are filtered out of AI decks on // purpose - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { final Map vars = c.getSVars(); return !vars.containsKey("RemAIDeck") && c.canBeTargetedBy(sa); } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryPermanentState.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryPermanentState.java index 297d55b5143..e013f28a094 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.CardListFilter; +import forge.CardPredicates; import forge.Singletons; import forge.card.cardfactory.CardFactoryUtil; import forge.card.cost.Cost; @@ -44,6 +44,7 @@ import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.GuiUtils; import forge.util.MyRandom; +import forge.util.closures.Predicate; /** *

@@ -402,7 +403,7 @@ public class AbilityFactoryPermanentState { untapList = untapList.getTargetableCards(sa); untapList = untapList.getValidCards(tgt.getValidTgts(), source.getController(), source); - untapList = untapList.filter(CardListFilter.TAPPED); + untapList = untapList.filter(CardPredicates.TAPPED); // filter out enchantments and planeswalkers, their tapped state doesn't // matter. final String[] tappablePermanents = { "Creature", "Land", "Artifact" }; @@ -485,7 +486,7 @@ public class AbilityFactoryPermanentState { } // try to just tap already tapped things - tapList = list.filter(CardListFilter.UNTAPPED); + tapList = list.filter(CardPredicates.UNTAPPED); if (AbilityFactoryPermanentState.untapTargetList(source, tgt, af, sa, mandatory, tapList)) { return true; @@ -633,7 +634,7 @@ public class AbilityFactoryPermanentState { } else { CardList list = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield); list = list.getType(valid); - list = list.filter(CardListFilter.TAPPED); + list = list.filter(CardPredicates.TAPPED); int count = 0; while ((list.size() != 0) && (count < num)) { @@ -995,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(CardListFilter.UNTAPPED); + tapList = tapList.filter(CardPredicates.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" }; @@ -1031,9 +1032,9 @@ public class AbilityFactoryPermanentState { if (phase.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { //Combat has already started final CardList attackers = AllZone.getCombat().getAttackerList(); - CardList creatureList = tapList.filter(new CardListFilter() { + CardList creatureList = tapList.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (c.isCreature()) { return CombatUtil.canBlockAtLeastOne(c, attackers); } @@ -1046,9 +1047,9 @@ public class AbilityFactoryPermanentState { } else { final CardList attackers = ComputerUtil.getPossibleAttackers(); attackers.remove(sa.getSourceCard()); - CardList creatureList = tapList.filter(new CardListFilter() { + CardList creatureList = tapList.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (c.isCreature()) { return CombatUtil.canBlockAtLeastOne(c, attackers); } @@ -1063,9 +1064,9 @@ public class AbilityFactoryPermanentState { && phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)) { // Tap creatures possible blockers before combat during AI's turn. if (!tapList.getType("Creature").isEmpty()) { - CardList creatureList = tapList.filter(new CardListFilter() { + CardList creatureList = tapList.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (c.isCreature()) { return CombatUtil.canAttack(c); } @@ -1132,7 +1133,7 @@ public class AbilityFactoryPermanentState { } // try to just tap already tapped things - tapList = list.filter(CardListFilter.TAPPED); + tapList = list.filter(CardPredicates.TAPPED); if (AbilityFactoryPermanentState.tapTargetList(af, sa, tapList, mandatory)) { return true; @@ -1751,7 +1752,7 @@ public class AbilityFactoryPermanentState { } validTappables = validTappables.getValidCards(valid, source.getController(), source); - validTappables = validTappables.filter(CardListFilter.UNTAPPED); + validTappables = validTappables.filter(CardPredicates.UNTAPPED); final Random r = MyRandom.getRandom(); boolean rr = false; @@ -1760,15 +1761,15 @@ public class AbilityFactoryPermanentState { } if (validTappables.size() > 0) { - final CardList human = validTappables.filter(new CardListFilter() { + final CardList human = validTappables.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getController().isHuman(); } }); - final CardList compy = validTappables.filter(new CardListFilter() { + final CardList compy = validTappables.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getController().isComputer(); } }); @@ -1793,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(CardListFilter.UNTAPPED); + tmpList = tmpList.filter(CardPredicates.UNTAPPED); return tmpList; } @@ -1875,15 +1876,15 @@ public class AbilityFactoryPermanentState { } if (validTappables.size() > 0) { - final CardList human = validTappables.filter(new CardListFilter() { + final CardList human = validTappables.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getController().isHuman(); } }); - final CardList compy = validTappables.filter(new CardListFilter() { + final CardList compy = validTappables.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getController().isComputer(); } }); diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryPlay.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryPlay.java index 0b829b8ece8..dee9ed5048a 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryPlay.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryPlay.java @@ -27,7 +27,6 @@ import forge.AllZoneUtil; import forge.Card; import forge.CardCharacteristicName; import forge.CardList; -import forge.CardListFilter; import forge.GameActionUtil; import forge.Singletons; import forge.card.cardfactory.CardFactoryUtil; @@ -46,6 +45,7 @@ import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.GuiUtils; import forge.util.MyRandom; +import forge.util.closures.Predicate; /** *

* AbilityFactory_Copy class. @@ -393,9 +393,9 @@ public final class AbilityFactoryPlay { tgtCard = GuiUtils.chooseOne("Select a card to play", tgtCards); } else { // AI - tgtCards = tgtCards.filter(new CardListFilter() { + tgtCards = tgtCards.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { ArrayList spellAbilities = c.getBasicSpells(); ArrayList sas = new ArrayList(); for (SpellAbility s : spellAbilities) { diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryProtection.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryProtection.java index 79cab0c9931..62d0bc4fbc5 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryProtection.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryProtection.java @@ -28,7 +28,6 @@ import forge.AllZone; import forge.AllZoneUtil; import forge.Card; import forge.CardList; -import forge.CardListFilter; import forge.CardUtil; import forge.Command; import forge.Constant; @@ -47,6 +46,7 @@ import forge.game.player.ComputerUtil; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.GuiUtils; +import forge.util.closures.Predicate; /** *

@@ -246,9 +246,9 @@ public final class AbilityFactoryProtection { final ArrayList gains = AbilityFactoryProtection.getProtectionList(hostCard, af.getMapParams()); CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (!c.canBeTargetedBy(sa)) { return false; } @@ -414,9 +414,9 @@ public final class AbilityFactoryProtection { } // Don't target cards that will die. - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { System.out.println("Not Protecting"); return !c.getSVar("Targeting").equals("Dies"); } @@ -481,17 +481,17 @@ public final class AbilityFactoryProtection { } CardList pref = list.getController(AllZone.getComputerPlayer()); - pref = pref.filter(new CardListFilter() { + pref = pref.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !AbilityFactoryProtection.hasProtectionFromAll(c, AbilityFactoryProtection.getProtectionList(host, params)); } }); final CardList pref2 = list.getController(AllZone.getComputerPlayer()); - pref = pref.filter(new CardListFilter() { + pref = pref.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !AbilityFactoryProtection.hasProtectionFromAny(c, AbilityFactoryProtection.getProtectionList(host, params)); } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java index 9c219a5673d..2507be494f5 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java @@ -26,7 +26,6 @@ import forge.AllZone; import forge.AllZoneUtil; import forge.Card; import forge.CardList; -import forge.CardListFilter; import forge.CardListUtil; import forge.CardUtil; import forge.Command; @@ -51,6 +50,7 @@ import forge.game.player.ComputerUtil; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.util.MyRandom; +import forge.util.closures.Predicate; /** *

@@ -670,9 +670,9 @@ public class AbilityFactoryPump { private CardList getPumpCreatures(final SpellAbility sa) { CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return shouldPumpCard(sa, c); } }); @@ -698,9 +698,9 @@ public class AbilityFactoryPump { if ((defense < 0) && !list.isEmpty()) { // with spells that give -X/-X, // compi will try to destroy a // creature - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (c.getNetDefense() <= -defense) { return true; // can kill indestructible creatures } @@ -722,9 +722,9 @@ public class AbilityFactoryPump { } else { // Human active, only curse attacking creatures if (Singletons.getModel().getGameState().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)) { - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (!c.isAttacking()) { return false; } @@ -749,9 +749,9 @@ public class AbilityFactoryPump { final boolean addsKeywords = this.keywords.size() > 0; if (addsKeywords) { - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return containsUsefulKeyword(keywords, c, sa); } }); @@ -997,9 +997,9 @@ public class AbilityFactoryPump { if (!this.abilityFactory.isCurse()) { // Don't target cards that will die. - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !c.getSVar("Targeting").equals("Dies"); } }); @@ -1704,18 +1704,18 @@ public class AbilityFactoryPump { if (this.abilityFactory.isCurse()) { if (defense < 0) { // try to destroy creatures - comp = comp.filter(new CardListFilter() { + comp = comp.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (c.getNetDefense() <= -defense) { return true; // can kill indestructible creatures } return ((c.getKillDamage() <= -defense) && !c.hasKeyword("Indestructible")); } }); // leaves all creatures that will be destroyed - human = human.filter(new CardListFilter() { + human = human.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (c.getNetDefense() <= -defense) { return true; // can kill indestructible creatures } @@ -1738,9 +1738,9 @@ public class AbilityFactoryPump { } // only count creatures that can attack - comp = comp.filter(new CardListFilter() { + comp = comp.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (power <= 0 && !containsUsefulKeyword(keywords, c, sa)) { return false; } diff --git a/src/main/java/forge/card/cardfactory/CardFactoryArtifacts.java b/src/main/java/forge/card/cardfactory/CardFactoryArtifacts.java index 16378d62abd..93c3ff9fe5e 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.CardListFilter; +import forge.CardPredicates; import forge.Command; import forge.Counters; import forge.Singletons; @@ -22,6 +22,7 @@ import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; import forge.gui.GuiUtils; import forge.gui.match.CMatchUI; +import forge.util.closures.Predicate; import forge.view.ButtonUtil; /** @@ -182,9 +183,9 @@ class CardFactoryArtifacts { } } else { CardList list = AllZone.getComputerPlayer().getCardsIn(ZoneType.Hand); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (c.isLand()); } }); @@ -220,9 +221,9 @@ class CardFactoryArtifacts { public boolean canPlay() { CardList list = card.getController().getCardsIn(ZoneType.Hand); list.remove(card); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (c.isLand()); } }); @@ -351,7 +352,7 @@ class CardFactoryArtifacts { final Player player = this.getTargetPlayer(); CardList lands = player.getCardsIn(ZoneType.Graveyard); - lands = lands.filter(CardListFilter.BASIC_LANDS); + lands = lands.filter(CardPredicates.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 8400b68adf7..cdaad6e6756 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryAuras.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryAuras.java @@ -26,7 +26,7 @@ import forge.AllZone; import forge.AllZoneUtil; import forge.Card; import forge.CardList; -import forge.CardListFilter; +import forge.CardPredicates; import forge.CardListUtil; import forge.CardUtil; import forge.Command; @@ -41,6 +41,7 @@ import forge.control.input.Input; import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; import forge.gui.GuiUtils; +import forge.util.closures.Predicate; /** *

@@ -268,9 +269,9 @@ class CardFactoryAuras { return false; } - final CardListFilter f = new CardListFilter() { + final Predicate f = new Predicate() { @Override - public final boolean addCard(final Card c) { + public final boolean isTrue(final Card c) { return (c.getNetDefense() - c.getDamage()) <= 2; } }; @@ -421,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(CardListFilter.CREATURES); + return AllZoneUtil.getCardsIn(ZoneType.Graveyard).filter(CardPredicates.CREATURES); } @Override diff --git a/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java b/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java index 01d67e4652b..22e784ac2d3 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java @@ -29,7 +29,7 @@ import forge.AllZoneUtil; import forge.Card; import forge.CardCharacteristicName; import forge.CardList; -import forge.CardListFilter; +import forge.CardPredicates; import forge.CardUtil; import forge.Command; import forge.Constant; @@ -53,6 +53,7 @@ import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; import forge.gui.GuiUtils; import forge.gui.match.CMatchUI; +import forge.util.closures.Predicate; import forge.view.ButtonUtil; /** @@ -116,9 +117,9 @@ public class CardFactoryCreatures { @Override public void chooseTargetAI() { CardList perms = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield); - perms = perms.getTargetableCards(this).filter(new CardListFilter() { + perms = perms.getTargetableCards(this).filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (c.sumAllCounters() > 0); } }); @@ -129,9 +130,9 @@ public class CardFactoryCreatures { @Override public boolean canPlayAI() { CardList perms = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield); - perms = perms.getTargetableCards(this).filter(new CardListFilter() { + perms = perms.getTargetableCards(this).filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (c.sumAllCounters() > 0); } }); @@ -222,17 +223,12 @@ public class CardFactoryCreatures { } else { // computer CardList art = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield); - art = art.filter(new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return c.isArtifact(); - } - }); + art = art.filter(CardPredicates.ARTIFACTS); CardList list = new CardList(art); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getIntrinsicKeyword().contains("Indestructible"); } }); @@ -424,7 +420,7 @@ public class CardFactoryCreatures { @Override public void resolve() { CardList allTokens = AllZoneUtil.getCreaturesInPlay(card.getController()); - allTokens = allTokens.filter(CardListFilter.TOKEN); + allTokens = allTokens.filter(CardPredicates.TOKEN); CardFactoryUtil.copyTokens(allTokens); } @@ -432,7 +428,7 @@ public class CardFactoryCreatures { @Override public boolean canPlayAI() { CardList allTokens = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); - allTokens = allTokens.filter(CardListFilter.TOKEN); + allTokens = allTokens.filter(CardPredicates.TOKEN); return allTokens.size() >= 2; } @@ -547,9 +543,9 @@ public class CardFactoryCreatures { CardList wolves = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield); wolves = wolves.getType("Wolf"); - wolves = wolves.filter(new CardListFilter() { + wolves = wolves.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.isUntapped() && c.isCreature(); } }); @@ -566,9 +562,9 @@ public class CardFactoryCreatures { CardList targetables = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); - targetables = targetables.getTargetableCards(this).filter(new CardListFilter() { + targetables = targetables.getTargetableCards(this).filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.isCreature() && (c.getNetDefense() <= totalPower); } }); @@ -588,9 +584,9 @@ public class CardFactoryCreatures { CardList wolves = card.getController().getCardsIn(ZoneType.Battlefield); wolves = wolves.getType("Wolf"); - wolves = wolves.filter(new CardListFilter() { + wolves = wolves.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.isUntapped() && c.isCreature(); } }); @@ -625,9 +621,9 @@ public class CardFactoryCreatures { })); } } else { // AI Choose spread Damage - final CardList damageableWolves = wolves.filter(new CardListFilter() { + final CardList damageableWolves = wolves.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (c.predictDamage(target.getNetAttack(), target, false) > 0); } }); @@ -638,17 +634,17 @@ public class CardFactoryCreatures { return; } - CardList wolvesLeft = damageableWolves.filter(new CardListFilter() { + CardList wolvesLeft = damageableWolves.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !c.hasKeyword("Indestructible"); } }); for (int i = 0; i < target.getNetAttack(); i++) { - wolvesLeft = wolvesLeft.filter(new CardListFilter() { + wolvesLeft = wolvesLeft.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (c.getKillDamage() > 0) && ((c.getKillDamage() <= target.getNetAttack()) || target .hasKeyword("Deathtouch")); @@ -665,9 +661,9 @@ public class CardFactoryCreatures { } else { // Add -1/-1s to Random Indestructibles if (target.hasKeyword("Infect") || target.hasKeyword("Wither")) { - final CardList indestructibles = damageableWolves.filter(new CardListFilter() { + final CardList indestructibles = damageableWolves.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.hasKeyword("Indestructible"); } }); @@ -770,9 +766,9 @@ public class CardFactoryCreatures { // toughness of 1 CardList list = CardFactoryUtil.getHumanCreatureAI(card.getCounters(Counters.P1P1), this, true); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { final int total = card.getCounters(Counters.P1P1); return (total >= c.getKillDamage()); } @@ -825,10 +821,10 @@ public class CardFactoryCreatures { public int countKithkin() { CardList kithkin = card.getController().getCardsIn(ZoneType.Battlefield); - kithkin = kithkin.filter(new CardListFilter() { + kithkin = kithkin.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (c.isType("Kithkin")) && !c.equals(card); } @@ -936,9 +932,9 @@ public class CardFactoryCreatures { // Dark Depths: CardList list = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield, "Dark Depths"); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card crd) { + public boolean isTrue(final Card crd) { return crd.getCounters(Counters.ICE) >= 3; } }); @@ -950,9 +946,9 @@ public class CardFactoryCreatures { // Get rid of Planeswalkers: list = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card crd) { + public boolean isTrue(final Card crd) { return crd.isPlaneswalker() && (crd.getCounters(Counters.LOYALTY) >= 5); } }); @@ -994,9 +990,9 @@ public class CardFactoryCreatures { int intermSumToughness = 0; // intermSumPower = intermSumToughness = 0; CardList creats = card.getController().getCardsIn(ZoneType.Graveyard); - creats = creats.filter(new CardListFilter() { + creats = creats.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.isCreature() && !c.equals(card); } }); @@ -1047,7 +1043,7 @@ public class CardFactoryCreatures { public boolean canPlayAI() { // get all creatures CardList list = AllZone.getComputerPlayer().getCardsIn(ZoneType.Graveyard); - list = list.filter(CardListFilter.CREATURES); + list = list.filter(CardPredicates.CREATURES); return 0 < list.size(); } }); @@ -1069,12 +1065,12 @@ public class CardFactoryCreatures { final Player opp = player.getOpponent(); int max = 0; CardList play = opp.getCardsIn(ZoneType.Battlefield); - play = play.filter(CardListFilter.NON_TOKEN); - play = play.filter(CardListFilter.WHITE); + play = play.filter(CardPredicates.NON_TOKEN); + play = play.filter(CardPredicates.WHITE); max += play.size(); CardList grave = opp.getCardsIn(ZoneType.Graveyard); - grave = grave.filter(CardListFilter.WHITE); + grave = grave.filter(CardPredicates.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 00e7eb2a632..df160818986 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.CardListFilter; +import forge.CardPredicates; import forge.Command; import forge.Singletons; import forge.card.cost.Cost; @@ -37,6 +37,7 @@ import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; import forge.gui.GuiUtils; import forge.util.MyRandom; +import forge.util.closures.Predicate; /** *

@@ -416,10 +417,10 @@ public class CardFactoryInstants { @Override public void resolve() { final Player you = card.getController(); - final CardList ens = AllZoneUtil.getCardsIn(ZoneType.Battlefield).filter(CardListFilter.ENCHANTMENTS); - final CardList toReturn = ens.filter(new CardListFilter() { + final CardList ens = AllZoneUtil.getCardsIn(ZoneType.Battlefield).filter(CardPredicates.ENCHANTMENTS); + final CardList toReturn = ens.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { final Card enchanting = c.getEnchantingCard(); if (enchanting != null) { diff --git a/src/main/java/forge/card/cardfactory/CardFactoryLands.java b/src/main/java/forge/card/cardfactory/CardFactoryLands.java index de369791f8d..5015ec6dce4 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.CardListFilter; +import forge.CardPredicates; import forge.Command; import forge.Counters; import forge.GameActionUtil; @@ -40,6 +40,7 @@ import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; import forge.gui.GuiUtils; import forge.gui.match.CMatchUI; +import forge.util.closures.Predicate; import forge.view.ButtonUtil; /** @@ -136,10 +137,10 @@ class CardFactoryLands { else if (cardName.equals("Novijen, Heart of Progress")) { card.clearSpellKeepManaAbility(); - final CardListFilter targets = new CardListFilter() { + final Predicate targets = new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return AllZoneUtil.isCardInPlay(c) && c.isCreature() && (c.getTurnInZone() == Singletons.getModel().getGameState().getPhaseHandler().getTurn()); } @@ -249,7 +250,7 @@ class CardFactoryLands { } } // selectCard() }; // Input - if ((AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer()).filter(CardListFilter.UNTAPPED) + if ((AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer()).filter(CardPredicates.UNTAPPED) .size() < 2)) { Singletons.getModel().getGameAction().sacrifice(card, null); return; @@ -296,7 +297,7 @@ class CardFactoryLands { if (this.player.isComputer()) { if (land.size() > 0) { CardList tappedLand = new CardList(land); - tappedLand = tappedLand.filter(CardListFilter.TAPPED); + tappedLand = tappedLand.filter(CardPredicates.TAPPED); // if any are tapped, sacrifice it // else sacrifice random if (tappedLand.size() > 0) { @@ -377,7 +378,7 @@ class CardFactoryLands { @Override public void execute() { CardList plains = AllZoneUtil.getPlayerLandsInPlay(card.getController()); - plains = plains.filter(CardListFilter.UNTAPPED); + plains = plains.filter(CardPredicates.UNTAPPED); if (this.player.isComputer()) { if (plains.size() > 1) { @@ -396,7 +397,7 @@ class CardFactoryLands { } } else { // this is the human resolution final int[] paid = { 0 }; - if ((AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer()).filter(CardListFilter.UNTAPPED) + if ((AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer()).filter(CardPredicates.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 e2958276711..7b456e3bd3f 100644 --- a/src/main/java/forge/card/cardfactory/CardFactorySorceries.java +++ b/src/main/java/forge/card/cardfactory/CardFactorySorceries.java @@ -30,7 +30,7 @@ import forge.AllZone; import forge.AllZoneUtil; import forge.Card; import forge.CardList; -import forge.CardListFilter; +import forge.CardPredicates; import forge.CardListUtil; import forge.CardUtil; import forge.Command; @@ -50,6 +50,7 @@ import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; import forge.gui.GuiUtils; import forge.gui.match.CMatchUI; +import forge.util.closures.Predicate; import forge.view.ButtonUtil; /** @@ -309,10 +310,10 @@ public class CardFactorySorceries { @Override public boolean canPlayAI() { CardList humTokenCreats = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - humTokenCreats = humTokenCreats.filter(CardListFilter.TOKEN); + humTokenCreats = humTokenCreats.filter(CardPredicates.TOKEN); CardList compTokenCreats = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); - compTokenCreats = compTokenCreats.filter(CardListFilter.TOKEN); + compTokenCreats = compTokenCreats.filter(CardPredicates.TOKEN); return compTokenCreats.size() > humTokenCreats.size(); } // canPlayAI() @@ -320,7 +321,7 @@ public class CardFactorySorceries { @Override public void resolve() { CardList tokens = AllZoneUtil.getCreaturesInPlay(); - tokens = tokens.filter(CardListFilter.TOKEN); + tokens = tokens.filter(CardPredicates.TOKEN); CardFactoryUtil.copyTokens(tokens); @@ -389,9 +390,9 @@ public class CardFactorySorceries { } // need to sacrifice the other non-basic land types - land = land.filter(new CardListFilter() { + land = land.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (c.getName().contains("Dryad Arbor")) { return true; } else { @@ -456,9 +457,9 @@ public class CardFactorySorceries { // controls and add them to target CardList land = AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer()); CardList cl = land.getType(humanBasic.get(this.count)); - cl = cl.filter(new CardListFilter() { + cl = cl.filter(new Predicate() { @Override - public boolean addCard(final Card crd) { + public boolean isTrue(final Card crd) { return !saveList.contains(crd); } }); @@ -477,9 +478,9 @@ public class CardFactorySorceries { } // need to sacrifice the other non-basic land types - land = land.filter(new CardListFilter() { + land = land.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (c.getName().contains("Dryad Arbor")) { return true; } else { @@ -541,9 +542,9 @@ public class CardFactorySorceries { CardList graveyard = AllZone.getHumanPlayer().getCardsIn(ZoneType.Graveyard); final CardList library = AllZone.getHumanPlayer().getCardsIn(ZoneType.Library); final int graveCount = graveyard.size(); - graveyard = graveyard.filter(new CardListFilter() { + graveyard = graveyard.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.isBasicLand(); } }); @@ -1403,10 +1404,10 @@ public class CardFactorySorceries { @Override public void showMessage() { CardList grave = card.getController().getCardsIn(ZoneType.Graveyard); - grave = grave.filter(CardListFilter.CREATURES); - grave = grave.filter(new CardListFilter() { + grave = grave.filter(CardPredicates.CREATURES); + grave = grave.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getCMC() <= x[0]; } }); @@ -1553,7 +1554,7 @@ public class CardFactorySorceries { // get all final CardList creatures = AllZoneUtil.getCreaturesInPlay(); CardList grave = card.getController().getCardsIn(ZoneType.Graveyard); - grave = grave.filter(CardListFilter.CREATURES); + grave = grave.filter(CardPredicates.CREATURES); if (AllZone.getHumanPlayer().canBeTargetedBy(spell) || AllZone.getComputerPlayer().canBeTargetedBy(spell)) { @@ -1634,7 +1635,7 @@ public class CardFactorySorceries { // Sacrifice an artifact CardList arts = p.getCardsIn(ZoneType.Battlefield); - arts = arts.filter(CardListFilter.ARTIFACTS); + arts = arts.filter(CardPredicates.ARTIFACTS); final Object toSac = GuiUtils.chooseOneOrNone("Sacrifice an artifact", arts.toArray()); if (toSac != null) { final Card c = (Card) toSac; @@ -1647,7 +1648,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(CardListFilter.ARTIFACTS); + final CardList libArts = lib.filter(CardPredicates.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 c5d7683b76b..ba153230b1d 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java @@ -32,7 +32,7 @@ import forge.AllZoneUtil; import forge.Card; import forge.CardCharacteristicName; import forge.CardList; -import forge.CardListFilter; +import forge.CardPredicates; import forge.CardListUtil; import forge.CardUtil; import forge.Command; @@ -72,6 +72,7 @@ import forge.game.zone.ZoneType; import forge.gui.GuiUtils; import forge.gui.match.CMatchUI; import forge.util.MyRandom; +import forge.util.closures.Predicate; import forge.view.ButtonUtil; /** @@ -101,9 +102,9 @@ public class CardFactoryUtil { public static Card getMostExpensivePermanentAI(final CardList list, final SpellAbility spell, final boolean targeted) { CardList all = list; if (targeted) { - all = all.filter(new CardListFilter() { + all = all.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.canBeTargetedBy(spell); } }); @@ -160,9 +161,9 @@ public class CardFactoryUtil { * @return a {@link forge.Card} object. */ public static Card getCheapestCreatureAI(CardList list, final SpellAbility spell, final boolean targeted) { - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.isCreature(); } }); @@ -185,9 +186,9 @@ public class CardFactoryUtil { public static Card getCheapestPermanentAI(final CardList list, final SpellAbility spell, final boolean targeted) { CardList all = list; if (targeted) { - all = all.filter(new CardListFilter() { + all = all.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.canBeTargetedBy(spell); } }); @@ -226,9 +227,9 @@ public class CardFactoryUtil { } // prefer to target non basic lands - final CardList nbLand = land.filter(new CardListFilter() { + final CardList nbLand = land.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (!c.isBasicLand()); } }); @@ -291,10 +292,10 @@ public class CardFactoryUtil { CardList all = list; all = all.getType("Enchantment"); if (targeted) { - all = all.filter(new CardListFilter() { + all = all.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.canBeTargetedBy(spell); } }); @@ -799,9 +800,9 @@ public class CardFactoryUtil { } if ((list.getType("Artifact").size() > 0) || (list.getType("Enchantment").size() > 0)) { - return CardFactoryUtil.getCheapestPermanentAI(list.filter(new CardListFilter() { + return CardFactoryUtil.getCheapestPermanentAI(list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.isArtifact() || c.isEnchantment(); } }), null, false); @@ -1665,9 +1666,9 @@ public class CardFactoryUtil { */ public static CardList getHumanCreatureAI(final int toughness, final SpellAbility spell, final boolean targeted) { CardList creature = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); - creature = creature.filter(new CardListFilter() { + creature = creature.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (targeted) { return c.isCreature() && (c.getNetDefense() <= toughness) && c.canBeTargetedBy(spell); } else { @@ -2026,9 +2027,9 @@ public class CardFactoryUtil { } CardList list = new CardList(card.getEquippedBy()); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getName().equals(name); } @@ -2082,9 +2083,9 @@ public class CardFactoryUtil { } if (activator.isPlayer(zone.getPlayer())) { - cl = cl.filter(new CardListFilter() { + cl = cl.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (zone.is(ZoneType.Graveyard)) { if (c.hasUnearth()) { return true; @@ -2117,9 +2118,9 @@ public class CardFactoryUtil { }); } else { // the activator is not the owner of the card - cl = cl.filter(new CardListFilter() { + cl = cl.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (c.hasStartOfKeyword("May be played by your opponent") || c.hasKeyword("Your opponent may look at this card.")) { @@ -2575,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(CardListFilter.CREATURES); + someCards = someCards.filter(CardPredicates.CREATURES); final String[] colors = { "green", "white", "red", "blue", "black" }; @@ -2787,9 +2788,9 @@ public class CardFactoryUtil { final Card csource = c; CardList cl = c.getDevoured(); - cl = cl.filter(new CardListFilter() { + cl = cl.filter(new Predicate() { @Override - public boolean addCard(final Card cdev) { + public boolean isTrue(final Card cdev) { return cdev.isValid(validDevoured.split(","), csource.getController(), csource); } }); @@ -3046,9 +3047,9 @@ public class CardFactoryUtil { // "Clerics you control" - Count$TypeYouCtrl.Cleric if (sq[0].contains("Type")) { - someCards = someCards.filter(new CardListFilter() { + someCards = someCards.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (c.isType(sq[1])) { return true; } @@ -3065,9 +3066,9 @@ public class CardFactoryUtil { sq[1] = c.getName(); } - someCards = someCards.filter(new CardListFilter() { + someCards = someCards.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (c.getName().equals(sq[1])) { return true; } @@ -3081,47 +3082,52 @@ public class CardFactoryUtil { // "Untapped Lands" - Count$UntappedTypeYouCtrl.Land if (sq[0].contains("Untapped")) { - someCards = someCards.filter(CardListFilter.UNTAPPED); + someCards = someCards.filter(CardPredicates.UNTAPPED); } if (sq[0].contains("Tapped")) { - someCards = someCards.filter(CardListFilter.TAPPED); + someCards = someCards.filter(CardPredicates.TAPPED); } +// String sq0 = sq[0].toLowerCase(); +// for(String color : Constant.Color.ONLY_COLORS) { +// if( sq0.contains(color) ) +// someCards = someCards.filter(CardListFilter.WHITE); +// } // "White Creatures" - Count$WhiteTypeYouCtrl.Creature if (sq[0].contains("White")) { - someCards = someCards.filter(CardListFilter.WHITE); + someCards = someCards.filter(CardPredicates.WHITE); } if (sq[0].contains("Blue")) { - someCards = someCards.filter(CardListFilter.BLUE); + someCards = someCards.filter(CardPredicates.BLUE); } if (sq[0].contains("Black")) { - someCards = someCards.filter(CardListFilter.BLACK); + someCards = someCards.filter(CardPredicates.BLACK); } if (sq[0].contains("Red")) { - someCards = someCards.filter(CardListFilter.RED); + someCards = someCards.filter(CardPredicates.RED); } if (sq[0].contains("Green")) { - someCards = someCards.filter(CardListFilter.GREEN); + someCards = someCards.filter(CardPredicates.GREEN); } if (sq[0].contains("Multicolor")) { - someCards = someCards.filter(new CardListFilter() { + someCards = someCards.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (CardUtil.getColors(c).size() > 1); } }); } if (sq[0].contains("Monocolor")) { - someCards = someCards.filter(new CardListFilter() { + someCards = someCards.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (CardUtil.getColors(c).size() == 1); } }); @@ -3512,9 +3518,9 @@ public class CardFactoryUtil { */ public static int getUsableManaSources(final Player player) { CardList list = player.getCardsIn(ZoneType.Battlefield); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { for (final AbilityMana am : c.getAIPlayableMana()) { if (am.canPlay()) { return true; @@ -5151,9 +5157,9 @@ public class CardFactoryUtil { // Target as Modular is Destroyed if (card.getController().isComputer()) { CardList choices = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield); - choices = choices.filter(new CardListFilter() { + choices = choices.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.isCreature() && c.isArtifact(); } }); diff --git a/src/main/java/forge/card/cost/CostTapType.java b/src/main/java/forge/card/cost/CostTapType.java index f7c16b5f54a..89514788498 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.CardListFilter; +import forge.CardPredicates; 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(CardListFilter.UNTAPPED); + typeList = typeList.filter(CardPredicates.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(CardListFilter.UNTAPPED); + typeList = typeList.filter(CardPredicates.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(CardListFilter.UNTAPPED); + typeList = typeList.filter(CardPredicates.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 9d7ed39eaad..6ac21e6981c 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.CardListFilter; +import forge.CardPredicates; 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(CardListFilter.TAPPED); + typeList = typeList.filter(CardPredicates.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(CardListFilter.TAPPED); + typeList = typeList.filter(CardPredicates.TAPPED); if (untap) { typeList.remove(source); } @@ -201,7 +201,7 @@ public class CostUntapType extends CostPartWithList { if (untap) { typeList.remove(source); } - typeList = typeList.filter(CardListFilter.TAPPED); + typeList = typeList.filter(CardPredicates.TAPPED); c = typeList.size(); source.setSVar("ChosenX", "Number$" + Integer.toString(c)); } diff --git a/src/main/java/forge/card/spellability/TargetSelection.java b/src/main/java/forge/card/spellability/TargetSelection.java index 401ed5794f7..2ff3f304ddd 100644 --- a/src/main/java/forge/card/spellability/TargetSelection.java +++ b/src/main/java/forge/card/spellability/TargetSelection.java @@ -25,7 +25,6 @@ import forge.AllZone; import forge.AllZoneUtil; import forge.Card; import forge.CardList; -import forge.CardListFilter; import forge.card.abilityfactory.AbilityFactory; import forge.control.input.Input; import forge.game.player.Player; @@ -33,6 +32,7 @@ import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; import forge.gui.GuiUtils; import forge.gui.match.CMatchUI; +import forge.util.closures.Predicate; import forge.view.ButtonUtil; /** @@ -320,9 +320,9 @@ public class TargetSelection { // If the cards can't share a creature type if (tgt.isWithoutSameCreatureType() && !targeted.isEmpty()) { final Card card = targeted.get(0); - choices = choices.filter(new CardListFilter() { + choices = choices.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !c.sharesCreatureTypeWith(card); } }); diff --git a/src/main/java/forge/game/GameNew.java b/src/main/java/forge/game/GameNew.java index 05701256dfc..4f02e6369fa 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.CardListFilter; +import forge.CardPredicates; 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(CardListFilter.NON_LANDS); + hLibrary = hLibrary.filter(CardPredicates.NON_LANDS); CardList cLibrary = AllZone.getComputerPlayer().getCardsIn(ZoneType.Library); - cLibrary = cLibrary.filter(CardListFilter.NON_LANDS); + cLibrary = cLibrary.filter(CardPredicates.NON_LANDS); final boolean starterDetermined = false; int cutCount = 0; diff --git a/src/main/java/forge/game/phase/CombatUtil.java b/src/main/java/forge/game/phase/CombatUtil.java index c89ef14b595..ede72a02368 100644 --- a/src/main/java/forge/game/phase/CombatUtil.java +++ b/src/main/java/forge/game/phase/CombatUtil.java @@ -31,7 +31,6 @@ import forge.AllZone; import forge.AllZoneUtil; import forge.Card; import forge.CardList; -import forge.CardListFilter; import forge.CardListUtil; import forge.Command; import forge.Constant; @@ -61,6 +60,7 @@ import forge.gui.GuiUtils; import forge.gui.framework.EDocID; import forge.gui.framework.SDisplayUtil; import forge.gui.match.views.VCombat; +import forge.util.closures.Predicate; /** *

@@ -882,9 +882,9 @@ public class CombatUtil { powerLimit[0] = Integer.parseInt((asSeparateWords[12]).trim()); CardList list = AllZoneUtil.getCreaturesInPlay(c.getController().getOpponent()); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card ct) { + public boolean isTrue(final Card ct) { return ((ct.isUntapped() && (ct.getNetAttack() >= powerLimit[0]) && asSeparateWords[14] .contains("greater")) || (ct.isUntapped() && (ct.getNetAttack() <= powerLimit[0]) && asSeparateWords[14] .contains("less"))); @@ -926,9 +926,9 @@ public class CombatUtil { return false; } } else if (keyword.equals("CARDNAME can't attack unless defending player controls a snow land.")) { - temp = list.filter(new CardListFilter() { + temp = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.isLand() && c.isSnow(); } }); @@ -966,9 +966,9 @@ public class CombatUtil { final Card att = attacker; CardList list = AllZoneUtil.getCreaturesInPlay(player); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return CombatUtil.canBlock(att, c) && (c.hasFirstStrike() || c.hasDoubleStrike()); } }); @@ -3081,9 +3081,9 @@ public class CombatUtil { @Override public void resolve() { CardList enchantments = attacker.getController().getCardsIn(ZoneType.Library); - enchantments = enchantments.filter(new CardListFilter() { + enchantments = enchantments.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (attacker.hasKeyword("Protection from enchantments") || (attacker.hasKeyword("Protection from everything"))) { return false; diff --git a/src/main/java/forge/game/phase/EndOfTurn.java b/src/main/java/forge/game/phase/EndOfTurn.java index afd596f830a..516e3c30e5a 100644 --- a/src/main/java/forge/game/phase/EndOfTurn.java +++ b/src/main/java/forge/game/phase/EndOfTurn.java @@ -21,7 +21,6 @@ import forge.AllZone; import forge.AllZoneUtil; import forge.Card; import forge.CardList; -import forge.CardListFilter; import forge.Counters; import forge.Singletons; import forge.card.spellability.Ability; @@ -29,6 +28,7 @@ import forge.card.spellability.SpellAbility; import forge.game.GameLossReason; import forge.game.player.Player; import forge.game.zone.ZoneType; +import forge.util.closures.Predicate; /** *

@@ -230,9 +230,9 @@ public class EndOfTurn extends Phase implements java.io.Serializable { final Player opponent = player.getOpponent(); CardList list = opponent.getCardsIn(ZoneType.Battlefield); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getName().equals("Lighthouse Chronologist") && (c.getCounters(Counters.LEVEL) >= 7); } }); diff --git a/src/main/java/forge/game/phase/PhaseHandler.java b/src/main/java/forge/game/phase/PhaseHandler.java index e2b4f748076..140431523ad 100644 --- a/src/main/java/forge/game/phase/PhaseHandler.java +++ b/src/main/java/forge/game/phase/PhaseHandler.java @@ -27,7 +27,6 @@ import forge.AllZone; import forge.AllZoneUtil; import forge.Card; import forge.CardList; -import forge.CardListFilter; import forge.GameActionUtil; import forge.Singletons; import forge.card.spellability.SpellAbility; @@ -36,6 +35,7 @@ import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.properties.ForgePreferences.FPref; import forge.util.MyObservable; +import forge.util.closures.Predicate; /** *

@@ -660,9 +660,9 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { private boolean skipTurnTimeVault(Player turn) { // time vault: CardList vaults = turn.getCardsIn(ZoneType.Battlefield, "Time Vault"); - vaults = vaults.filter(new CardListFilter() { + vaults = vaults.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.isTapped(); } }); diff --git a/src/main/java/forge/game/phase/PhaseUtil.java b/src/main/java/forge/game/phase/PhaseUtil.java index 6a9c22b9118..f5b56582b78 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.CardListFilter; +import forge.CardPredicates; import forge.Singletons; import forge.card.trigger.TriggerType; import forge.game.player.Player; @@ -31,6 +31,7 @@ import forge.game.zone.ZoneType; import forge.gui.match.CMatchUI; import forge.gui.match.controllers.CMessage; import forge.gui.match.nonsingleton.VField.PhaseLabel; +import forge.util.closures.Predicate; /** *

@@ -100,7 +101,7 @@ public class PhaseUtil { Singletons.getModel().getGameAction().resetActivationsPerTurn(); - final CardList lands = AllZoneUtil.getPlayerLandsInPlay(turn).filter(CardListFilter.UNTAPPED); + final CardList lands = AllZoneUtil.getPlayerLandsInPlay(turn).filter(CardPredicates.UNTAPPED); turn.setNumPowerSurgeLands(lands.size()); // anything before this point happens regardless of whether the Untap @@ -369,9 +370,9 @@ public class PhaseUtil { CardList list = new CardList(); list.addAll(AllZone.getCombat().getAllBlockers()); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !c.getDamageHistory().getCreatureBlockedThisCombat(); } }); diff --git a/src/main/java/forge/game/phase/Untap.java b/src/main/java/forge/game/phase/Untap.java index 2858ff77fdf..b1feb4a4999 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.CardListFilter; +import forge.CardPredicates; import forge.Counters; import forge.GameActionUtil; import forge.GameEntity; @@ -34,6 +34,7 @@ import forge.game.player.Player; import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; import forge.gui.match.CMatchUI; +import forge.util.closures.Predicate; import forge.view.ButtonUtil; /** @@ -115,9 +116,9 @@ public class Untap extends Phase implements java.io.Serializable { } } - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (!Untap.canUntap(c)) { return false; } @@ -194,9 +195,9 @@ 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(CardListFilter.TAPPED).filter(new CardListFilter() { + landList = landList.filter(CardPredicates.TAPPED).filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return Untap.canUntap(c); } }); @@ -227,9 +228,9 @@ public class Untap extends Phase implements java.io.Serializable { } // selectCard() }; // Input CardList landList = AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer()); - landList = landList.filter(CardListFilter.TAPPED).filter(new CardListFilter() { + landList = landList.filter(CardPredicates.TAPPED).filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return Untap.canUntap(c); } }); @@ -241,10 +242,10 @@ 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(CardListFilter.ARTIFACTS); - artList = artList.filter(CardListFilter.TAPPED).filter(new CardListFilter() { + artList = artList.filter(CardPredicates.ARTIFACTS); + artList = artList.filter(CardPredicates.TAPPED).filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return Untap.canUntap(c); } }); @@ -276,10 +277,10 @@ public class Untap extends Phase implements java.io.Serializable { } // selectCard() }; // Input CardList artList = AllZone.getHumanPlayer().getCardsIn(ZoneType.Battlefield); - artList = artList.filter(CardListFilter.ARTIFACTS); - artList = artList.filter(CardListFilter.TAPPED).filter(new CardListFilter() { + artList = artList.filter(CardPredicates.ARTIFACTS); + artList = artList.filter(CardPredicates.TAPPED).filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return Untap.canUntap(c); } }); @@ -291,9 +292,9 @@ 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(CardListFilter.TAPPED).filter(new CardListFilter() { + creatures = creatures.filter(CardPredicates.TAPPED).filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return Untap.canUntap(c); } }); @@ -325,9 +326,9 @@ public class Untap extends Phase implements java.io.Serializable { } // selectCard() }; // Input CardList creatures = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - creatures = creatures.filter(CardListFilter.TAPPED).filter(new CardListFilter() { + creatures = creatures.filter(CardPredicates.TAPPED).filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return Untap.canUntap(c); } }); @@ -365,10 +366,10 @@ public class Untap extends Phase implements java.io.Serializable { private static void doPhasing(final Player turn) { // Needs to include phased out cards - final CardList list = turn.getCardsIncludePhasingIn(ZoneType.Battlefield).filter(new CardListFilter() { + final CardList list = turn.getCardsIncludePhasingIn(ZoneType.Battlefield).filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return ((c.isPhasedOut() && c.isDirectlyPhasedOut()) || c.hasKeyword("Phasing")); } }); diff --git a/src/main/java/forge/game/phase/Upkeep.java b/src/main/java/forge/game/phase/Upkeep.java index 06f450f51a3..fc1f6846553 100644 --- a/src/main/java/forge/game/phase/Upkeep.java +++ b/src/main/java/forge/game/phase/Upkeep.java @@ -23,7 +23,7 @@ import forge.AllZone; import forge.AllZoneUtil; import forge.Card; import forge.CardList; -import forge.CardListFilter; +import forge.CardPredicates; import forge.CardListUtil; import forge.Command; import forge.Counters; @@ -44,6 +44,7 @@ import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; import forge.gui.GuiUtils; import forge.gui.match.CMatchUI; +import forge.util.closures.Predicate; import forge.view.ButtonUtil; /** @@ -160,9 +161,9 @@ public class Upkeep extends Phase implements java.io.Serializable { */ private static void upkeepEcho() { CardList list = Singletons.getModel().getGameState().getPhaseHandler().getPlayerTurn().getCardsIn(ZoneType.Battlefield); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.hasStartOfKeyword("(Echo unpaid)"); } }); @@ -480,7 +481,7 @@ public class Upkeep extends Phase implements java.io.Serializable { final Card abyss = c; final CardList abyssGetTargets = AllZoneUtil.getCreaturesInPlay(player) - .filter(CardListFilter.NON_ARTIFACTS); + .filter(CardPredicates.NON_ARTIFACTS); final Ability sacrificeCreature = new Ability(abyss, "") { @Override @@ -584,9 +585,9 @@ public class Upkeep extends Phase implements java.io.Serializable { private Card getCompyCardToDestroy(final CardList original) { final CardList options = this.getLowestPowerList(original); - final CardList humanCreatures = options.filter(new CardListFilter() { + final CardList humanCreatures = options.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getController().isHuman(); } }); @@ -1824,9 +1825,9 @@ public class Upkeep extends Phase implements java.io.Serializable { CardList list = player.getCardsIn(ZoneType.Exile); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.hasSuspend(); } }); @@ -1852,9 +1853,9 @@ public class Upkeep extends Phase implements java.io.Serializable { final Player player = Singletons.getModel().getGameState().getPhaseHandler().getPlayerTurn(); CardList list = player.getCardsIn(ZoneType.Battlefield); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return CardFactoryUtil.hasKeyword(c, "Vanishing") != -1; } }); @@ -1889,9 +1890,9 @@ public class Upkeep extends Phase implements java.io.Serializable { final Player player = Singletons.getModel().getGameState().getPhaseHandler().getPlayerTurn(); CardList list = player.getCardsIn(ZoneType.Battlefield); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return CardFactoryUtil.hasKeyword(c, "Fading") != -1; } }); @@ -2143,9 +2144,9 @@ public class Upkeep extends Phase implements java.io.Serializable { @Override public void resolve() { final int num = source.getCounters(Counters.FADE); - final CardList list = player.getCardsIn(ZoneType.Battlefield).filter(new CardListFilter() { + final CardList list = player.getCardsIn(ZoneType.Battlefield).filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (c.isArtifact() || c.isLand() || c.isCreature()) && c.isUntapped(); } }); @@ -2154,9 +2155,9 @@ public class Upkeep extends Phase implements java.io.Serializable { if (player.isComputer()) { Card toTap = CardFactoryUtil.getWorstPermanentAI(list, false, false, false, false); // try to find non creature cards without tap abilities - CardList betterList = list.filter(new CardListFilter() { + CardList betterList = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (c.isCreature()) { return false; } @@ -2229,9 +2230,9 @@ public class Upkeep extends Phase implements java.io.Serializable { final Player player = Singletons.getModel().getGameState().getPhaseHandler().getPlayerTurn(); CardList blaze = player.getCardsIn(ZoneType.Battlefield); - blaze = blaze.filter(new CardListFilter() { + blaze = blaze.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.isLand() && (c.getCounters(Counters.BLAZE) > 0); } }); @@ -2273,9 +2274,9 @@ public class Upkeep extends Phase implements java.io.Serializable { public void resolve() { CardList enchantmentsInLibrary = source.getController().getCardsIn(ZoneType.Library); final CardList enchantmentsAttached = new CardList(source.getEnchantingPlayer().getEnchantedBy()); - enchantmentsInLibrary = enchantmentsInLibrary.filter(new CardListFilter() { + enchantmentsInLibrary = enchantmentsInLibrary.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (c.isEnchantment() && c.hasKeyword("Enchant player") && !source.getEnchantingPlayer().hasProtectionFrom(c) && !enchantmentsAttached.containsName(c)); diff --git a/src/main/java/forge/game/player/AIPlayer.java b/src/main/java/forge/game/player/AIPlayer.java index dd6485563b2..8dd1d1e6647 100644 --- a/src/main/java/forge/game/player/AIPlayer.java +++ b/src/main/java/forge/game/player/AIPlayer.java @@ -22,7 +22,7 @@ import java.util.Random; import forge.AllZone; import forge.Card; import forge.CardList; -import forge.CardListFilter; +import forge.CardPredicates; import forge.CardListUtil; import forge.Singletons; import forge.card.cardfactory.CardFactoryUtil; @@ -201,32 +201,13 @@ public class AIPlayer extends Player { boolean bottom = false; if (topN.get(i).isBasicLand()) { CardList bl = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield); - bl = bl.filter(new CardListFilter() { - @Override - public boolean addCard(final Card c) { - if (c.isBasicLand()) { - return true; - } - - return false; - } - }); + bl = bl.filter(CardPredicates.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(new CardListFilter() { - @Override - public boolean addCard(final Card c) { - if (c.isCreature()) { - return true; - } - - return false; - } - }); - + cl = cl.filter(CardPredicates.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 7285824ebae..b9bb06d132d 100644 --- a/src/main/java/forge/game/player/ComputerUtil.java +++ b/src/main/java/forge/game/player/ComputerUtil.java @@ -26,7 +26,7 @@ import forge.AllZone; import forge.AllZoneUtil; import forge.Card; import forge.CardList; -import forge.CardListFilter; +import forge.CardPredicates; import forge.CardListUtil; import forge.CardUtil; import forge.GameActionUtil; @@ -52,6 +52,7 @@ import forge.game.phase.CombatUtil; import forge.game.phase.PhaseType; import forge.game.zone.ZoneType; import forge.gui.GuiUtils; +import forge.util.closures.Predicate; /** *

@@ -991,9 +992,9 @@ public class ComputerUtil { */ public static CardList getAvailableMana(final Player player, final boolean checkPlayable) { final CardList list = player.getCardsIn(ZoneType.Battlefield); - final CardList manaSources = list.filter(new CardListFilter() { + final CardList manaSources = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (checkPlayable) { for (final AbilityMana am : c.getAIPlayableMana()) { am.setActivatingPlayer(player); @@ -1212,7 +1213,7 @@ public class ComputerUtil { return false; } CardList landList = computer.getCardsIn(ZoneType.Hand); - landList = landList.filter(CardListFilter.LANDS); + landList = landList.filter(CardPredicates.LANDS); final CardList lands = computer.getCardsIn(ZoneType.Graveyard); for (final Card crd : lands) { @@ -1221,9 +1222,9 @@ public class ComputerUtil { } } - landList = landList.filter(new CardListFilter() { + landList = landList.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if (c.getSVar("NeedsToPlay").length() > 0) { final String needsToPlay = c.getSVar("NeedsToPlay"); CardList list = AllZoneUtil.getCardsIn(ZoneType.Battlefield); @@ -1343,9 +1344,9 @@ public class ComputerUtil { for (int ip = 0; ip < 9; ip++) { // priority 0 is the lowest, // priority 5 the highest final int priority = 9 - ip; - final CardList sacMeList = typeList.filter(new CardListFilter() { + final CardList sacMeList = typeList.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (!c.getSVar("SacMe").equals("") && (Integer.parseInt(c.getSVar("SacMe")) == priority)); } }); @@ -1361,9 +1362,9 @@ public class ComputerUtil { for (int ip = 0; ip < 9; ip++) { // priority 0 is the lowest, // priority 5 the highest final int priority = 9 - ip; - final CardList sacMeList = typeList.filter(new CardListFilter() { + final CardList sacMeList = typeList.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return (!c.getSVar("DiscardMe").equals("") && (Integer.parseInt(c.getSVar("DiscardMe")) == priority)); } }); @@ -1630,7 +1631,7 @@ public class ComputerUtil { typeList = typeList.getValidCards(type.split(","), activate.getController(), activate); // is this needed? - typeList = typeList.filter(CardListFilter.UNTAPPED); + typeList = typeList.filter(CardPredicates.UNTAPPED); if (tap) { typeList.remove(activate); @@ -1670,7 +1671,7 @@ public class ComputerUtil { typeList = typeList.getValidCards(type.split(","), activate.getController(), activate); // is this needed? - typeList = typeList.filter(CardListFilter.TAPPED); + typeList = typeList.filter(CardPredicates.TAPPED); if (untap) { typeList.remove(activate); @@ -1739,9 +1740,9 @@ public class ComputerUtil { */ public static CardList getPossibleAttackers() { CardList list = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return CombatUtil.canAttack(c); } }); diff --git a/src/main/java/forge/game/player/ComputerUtilAttack.java b/src/main/java/forge/game/player/ComputerUtilAttack.java index 409b3797ac0..77e6bcc35a3 100644 --- a/src/main/java/forge/game/player/ComputerUtilAttack.java +++ b/src/main/java/forge/game/player/ComputerUtilAttack.java @@ -24,7 +24,6 @@ import forge.AllZone; import forge.AllZoneUtil; import forge.Card; import forge.CardList; -import forge.CardListFilter; import forge.CardListUtil; import forge.Counters; import forge.GameEntity; @@ -36,6 +35,7 @@ import forge.game.phase.Combat; import forge.game.phase.CombatUtil; import forge.game.zone.ZoneType; import forge.util.MyRandom; +import forge.util.closures.Predicate; //doesHumanAttackAndWin() uses the global variable AllZone.getComputerPlayer() /** @@ -164,9 +164,9 @@ public class ComputerUtilAttack { */ public final CardList getPossibleAttackers(final CardList in) { CardList list = new CardList(in); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return CombatUtil.canAttack(c); } }); @@ -186,9 +186,9 @@ public class ComputerUtilAttack { */ public final CardList getPossibleBlockers(final CardList blockers, final CardList attackers) { CardList possibleBlockers = new CardList(blockers); - possibleBlockers = possibleBlockers.filter(new CardListFilter() { + possibleBlockers = possibleBlockers.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return canBlockAnAttacker(c, attackers); } }); @@ -841,9 +841,9 @@ public class ComputerUtilAttack { */ public final int countExaltedBonus(final Player player) { CardList list = player.getCardsIn(ZoneType.Battlefield); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.hasKeyword("Exalted"); } }); diff --git a/src/main/java/forge/game/player/ComputerUtilBlock.java b/src/main/java/forge/game/player/ComputerUtilBlock.java index 6690d6c820c..0220a350e67 100644 --- a/src/main/java/forge/game/player/ComputerUtilBlock.java +++ b/src/main/java/forge/game/player/ComputerUtilBlock.java @@ -22,13 +22,13 @@ import java.util.List; import forge.AllZone; import forge.Card; import forge.CardList; -import forge.CardListFilter; import forge.CardListUtil; import forge.Counters; import forge.GameEntity; import forge.card.cardfactory.CardFactoryUtil; import forge.game.phase.Combat; import forge.game.phase.CombatUtil; +import forge.util.closures.Predicate; /** *

@@ -455,9 +455,9 @@ public class ComputerUtilBlock { // than the attacker // Don't use blockers without First Strike or Double Strike if // attacker has it - usableBlockers = blockers.filter(new CardListFilter() { + usableBlockers = blockers.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { if ((attacker.hasKeyword("First Strike") || attacker.hasKeyword("Double Strike")) && !(c.hasKeyword("First Strike") || c.hasKeyword("Double Strike"))) { return false; diff --git a/src/main/java/forge/game/player/PlayerUtil.java b/src/main/java/forge/game/player/PlayerUtil.java index 9b59460a6af..689e226fb7e 100644 --- a/src/main/java/forge/game/player/PlayerUtil.java +++ b/src/main/java/forge/game/player/PlayerUtil.java @@ -20,13 +20,13 @@ package forge.game.player; import forge.AllZone; import forge.Card; import forge.CardList; -import forge.CardListFilter; import forge.Singletons; import forge.card.spellability.SpellAbility; import forge.control.input.Input; import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; import forge.gui.match.CMatchUI; +import forge.util.closures.Predicate; import forge.view.ButtonUtil; /** @@ -56,9 +56,9 @@ public final class PlayerUtil { // Instead of hardcoded Ali from Cairo like cards, it is now a Keyword CardList list = player.getCardsIn(ZoneType.Battlefield); list = list.getKeyword("Damage that would reduce your life total to less than 1 reduces it to 1 instead."); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return !c.isFaceDown(); } }); diff --git a/src/main/java/forge/game/zone/MagicStack.java b/src/main/java/forge/game/zone/MagicStack.java index 669287439b5..f9695222d35 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.CardListFilter; +import forge.CardPredicates; 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(CardListFilter.NON_TOKEN); + all = all.filter(CardPredicates.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 3c8fdbfb1e6..be09e4e30d4 100644 --- a/src/main/java/forge/game/zone/PlayerZoneComesIntoPlay.java +++ b/src/main/java/forge/game/zone/PlayerZoneComesIntoPlay.java @@ -24,13 +24,14 @@ import forge.AllZone; import forge.AllZoneUtil; import forge.Card; import forge.CardList; -import forge.CardListFilter; +import forge.CardPredicates; import forge.Command; import forge.GameActionUtil; import forge.card.spellability.Ability; import forge.card.spellability.SpellAbility; import forge.card.staticability.StaticAbility; import forge.game.player.Player; +import forge.util.closures.Predicate; /** *

@@ -142,9 +143,9 @@ public class PlayerZoneComesIntoPlay extends DefaultPlayerZone { if (c.isLand()) { CardList list = player.getCardsIn(ZoneType.Battlefield); - list = list.filter(new CardListFilter() { + list = list.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.hasKeyword("Landfall"); } }); @@ -162,7 +163,7 @@ public class PlayerZoneComesIntoPlay extends DefaultPlayerZone { @Override public void resolve() { CardList lands = tisLand.getController().getCardsIn(ZoneType.Battlefield); - lands = lands.filter(CardListFilter.LANDS); + lands = lands.filter(CardPredicates.LANDS); for (final Card land : lands) { land.tap(); } diff --git a/src/main/java/forge/gui/match/controllers/CDock.java b/src/main/java/forge/gui/match/controllers/CDock.java index dcb134590f3..b1741b8bb31 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.CardListFilter; +import forge.CardPredicates; 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(CardListFilter.CREATURES)) { + for(Card c : human.getCardsIn(ZoneType.Battlefield).filter(CardPredicates.CREATURES)) { if (!c.isAttacking() && CombatUtil.canAttack(c, AllZone.getCombat())) { AllZone.getCombat().addAttacker(c); } diff --git a/src/test/java/forge/RunTest.java b/src/test/java/forge/RunTest.java index ef92d338081..c3a903f16a1 100644 --- a/src/test/java/forge/RunTest.java +++ b/src/test/java/forge/RunTest.java @@ -280,27 +280,27 @@ public class RunTest { c1.add(cf1.getCard("Royal Assassin", null)); c1.add(cf1.getCard("Hymn to Tourach", null)); - CardList c3 = c1.filter(new CardListFilter() { + CardList c3 = c1.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.isCreature(); } }); this.check("119", c3.containsName("Royal Assassin")); this.check("119", c3.size() == 1); - c3 = c1.filter(new CardListFilter() { + c3 = c1.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.isInstant(); } }); this.check("120", c3.containsName("Shock")); this.check("121", c3.size() == 1); - c3 = c1.filter(new CardListFilter() { + c3 = c1.filter(new Predicate() { @Override - public boolean addCard(final Card c) { + public boolean isTrue(final Card c) { return c.getName().equals("Hymn to Tourach"); } });