diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index b53096ec245..dd37ab118f2 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -611,9 +611,9 @@ public class AiAttackController { // TODO: the AI should ideally predict how many times it can activate // for now, unless the opponent is tapped out, break at this point // and do not predict the blocker limit (which is safer) - if (Iterables.any(defendingOpponent.getLandsInPlay(), CardPredicates.Presets.UNTAPPED)) { + if (Iterables.any(defendingOpponent.getLandsInPlay(), CardPredicates.UNTAPPED)) { maxBlockersAfterCrew += CardLists.count(CardLists.getNotType(defendingOpponent.getCardsIn(ZoneType.Battlefield), "Creature"), - CardPredicates.isType("Vehicle").and(CardPredicates.Presets.UNTAPPED)); + CardPredicates.isType("Vehicle").and(CardPredicates.UNTAPPED)); } } diff --git a/forge-ai/src/main/java/forge/ai/AiBlockController.java b/forge-ai/src/main/java/forge/ai/AiBlockController.java index d884dd19ba5..97bc20ca63c 100644 --- a/forge-ai/src/main/java/forge/ai/AiBlockController.java +++ b/forge-ai/src/main/java/forge/ai/AiBlockController.java @@ -1343,7 +1343,7 @@ public class AiBlockController { boolean creatureParityOrAllowedDiff = aiCreatureCount + (randomTradeIfBehindOnBoard ? maxCreatDiff : 0) >= oppCreatureCount; boolean wantToTradeWithCreatInHand = !checkingOther && randomTradeIfCreatInHand - && ai.getZone(ZoneType.Hand).contains(CardPredicates.Presets.CREATURES) + && ai.getZone(ZoneType.Hand).contains(CardPredicates.CREATURES) && aiCreatureCount + maxCreatDiffWithRepl >= oppCreatureCount; boolean wantToSavePlaneswalker = MyRandom.percentTrue(chanceToSavePW) && combat.getDefenderByAttacker(attacker) instanceof Card diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index f51e553d0c2..4d49aa2520f 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -34,7 +34,6 @@ import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.ability.SpellApiBased; import forge.game.card.*; -import forge.game.card.CardPredicates.Presets; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; import forge.game.cost.*; @@ -404,10 +403,10 @@ public class AiController { private CardCollection filterLandsToPlay(CardCollection landList) { final CardCollectionView hand = player.getCardsIn(ZoneType.Hand); - CardCollection nonLandList = CardLists.filter(hand, Presets.NON_LANDS); + CardCollection nonLandList = CardLists.filter(hand, CardPredicates.NON_LANDS); if (landList.size() == 1 && nonLandList.size() < 3) { CardCollectionView cardsInPlay = player.getCardsIn(ZoneType.Battlefield); - CardCollection landsInPlay = CardLists.filter(cardsInPlay, Presets.LANDS); + CardCollection landsInPlay = CardLists.filter(cardsInPlay, CardPredicates.LANDS); CardCollection allCards = new CardCollection(player.getCardsIn(ZoneType.Graveyard)); allCards.addAll(player.getCardsIn(ZoneType.Command)); allCards.addAll(cardsInPlay); @@ -445,7 +444,7 @@ public class AiController { final CardCollectionView hand1 = player.getCardsIn(ZoneType.Hand); CardCollection lands = new CardCollection(battlefield); lands.addAll(hand1); - lands = CardLists.filter(lands, Presets.LANDS); + lands = CardLists.filter(lands, CardPredicates.LANDS); int maxCmcInHand = Aggregates.max(hand1, Card::getCMC); if (lands.size() >= Math.max(maxCmcInHand, 6)) { @@ -469,7 +468,7 @@ public class AiController { return null; } - CardCollection nonLandsInHand = CardLists.filter(player.getCardsIn(ZoneType.Hand), Presets.NON_LANDS); + CardCollection nonLandsInHand = CardLists.filter(player.getCardsIn(ZoneType.Hand), CardPredicates.NON_LANDS); // Some considerations for Momir/MoJhoSto boolean hasMomir = player.isCardInCommand("Momir Vig, Simic Visionary Avatar"); @@ -598,8 +597,8 @@ public class AiController { } // pick dual lands if available - if (Iterables.any(landList, Presets.NONBASIC_LANDS)) { - landList = CardLists.filter(landList, Presets.NONBASIC_LANDS); + if (Iterables.any(landList, CardPredicates.NONBASIC_LANDS)) { + landList = CardLists.filter(landList, CardPredicates.NONBASIC_LANDS); } } return ComputerUtilCard.getBestLandToPlayAI(landList); @@ -1061,7 +1060,7 @@ public class AiController { if ("DiscardUncastableAndExcess".equals(sa.getParam("AILogic"))) { CardCollection discards = new CardCollection(); final CardCollectionView inHand = player.getCardsIn(ZoneType.Hand); - final int numLandsOTB = CardLists.count(inHand, CardPredicates.Presets.LANDS); + final int numLandsOTB = CardLists.count(inHand, CardPredicates.LANDS); int numOppInHand = 0; for (Player p : player.getGame().getPlayers()) { if (p.getCardsIn(ZoneType.Hand).size() > numOppInHand) { @@ -1119,8 +1118,8 @@ public class AiController { if (validCards.isEmpty()) { continue; } - final int numLandsInPlay = CardLists.count(player.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.LANDS_PRODUCING_MANA); - final CardCollection landsInHand = CardLists.filter(validCards, CardPredicates.Presets.LANDS); + final int numLandsInPlay = CardLists.count(player.getCardsIn(ZoneType.Battlefield), CardPredicates.LANDS_PRODUCING_MANA); + final CardCollection landsInHand = CardLists.filter(validCards, CardPredicates.LANDS); final int numLandsInHand = landsInHand.size(); // Discard a land @@ -1397,11 +1396,11 @@ public class AiController { return false; } - CardCollection inHand = CardLists.filter(player.getCardsIn(ZoneType.Hand), Presets.NON_LANDS); + CardCollection inHand = CardLists.filter(player.getCardsIn(ZoneType.Hand), CardPredicates.NON_LANDS); CardCollectionView otb = player.getCardsIn(ZoneType.Battlefield); if (getBooleanProperty(AiProps.HOLD_LAND_DROP_ONLY_IF_HAVE_OTHER_PERMS)) { - if (!Iterables.any(otb, Presets.NON_LANDS)) { + if (!Iterables.any(otb, CardPredicates.NON_LANDS)) { return false; } } @@ -1578,7 +1577,7 @@ public class AiController { if (sa.getHostCard().hasKeyword(Keyword.STORM) && sa.getApi() != ApiType.Counter // AI would suck at trying to deliberately proc a Storm counterspell && player.getZone(ZoneType.Hand).contains( - Presets.LANDS.or(CardPredicates.hasKeyword("Storm")).negate())) { + CardPredicates.LANDS.or(CardPredicates.hasKeyword("Storm")).negate())) { if (game.getView().getStormCount() < this.getIntProperty(AiProps.MIN_COUNT_FOR_STORM_SPELLS)) { // skip evaluating Storm unless we reached the minimum Storm count continue; @@ -1601,7 +1600,7 @@ public class AiController { } else if (sa.getHostCard().hasKeyword(Keyword.CASCADE)) { if (isLifeInDanger) { //needs more tune up for certain conditions aiPlayDecision = player.getCreaturesInPlay().size() >= 4 ? AiPlayDecision.CantPlaySa : AiPlayDecision.WillPlay; - } else if (CardLists.filter(player.getZone(ZoneType.Graveyard).getCards(), CardPredicates.Presets.CREATURES).size() > 4) { + } else if (CardLists.filter(player.getZone(ZoneType.Graveyard).getCards(), CardPredicates.CREATURES).size() > 4) { if (player.getCreaturesInPlay().size() >= 4) // it's good minimum continue; else if (!sa.getHostCard().isPermanent() && sa.canCastTiming(player) && ComputerUtilCost.canPayCost(sa, player, sa.isTrigger())) @@ -1971,7 +1970,7 @@ public class AiController { break; } } else { - CardCollectionView viableOptions = CardLists.filter(pool, CardPredicates.isControlledByAnyOf(sa.getActivatingPlayer().getOpponents()), CardPredicates.Presets.CAN_BE_DESTROYED); + CardCollectionView viableOptions = CardLists.filter(pool, CardPredicates.isControlledByAnyOf(sa.getActivatingPlayer().getOpponents()), CardPredicates.CAN_BE_DESTROYED); Card best = ComputerUtilCard.getBestAI(viableOptions); if (best != null) { result.add(best); @@ -2047,7 +2046,7 @@ public class AiController { CardLists.shuffle(library); // remove all land, keep non-basicland in there, shuffled - CardCollection land = CardLists.filter(library, CardPredicates.Presets.LANDS); + CardCollection land = CardLists.filter(library, CardPredicates.LANDS); for (Card c : land) { if (c.isLand()) { library.remove(c); @@ -2097,7 +2096,7 @@ public class AiController { } } if ("Aminatou".equals(sa.getParam("AILogic")) && game.getPlayers().size() > 2) { - CardCollection all = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.NONLAND_PERMANENTS); + CardCollection all = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.NONLAND_PERMANENTS); CardCollection left = CardLists.filterControlledBy(all, game.getNextPlayerAfter(player, Direction.Left)); CardCollection right = CardLists.filterControlledBy(all, game.getNextPlayerAfter(player, Direction.Right)); return Aggregates.sum(left, Card::getCMC) > Aggregates.sum(right, Card::getCMC); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 0e3b8437a10..c7add8c8347 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -48,7 +48,6 @@ import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.ability.effects.CharmEffect; -import forge.game.card.CardPredicates.Presets; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; import forge.game.keyword.Keyword; @@ -528,7 +527,7 @@ public class ComputerUtil { // Discard lands final CardCollection landsInHand = CardLists.getType(typeList, "Land"); if (!landsInHand.isEmpty()) { - final int numLandsInPlay = CardLists.count(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.LANDS_PRODUCING_MANA); + final int numLandsInPlay = CardLists.count(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.LANDS_PRODUCING_MANA); final CardCollection nonLandsInHand = CardLists.getNotType(ai.getCardsIn(ZoneType.Hand), "Land"); final int highestCMC = Math.max(6, Aggregates.max(nonLandsInHand, Card::getCMC)); if (numLandsInPlay >= highestCMC @@ -769,7 +768,7 @@ public class ComputerUtil { all.removeAll(exclude); CardCollection typeList = CardLists.getValidCards(all, type.split(";"), activate.getController(), activate, sa); - typeList = CardLists.filter(typeList, Presets.CAN_TAP); + typeList = CardLists.filter(typeList, CardPredicates.CAN_TAP); if (tap) { typeList.remove(activate); @@ -799,7 +798,7 @@ public class ComputerUtil { all.removeAll(exclude); CardCollection typeList = CardLists.getValidCards(all, type.split(";"), activate.getController(), activate, sa); - typeList = CardLists.filter(typeList, sa.isCrew() ? Presets.CAN_CREW : Presets.CAN_TAP); + typeList = CardLists.filter(typeList, sa.isCrew() ? CardPredicates.CAN_CREW : CardPredicates.CAN_TAP); if (tap) { typeList.remove(activate); @@ -837,7 +836,7 @@ public class ComputerUtil { CardCollection typeList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), type.split(";"), activate.getController(), activate, sa); - typeList = CardLists.filter(typeList, Presets.TAPPED); + typeList = CardLists.filter(typeList, CardPredicates.TAPPED); if (untap) { typeList.remove(activate); @@ -1035,7 +1034,7 @@ public class ComputerUtil { c = ComputerUtilCard.getWorstCreatureAI(remaining); } else if (CardLists.getNotType(remaining, "Land").isEmpty()) { - c = ComputerUtilCard.getWorstLand(CardLists.filter(remaining, CardPredicates.Presets.LANDS)); + c = ComputerUtilCard.getWorstLand(CardLists.filter(remaining, CardPredicates.LANDS)); } else { c = ComputerUtilCard.getWorstPermanentAI(remaining, false, false, false, false); @@ -1344,8 +1343,8 @@ public class ComputerUtil { } final Game game = ai.getGame(); - final CardCollection landsInPlay = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.LANDS_PRODUCING_MANA); - final CardCollection landsInHand = CardLists.filter(ai.getCardsIn(ZoneType.Hand), CardPredicates.Presets.LANDS); + final CardCollection landsInPlay = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.LANDS_PRODUCING_MANA); + final CardCollection landsInHand = CardLists.filter(ai.getCardsIn(ZoneType.Hand), CardPredicates.LANDS); final CardCollection nonLandsInHand = CardLists.getNotType(ai.getCardsIn(ZoneType.Hand), "Land"); final int highestCMC = Math.max(6, Aggregates.max(nonLandsInHand, Card::getCMC)); final int discardCMC = discard.getCMC(); @@ -1664,7 +1663,7 @@ public class ComputerUtil { int damage = 0; final CardCollection all = new CardCollection(ai.getCardsIn(ZoneType.Battlefield)); all.addAll(ai.getCardsActivatableInExternalZones(true)); - all.addAll(CardLists.filter(ai.getCardsIn(ZoneType.Hand), Presets.PERMANENTS.negate())); + all.addAll(CardLists.filter(ai.getCardsIn(ZoneType.Hand), CardPredicates.PERMANENTS.negate())); for (final Card c : all) { if (c.getZone().getPlayer() != null && c.getZone().getPlayer() != ai && c.mayPlay(ai).isEmpty()) { @@ -2218,7 +2217,7 @@ public class ComputerUtil { } CardCollectionView library = ai.getCardsIn(ZoneType.Library); - int landsInDeck = CardLists.count(library, Presets.LANDS); + int landsInDeck = CardLists.count(library, CardPredicates.LANDS); // no land deck, can't do anything better if (landsInDeck == 0) { @@ -2363,14 +2362,14 @@ public class ComputerUtil { CardCollectionView cardsInHand = player.getCardsIn(ZoneType.Hand); CardCollectionView cardsOTB = player.getCardsIn(ZoneType.Battlefield); - CardCollection landsOTB = CardLists.filter(cardsOTB, CardPredicates.Presets.LANDS_PRODUCING_MANA); + CardCollection landsOTB = CardLists.filter(cardsOTB, CardPredicates.LANDS_PRODUCING_MANA); CardCollection thisLandOTB = CardLists.filter(cardsOTB, CardPredicates.nameEquals(c.getName())); - CardCollection landsInHand = CardLists.filter(cardsInHand, CardPredicates.Presets.LANDS_PRODUCING_MANA); + CardCollection landsInHand = CardLists.filter(cardsInHand, CardPredicates.LANDS_PRODUCING_MANA); // valuable mana-producing artifacts that may be equated to a land List manaArts = Arrays.asList("Mox Pearl", "Mox Sapphire", "Mox Jet", "Mox Ruby", "Mox Emerald"); // evaluate creatures available in deck - CardCollectionView allCreatures = CardLists.filter(allCards, CardPredicates.Presets.CREATURES, CardPredicates.isOwner(player)); + CardCollectionView allCreatures = CardLists.filter(allCards, CardPredicates.CREATURES, CardPredicates.isOwner(player)); int numCards = allCreatures.size(); if (landsOTB.size() < maxLandsToScryLandsToTop && landsInHand.isEmpty()) { @@ -2399,7 +2398,7 @@ public class ComputerUtil { } } } else if (c.isCreature()) { - CardCollection creaturesOTB = CardLists.filter(cardsOTB, CardPredicates.Presets.CREATURES); + CardCollection creaturesOTB = CardLists.filter(cardsOTB, CardPredicates.CREATURES); int avgCreatureValue = numCards != 0 ? ComputerUtilCard.evaluateCreatureList(allCreatures) / numCards : 0; int maxControlledCMC = Aggregates.max(creaturesOTB, Card::getCMC); @@ -2490,7 +2489,7 @@ public class ComputerUtil { double amount = 0; for (String type : CardType.getAllCardTypes()) { if (!invalidTypes.contains(type)) { - CardCollection list = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.isType(type), Presets.TAPPED); + CardCollection list = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.isType(type), CardPredicates.TAPPED); double i = type.equals("Creature") ? list.size() * 1.5 : list.size(); if (i > amount) { amount = i; @@ -2801,7 +2800,7 @@ public class ComputerUtil { } // has cards with SacMe or Token - if (CardLists.count(aiCreatures, CardPredicates.hasSVar("SacMe").or(Presets.TOKEN)) >= numDeath) { + if (CardLists.count(aiCreatures, CardPredicates.hasSVar("SacMe").or(CardPredicates.TOKEN)) >= numDeath) { return "Death"; } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index 70466f6e223..7170d04894d 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -81,7 +81,7 @@ public class ComputerUtilCard { * @return a {@link forge.game.card.Card} object. */ public static Card getBestArtifactAI(final List list) { - List all = CardLists.filter(list, CardPredicates.Presets.ARTIFACTS); + List all = CardLists.filter(list, CardPredicates.ARTIFACTS); if (all.size() == 0) { return null; } @@ -96,7 +96,7 @@ public class ComputerUtilCard { * @return best Planeswalker */ public static Card getBestPlaneswalkerAI(final List list) { - List all = CardLists.filter(list, CardPredicates.Presets.PLANESWALKERS); + List all = CardLists.filter(list, CardPredicates.PLANESWALKERS); if (all.isEmpty()) { return null; } @@ -111,7 +111,7 @@ public class ComputerUtilCard { * @return best Planeswalker */ public static Card getWorstPlaneswalkerAI(final List list) { - List all = CardLists.filter(list, CardPredicates.Presets.PLANESWALKERS); + List all = CardLists.filter(list, CardPredicates.PLANESWALKERS); if (all.isEmpty()) { return null; } @@ -182,7 +182,7 @@ public class ComputerUtilCard { * @return a {@link forge.game.card.Card} object. */ public static Card getBestEnchantmentAI(final List list, final SpellAbility spell, final boolean targeted) { - List all = CardLists.filter(list, CardPredicates.Presets.ENCHANTMENTS); + List all = CardLists.filter(list, CardPredicates.ENCHANTMENTS); if (targeted) { all = CardLists.filter(all, c -> c.canBeTargetedBy(spell)); } @@ -200,13 +200,13 @@ public class ComputerUtilCard { * @return a {@link forge.game.card.Card} object. */ public static Card getBestLandAI(final Iterable list) { - final List land = CardLists.filter(list, CardPredicates.Presets.LANDS); + final List land = CardLists.filter(list, CardPredicates.LANDS); if (land.isEmpty()) { return null; } // prefer to target non basic lands - final List nbLand = CardLists.filter(land, CardPredicates.Presets.NONBASIC_LANDS); + final List nbLand = CardLists.filter(land, CardPredicates.NONBASIC_LANDS); if (!nbLand.isEmpty()) { // TODO - Improve ranking various non-basic lands depending on context @@ -245,12 +245,12 @@ public class ComputerUtilCard { } if (iminBL == Integer.MAX_VALUE) { // All basic lands have no basic land type. Just return something - return Iterables.find(land, CardPredicates.Presets.UNTAPPED, land.get(0)); + return Iterables.find(land, CardPredicates.UNTAPPED, land.get(0)); } final List bLand = CardLists.getType(land, sminBL); - for (Card ut : Iterables.filter(bLand, CardPredicates.Presets.UNTAPPED)) { + for (Card ut : Iterables.filter(bLand, CardPredicates.UNTAPPED)) { return ut; } @@ -357,10 +357,10 @@ public class ComputerUtilCard { */ public static Card getBestAI(final Iterable list) { // Get Best will filter by appropriate getBest list if ALL of the list is of that type - if (Iterables.all(list, CardPredicates.Presets.CREATURES)) { + if (Iterables.all(list, CardPredicates.CREATURES)) { return getBestCreatureAI(list); } - if (Iterables.all(list, CardPredicates.Presets.LANDS)) { + if (Iterables.all(list, CardPredicates.LANDS)) { return getBestLandAI(list); } // TODO - Once we get an EvaluatePermanent this should call getBestPermanent() @@ -377,7 +377,7 @@ public class ComputerUtilCard { if (Iterables.size(list) == 1) { return Iterables.get(list, 0); } - return Aggregates.itemWithMax(Iterables.filter(list, CardPredicates.Presets.CREATURES), ComputerUtilCard.creatureEvaluator); + return Aggregates.itemWithMax(Iterables.filter(list, CardPredicates.CREATURES), ComputerUtilCard.creatureEvaluator); } /** @@ -390,7 +390,7 @@ public class ComputerUtilCard { if (Iterables.size(list) == 1) { return Iterables.get(list, 0); } - return Aggregates.itemWithMax(Iterables.filter(list, CardPredicates.Presets.LANDS), ComputerUtilCard.landEvaluator); + return Aggregates.itemWithMax(Iterables.filter(list, CardPredicates.LANDS), ComputerUtilCard.landEvaluator); } /** @@ -405,7 +405,7 @@ public class ComputerUtilCard { if (Iterables.size(list) == 1) { return Iterables.get(list, 0); } - return Aggregates.itemWithMin(Iterables.filter(list, CardPredicates.Presets.CREATURES), ComputerUtilCard.creatureEvaluator); + return Aggregates.itemWithMin(Iterables.filter(list, CardPredicates.CREATURES), ComputerUtilCard.creatureEvaluator); } // This selection rates tokens higher @@ -426,7 +426,7 @@ public class ComputerUtilCard { Card biggest = null; int biggestvalue = -1; - for (Card card : CardLists.filter(list, CardPredicates.Presets.CREATURES)) { + for (Card card : CardLists.filter(list, CardPredicates.CREATURES)) { int newvalue = evaluateCreature(card); newvalue += card.isToken() ? tokenBonus : 0; // raise the value of tokens @@ -479,40 +479,40 @@ public class ComputerUtilCard { return null; } - final boolean hasEnchantmants = Iterables.any(list, CardPredicates.Presets.ENCHANTMENTS); + final boolean hasEnchantmants = Iterables.any(list, CardPredicates.ENCHANTMENTS); if (biasEnch && hasEnchantmants) { - return getCheapestPermanentAI(CardLists.filter(list, CardPredicates.Presets.ENCHANTMENTS), null, false); + return getCheapestPermanentAI(CardLists.filter(list, CardPredicates.ENCHANTMENTS), null, false); } - final boolean hasArtifacts = Iterables.any(list, CardPredicates.Presets.ARTIFACTS); + final boolean hasArtifacts = Iterables.any(list, CardPredicates.ARTIFACTS); if (biasArt && hasArtifacts) { - return getCheapestPermanentAI(CardLists.filter(list, CardPredicates.Presets.ARTIFACTS), null, false); + return getCheapestPermanentAI(CardLists.filter(list, CardPredicates.ARTIFACTS), null, false); } - if (biasLand && Iterables.any(list, CardPredicates.Presets.LANDS)) { - return getWorstLand(CardLists.filter(list, CardPredicates.Presets.LANDS)); + if (biasLand && Iterables.any(list, CardPredicates.LANDS)) { + return getWorstLand(CardLists.filter(list, CardPredicates.LANDS)); } - final boolean hasCreatures = Iterables.any(list, CardPredicates.Presets.CREATURES); + final boolean hasCreatures = Iterables.any(list, CardPredicates.CREATURES); if (biasCreature && hasCreatures) { - return getWorstCreatureAI(CardLists.filter(list, CardPredicates.Presets.CREATURES)); + return getWorstCreatureAI(CardLists.filter(list, CardPredicates.CREATURES)); } - List lands = CardLists.filter(list, CardPredicates.Presets.LANDS); + List lands = CardLists.filter(list, CardPredicates.LANDS); if (lands.size() > 6) { return getWorstLand(lands); } if (hasEnchantmants || hasArtifacts) { final List ae = CardLists.filter(list, - (CardPredicates.Presets.ARTIFACTS.or(CardPredicates.Presets.ENCHANTMENTS)) + (CardPredicates.ARTIFACTS.or(CardPredicates.ENCHANTMENTS)) .and(card -> !card.hasSVar("DoNotDiscardIfAble")) ); return getCheapestPermanentAI(ae, null, false); } if (hasCreatures) { - return getWorstCreatureAI(CardLists.filter(list, CardPredicates.Presets.CREATURES)); + return getWorstCreatureAI(CardLists.filter(list, CardPredicates.CREATURES)); } // Planeswalkers fall through to here, lands will fall through if there aren't very many @@ -521,7 +521,7 @@ public class ComputerUtilCard { public static final Card getCheapestSpellAI(final Iterable list) { if (!Iterables.isEmpty(list)) { - CardCollection cc = CardLists.filter(list, CardPredicates.Presets.INSTANTS_AND_SORCERIES); + CardCollection cc = CardLists.filter(list, CardPredicates.INSTANTS_AND_SORCERIES); if (cc.isEmpty()) { return null; @@ -1001,7 +1001,7 @@ public class ComputerUtilCard { } else if (logic.equals("MostProminentHumanCreatures")) { CardCollectionView list = opp.getCreaturesInPlay(); if (list.isEmpty()) { - list = CardLists.filter(CardLists.filterControlledBy(game.getCardsInGame(), opp), CardPredicates.Presets.CREATURES); + list = CardLists.filter(CardLists.filterControlledBy(game.getCardsInGame(), opp), CardPredicates.CREATURES); } chosen.add(getMostProminentColor(list, colorChoices)); } else if (logic.equals("MostProminentComputerControls")) { @@ -1943,7 +1943,7 @@ public class ComputerUtilCard { CardCollection aiCreats = ai.getCreaturesInPlay(); if (temporary) { // Pump effects that add "CARDNAME can't attack" and similar things. Only do it if something is untapped. - oppCards = CardLists.filter(oppCards, CardPredicates.Presets.UNTAPPED); + oppCards = CardLists.filter(oppCards, CardPredicates.UNTAPPED); } CardCollection priorityCards = new CardCollection(); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index 93cd73d3a63..68ad94b63e8 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -10,7 +10,6 @@ import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.card.*; -import forge.game.card.CardPredicates.Presets; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; import forge.game.cost.*; @@ -745,7 +744,7 @@ public class ComputerUtilCost { // Special Card logic, this one try to median its power with the number of artifacts if ("Marionette Master".equals(source.getName())) { - CardCollection list = CardLists.filter(payer.getCardsIn(ZoneType.Battlefield), Presets.ARTIFACTS); + CardCollection list = CardLists.filter(payer.getCardsIn(ZoneType.Battlefield), CardPredicates.ARTIFACTS); return list.size() >= copy.getNetPower(); } else if ("Cultivator of Blades".equals(source.getName())) { // Cultivator does try to median with number of Creatures @@ -832,7 +831,7 @@ public class ComputerUtilCost { return getAvailableManaColors(ai, Lists.newArrayList(additionalLand)); } public static Set getAvailableManaColors(Player ai, List additionalLands) { - CardCollection cardsToConsider = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), Presets.UNTAPPED); + CardCollection cardsToConsider = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.UNTAPPED); Set colorsAvailable = Sets.newHashSet(); if (additionalLands != null) { diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 66fc10d90d8..027fd436dfc 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -313,7 +313,7 @@ public class ComputerUtilMana { // For cards like Genju of the Cedars, make sure we're not attaching to the same land that will // be tapped to pay its own cost if there's another untapped land like that available if (ma.getHostCard().equals(sa.getTargetCard())) { - if (CardLists.count(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals(ma.getHostCard().getName()).and(CardPredicates.Presets.UNTAPPED)) > 1) { + if (CardLists.count(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals(ma.getHostCard().getName()).and(CardPredicates.UNTAPPED)) > 1) { continue; } } diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 685e11cfd54..99505d9ca51 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -19,7 +19,6 @@ import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.ability.effects.CharmEffect; import forge.game.card.*; -import forge.game.card.CardPredicates.Presets; import forge.game.combat.Combat; import forge.game.cost.Cost; import forge.game.cost.CostEnlist; @@ -614,7 +613,7 @@ public class PlayerControllerAi extends PlayerController { } } - int landsOTB = CardLists.count(p.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.LANDS_PRODUCING_MANA); + int landsOTB = CardLists.count(p.getCardsIn(ZoneType.Battlefield), CardPredicates.LANDS_PRODUCING_MANA); if (!p.isOpponentOf(player)) { if (landsOTB <= 2) { @@ -758,13 +757,13 @@ public class PlayerControllerAi extends PlayerController { for (int i = 0; i < cardsToReturn; i++) { hand.removeAll(toReturn); - CardCollection landsInHand = CardLists.filter(hand, Presets.LANDS); - int numLandsInHand = landsInHand.size() - CardLists.count(toReturn, Presets.LANDS); + CardCollection landsInHand = CardLists.filter(hand, CardPredicates.LANDS); + int numLandsInHand = landsInHand.size() - CardLists.count(toReturn, CardPredicates.LANDS); // If we're flooding with lands, get rid of the worst land we have if (numLandsInHand > 0 && numLandsInHand > numLandsDesired) { - CardCollection producingLands = CardLists.filter(landsInHand, Presets.LANDS_PRODUCING_MANA); - CardCollection nonProducingLands = CardLists.filter(landsInHand, Presets.LANDS_PRODUCING_MANA.negate()); + CardCollection producingLands = CardLists.filter(landsInHand, CardPredicates.LANDS_PRODUCING_MANA); + CardCollection nonProducingLands = CardLists.filter(landsInHand, CardPredicates.LANDS_PRODUCING_MANA.negate()); Card worstLand = nonProducingLands.isEmpty() ? ComputerUtilCard.getWorstLand(producingLands) : ComputerUtilCard.getWorstLand(nonProducingLands); toReturn.add(worstLand); @@ -1074,7 +1073,7 @@ public class PlayerControllerAi extends PlayerController { return Iterables.getFirst(options, null); } List possible = Lists.newArrayList(); - CardCollection oppUntappedCreatures = CardLists.filter(player.getOpponents().getCreaturesInPlay(), CardPredicates.Presets.UNTAPPED); + CardCollection oppUntappedCreatures = CardLists.filter(player.getOpponents().getCreaturesInPlay(), CardPredicates.UNTAPPED); if (tgtCard != null) { for (String kw : options) { if (tgtCard.hasKeyword(kw)) { @@ -1336,7 +1335,7 @@ public class PlayerControllerAi extends PlayerController { // Probably want to see if the face up pile has anything "worth it", then potentially take face down pile return pile1.size() >= pile2.size(); } else { - boolean allCreatures = Iterables.all(Iterables.concat(pile1, pile2), CardPredicates.Presets.CREATURES); + boolean allCreatures = Iterables.all(Iterables.concat(pile1, pile2), CardPredicates.CREATURES); int cmc1 = allCreatures ? ComputerUtilCard.evaluateCreatureList(pile1) : ComputerUtilCard.evaluatePermanentList(pile1); int cmc2 = allCreatures ? ComputerUtilCard.evaluateCreatureList(pile2) : ComputerUtilCard.evaluatePermanentList(pile2); @@ -1469,7 +1468,7 @@ public class PlayerControllerAi extends PlayerController { } } else { CardCollectionView list = CardLists.filterControlledBy(getGame().getCardsInGame(), player.getOpponents()); - list = CardLists.filter(list, Presets.NON_LANDS); + list = CardLists.filter(list, CardPredicates.NON_LANDS); if (!list.isEmpty()) { return list.get(0).getName(); } diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java index 485504495f4..ca79e7df54b 100644 --- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java +++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java @@ -124,8 +124,8 @@ public class SpecialCardAi { CardCollection manaSources = ComputerUtilMana.getAvailableManaSources(ai, true); int numManaSrcs = manaSources.size(); - CardCollection allCards = CardLists.filter(ai.getAllCards(), Arrays.asList(CardPredicates.Presets.NON_TOKEN, - CardPredicates.Presets.NON_LANDS, CardPredicates.isOwner(ai))); + CardCollection allCards = CardLists.filter(ai.getAllCards(), Arrays.asList(CardPredicates.NON_TOKEN, + CardPredicates.NON_LANDS, CardPredicates.isOwner(ai))); int numHighCMC = CardLists.count(allCards, CardPredicates.greaterCMC(5)); int numLowCMC = CardLists.count(allCards, CardPredicates.lessCMC(3)); @@ -156,7 +156,7 @@ public class SpecialCardAi { int libsize = ai.getCardsIn(ZoneType.Library).size(); final CardCollection hand = CardLists.filter(ai.getCardsIn(ZoneType.Hand), - CardPredicates.Presets.INSTANTS_AND_SORCERIES); + CardPredicates.INSTANTS_AND_SORCERIES); if (!hand.isEmpty()) { // has spell that can be cast in hand with put ability if (Iterables.any(hand, CardPredicates.hasCMC(counterNum + 1))) { @@ -169,7 +169,7 @@ public class SpecialCardAi { } } final CardCollection library = CardLists.filter(ai.getCardsIn(ZoneType.Library), - CardPredicates.Presets.INSTANTS_AND_SORCERIES); + CardPredicates.INSTANTS_AND_SORCERIES); if (!library.isEmpty()) { // get max cmc of instant or sorceries in the libary int maxCMC = 0; @@ -204,9 +204,9 @@ public class SpecialCardAi { public static class ChainOfAcid { public static boolean consider(final Player ai, final SpellAbility sa) { List AiLandsOnly = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), - CardPredicates.Presets.LANDS); + CardPredicates.LANDS); List OppPerms = CardLists.filter(ai.getOpponents().getCardsIn(ZoneType.Battlefield), - CardPredicates.Presets.NON_CREATURES); + CardPredicates.NON_CREATURES); // TODO: improve this logic (currently the AI has difficulty evaluating non-creature permanents, // which it can only distinguish by their CMC, considering >CMC higher value). @@ -330,13 +330,13 @@ public class SpecialCardAi { // Deathgorge Scavenger public static class DeathgorgeScavenger { public static boolean consider(final Player ai, final SpellAbility sa) { - Card worstCreat = ComputerUtilCard.getWorstAI(CardLists.filter(ai.getOpponents().getCardsIn(ZoneType.Graveyard), CardPredicates.Presets.CREATURES)); - Card worstNonCreat = ComputerUtilCard.getWorstAI(CardLists.filter(ai.getOpponents().getCardsIn(ZoneType.Graveyard), CardPredicates.Presets.NON_CREATURES)); + Card worstCreat = ComputerUtilCard.getWorstAI(CardLists.filter(ai.getOpponents().getCardsIn(ZoneType.Graveyard), CardPredicates.CREATURES)); + Card worstNonCreat = ComputerUtilCard.getWorstAI(CardLists.filter(ai.getOpponents().getCardsIn(ZoneType.Graveyard), CardPredicates.NON_CREATURES)); if (worstCreat == null) { - worstCreat = ComputerUtilCard.getWorstAI(CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), CardPredicates.Presets.CREATURES)); + worstCreat = ComputerUtilCard.getWorstAI(CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), CardPredicates.CREATURES)); } if (worstNonCreat == null) { - worstNonCreat = ComputerUtilCard.getWorstAI(CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), CardPredicates.Presets.NON_CREATURES)); + worstNonCreat = ComputerUtilCard.getWorstAI(CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), CardPredicates.NON_CREATURES)); } sa.resetTargets(); @@ -359,7 +359,7 @@ public class SpecialCardAi { public static boolean considerSacrificingCreature(final Player ai, final SpellAbility sa) { CardCollection flyingCreatures = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), - CardPredicates.Presets.UNTAPPED.and( + CardPredicates.UNTAPPED.and( CardPredicates.hasKeyword(Keyword.FLYING).or(CardPredicates.hasKeyword(Keyword.REACH)))); boolean hasUsefulBlocker = false; @@ -402,7 +402,7 @@ public class SpecialCardAi { // select player with less lands on the field (helpful for Illusions of Grandeur and probably Pacts too) Player opp = Collections.min(Lists.newArrayList(oppTarget), - PlayerPredicates.compareByZoneSize(ZoneType.Battlefield, CardPredicates.Presets.LANDS)); + PlayerPredicates.compareByZoneSize(ZoneType.Battlefield, CardPredicates.LANDS)); if (opp != null) { sa.resetTargets(); @@ -581,9 +581,9 @@ public class SpecialCardAi { Card bestBasic = null; Card bestBasicSelfOnly = null; - CardCollection aiLands = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.LANDS_PRODUCING_MANA); + CardCollection aiLands = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.LANDS_PRODUCING_MANA); CardCollection oppLands = CardLists.filter(ai.getOpponents().getCardsIn(ZoneType.Battlefield), - CardPredicates.Presets.LANDS_PRODUCING_MANA); + CardPredicates.LANDS_PRODUCING_MANA); int bestCount = 0; int bestSelfOnlyCount = 0; @@ -629,7 +629,7 @@ public class SpecialCardAi { } CardCollection oppList = CardLists.filter(ai.getGame().getCardsIn(ZoneType.Battlefield), - CardPredicates.Presets.CREATURES, CardPredicates.isControlledByAnyOf(ai.getOpponents())); + CardPredicates.CREATURES, CardPredicates.isControlledByAnyOf(ai.getOpponents())); oppList = CardLists.filterPower(oppList, lowest.getNetPower() + 1); if (ComputerUtilCard.evaluateCreatureList(oppList) > 200) { @@ -685,7 +685,7 @@ public class SpecialCardAi { // Goblin Polka Band public static class GoblinPolkaBand { public static boolean consider(final Player ai, final SpellAbility sa) { - int maxPotentialTgts = Lists.newArrayList(Iterables.filter(ai.getOpponents().getCreaturesInPlay(), CardPredicates.Presets.UNTAPPED)).size(); + int maxPotentialTgts = Lists.newArrayList(Iterables.filter(ai.getOpponents().getCreaturesInPlay(), CardPredicates.UNTAPPED)).size(); int maxPotentialPayment = ComputerUtilMana.determineLeftoverMana(sa, ai, "R", false); int numTgts = Math.min(maxPotentialPayment, maxPotentialTgts); @@ -921,7 +921,7 @@ public class SpecialCardAi { int aiBattlefieldPower = 0, aiGraveyardPower = 0; int threshold = 320; // approximately a 4/4 Flying creature worth of extra value - CardCollection aiCreaturesInGY = CardLists.filter(ai.getZone(ZoneType.Graveyard).getCards(), CardPredicates.Presets.CREATURES); + CardCollection aiCreaturesInGY = CardLists.filter(ai.getZone(ZoneType.Graveyard).getCards(), CardPredicates.CREATURES); if (aiCreaturesInGY.isEmpty()) { // nothing in graveyard, so cut short @@ -945,7 +945,7 @@ public class SpecialCardAi { for (Card c : p.getCreaturesInPlay()) { playerPower += ComputerUtilCard.evaluateCreature(c); } - for (Card c : CardLists.filter(p.getZone(ZoneType.Graveyard).getCards(), CardPredicates.Presets.CREATURES)) { + for (Card c : CardLists.filter(p.getZone(ZoneType.Graveyard).getCards(), CardPredicates.CREATURES)) { tempGraveyardPower += ComputerUtilCard.evaluateCreature(c); } if (playerPower > oppBattlefieldPower) { @@ -997,7 +997,7 @@ public class SpecialCardAi { // Scan the fetch list for a card with at least one activated ability. // TODO: can be improved to a full consider(sa, ai) logic which would scan the graveyard first and hand last public static Card considerCardFromList(final CardCollection fetchList) { - for (Card c : CardLists.filter(fetchList, CardPredicates.Presets.ARTIFACTS.or(CardPredicates.Presets.CREATURES))) { + for (Card c : CardLists.filter(fetchList, CardPredicates.ARTIFACTS.or(CardPredicates.CREATURES))) { for (SpellAbility ab : c.getSpellAbilities()) { if (ab.isActivatedAbility()) { Player controller = c.getController(); @@ -1058,7 +1058,7 @@ public class SpecialCardAi { // In MoJhoSto, prefer Jhoira sorcery ability from time to time if (source.getGame().getRules().hasAppliedVariant(GameType.MoJhoSto) - && CardLists.filter(ai.getLandsInPlay(), CardPredicates.Presets.UNTAPPED).size() >= 3) { + && CardLists.filter(ai.getLandsInPlay(), CardPredicates.UNTAPPED).size() >= 3) { AiController aic = ((PlayerControllerAi)ai.getController()).getAi(); int chanceToPrefJhoira = aic.getIntProperty(AiProps.MOJHOSTO_CHANCE_TO_PREFER_JHOIRA_OVER_MOMIR); int numLandsForJhoira = aic.getIntProperty(AiProps.MOJHOSTO_NUM_LANDS_TO_ACTIVATE_JHOIRA); @@ -1219,7 +1219,7 @@ public class SpecialCardAi { final CardCollectionView cards = ai.getCardsIn(Arrays.asList(ZoneType.Hand, ZoneType.Battlefield, ZoneType.Command)); List all = ComputerUtilAbility.getSpellAbilities(cards, ai); - int numManaSrcs = CardLists.filter(ComputerUtilMana.getAvailableManaSources(ai, true), CardPredicates.Presets.UNTAPPED).size(); + int numManaSrcs = CardLists.filter(ComputerUtilMana.getAvailableManaSources(ai, true), CardPredicates.UNTAPPED).size(); for (final SpellAbility testSa : ComputerUtilAbility.getOriginalAndAltCostAbilities(all, ai)) { ManaCost cost = testSa.getPayCosts().getTotalMana(); @@ -1316,7 +1316,7 @@ public class SpecialCardAi { return false; } - int aiLands = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.NONBASIC_LANDS).size(); + int aiLands = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.NONBASIC_LANDS).size(); boolean hasBridge = false; for (Card c : ai.getCardsIn(ZoneType.Battlefield)) { @@ -1334,7 +1334,7 @@ public class SpecialCardAi { } for (Player opp : ai.getOpponents()) { - int oppLands = CardLists.filter(opp.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.NONBASIC_LANDS).size(); + int oppLands = CardLists.filter(opp.getCardsIn(ZoneType.Battlefield), CardPredicates.NONBASIC_LANDS).size(); // Always if enemy would die and we don't! // TODO : predict actual damage instead of assuming it'll be 2*lands // Don't if we lose, unless we lose anyway to unblocked creatures next turn @@ -1402,7 +1402,7 @@ public class SpecialCardAi { public static boolean consider(final Player ai, final SpellAbility sa) { CardCollection oppTargetables = CardLists.getTargetableCards(ai.getOpponents().getCreaturesInPlay(), sa); CardCollection threats = CardLists.filter(oppTargetables, card -> !ComputerUtilCard.isUselessCreature(card.getController(), card)); - CardCollection ownTgts = CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), CardPredicates.Presets.CREATURES); + CardCollection ownTgts = CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), CardPredicates.CREATURES); // TODO: improve the conditions for when the AI is considered threatened (check the possibility of being attacked?) int lifeInDanger = (((PlayerControllerAi) ai.getController()).getAi().getIntProperty(AiProps.AI_IN_DANGER_THRESHOLD)); @@ -1442,7 +1442,7 @@ public class SpecialCardAi { public static boolean consider(final Player ai, final SpellAbility sa) { int loyalty = sa.getHostCard().getCounters(CounterEnumType.LOYALTY); CardCollection creaturesToGet = CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), - CardPredicates.Presets.CREATURES + CardPredicates.CREATURES .and(CardPredicates.lessCMC(loyalty - 1)) .and(card -> { final Card copy = CardCopyService.getLKICopy(card); @@ -1484,9 +1484,9 @@ public class SpecialCardAi { // face down (on the battlefield or in exile). Might need some kind of an update to consider hidden information // like that properly (probably by adding all those cards to the evaluation mix so the AI doesn't "know" which // ones are already face down in play and which are still in the library) - CardCollectionView creatsInLib = CardLists.filter(ai.getCardsIn(ZoneType.Library), CardPredicates.Presets.CREATURES); - CardCollectionView creatsInHand = CardLists.filter(ai.getCardsIn(ZoneType.Hand), CardPredicates.Presets.CREATURES); - CardCollectionView manaSrcsInHand = CardLists.filter(ai.getCardsIn(ZoneType.Hand), CardPredicates.Presets.LANDS_PRODUCING_MANA); + CardCollectionView creatsInLib = CardLists.filter(ai.getCardsIn(ZoneType.Library), CardPredicates.CREATURES); + CardCollectionView creatsInHand = CardLists.filter(ai.getCardsIn(ZoneType.Hand), CardPredicates.CREATURES); + CardCollectionView manaSrcsInHand = CardLists.filter(ai.getCardsIn(ZoneType.Hand), CardPredicates.LANDS_PRODUCING_MANA); if (creatsInHand.isEmpty() || creatsInLib.isEmpty()) { return null; } @@ -1555,10 +1555,10 @@ public class SpecialCardAi { } public static Card considerCardToGet(final Player ai, final SpellAbility sa) { - CardCollectionView creatsInLib = CardLists.filter(ai.getCardsIn(ZoneType.Library), CardPredicates.Presets.CREATURES); + CardCollectionView creatsInLib = CardLists.filter(ai.getCardsIn(ZoneType.Library), CardPredicates.CREATURES); if (creatsInLib.isEmpty()) { return null; } - CardCollectionView manaSrcsInHand = CardLists.filter(ai.getCardsIn(ZoneType.Hand), CardPredicates.Presets.LANDS_PRODUCING_MANA); + CardCollectionView manaSrcsInHand = CardLists.filter(ai.getCardsIn(ZoneType.Hand), CardPredicates.LANDS_PRODUCING_MANA); int numManaSrcs = ComputerUtilMana.getAvailableManaEstimate(ai, false) + Math.min(1, manaSrcsInHand.size()); @@ -1602,8 +1602,8 @@ public class SpecialCardAi { // The Scarab God public static class TheScarabGod { public static boolean consider(final Player ai, final SpellAbility sa) { - Card bestOppCreat = ComputerUtilCard.getBestAI(CardLists.filter(ai.getOpponents().getCardsIn(ZoneType.Graveyard), CardPredicates.Presets.CREATURES)); - Card worstOwnCreat = ComputerUtilCard.getWorstAI(CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), CardPredicates.Presets.CREATURES)); + Card bestOppCreat = ComputerUtilCard.getBestAI(CardLists.filter(ai.getOpponents().getCardsIn(ZoneType.Graveyard), CardPredicates.CREATURES)); + Card worstOwnCreat = ComputerUtilCard.getWorstAI(CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), CardPredicates.CREATURES)); sa.resetTargets(); if (bestOppCreat != null) { @@ -1704,7 +1704,7 @@ public class SpecialCardAi { CardCollectionView aiGY = ai.getCardsIn(ZoneType.Graveyard); Card topGY = null; Card creatHand = ComputerUtilCard.getBestCreatureAI(ai.getCardsIn(ZoneType.Hand)); - int numCreatsInHand = CardLists.filter(ai.getCardsIn(ZoneType.Hand), CardPredicates.Presets.CREATURES).size(); + int numCreatsInHand = CardLists.filter(ai.getCardsIn(ZoneType.Hand), CardPredicates.CREATURES).size(); if (!aiGY.isEmpty()) { topGY = ai.getCardsIn(ZoneType.Graveyard).get(0); diff --git a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java index 88e4ed97dd4..e9503149190 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java @@ -130,7 +130,7 @@ public class AnimateAi extends SpellAbilityAi { && game.getPhaseHandler().getNextTurn() != ai && source.isPermanent(); if (ph.isPlayerTurn(ai) && ai.getLife() < 6 && opponent.getLife() > 6 - && opponent.getZone(ZoneType.Battlefield).contains(CardPredicates.Presets.CREATURES) + && opponent.getZone(ZoneType.Battlefield).contains(CardPredicates.CREATURES) && !sa.hasParam("AILogic") && !"Permanent".equals(sa.getParam("Duration")) && !activateAsPotentialBlocker) { return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index 7a353b2c05c..1a64a02490a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -509,7 +509,7 @@ public class AttachAi extends SpellAbilityAi { if (!evenBetterList.isEmpty()) { betterList = evenBetterList; } - evenBetterList = CardLists.filter(betterList, CardPredicates.Presets.UNTAPPED); + evenBetterList = CardLists.filter(betterList, CardPredicates.UNTAPPED); if (!evenBetterList.isEmpty()) { betterList = evenBetterList; } diff --git a/forge-ai/src/main/java/forge/ai/ability/BalanceAi.java b/forge-ai/src/main/java/forge/ai/ability/BalanceAi.java index 902741c6da3..9bd5d028cf0 100644 --- a/forge-ai/src/main/java/forge/ai/ability/BalanceAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/BalanceAi.java @@ -25,10 +25,10 @@ public class BalanceAi extends SpellAbilityAi { if ("BalanceCreaturesAndLands".equals(logic)) { // TODO Copied over from hardcoded Balance. We should be checking value of the lands/creatures for each opponent, not just counting - diff += CardLists.filter(humPerms, CardPredicates.Presets.LANDS).size() - - CardLists.filter(compPerms, CardPredicates.Presets.LANDS).size(); - diff += 1.5 * (CardLists.filter(humPerms, CardPredicates.Presets.CREATURES).size() - - CardLists.filter(compPerms, CardPredicates.Presets.CREATURES).size()); + diff += CardLists.filter(humPerms, CardPredicates.LANDS).size() - + CardLists.filter(compPerms, CardPredicates.LANDS).size(); + diff += 1.5 * (CardLists.filter(humPerms, CardPredicates.CREATURES).size() - + CardLists.filter(compPerms, CardPredicates.CREATURES).size()); } else if ("BalancePermanents".equals(logic)) { // Don't cast if you have to sacrifice permanents diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java index 63403bd4e6c..3384e0dc4f5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -12,7 +12,6 @@ import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.card.*; -import forge.game.card.CardPredicates.Presets; import forge.game.combat.Combat; import forge.game.cost.*; import forge.game.keyword.Keyword; @@ -32,7 +31,6 @@ import forge.util.MyRandom; import org.apache.commons.lang3.StringUtils; import java.util.*; -import java.util.function.Predicate; public class ChangeZoneAi extends SpellAbilityAi { /* @@ -614,8 +612,8 @@ public class ChangeZoneAi extends SpellAbilityAi { } // pick dual lands if available - if (Iterables.any(result, Presets.NONBASIC_LANDS)) { - result = CardLists.filter(result, Presets.NONBASIC_LANDS); + if (Iterables.any(result, CardPredicates.NONBASIC_LANDS)) { + result = CardLists.filter(result, CardPredicates.NONBASIC_LANDS); } return result.get(0); @@ -1013,7 +1011,7 @@ public class ChangeZoneAi extends SpellAbilityAi { boolean saheeliFelidarCombo = ComputerUtilAbility.getAbilitySourceName(sa).equals("Felidar Guardian") && tobounce.getName().equals("Saheeli Rai") && CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals("Felidar Guardian")).size() < - CardLists.filter(ai.getOpponents().getCardsIn(ZoneType.Battlefield), Presets.CREATURES).size() + ai.getOpponentsGreatestLifeTotal() + 10; + CardLists.filter(ai.getOpponents().getCardsIn(ZoneType.Battlefield), CardPredicates.CREATURES).size() + ai.getOpponentsGreatestLifeTotal() + 10; // remember that the card was bounced already unless it's a special combo case if (!saheeliFelidarCombo) { @@ -1197,7 +1195,7 @@ public class ChangeZoneAi extends SpellAbilityAi { } else if (destination.equals(ZoneType.Hand) || destination.equals(ZoneType.Library)) { List nonLands = CardLists.getNotType(list, "Land"); // Prefer to pull a creature, generally more useful for AI. - choice = chooseCreature(ai, CardLists.filter(nonLands, CardPredicates.Presets.CREATURES)); + choice = chooseCreature(ai, CardLists.filter(nonLands, CardPredicates.CREATURES)); if (choice == null) { // Could not find a creature. if (ai.getLife() <= 5) { // Desperate? // Get something AI can cast soon. @@ -1309,7 +1307,7 @@ public class ChangeZoneAi extends SpellAbilityAi { Game game = ai.getGame(); // filter out untargetables CardCollectionView aiPermanents = CardLists.filterControlledBy(list, ai); - CardCollection aiPlaneswalkers = CardLists.filter(aiPermanents, Presets.PLANESWALKERS); + CardCollection aiPlaneswalkers = CardLists.filter(aiPermanents, CardPredicates.PLANESWALKERS); // Felidar Guardian + Saheeli Rai combo support if (sa.getHostCard().getName().equals("Felidar Guardian")) { @@ -1335,7 +1333,7 @@ public class ChangeZoneAi extends SpellAbilityAi { else if (game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS)) { Combat combat = game.getCombat(); final CardCollection combatants = CardLists.filter(aiPermanents, - CardPredicates.Presets.CREATURES); + CardPredicates.CREATURES); ComputerUtilCard.sortByEvaluateCreature(combatants); for (final Card c : combatants) { @@ -1455,7 +1453,7 @@ public class ChangeZoneAi extends SpellAbilityAi { } else if (destination.equals(ZoneType.Hand) || destination.equals(ZoneType.Library)) { List nonLands = CardLists.getNotType(list, "Land"); // Prefer to pull a creature, generally more useful for AI. - choice = chooseCreature(ai, CardLists.filter(nonLands, CardPredicates.Presets.CREATURES)); + choice = chooseCreature(ai, CardLists.filter(nonLands, CardPredicates.CREATURES)); if (choice == null) { // Could not find a creature. if (ai.getLife() <= 5) { // Desperate? // Get something AI can cast soon. @@ -1636,7 +1634,7 @@ public class ChangeZoneAi extends SpellAbilityAi { // Does AI need a land? CardCollectionView hand = decider.getCardsIn(ZoneType.Hand); - if (!Iterables.any(hand, Presets.LANDS) && CardLists.count(decider.getCardsIn(ZoneType.Battlefield), Presets.LANDS) < 4) { + if (!Iterables.any(hand, CardPredicates.LANDS) && CardLists.count(decider.getCardsIn(ZoneType.Battlefield), CardPredicates.LANDS) < 4) { boolean canCastSomething = false; for (Card cardInHand : hand) { canCastSomething = canCastSomething || ComputerUtilMana.hasEnoughManaSourcesToCast(cardInHand.getFirstSpellAbility(), decider); @@ -1646,13 +1644,13 @@ public class ChangeZoneAi extends SpellAbilityAi { } } if (c == null) { - if (Iterables.all(fetchList, Presets.LANDS)) { + if (Iterables.all(fetchList, CardPredicates.LANDS)) { // we're only choosing from lands, so get the best land c = ComputerUtilCard.getBestLandAI(fetchList); } else { fetchList = CardLists.getNotType(fetchList, "Land"); // Prefer to pull a creature, generally more useful for AI. - c = chooseCreature(decider, CardLists.filter(fetchList, CardPredicates.Presets.CREATURES)); + c = chooseCreature(decider, CardLists.filter(fetchList, CardPredicates.CREATURES)); } } if (c == null) { // Could not find a creature. @@ -1770,7 +1768,7 @@ public class ChangeZoneAi extends SpellAbilityAi { CardCollection listToSac = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), definedSac, ai, source, sa); listToSac.sort(Collections.reverseOrder(CardLists.CmcComparatorInv)); - CardCollection listToRet = CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), Presets.CREATURES); + CardCollection listToRet = CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), CardPredicates.CREATURES); listToRet.sort(CardLists.CmcComparatorInv); if (!listToSac.isEmpty() && !listToRet.isEmpty()) { @@ -1961,7 +1959,7 @@ public class ChangeZoneAi extends SpellAbilityAi { } if (logic.contains("NonLand")) { - scanList = CardLists.filter(scanList, Presets.NON_LANDS); + scanList = CardLists.filter(scanList, CardPredicates.NON_LANDS); } if (logic.contains("NonExiled")) { diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java index dc2aa48d65a..a01557c3cd6 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java @@ -92,7 +92,7 @@ public class ChangeZoneAllAi extends SpellAbilityAi { } else if ("ExileGraveyards".equals(aiLogic)) { for (Player opp : ai.getOpponents()) { CardCollectionView cardsGY = opp.getCardsIn(ZoneType.Graveyard); - CardCollection creats = CardLists.filter(cardsGY, CardPredicates.Presets.CREATURES); + CardCollection creats = CardLists.filter(cardsGY, CardPredicates.CREATURES); if (opp.hasDelirium() || opp.hasThreshold() || creats.size() >= 5) { return true; @@ -107,7 +107,7 @@ public class ChangeZoneAllAi extends SpellAbilityAi { Player bestTgt = null; if (player.canBeTargetedBy(sa)) { int numGY = CardLists.count(player.getCardsIn(ZoneType.Graveyard), - CardPredicates.Presets.CREATURES); + CardPredicates.CREATURES); if (numGY > maxSize) { maxSize = numGY; bestTgt = player; @@ -353,7 +353,7 @@ public class ChangeZoneAllAi extends SpellAbilityAi { // TODO: this is a stub to prevent the AI from crashing the game when, for instance, playing the opponent's // Profaner from exile without paying its mana cost. Otherwise the card is marked AI:RemoveDeck:All and // there is no specific AI to support playing it in a smarter way. Feel free to expand. - return Iterables.any(ai.getOpponents().getCardsIn(origin), CardPredicates.Presets.CREATURES); + return Iterables.any(ai.getOpponents().getCardsIn(origin), CardPredicates.CREATURES); } CardCollectionView humanType = ai.getOpponents().getCardsIn(origin); diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java index b5a77496d57..3efdce0e464 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java @@ -15,7 +15,6 @@ import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; import forge.game.card.CardPredicates; -import forge.game.card.CardPredicates.Presets; import forge.game.card.CounterEnumType; import forge.game.combat.Combat; import forge.game.keyword.Keyword; @@ -178,8 +177,8 @@ public class ChooseCardAi extends SpellAbilityAi { } choice = ComputerUtilCard.getBestAI(ownChoices); } else if (logic.equals("BestBlocker")) { - if (Iterables.any(options, Presets.UNTAPPED)) { - options = CardLists.filter(options, Presets.UNTAPPED); + if (Iterables.any(options, CardPredicates.UNTAPPED)) { + options = CardLists.filter(options, CardPredicates.UNTAPPED); } choice = ComputerUtilCard.getBestCreatureAI(options); } else if (logic.equals("Clone")) { @@ -216,7 +215,7 @@ public class ChooseCardAi extends SpellAbilityAi { choice = ComputerUtilCard.getWorstAI(aiControlled); } } else if ("LowestCMCCreature".equals(logic)) { - CardCollection creats = CardLists.filter(options, Presets.CREATURES); + CardCollection creats = CardLists.filter(options, CardPredicates.CREATURES); creats = CardLists.filterToughness(creats, 1); if (creats.isEmpty()) { choice = ComputerUtilCard.getWorstAI(options); @@ -268,10 +267,10 @@ public class ChooseCardAi extends SpellAbilityAi { // – might also be good to do a separate AI for Noble Heritage } } else if (logic.equals("Phylactery")) { - CardCollection aiArtifacts = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), Presets.ARTIFACTS); + CardCollection aiArtifacts = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.ARTIFACTS); CardCollection indestructibles = CardLists.filter(aiArtifacts, CardPredicates.hasKeyword(Keyword.INDESTRUCTIBLE)); - CardCollection nonCreatures = CardLists.filter(aiArtifacts, Presets.NON_CREATURES); - CardCollection creatures = CardLists.filter(aiArtifacts, Presets.CREATURES); + CardCollection nonCreatures = CardLists.filter(aiArtifacts, CardPredicates.NON_CREATURES); + CardCollection creatures = CardLists.filter(aiArtifacts, CardPredicates.CREATURES); if (!indestructibles.isEmpty()) { // Choose the worst (smallest) indestructible artifact so that the opponent would have to waste // removal on something unpreferred diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java index a6d8b7b41a7..c3d3b307d93 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java @@ -68,7 +68,7 @@ public class ChooseColorAi extends SpellAbilityAi { // activate in Main 2 hoping that the extra mana surplus will make a difference // if there are some nonland permanents in hand CardCollectionView permanents = CardLists.filter(ai.getCardsIn(ZoneType.Hand), - CardPredicates.Presets.NONLAND_PERMANENTS); + CardPredicates.NONLAND_PERMANENTS); return permanents.size() > 0 && ph.is(PhaseType.MAIN2, ai); } diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseDirectionAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseDirectionAi.java index 17a74f21fe0..92a5d969980 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseDirectionAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseDirectionAi.java @@ -6,7 +6,7 @@ import forge.game.Game; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardLists; -import forge.game.card.CardPredicates.Presets; +import forge.game.card.CardPredicates; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; @@ -25,7 +25,7 @@ public class ChooseDirectionAi extends SpellAbilityAi { return false; } else { if ("Aminatou".equals(logic)) { - CardCollection all = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.NONLAND_PERMANENTS); + CardCollection all = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.NONLAND_PERMANENTS); CardCollection aiPermanent = CardLists.filterControlledBy(all, ai); aiPermanent.remove(sa.getHostCard()); int aiValue = Aggregates.sum(aiPermanent, Card::getCMC); diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java index 25afc948935..43bbf5dc13b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java @@ -134,10 +134,10 @@ public class ChooseSourceAi extends SpellAbilityAi { // No optimal creature was found above, so try to broaden the choice. if (!Iterables.isEmpty(options)) { List oppCreatures = CardLists.filter(options, - CardPredicates.Presets.CREATURES.and(CardPredicates.isOwner(aiChoser).negate())); + CardPredicates.CREATURES.and(CardPredicates.isOwner(aiChoser).negate())); List aiNonCreatures = CardLists.filter(options, - CardPredicates.Presets.NON_CREATURES - .and(CardPredicates.Presets.PERMANENTS) + CardPredicates.NON_CREATURES + .and(CardPredicates.PERMANENTS) .and(CardPredicates.isOwner(aiChoser)) ); diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseTypeAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseTypeAi.java index 02b5163050b..b85501fe732 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseTypeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseTypeAi.java @@ -65,7 +65,7 @@ public class ChooseTypeAi extends SpellAbilityAi { int avgPower = 0; // predict the opposition - CardCollection oppCreatures = CardLists.filter(aiPlayer.getOpponents().getCreaturesInPlay(), CardPredicates.Presets.UNTAPPED); + CardCollection oppCreatures = CardLists.filter(aiPlayer.getOpponents().getCreaturesInPlay(), CardPredicates.UNTAPPED); int maxOppPower = 0; int maxOppToughness = 0; int oppUsefulCreatures = 0; @@ -85,7 +85,7 @@ public class ChooseTypeAi extends SpellAbilityAi { if (maxX > 1) { CardCollection cre = CardLists.filter(aiPlayer.getCardsIn(ZoneType.Battlefield), - CardPredicates.isType(chosenType), CardPredicates.Presets.UNTAPPED); + CardPredicates.isType(chosenType), CardPredicates.UNTAPPED); if (!cre.isEmpty()) { for (Card c: cre) { avgPower += c.getNetPower(); diff --git a/forge-ai/src/main/java/forge/ai/ability/ClashAi.java b/forge-ai/src/main/java/forge/ai/ability/ClashAi.java index 3c533a65a9f..4e4f4c5f77c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ClashAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ClashAi.java @@ -92,7 +92,7 @@ public class ClashAi extends SpellAbilityAi { // Springjack Knight // TODO: Whirlpool Whelm also uses creature targeting but it's trickier to support CardCollectionView aiCreats = ai.getCreaturesInPlay(); - CardCollectionView oppCreats = CardLists.filter(ai.getOpponents().getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES); + CardCollectionView oppCreats = CardLists.filter(ai.getOpponents().getCardsIn(ZoneType.Battlefield), CardPredicates.CREATURES); Card tgt = aiCreats.isEmpty() ? ComputerUtilCard.getWorstCreatureAI(oppCreats) : ComputerUtilCard.getBestCreatureAI(aiCreats); diff --git a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java index a4ea818d1bd..fe801af02c5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java @@ -22,7 +22,6 @@ import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; import forge.game.card.CardPredicates; -import forge.game.card.CardPredicates.Presets; import forge.game.card.CardUtil; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; @@ -177,7 +176,7 @@ public class CopyPermanentAi extends SpellAbilityAi { list = CardLists.filter(list, c -> (!c.getType().isLegendary() || canCopyLegendary) || !c.getController().equals(aiPlayer)); Card choice; - if (Iterables.any(list, Presets.CREATURES)) { + if (Iterables.any(list, CardPredicates.CREATURES)) { if (sa.hasParam("TargetingPlayer")) { choice = ComputerUtilCard.getWorstCreatureAI(list); } else { diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 95e41b8bb52..467af4ae521 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -380,7 +380,7 @@ public class CountersPutAi extends CountersAi { sa.setXManaCostPaid(amount); } else if ("ExiledCreatureFromGraveCMC".equals(logic)) { // e.g. Necropolis - amount = Aggregates.max(CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), CardPredicates.Presets.CREATURES), Card::getCMC); + amount = Aggregates.max(CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), CardPredicates.CREATURES), Card::getCMC); if (amount > 0 && ai.getGame().getPhaseHandler().is(PhaseType.END_OF_TURN)) { return true; } @@ -703,7 +703,7 @@ public class CountersPutAi extends CountersAi { if (sa.isCurse()) { choice = chooseCursedTarget(list, type, amount, ai); } else { - CardCollection lands = CardLists.filter(list, CardPredicates.Presets.LANDS); + CardCollection lands = CardLists.filter(list, CardPredicates.LANDS); SpellAbility animate = sa.findSubAbilityByType(ApiType.Animate); if (!lands.isEmpty() && animate != null) { choice = ComputerUtilCard.getWorstLand(lands); @@ -796,7 +796,7 @@ public class CountersPutAi extends CountersAi { } // try to choose player with less creatures - Player choice = playerList.min(PlayerPredicates.compareByZoneSize(ZoneType.Battlefield, CardPredicates.Presets.CREATURES)); + Player choice = playerList.min(PlayerPredicates.compareByZoneSize(ZoneType.Battlefield, CardPredicates.CREATURES)); if (choice != null) { sa.getTargets().add(choice); @@ -1193,7 +1193,7 @@ public class CountersPutAi extends CountersAi { private boolean doChargeToCMCLogic(Player ai, SpellAbility sa) { Card source = sa.getHostCard(); - CardCollectionView ownLib = CardLists.filter(ai.getCardsIn(ZoneType.Library), CardPredicates.Presets.CREATURES); + CardCollectionView ownLib = CardLists.filter(ai.getCardsIn(ZoneType.Library), CardPredicates.CREATURES); int numCtrs = source.getCounters(CounterEnumType.CHARGE); int maxCMC = Aggregates.max(ownLib, Card::getCMC); int optimalCMC = 0; @@ -1211,7 +1211,7 @@ public class CountersPutAi extends CountersAi { private boolean doChargeToOppCtrlCMCLogic(Player ai, SpellAbility sa) { Card source = sa.getHostCard(); - CardCollectionView oppInPlay = CardLists.filter(ai.getOpponents().getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.NONLAND_PERMANENTS); + CardCollectionView oppInPlay = CardLists.filter(ai.getOpponents().getCardsIn(ZoneType.Battlefield), CardPredicates.NONLAND_PERMANENTS); int numCtrs = source.getCounters(CounterEnumType.CHARGE); int maxCMC = Aggregates.max(oppInPlay, Card::getCMC); int optimalCMC = 0; diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutOrRemoveAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutOrRemoveAi.java index c13850399cb..26309cec653 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutOrRemoveAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutOrRemoveAi.java @@ -121,7 +121,7 @@ public class CountersPutOrRemoveAi extends SpellAbilityAi { // with one touch CardCollection planeswalkerList = CardLists.filter( CardLists.filterControlledBy(countersList, ai.getOpponents()), - CardPredicates.Presets.PLANESWALKERS, + CardPredicates.PLANESWALKERS, CardPredicates.hasLessCounter(CounterEnumType.LOYALTY, amount)); if (!planeswalkerList.isEmpty()) { diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java index 20de084c414..d411413e61b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java @@ -135,7 +135,7 @@ public class CountersRemoveAi extends SpellAbilityAi { list = ai.getOpponents().getCardsIn(ZoneType.Battlefield); list = CardLists.filter(list, CardPredicates.isTargetableBy(sa)); - CardCollection planeswalkerList = CardLists.filter(list, CardPredicates.Presets.PLANESWALKERS, + CardCollection planeswalkerList = CardLists.filter(list, CardPredicates.PLANESWALKERS, CardPredicates.hasCounter(CounterEnumType.LOYALTY, 5)); if (!planeswalkerList.isEmpty()) { @@ -182,7 +182,7 @@ public class CountersRemoveAi extends SpellAbilityAi { list = CardLists.filter(list, CardPredicates.isTargetableBy(sa)); CardCollection planeswalkerList = CardLists.filter(list, - CardPredicates.Presets.PLANESWALKERS.and(CardPredicates.isControlledByAnyOf(ai.getOpponents())), + CardPredicates.PLANESWALKERS.and(CardPredicates.isControlledByAnyOf(ai.getOpponents())), CardPredicates.hasLessCounter(CounterEnumType.LOYALTY, amount)); if (!planeswalkerList.isEmpty()) { @@ -222,7 +222,7 @@ public class CountersRemoveAi extends SpellAbilityAi { // remove P1P1 counters from opposing creatures CardCollection oppP1P1List = CardLists.filter(list, - CardPredicates.Presets.CREATURES.and(CardPredicates.isControlledByAnyOf(ai.getOpponents())), + CardPredicates.CREATURES.and(CardPredicates.isControlledByAnyOf(ai.getOpponents())), CardPredicates.hasCounter(CounterEnumType.P1P1)); if (!oppP1P1List.isEmpty()) { sa.getTargets().add(ComputerUtilCard.getBestCreatureAI(oppP1P1List)); diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index b75d7351c8c..a0840e36e77 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -28,7 +28,6 @@ import forge.game.staticability.StaticAbilityMustTarget; import forge.game.zone.ZoneType; import forge.util.Aggregates; import forge.util.MyRandom; -import forge.util.Predicates; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -408,7 +407,7 @@ public class DamageDealAi extends DamageAiBase { final Player activator = sa.getActivatingPlayer(); final Card source = sa.getHostCard(); final Game game = source.getGame(); - List hPlay = CardLists.filter(getTargetableCards(ai, sa, pl, tgt, activator, source, game), CardPredicates.Presets.PLANESWALKERS); + List hPlay = CardLists.filter(getTargetableCards(ai, sa, pl, tgt, activator, source, game), CardPredicates.PLANESWALKERS); CardCollection killables = CardLists.filter(hPlay, c -> c.getSVar("Targeting").equals("Dies") || (ComputerUtilCombat.getEnoughDamageToKill(c, d, source, false, noPrevention) <= d) @@ -892,8 +891,8 @@ public class DamageDealAi extends DamageAiBase { // See if there's an indestructible target that can be used CardCollection indestructible = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), - CardPredicates.Presets.CREATURES - .and(CardPredicates.Presets.PLANESWALKERS) //TODO: Should this be "or" Planeswalkers? + CardPredicates.CREATURES + .and(CardPredicates.PLANESWALKERS) //TODO: Should this be "or" Planeswalkers? .and(CardPredicates.hasKeyword(Keyword.INDESTRUCTIBLE)) .and(CardPredicates.isTargetableBy(sa)) ); @@ -909,7 +908,7 @@ public class DamageDealAi extends DamageAiBase { } else if (tgt.canTgtPlaneswalker()) { // Second pass for planeswalkers: choose AI's worst planeswalker - final Card c = ComputerUtilCard.getWorstPlaneswalkerToDamage(CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.PLANESWALKERS, CardPredicates.isTargetableBy(sa))); + final Card c = ComputerUtilCard.getWorstPlaneswalkerToDamage(CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.PLANESWALKERS, CardPredicates.isTargetableBy(sa))); if (c != null) { sa.getTargets().add(c); if (divided) { diff --git a/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java b/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java index 7e95fdd2be3..89482adde62 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java @@ -126,7 +126,7 @@ public class DamagePreventAi extends SpellAbilityAi { if (targetables.isEmpty()) { return false; } - final CardCollection combatants = CardLists.filter(targetables, CardPredicates.Presets.CREATURES); + final CardCollection combatants = CardLists.filter(targetables, CardPredicates.CREATURES); ComputerUtilCard.sortByEvaluateCreature(combatants); for (final Card c : combatants) { @@ -187,7 +187,7 @@ public class DamagePreventAi extends SpellAbilityAi { } if (!compTargetables.isEmpty()) { - final CardCollection combatants = CardLists.filter(compTargetables, CardPredicates.Presets.CREATURES); + final CardCollection combatants = CardLists.filter(compTargetables, CardPredicates.CREATURES); ComputerUtilCard.sortByEvaluateCreature(combatants); if (game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS)) { Combat combat = game.getCombat(); diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java index c94523c1643..2fed685edb0 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java @@ -425,8 +425,8 @@ public class DestroyAi extends SpellAbilityAi { boolean nonBasicTgt = !tgtLand.isBasicLand(); // Try not to lose tempo too much and not to mana-screw yourself when considering this logic - int numLandsInHand = CardLists.count(ai.getCardsIn(ZoneType.Hand), CardPredicates.Presets.LANDS_PRODUCING_MANA); - int numLandsOTB = CardLists.count(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.LANDS_PRODUCING_MANA); + int numLandsInHand = CardLists.count(ai.getCardsIn(ZoneType.Hand), CardPredicates.LANDS_PRODUCING_MANA); + int numLandsOTB = CardLists.count(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.LANDS_PRODUCING_MANA); // If the opponent skipped a land drop, consider not looking at having the extra land in hand if the profile allows it boolean isHighPriority = highPriorityIfNoLandDrop && oppSkippedLandDrop; diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java index 24d0d00ee01..96d2479cf26 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java @@ -109,8 +109,8 @@ public class DestroyAllAi extends SpellAbilityAi { // Special handling for Raiding Party if (logic.equals("RaidingParty")) { - int numAiCanSave = Math.min(CardLists.count(ai.getCreaturesInPlay(), CardPredicates.isColor(MagicColor.WHITE).and(CardPredicates.Presets.UNTAPPED)) * 2, ailist.size()); - int numOppsCanSave = Math.min(CardLists.count(ai.getOpponents().getCreaturesInPlay(), CardPredicates.isColor(MagicColor.WHITE).and(CardPredicates.Presets.UNTAPPED)) * 2, opplist.size()); + int numAiCanSave = Math.min(CardLists.count(ai.getCreaturesInPlay(), CardPredicates.isColor(MagicColor.WHITE).and(CardPredicates.UNTAPPED)) * 2, ailist.size()); + int numOppsCanSave = Math.min(CardLists.count(ai.getOpponents().getCreaturesInPlay(), CardPredicates.isColor(MagicColor.WHITE).and(CardPredicates.UNTAPPED)) * 2, opplist.size()); return numOppsCanSave < opplist.size() && (ailist.size() - numAiCanSave < opplist.size() - numOppsCanSave); } diff --git a/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java b/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java index 2c4dabd9ee2..699ae42e7ee 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java @@ -45,7 +45,7 @@ public class DigUntilAi extends SpellAbilityAi { return false; } if ("Land.Basic".equals(sa.getParam("Valid")) - && ai.getZone(ZoneType.Hand).contains(CardPredicates.Presets.LANDS_PRODUCING_MANA)) { + && ai.getZone(ZoneType.Hand).contains(CardPredicates.LANDS_PRODUCING_MANA)) { // We already have a mana-producing land in hand, so bail // until opponent's end of turn phase! // But we still want more (and want to fill grave) if nothing better to do then @@ -128,7 +128,7 @@ public class DigUntilAi extends SpellAbilityAi { final String logic = sa.getParam("AILogic"); if ("OathOfDruids".equals(logic)) { final List creaturesInLibrary = - CardLists.filter(player.getCardsIn(ZoneType.Library), CardPredicates.Presets.CREATURES); + CardLists.filter(player.getCardsIn(ZoneType.Library), CardPredicates.CREATURES); final List creaturesInBattlefield = player.getCreaturesInPlay(); // if there are at least 3 creatures in library, // or none in play with one in library, oath diff --git a/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java b/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java index b8ac075c536..a09a9e91ceb 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java @@ -94,7 +94,7 @@ public class DiscardAi extends SpellAbilityAi { if (sa.hasParam("AnyNumber")) { if ("DiscardUncastableAndExcess".equals(aiLogic)) { final CardCollectionView inHand = ai.getCardsIn(ZoneType.Hand); - final int numLandsOTB = CardLists.count(ai.getCardsIn(ZoneType.Hand), CardPredicates.Presets.LANDS); + final int numLandsOTB = CardLists.count(ai.getCardsIn(ZoneType.Hand), CardPredicates.LANDS); int numDiscard = 0; int numOppInHand = 0; for (Player p : ai.getGame().getPlayers()) { diff --git a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java index 75b4b914d8e..35f9e0e27c4 100644 --- a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java @@ -8,7 +8,6 @@ import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.card.*; -import forge.game.card.CardPredicates.Presets; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; import forge.game.keyword.Keyword; @@ -56,8 +55,8 @@ public class EffectAi extends SpellAbilityAi { for (Player opp : ai.getOpponents()) { boolean worthHolding = false; CardCollectionView oppCreatsLands = CardLists.filter(opp.getCardsIn(ZoneType.Battlefield), - Presets.LANDS.or(Presets.CREATURES)); - CardCollectionView oppCreatsLandsTapped = CardLists.filter(oppCreatsLands, CardPredicates.Presets.TAPPED); + CardPredicates.LANDS.or(CardPredicates.CREATURES)); + CardCollectionView oppCreatsLandsTapped = CardLists.filter(oppCreatsLands, CardPredicates.TAPPED); if (oppCreatsLandsTapped.size() >= 3 || oppCreatsLands.size() == oppCreatsLandsTapped.size()) { worthHolding = true; @@ -83,7 +82,7 @@ public class EffectAi extends SpellAbilityAi { Player opp = ai.getStrongestOpponent(); List possibleAttackers = ai.getCreaturesInPlay(); List possibleBlockers = opp.getCreaturesInPlay(); - possibleBlockers = CardLists.filter(possibleBlockers, Presets.UNTAPPED); + possibleBlockers = CardLists.filter(possibleBlockers, CardPredicates.UNTAPPED); final Combat combat = game.getCombat(); int oppLife = opp.getLife(); int potentialDmg = 0; @@ -332,7 +331,7 @@ public class EffectAi extends SpellAbilityAi { } else if (logic.equals("CantRegenerate")) { if (sa.usesTargeting()) { CardCollection list = CardLists.getTargetableCards(ai.getOpponents().getCardsIn(ZoneType.Battlefield), sa); - list = CardLists.filter(list, CardPredicates.Presets.CAN_BE_DESTROYED, input -> { + list = CardLists.filter(list, CardPredicates.CAN_BE_DESTROYED, input -> { Map runParams = AbilityKey.mapFromAffected(input); runParams.put(AbilityKey.Regeneration, true); List repDestoryList = game.getReplacementHandler().getReplacementList(ReplacementType.Destroy, runParams, ReplacementLayer.Other); diff --git a/forge-ai/src/main/java/forge/ai/ability/ExploreAi.java b/forge-ai/src/main/java/forge/ai/ability/ExploreAi.java index 9c28cd0b5c5..619918d763f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ExploreAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ExploreAi.java @@ -43,8 +43,8 @@ public class ExploreAi extends SpellAbilityAi { int predictedMana = ComputerUtilMana.getAvailableManaSources(ai, false).size(); CardCollectionView cardsOTB = ai.getCardsIn(ZoneType.Battlefield); CardCollectionView cardsInHand = ai.getCardsIn(ZoneType.Hand); - CardCollection landsOTB = CardLists.filter(cardsOTB, CardPredicates.Presets.LANDS_PRODUCING_MANA); - CardCollection landsInHand = CardLists.filter(cardsInHand, CardPredicates.Presets.LANDS_PRODUCING_MANA); + CardCollection landsOTB = CardLists.filter(cardsOTB, CardPredicates.LANDS_PRODUCING_MANA); + CardCollection landsInHand = CardLists.filter(cardsInHand, CardPredicates.LANDS_PRODUCING_MANA); int maxCMCDiff = 1; int numLandsToStillNeedMore = 2; diff --git a/forge-ai/src/main/java/forge/ai/ability/HauntAi.java b/forge-ai/src/main/java/forge/ai/ability/HauntAi.java index 76d8c2005ea..26bb8d2ba81 100644 --- a/forge-ai/src/main/java/forge/ai/ability/HauntAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/HauntAi.java @@ -20,7 +20,7 @@ public class HauntAi extends SpellAbilityAi { final Game game = ai.getGame(); if (sa.usesTargeting() && !card.isToken()) { final List creats = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), - CardPredicates.Presets.CREATURES); + CardPredicates.CREATURES); // nothing to haunt if (creats.isEmpty()) { diff --git a/forge-ai/src/main/java/forge/ai/ability/MillAi.java b/forge-ai/src/main/java/forge/ai/ability/MillAi.java index 4e28ba8764b..073df55136a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/MillAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/MillAi.java @@ -37,7 +37,7 @@ public class MillAi extends SpellAbilityAi { return ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn().equals(ai); } else if (aiLogic.equals("LilianaMill")) { // Only mill if a "Raise Dead" target is available, in case of control decks with few creatures - return CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), CardPredicates.Presets.CREATURES).size() >= 1; + return CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), CardPredicates.CREATURES).size() >= 1; } return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java index b85326c8f85..e2fb1da8563 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java @@ -140,8 +140,8 @@ public class PermanentAi extends SpellAbilityAi { && card.getState(CardStateName.Original).getManaCost() != null && card.getState(CardStateName.Original).getManaCost().getCMC() == manaValue); if (manaValue == 0) { - aiCards = CardLists.filter(aiCards, CardPredicates.Presets.NON_LANDS); - oppCards = CardLists.filter(oppCards, CardPredicates.Presets.NON_LANDS); + aiCards = CardLists.filter(aiCards, CardPredicates.NON_LANDS); + oppCards = CardLists.filter(oppCards, CardPredicates.NON_LANDS); // also filter out other Chalices in our own deck aiCards = CardLists.filter(aiCards, CardPredicates.nameNotEquals("Chalice of the Void")); } @@ -257,7 +257,7 @@ public class PermanentAi extends SpellAbilityAi { // Only cast if there are X or more mana sources controlled by the AI *or* // if there are X-1 mana sources in play but the AI has an extra land in hand CardCollection m = ComputerUtilMana.getAvailableManaSources(ai, true); - int extraMana = CardLists.count(ai.getCardsIn(ZoneType.Hand), CardPredicates.Presets.LANDS) > 0 ? 1 : 0; + int extraMana = CardLists.count(ai.getCardsIn(ZoneType.Hand), CardPredicates.LANDS) > 0 ? 1 : 0; if (source.getName().equals("Illusions of Grandeur")) { // TODO: this is currently hardcoded for specific Illusions-Donate cost reduction spells, need to make this generic. extraMana += Math.min(3, CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals("Sapphire Medallion").or(CardPredicates.nameEquals("Helm of Awakening"))).size()) * 2; // each cost-reduction spell accounts for {1} in both Illusions and Donate diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java index d6638be806f..e0918276957 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -8,7 +8,6 @@ import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.card.*; -import forge.game.card.CardPredicates.Presets; import forge.game.cost.Cost; import forge.game.cost.CostTapType; import forge.game.keyword.Keyword; @@ -402,7 +401,7 @@ public class PumpAi extends PumpAiBase { CardCollection list; if (sa.hasParam("AILogic")) { if (sa.getParam("AILogic").equals("HighestPower") || sa.getParam("AILogic").equals("ContinuousBonus")) { - list = CardLists.getValidCards(CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.CREATURES), tgt.getValidTgts(), ai, source, sa); + list = CardLists.getValidCards(CardLists.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.CREATURES), tgt.getValidTgts(), ai, source, sa); list = CardLists.getTargetableCards(list, sa); CardLists.sortByPowerDesc(list); @@ -511,7 +510,7 @@ public class PumpAi extends PumpAiBase { // Detain target nonland permanent: don't target noncreature permanents that don't have // any activated abilities. if ("DetainNonLand".equals(sa.getParam("AILogic"))) { - list = CardLists.filter(list, Presets.CREATURES.or(card -> { + list = CardLists.filter(list, CardPredicates.CREATURES.or(card -> { for (SpellAbility sa1 : card.getSpellAbilities()) { if (sa1.isActivatedAbility()) { return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java b/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java index 81da8244c57..aac480c5185 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java @@ -115,7 +115,7 @@ public class RearrangeTopOfLibraryAi extends SpellAbilityAi { uncastableCMCThreshold = aic.getIntProperty(AiProps.SCRY_IMMEDIATELY_UNCASTABLE_CMC_DIFF); } - int landsOTB = CardLists.count(p.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.LANDS_PRODUCING_MANA); + int landsOTB = CardLists.count(p.getCardsIn(ZoneType.Battlefield), CardPredicates.LANDS_PRODUCING_MANA); int cmc = top.isSplitCard() ? Math.min(top.getCMC(Card.SplitCMCMode.LeftSplitCMC), top.getCMC(Card.SplitCMCMode.RightSplitCMC)) : top.getCMC(); int maxCastable = ComputerUtilMana.getAvailableManaEstimate(p, false); diff --git a/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java b/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java index d199f15a17b..2b332347a7e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java @@ -82,7 +82,7 @@ public class RegenerateAi extends SpellAbilityAi { chance = true; } } else if (game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS)) { - final CardCollection combatants = CardLists.filter(targetables, CardPredicates.Presets.CREATURES); + final CardCollection combatants = CardLists.filter(targetables, CardPredicates.CREATURES); ComputerUtilCard.sortByEvaluateCreature(combatants); for (final Card c : combatants) { @@ -156,7 +156,7 @@ public class RegenerateAi extends SpellAbilityAi { } if (compTargetables.size() > 0) { - final CardCollection combatants = CardLists.filter(compTargetables, CardPredicates.Presets.CREATURES); + final CardCollection combatants = CardLists.filter(compTargetables, CardPredicates.CREATURES); ComputerUtilCard.sortByEvaluateCreature(combatants); if (game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS)) { Combat combat = game.getCombat(); diff --git a/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java b/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java index e7ed3a5dfa7..fe784006446 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java @@ -8,7 +8,6 @@ import forge.ai.SpecialCardAi; import forge.ai.SpellAbilityAi; import forge.game.ability.AbilityUtils; import forge.game.card.*; -import forge.game.card.CardPredicates.Presets; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -30,7 +29,7 @@ public class RepeatEachAi extends SpellAbilityAi { } else if ("Never".equals(logic)) { return false; } else if ("CloneAllTokens".equals(logic)) { - List humTokenCreats = CardLists.filter(aiPlayer.getOpponents().getCreaturesInPlay(), Presets.TOKEN); + List humTokenCreats = CardLists.filter(aiPlayer.getOpponents().getCreaturesInPlay(), CardPredicates.TOKEN); List compTokenCreats = aiPlayer.getTokensInPlay(); return compTokenCreats.size() > humTokenCreats.size(); diff --git a/forge-ai/src/main/java/forge/ai/ability/ScryAi.java b/forge-ai/src/main/java/forge/ai/ability/ScryAi.java index 94a7cbbf85f..8df58ec64e5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ScryAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ScryAi.java @@ -99,7 +99,7 @@ public class ScryAi extends SpellAbilityAi { private boolean doBestOpportunityLogic(Player ai, SpellAbility sa, PhaseHandler ph) { // Check to see if there are any cards in hand that may be worth casting boolean hasSomethingElse = false; - for (Card c : CardLists.filter(ai.getCardsIn(ZoneType.Hand), CardPredicates.Presets.NON_LANDS)) { + for (Card c : CardLists.filter(ai.getCardsIn(ZoneType.Hand), CardPredicates.NON_LANDS)) { for (SpellAbility ab : c.getAllSpellAbilities()) { if (ab.getPayCosts().hasManaCost() && ComputerUtilMana.hasEnoughManaSourcesToCast(ab, ai)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java index da8dcfc2286..4dac2a7ea9f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java @@ -73,7 +73,7 @@ public class SetStateAi extends SpellAbilityAi { sa.resetTargets(); // select only the ones that can transform - CardCollection list = CardLists.filter(CardUtil.getValidCardsToTarget(sa), CardPredicates.Presets.CREATURES, c -> c.canTransform(sa)); + CardCollection list = CardLists.filter(CardUtil.getValidCardsToTarget(sa), CardPredicates.CREATURES, c -> c.canTransform(sa)); if (list.isEmpty()) { return false; diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java b/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java index e742e62ee09..9f47bd2c3f6 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java @@ -15,7 +15,6 @@ import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardLists; import forge.game.card.CardPredicates; -import forge.game.card.CardPredicates.Presets; import forge.game.combat.CombatUtil; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; @@ -107,7 +106,7 @@ public abstract class TapAiBase extends SpellAbilityAi { protected boolean tapPrefTargeting(final Player ai, final Card source, final SpellAbility sa, final boolean mandatory) { final Game game = ai.getGame(); CardCollection tapList = CardLists.getTargetableCards(ai.getOpponents().getCardsIn(ZoneType.Battlefield), sa); - tapList = CardLists.filter(tapList, Presets.CAN_TAP); + tapList = CardLists.filter(tapList, CardPredicates.CAN_TAP); tapList = CardLists.filter(tapList, c -> { if (c.isCreature()) { return true; @@ -196,7 +195,7 @@ public abstract class TapAiBase extends SpellAbilityAi { } else if (phase.isPlayerTurn(opp) && phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)) { // Tap creatures possible blockers before combat during AI's turn. - if (Iterables.any(tapList, CardPredicates.Presets.CREATURES)) { + if (Iterables.any(tapList, CardPredicates.CREATURES)) { List creatureList = CardLists.filter(tapList, c -> c.isCreature() && CombatUtil.canAttack(c, opp)); choice = ComputerUtilCard.getBestCreatureAI(creatureList); } else { // no creatures available @@ -264,7 +263,7 @@ public abstract class TapAiBase extends SpellAbilityAi { } // try to just tap already tapped things - tapList = CardLists.filter(list, Presets.TAPPED); + tapList = CardLists.filter(list, CardPredicates.TAPPED); if (tapTargetList(ai, sa, tapList, mandatory)) { return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java index bafaa3b4e34..c7ea1207ff9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java @@ -45,7 +45,7 @@ public class TapAllAi extends SpellAbilityAi { } validTappables = CardLists.getValidCards(validTappables, valid, source.getController(), source, sa); - validTappables = CardLists.filter(validTappables, CardPredicates.Presets.UNTAPPED); + validTappables = CardLists.filter(validTappables, CardPredicates.UNTAPPED); if (sa.hasParam("AILogic")) { String logic = sa.getParam("AILogic"); @@ -83,7 +83,7 @@ public class TapAllAi extends SpellAbilityAi { final Game game = source.getGame(); CardCollectionView tmpList = game.getCardsIn(ZoneType.Battlefield); tmpList = CardLists.getValidCards(tmpList, valid, source.getController(), source, sa); - tmpList = CardLists.filter(tmpList, CardPredicates.Presets.UNTAPPED); + tmpList = CardLists.filter(tmpList, CardPredicates.UNTAPPED); return tmpList; } diff --git a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java index 3d70acae32f..6f98186da85 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java @@ -8,7 +8,7 @@ import forge.game.ability.ApiType; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardLists; -import forge.game.card.CardPredicates.Presets; +import forge.game.card.CardPredicates; import forge.game.combat.Combat; import forge.game.cost.Cost; import forge.game.cost.CostTap; @@ -155,7 +155,7 @@ public class UntapAi extends SpellAbilityAi { } } - CardCollection untapList = targetUntapped ? list : CardLists.filter(list, Presets.TAPPED); + CardCollection untapList = targetUntapped ? list : CardLists.filter(list, CardPredicates.TAPPED); // filter out enchantments and planeswalkers, their tapped state doesn't matter. final String[] tappablePermanents = {"Creature", "Land", "Artifact"}; untapList = CardLists.getValidCards(untapList, tappablePermanents, source.getController(), source, sa); @@ -260,7 +260,7 @@ public class UntapAi extends SpellAbilityAi { } // try to just tap already tapped things - tapList = CardLists.filter(list, Presets.UNTAPPED); + tapList = CardLists.filter(list, CardPredicates.UNTAPPED); if (untapTargetList(source, tgt, sa, mandatory, tapList)) { return true; @@ -400,10 +400,10 @@ public class UntapAi extends SpellAbilityAi { } // Check if something is playable if we untap for an additional mana with this, then proceed - CardCollection inHand = CardLists.filter(ai.getCardsIn(ZoneType.Hand), Presets.NON_LANDS); + CardCollection inHand = CardLists.filter(ai.getCardsIn(ZoneType.Hand), CardPredicates.NON_LANDS); // The AI is not very good at timing non-permanent spells this way, so filter them out // (it may actually be possible to enable this for sorceries, but that'll need some canPlay shenanigans) - CardCollection playable = CardLists.filter(inHand, Presets.PERMANENTS); + CardCollection playable = CardLists.filter(inHand, CardPredicates.PERMANENTS); CardCollection untappingCards = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), card -> { boolean hasUntapLandLogic = false; @@ -427,7 +427,7 @@ public class UntapAi extends SpellAbilityAi { reduced.decreaseShard(ManaCostShard.GENERIC, untappingCards.size()); if (ComputerUtilMana.canPayManaCost(reduced, ab, ai, false)) { CardCollection manaLandsTapped = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), - Presets.LANDS_PRODUCING_MANA, Presets.TAPPED); + CardPredicates.LANDS_PRODUCING_MANA, CardPredicates.TAPPED); manaLandsTapped = CardLists.getValidCards(manaLandsTapped, sa.getParam("ValidTgts"), ai, source, null); if (!manaLandsTapped.isEmpty()) { @@ -437,7 +437,7 @@ public class UntapAi extends SpellAbilityAi { // pool one additional mana by tapping a land to try to ramp to something CardCollection manaLands = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), - Presets.LANDS_PRODUCING_MANA, Presets.CAN_TAP); + CardPredicates.LANDS_PRODUCING_MANA, CardPredicates.CAN_TAP); manaLands = CardLists.getValidCards(manaLands, sa.getParam("ValidTgts"), ai, source, null); if (manaLands.isEmpty()) { diff --git a/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java b/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java index 47cb882ae38..bb745813f32 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java @@ -24,7 +24,7 @@ public class UntapAllAi extends SpellAbilityAi { && source.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_END)) { return false; } - CardCollectionView list = CardLists.filter(aiPlayer.getGame().getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.TAPPED); + CardCollectionView list = CardLists.filter(aiPlayer.getGame().getCardsIn(ZoneType.Battlefield), CardPredicates.TAPPED); final String valid = sa.getParamOrDefault("ValidCards", ""); list = CardLists.getValidCards(list, valid, source.getController(), source, sa); // don't untap if only opponent benefits @@ -39,7 +39,7 @@ public class UntapAllAi extends SpellAbilityAi { if (sa.hasParam("ValidCards")) { String valid = sa.getParam("ValidCards"); - CardCollectionView list = CardLists.filter(aiPlayer.getGame().getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.TAPPED); + CardCollectionView list = CardLists.filter(aiPlayer.getGame().getCardsIn(ZoneType.Battlefield), CardPredicates.TAPPED); list = CardLists.getValidCards(list, valid, source.getController(), source, sa); return mandatory || !list.isEmpty(); } diff --git a/forge-core/src/main/java/forge/card/CardFacePredicates.java b/forge-core/src/main/java/forge/card/CardFacePredicates.java index a23339ca33d..fb3126d3a84 100644 --- a/forge-core/src/main/java/forge/card/CardFacePredicates.java +++ b/forge-core/src/main/java/forge/card/CardFacePredicates.java @@ -133,21 +133,9 @@ public final class CardFacePredicates { return new ValidPredicate(val); } - public static class Presets { - /** The Constant isBasicLand. */ - public static final Predicate IS_BASIC_LAND = subject -> subject.getType().isBasicLand(); - - /** The Constant isNonBasicLand. */ - public static final Predicate IS_NONBASIC_LAND = subject -> subject.getType().isLand() && !subject.getType().isBasicLand(); - - /** The Constant isCreature. */ - public static final Predicate IS_CREATURE = CardFacePredicates - .coreType(true, CardType.CoreType.Creature); - - public static final Predicate IS_LEGENDARY = CardFacePredicates - .superType(true, CardType.Supertype.Legendary); - - public static final Predicate IS_NON_LAND = CardFacePredicates - .coreType(false, CardType.CoreType.Land); - } + public static final Predicate IS_BASIC_LAND = subject -> subject.getType().isBasicLand(); + public static final Predicate IS_NONBASIC_LAND = subject -> subject.getType().isLand() && !subject.getType().isBasicLand(); + public static final Predicate IS_CREATURE = CardFacePredicates.coreType(true, CardType.CoreType.Creature); + public static final Predicate IS_LEGENDARY = CardFacePredicates.superType(true, CardType.Supertype.Legendary); + public static final Predicate IS_NON_LAND = CardFacePredicates.coreType(false, CardType.CoreType.Land); } diff --git a/forge-core/src/main/java/forge/card/CardRulesPredicates.java b/forge-core/src/main/java/forge/card/CardRulesPredicates.java index 2e97b9ab6a6..70023b36766 100644 --- a/forge-core/src/main/java/forge/card/CardRulesPredicates.java +++ b/forge-core/src/main/java/forge/card/CardRulesPredicates.java @@ -12,13 +12,8 @@ import org.apache.commons.lang3.StringUtils; */ public final class CardRulesPredicates { - /** The Constant isKeptInAiDecks. */ public static final Predicate IS_KEPT_IN_AI_DECKS = card -> !card.getAiHints().getRemAIDecks(); - - /** The Constant isKeptInAiLimitedDecks. */ public static final Predicate IS_KEPT_IN_AI_LIMITED_DECKS = card -> !card.getAiHints().getRemAIDecks() && !card.getAiHints().getRemNonCommanderDecks(); - - /** The Constant isKeptInRandomDecks. */ public static final Predicate IS_KEPT_IN_RANDOM_DECKS = card -> !card.getAiHints().getRemRandomDecks(); // Static builder methods - they choose concrete implementation by themselves @@ -524,106 +519,50 @@ public final class CardRulesPredicates { } } - /** - * The Class Presets. - */ - public static class Presets { - - /** The Constant isCreature. */ - public static final Predicate IS_CREATURE = CardRulesPredicates - .coreType(true, CardType.CoreType.Creature); - - public static final Predicate IS_LEGENDARY = CardRulesPredicates - .superType(true, CardType.Supertype.Legendary); - - /** The Constant isArtifact. */ - public static final Predicate IS_ARTIFACT = CardRulesPredicates - .coreType(true, CardType.CoreType.Artifact); - - /** The Constant isEquipment. */ - public static final Predicate IS_EQUIPMENT = CardRulesPredicates - .subType("Equipment"); - - /** The Constant isLand. */ - public static final Predicate IS_LAND = CardRulesPredicates.coreType(true, CardType.CoreType.Land); - - /** The Constant isBasicLand. */ - public static final Predicate IS_BASIC_LAND = subject -> subject.getType().isBasicLand(); - public static final Predicate NOT_BASIC_LAND = subject -> !subject.getType().isBasicLand(); - - /** Matches only Plains, Island, Swamp, Mountain, or Forest. */ - public static final Predicate IS_BASIC_LAND_NOT_WASTES = subject -> !subject.getName().equals("Wastes")&&subject.getType().isBasicLand(); - /** Matches any card except Plains, Island, Swamp, Mountain, or Forest. */ - public static final Predicate NOT_TRUE_BASIC_LAND = subject -> !subject.getType().isBasicLand() || subject.getName().equals("Wastes"); - - /** The Constant isNonBasicLand. */ - public static final Predicate IS_NONBASIC_LAND = subject -> subject.getType().isLand() && !subject.getType().isBasicLand(); - - public static final Predicate CAN_BE_COMMANDER = CardRules::canBeCommander; - public static final Predicate CAN_BE_PARTNER_COMMANDER = CardRules::canBePartnerCommander; - - public static final Predicate CAN_BE_OATHBREAKER = CardRules::canBeOathbreaker; - public static final Predicate CAN_BE_SIGNATURE_SPELL = CardRules::canBeSignatureSpell; - - public static final Predicate IS_PLANESWALKER = CardRulesPredicates.coreType(true, CardType.CoreType.Planeswalker); - public static final Predicate IS_BATTLE = CardRulesPredicates.coreType(true, CardType.CoreType.Battle); - public static final Predicate IS_INSTANT = CardRulesPredicates.coreType(true, CardType.CoreType.Instant); - public static final Predicate IS_SORCERY = CardRulesPredicates.coreType(true, CardType.CoreType.Sorcery); - public static final Predicate IS_ENCHANTMENT = CardRulesPredicates.coreType(true, CardType.CoreType.Enchantment); - public static final Predicate IS_PLANE = CardRulesPredicates.coreType(true, CardType.CoreType.Plane); - public static final Predicate IS_PHENOMENON = CardRulesPredicates.coreType(true, CardType.CoreType.Phenomenon); - public static final Predicate IS_PLANE_OR_PHENOMENON = IS_PLANE.or(IS_PHENOMENON); - public static final Predicate IS_SCHEME = CardRulesPredicates.coreType(true, CardType.CoreType.Scheme); - public static final Predicate IS_VANGUARD = CardRulesPredicates.coreType(true, CardType.CoreType.Vanguard); - public static final Predicate IS_CONSPIRACY = CardRulesPredicates.coreType(true, CardType.CoreType.Conspiracy); - public static final Predicate IS_DUNGEON = CardRulesPredicates.coreType(true, CardType.CoreType.Dungeon); - public static final Predicate IS_ATTRACTION = Presets.IS_ARTIFACT.and(CardRulesPredicates.subType("Attraction")); - - public static final Predicate IS_NON_LAND = CardRulesPredicates.coreType(false, CardType.CoreType.Land); - public static final Predicate CAN_BE_BRAWL_COMMANDER = Presets.IS_LEGENDARY.and(Presets.IS_CREATURE.or(Presets.IS_PLANESWALKER)); - public static final Predicate CAN_BE_TINY_LEADERS_COMMANDER = Presets.IS_LEGENDARY.and(Presets.IS_CREATURE.or(Presets.IS_PLANESWALKER)); - - /** The Constant IS_NON_CREATURE_SPELL. **/ - public static final Predicate IS_NON_CREATURE_SPELL = - Presets.IS_SORCERY - .or(Presets.IS_INSTANT) - .or(Presets.IS_PLANESWALKER) - .or(Presets.IS_ENCHANTMENT) //TODO: Battles? Is testing these one by one really the best way to check "non-creature"? - .or(Presets.IS_ARTIFACT.and(Presets.IS_CREATURE.negate())); - - /** The Constant isWhite. */ - public static final Predicate IS_WHITE = CardRulesPredicates.isColor(MagicColor.WHITE); - - /** The Constant isBlue. */ - public static final Predicate IS_BLUE = CardRulesPredicates.isColor(MagicColor.BLUE); - - /** The Constant isBlack. */ - public static final Predicate IS_BLACK = CardRulesPredicates.isColor(MagicColor.BLACK); - - /** The Constant isRed. */ - public static final Predicate IS_RED = CardRulesPredicates.isColor(MagicColor.RED); - - /** The Constant isGreen. */ - public static final Predicate IS_GREEN = CardRulesPredicates.isColor(MagicColor.GREEN); - - /** The Constant isColorless. */ - public static final Predicate IS_COLORLESS = CardRulesPredicates.hasCntColors((byte) 0); - - /** The Constant isMulticolor. */ - public static final Predicate IS_MULTICOLOR = CardRulesPredicates.hasAtLeastCntColors((byte) 2); - - /** The Constant isMonocolor. */ - public static final Predicate IS_MONOCOLOR = CardRulesPredicates.hasCntColors((byte) 1); - - /** The Constant colors. */ - public static final List> COLORS = new ArrayList<>(); - static { - Presets.COLORS.add(Presets.IS_WHITE); - Presets.COLORS.add(Presets.IS_BLUE); - Presets.COLORS.add(Presets.IS_BLACK); - Presets.COLORS.add(Presets.IS_RED); - Presets.COLORS.add(Presets.IS_GREEN); - Presets.COLORS.add(Presets.IS_COLORLESS); - } - } + public static final Predicate IS_CREATURE = CardRulesPredicates.coreType(true, CardType.CoreType.Creature); + public static final Predicate IS_LEGENDARY = CardRulesPredicates.superType(true, CardType.Supertype.Legendary); + public static final Predicate IS_ARTIFACT = CardRulesPredicates.coreType(true, CardType.CoreType.Artifact); + public static final Predicate IS_ATTRACTION = CardRulesPredicates.IS_ARTIFACT.and(CardRulesPredicates.subType("Attraction")); + public static final Predicate IS_EQUIPMENT = CardRulesPredicates.subType("Equipment"); + public static final Predicate IS_LAND = CardRulesPredicates.coreType(true, CardType.CoreType.Land); + public static final Predicate IS_BASIC_LAND = subject -> subject.getType().isBasicLand(); + public static final Predicate NOT_BASIC_LAND = subject -> !subject.getType().isBasicLand(); + /** Matches only Plains, Island, Swamp, Mountain, or Forest. */ + public static final Predicate IS_TRUE_BASIC_LAND = subject -> !subject.getName().equals("Wastes")&&subject.getType().isBasicLand(); + /** Matches any card except Plains, Island, Swamp, Mountain, or Forest. */ + public static final Predicate NOT_TRUE_BASIC_LAND = subject -> !subject.getType().isBasicLand() || subject.getName().equals("Wastes"); + public static final Predicate IS_NONBASIC_LAND = subject -> subject.getType().isLand() && !subject.getType().isBasicLand(); + public static final Predicate CAN_BE_COMMANDER = CardRules::canBeCommander; + public static final Predicate CAN_BE_PARTNER_COMMANDER = CardRules::canBePartnerCommander; + public static final Predicate CAN_BE_OATHBREAKER = CardRules::canBeOathbreaker; + public static final Predicate CAN_BE_SIGNATURE_SPELL = CardRules::canBeSignatureSpell; + public static final Predicate IS_PLANESWALKER = CardRulesPredicates.coreType(true, CardType.CoreType.Planeswalker); + public static final Predicate CAN_BE_TINY_LEADERS_COMMANDER = CardRulesPredicates.IS_LEGENDARY.and(CardRulesPredicates.IS_CREATURE.or(CardRulesPredicates.IS_PLANESWALKER)); + public static final Predicate CAN_BE_BRAWL_COMMANDER = CardRulesPredicates.IS_LEGENDARY.and(CardRulesPredicates.IS_CREATURE.or(CardRulesPredicates.IS_PLANESWALKER)); + public static final Predicate IS_BATTLE = CardRulesPredicates.coreType(true, CardType.CoreType.Battle); + public static final Predicate IS_INSTANT = CardRulesPredicates.coreType(true, CardType.CoreType.Instant); + public static final Predicate IS_SORCERY = CardRulesPredicates.coreType(true, CardType.CoreType.Sorcery); + public static final Predicate IS_ENCHANTMENT = CardRulesPredicates.coreType(true, CardType.CoreType.Enchantment); + public static final Predicate IS_NON_CREATURE_SPELL = + CardRulesPredicates.IS_SORCERY + .or(CardRulesPredicates.IS_INSTANT) + .or(CardRulesPredicates.IS_PLANESWALKER) + .or(CardRulesPredicates.IS_ENCHANTMENT) //TODO: Battles? Is testing these one by one really the best way to check "non-creature"? + .or(CardRulesPredicates.IS_ARTIFACT.and(CardRulesPredicates.IS_CREATURE.negate())); + public static final Predicate IS_PLANE = CardRulesPredicates.coreType(true, CardType.CoreType.Plane); + public static final Predicate IS_PHENOMENON = CardRulesPredicates.coreType(true, CardType.CoreType.Phenomenon); + public static final Predicate IS_PLANE_OR_PHENOMENON = IS_PLANE.or(IS_PHENOMENON); + public static final Predicate IS_SCHEME = CardRulesPredicates.coreType(true, CardType.CoreType.Scheme); + public static final Predicate IS_VANGUARD = CardRulesPredicates.coreType(true, CardType.CoreType.Vanguard); + public static final Predicate IS_CONSPIRACY = CardRulesPredicates.coreType(true, CardType.CoreType.Conspiracy); + public static final Predicate IS_DUNGEON = CardRulesPredicates.coreType(true, CardType.CoreType.Dungeon); + public static final Predicate IS_NON_LAND = CardRulesPredicates.coreType(false, CardType.CoreType.Land); + public static final Predicate IS_WHITE = CardRulesPredicates.isColor(MagicColor.WHITE); + public static final Predicate IS_BLUE = CardRulesPredicates.isColor(MagicColor.BLUE); + public static final Predicate IS_BLACK = CardRulesPredicates.isColor(MagicColor.BLACK); + public static final Predicate IS_RED = CardRulesPredicates.isColor(MagicColor.RED); + public static final Predicate IS_GREEN = CardRulesPredicates.isColor(MagicColor.GREEN); + public static final Predicate IS_COLORLESS = CardRulesPredicates.hasCntColors((byte) 0); + public static final Predicate IS_MULTICOLOR = CardRulesPredicates.hasAtLeastCntColors((byte) 2); + public static final Predicate IS_MONOCOLOR = CardRulesPredicates.hasCntColors((byte) 1); } diff --git a/forge-core/src/main/java/forge/card/DeckHints.java b/forge-core/src/main/java/forge/card/DeckHints.java index a422313f480..ba013dcc1f6 100644 --- a/forge-core/src/main/java/forge/card/DeckHints.java +++ b/forge-core/src/main/java/forge/card/DeckHints.java @@ -181,7 +181,7 @@ public class DeckHints { case COLOR: ColorSet cc = ColorSet.fromNames(p); if (cc.isColorless()) { - Iterables.addAll(cards, getMatchingItems(cardList, CardRulesPredicates.Presets.IS_COLORLESS, PaperCard::getRules)); + Iterables.addAll(cards, getMatchingItems(cardList, CardRulesPredicates.IS_COLORLESS, PaperCard::getRules)); } else { Iterables.addAll(cards, getMatchingItems(cardList, CardRulesPredicates.isColor(cc.getColor()), PaperCard::getRules)); } diff --git a/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java b/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java index d395d108ce6..dd3b313f7eb 100644 --- a/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java +++ b/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java @@ -4,8 +4,8 @@ import java.util.HashMap; import java.util.Map; import java.util.function.Predicate; -import forge.item.IPaperCard; import forge.item.PaperCard; +import forge.item.PaperCardPredicates; import forge.util.Iterables; public class DeckGenPool implements IDeckGenPool { @@ -37,7 +37,7 @@ public class DeckGenPool implements IDeckGenPool { @Override public PaperCard getCard(String name, String edition) { - Predicate filter = IPaperCard.Predicates.printedInSet(edition).and(IPaperCard.Predicates.name(name)); + Predicate filter = PaperCardPredicates.printedInSet(edition).and(PaperCardPredicates.name(name)); Iterable editionCards=Iterables.filter(cards.values(), filter); if (editionCards.iterator().hasNext()){ return editionCards.iterator().next(); diff --git a/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java b/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java index b83fcc53154..d38eb114cb5 100644 --- a/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java +++ b/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java @@ -23,8 +23,8 @@ import forge.card.*; import forge.card.mana.ManaCost; import forge.deck.CardPool; import forge.deck.DeckFormat; -import forge.item.IPaperCard; import forge.item.PaperCard; +import forge.item.PaperCardPredicates; import forge.util.*; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -87,12 +87,12 @@ public abstract class DeckGeneratorBase { final Iterable cards = selectCardsOfMatchingColorForPlayer(forAi); // build subsets based on type - final Iterable creatures = Iterables.filter(cards, Predicates.compose(CardRulesPredicates.Presets.IS_CREATURE, PaperCard::getRules)); + final Iterable creatures = Iterables.filter(cards, Predicates.compose(CardRulesPredicates.IS_CREATURE, PaperCard::getRules)); final int creatCnt = (int) Math.ceil(getCreaturePercentage() * size); trace.append("Creatures to add:").append(creatCnt).append("\n"); addCmcAdjusted(creatures, creatCnt, cmcLevels); - Predicate preSpells = Predicates.compose(CardRulesPredicates.Presets.IS_NON_CREATURE_SPELL, PaperCard::getRules); + Predicate preSpells = Predicates.compose(CardRulesPredicates.IS_NON_CREATURE_SPELL, PaperCard::getRules); final Iterable spells = Iterables.filter(cards, preSpells); final int spellCnt = (int) Math.ceil(getSpellPercentage() * size); trace.append("Spells to add:").append(spellCnt).append("\n"); @@ -108,10 +108,10 @@ public abstract class DeckGeneratorBase { protected boolean setBasicLandPool(String edition){ Predicate isSetBasicLand; if (edition !=null){ - isSetBasicLand = IPaperCard.Predicates.printedInSet(edition) - .and(Predicates.compose(CardRulesPredicates.Presets.IS_BASIC_LAND, PaperCard::getRules)); + isSetBasicLand = PaperCardPredicates.printedInSet(edition) + .and(Predicates.compose(CardRulesPredicates.IS_BASIC_LAND, PaperCard::getRules)); }else{ - isSetBasicLand = Predicates.compose(CardRulesPredicates.Presets.IS_BASIC_LAND, PaperCard::getRules); + isSetBasicLand = Predicates.compose(CardRulesPredicates.IS_BASIC_LAND, PaperCard::getRules); } landPool = new DeckGenPool(StaticData.instance().getCommonCards().getAllCards(isSetBasicLand)); @@ -234,7 +234,7 @@ public abstract class DeckGeneratorBase { addSome(targetSize - actualSize, tDeck.toFlatList()); } else if (actualSize > targetSize) { - Predicate exceptBasicLand = Predicates.compose(CardRulesPredicates.Presets.NOT_BASIC_LAND, PaperCard::getRules); + Predicate exceptBasicLand = Predicates.compose(CardRulesPredicates.NOT_BASIC_LAND, PaperCard::getRules); for (int i = 0; i < 3 && actualSize > targetSize; i++) { Iterable matchingCards = Iterables.filter(tDeck.toFlatList(), exceptBasicLand); @@ -388,7 +388,7 @@ public abstract class DeckGeneratorBase { //filter to provide all dual lands from pool matching 2 or 3 colors from current deck Predicate dualLandFilter = CardRulesPredicates.coreType(true, CardType.CoreType.Land); - Predicate exceptBasicLand = CardRulesPredicates.Presets.NOT_BASIC_LAND; + Predicate exceptBasicLand = CardRulesPredicates.NOT_BASIC_LAND; Iterable landCards = pool.getAllCards(Predicates.compose(dualLandFilter.and(exceptBasicLand).and(canPlay), PaperCard::getRules)); Iterable dualLandPatterns = Arrays.asList("Add \\{([WUBRG])\\} or \\{([WUBRG])\\}", diff --git a/forge-core/src/main/java/forge/item/IPaperCard.java b/forge-core/src/main/java/forge/item/IPaperCard.java index 37b11ba8250..762186dd2f6 100644 --- a/forge-core/src/main/java/forge/item/IPaperCard.java +++ b/forge-core/src/main/java/forge/item/IPaperCard.java @@ -24,211 +24,6 @@ public interface IPaperCard extends InventoryItem, Serializable { String NO_ARTIST_NAME = ""; String NO_FUNCTIONAL_VARIANT = ""; - /** - * Number of filters based on CardPrinted values. - */ - abstract class Predicates { - - public static Predicate rarity(final boolean isEqual, final CardRarity value) { - return new PredicateRarity(value, isEqual); - } - - public static Predicate color(final boolean isEqual, final boolean noColor, final byte value) { - return new PredicateColor(value, noColor, isEqual); - } - - public static Predicate printedInSets(final String[] sets) { - return printedInSets(Lists.newArrayList(sets), true); - } - - public static Predicate printedInSets(final List value, final boolean shouldContain) { - if ((value == null) || value.isEmpty()) { - return x -> true; - } - return new PredicateSets(value, shouldContain); - } - - public static Predicate printedInSet(final String value) { - if (StringUtils.isEmpty(value)) { - return x -> true; - } - return new PredicateSets(Lists.newArrayList(value), true); - } - - public static Predicate name(final String what) { - return new PredicateName(PredicateString.StringOp.EQUALS_IC, what); - } - - public static Predicate name(final PredicateString.StringOp op, final String what) { - return new PredicateName(op, what); - } - - public static Predicate names(final List what) { - return new PredicateNames(what); - } - - public static PredicateCards cards(final List what) { return new PredicateCards(what); } - - private static final class PredicateColor implements Predicate { - - private final byte operand; - private final boolean noColor; - private final boolean shouldBeEqual; - - private PredicateColor(final byte color, final boolean noColor, final boolean wantEqual) { - this.operand = color; - this.noColor = noColor; - this.shouldBeEqual = wantEqual; - } - - @Override - public boolean test(final PaperCard card) { - boolean colorFound = false; - if (noColor) { - return card.getRules().getColor().isColorless() == shouldBeEqual; - } - for (final byte color : card.getRules().getColor()) { - if (color == operand) { - colorFound = true; - break; - } - } - if (card.getRules().getType().hasType(CoreType.Land)) { - for (final byte color : card.getRules().getColorIdentity()) { - if (color == operand) { - colorFound = true; - break; - } - } - } - return colorFound == shouldBeEqual; - } - - } - - private static final class PredicateRarity implements Predicate { - private final CardRarity operand; - private final boolean shouldBeEqual; - - @Override - public boolean test(final PaperCard card) { - return (card.getRarity() == this.operand) == this.shouldBeEqual; - } - - private PredicateRarity(final CardRarity type, final boolean wantEqual) { - this.operand = type; - this.shouldBeEqual = wantEqual; - } - } - - private static final class PredicateSets implements Predicate { - private final Set sets; - private final boolean mustContain; - - @Override - public boolean test(final PaperCard card) { - return this.sets.contains(card.getEdition()) == this.mustContain; - } - - private PredicateSets(final List wantSets, final boolean shouldContain) { - this.sets = new HashSet<>(wantSets); - this.mustContain = shouldContain; - } - } - - private static final class PredicateName extends PredicateString { - private final String operand; - - @Override - public boolean test(final PaperCard card) { - return this.op(card.getName(), this.operand); - } - - private PredicateName(final PredicateString.StringOp operator, final String operand) { - super(operator); - this.operand = operand; - } - } - - private static final class PredicateNames extends PredicateString { - private final List operand; - - @Override - public boolean test(final PaperCard card) { - final String cardName = card.getName(); - for (final String element : this.operand) { - if (this.op(cardName, element)) { - return true; - } - } - return false; - } - - private PredicateNames(final List operand) { - super(StringOp.EQUALS); - this.operand = operand; - } - } - - private static final class PredicateCards extends PredicateCard { - private final List operand; - - @Override - public boolean test(final PaperCard card) { - for (final PaperCard element : this.operand) { - if (this.op(card, element)) { - return true; - } - } - return false; - } - - private PredicateCards(final List operand) { - super(StringOp.EQUALS); - this.operand = operand; - } - } - - /** - * Pre-built predicates are stored here to allow their re-usage and - * easier access from code. - */ - public abstract static class Presets { - // Think twice before using these, since rarity is a prop of printed - // card. - /** The Constant isCommon. */ - public static final Predicate IS_COMMON = Predicates.rarity(true, CardRarity.Common); - - /** The Constant isUncommon. */ - public static final Predicate IS_UNCOMMON = Predicates.rarity(true, CardRarity.Uncommon); - - /** The Constant isRare. */ - public static final Predicate IS_RARE = Predicates.rarity(true, CardRarity.Rare); - - /** The Constant isMythicRare. */ - public static final Predicate IS_MYTHIC_RARE = Predicates.rarity(true, CardRarity.MythicRare); - - /** The Constant isRareOrMythic. */ - public static final Predicate IS_RARE_OR_MYTHIC = Presets.IS_RARE.or(Presets.IS_MYTHIC_RARE); - - /** The Constant isSpecial. */ - public static final Predicate IS_SPECIAL = Predicates.rarity(true, CardRarity.Special); - - /** The Constant exceptLands. */ - public static final Predicate IS_BASIC_LAND = Predicates.rarity(true, CardRarity.BasicLand); - - public static final Predicate IS_BLACK = Predicates.color(true, false, MagicColor.BLACK); - public static final Predicate IS_BLUE = Predicates.color(true, false, MagicColor.BLUE); - public static final Predicate IS_GREEN = Predicates.color(true, false, MagicColor.GREEN); - public static final Predicate IS_RED = Predicates.color(true, false, MagicColor.RED); - public static final Predicate IS_WHITE = Predicates.color(true, false, MagicColor.WHITE); - public static final Predicate IS_COLORLESS = Predicates.color(true, true, MagicColor.COLORLESS); - - public static final Predicate IS_UNREBALANCED = PaperCard::isUnRebalanced; - public static final Predicate IS_REBALANCED = PaperCard::isRebalanced; - } - } - String getName(); String getEdition(); diff --git a/forge-core/src/main/java/forge/item/ItemPredicate.java b/forge-core/src/main/java/forge/item/ItemPredicate.java index dc50933998a..502bef226b1 100644 --- a/forge-core/src/main/java/forge/item/ItemPredicate.java +++ b/forge-core/src/main/java/forge/item/ItemPredicate.java @@ -10,34 +10,21 @@ public abstract class ItemPredicate { // Static builder methods - they choose concrete implementation by themselves public static final Predicate IsBoosterPack = BoosterPack.class::isInstance; + /** + * Checks that the inventory item is a Prebuilt Deck. + */ public static final Predicate IsPrebuiltDeck = PreconDeck.class::isInstance; public static final Predicate IsFatPack = FatPack.class::isInstance; /** * Checks that the inventory item is a Tournament Pack. - * - * @return the predicate */ public static final Predicate IsTournamentPack = card -> card instanceof TournamentPack && !((TournamentPack) card).isStarterDeck(); /** * Checks that the inventory item is a Starter Deck. - * - * @return the predicate */ public static final Predicate IsStarterDeck = card -> card instanceof TournamentPack && ((TournamentPack) card).isStarterDeck(); - /** - * Checks that the inventory item is a Prebuilt Deck. - * - * @return the predicate - */ - - /** - * The Class Presets. - */ - public static class Presets { - /** The Item IsPack. */ - public static final Predicate IS_PACK_OR_DECK = IsBoosterPack.or(IsFatPack).or(IsTournamentPack).or(IsStarterDeck).or(IsPrebuiltDeck); - } + public static final Predicate IS_PACK_OR_DECK = IsBoosterPack.or(IsFatPack).or(IsTournamentPack).or(IsStarterDeck).or(IsPrebuiltDeck); } diff --git a/forge-core/src/main/java/forge/item/PaperCardPredicates.java b/forge-core/src/main/java/forge/item/PaperCardPredicates.java new file mode 100644 index 00000000000..f7dbdc28d5d --- /dev/null +++ b/forge-core/src/main/java/forge/item/PaperCardPredicates.java @@ -0,0 +1,197 @@ +package forge.item; + +import com.google.common.collect.Lists; +import forge.card.CardRarity; +import forge.card.CardType; +import forge.card.MagicColor; +import forge.util.PredicateCard; +import forge.util.PredicateString; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.Predicate; + +/** + * Filters based on PaperCard values. + */ +public abstract class PaperCardPredicates { + public static Predicate rarity(final boolean isEqual, final CardRarity value) { + return new PredicateRarity(value, isEqual); + } + + public static Predicate color(final boolean isEqual, final boolean noColor, final byte value) { + return new PredicateColor(value, noColor, isEqual); + } + + public static Predicate printedInSets(final String[] sets) { + return printedInSets(Lists.newArrayList(sets), true); + } + + public static Predicate printedInSets(final List value, final boolean shouldContain) { + if ((value == null) || value.isEmpty()) { + return x -> true; + } + return new PredicateSets(value, shouldContain); + } + + public static Predicate printedInSet(final String value) { + if (StringUtils.isEmpty(value)) { + return x -> true; + } + return new PredicateSets(Lists.newArrayList(value), true); + } + + public static Predicate name(final String what) { + return new PredicateName(PredicateString.StringOp.EQUALS_IC, what); + } + + public static Predicate name(final PredicateString.StringOp op, final String what) { + return new PredicateName(op, what); + } + + public static Predicate names(final List what) { + return new PredicateNames(what); + } + + public static Predicate cards(final List what) { + return new PredicateCards(what); + } + + private static final class PredicateColor implements Predicate { + + private final byte operand; + private final boolean noColor; + private final boolean shouldBeEqual; + + private PredicateColor(final byte color, final boolean noColor, final boolean wantEqual) { + this.operand = color; + this.noColor = noColor; + this.shouldBeEqual = wantEqual; + } + + @Override + public boolean test(final PaperCard card) { + boolean colorFound = false; + if (noColor) { + return card.getRules().getColor().isColorless() == shouldBeEqual; + } + for (final byte color : card.getRules().getColor()) { + if (color == operand) { + colorFound = true; + break; + } + } + if (card.getRules().getType().hasType(CardType.CoreType.Land)) { + for (final byte color : card.getRules().getColorIdentity()) { + if (color == operand) { + colorFound = true; + break; + } + } + } + return colorFound == shouldBeEqual; + } + + } + + private static final class PredicateRarity implements Predicate { + private final CardRarity operand; + private final boolean shouldBeEqual; + + @Override + public boolean test(final PaperCard card) { + return (card.getRarity() == this.operand) == this.shouldBeEqual; + } + + private PredicateRarity(final CardRarity type, final boolean wantEqual) { + this.operand = type; + this.shouldBeEqual = wantEqual; + } + } + + private static final class PredicateSets implements Predicate { + private final Set sets; + private final boolean mustContain; + + @Override + public boolean test(final PaperCard card) { + return this.sets.contains(card.getEdition()) == this.mustContain; + } + + private PredicateSets(final List wantSets, final boolean shouldContain) { + this.sets = new HashSet<>(wantSets); + this.mustContain = shouldContain; + } + } + + private static final class PredicateName extends PredicateString { + private final String operand; + + @Override + public boolean test(final PaperCard card) { + return this.op(card.getName(), this.operand); + } + + private PredicateName(final StringOp operator, final String operand) { + super(operator); + this.operand = operand; + } + } + + private static final class PredicateNames extends PredicateString { + private final List operand; + + @Override + public boolean test(final PaperCard card) { + final String cardName = card.getName(); + for (final String element : this.operand) { + if (this.op(cardName, element)) { + return true; + } + } + return false; + } + + private PredicateNames(final List operand) { + super(StringOp.EQUALS); + this.operand = operand; + } + } + + private static final class PredicateCards extends PredicateCard { + private final List operand; + + @Override + public boolean test(final PaperCard card) { + for (final PaperCard element : this.operand) { + if (this.op(card, element)) { + return true; + } + } + return false; + } + + private PredicateCards(final List operand) { + super(StringOp.EQUALS); + this.operand = operand; + } + } + + public static final Predicate IS_COMMON = PaperCardPredicates.rarity(true, CardRarity.Common); + public static final Predicate IS_UNCOMMON = PaperCardPredicates.rarity(true, CardRarity.Uncommon); + public static final Predicate IS_RARE = PaperCardPredicates.rarity(true, CardRarity.Rare); + public static final Predicate IS_MYTHIC_RARE = PaperCardPredicates.rarity(true, CardRarity.MythicRare); + public static final Predicate IS_RARE_OR_MYTHIC = PaperCardPredicates.IS_RARE.or(PaperCardPredicates.IS_MYTHIC_RARE); + public static final Predicate IS_SPECIAL = PaperCardPredicates.rarity(true, CardRarity.Special); + public static final Predicate IS_BASIC_LAND = PaperCardPredicates.rarity(true, CardRarity.BasicLand); + public static final Predicate IS_BLACK = PaperCardPredicates.color(true, false, MagicColor.BLACK); + public static final Predicate IS_BLUE = PaperCardPredicates.color(true, false, MagicColor.BLUE); + public static final Predicate IS_GREEN = PaperCardPredicates.color(true, false, MagicColor.GREEN); + public static final Predicate IS_RED = PaperCardPredicates.color(true, false, MagicColor.RED); + public static final Predicate IS_WHITE = PaperCardPredicates.color(true, false, MagicColor.WHITE); + public static final Predicate IS_COLORLESS = PaperCardPredicates.color(true, true, MagicColor.COLORLESS); + public static final Predicate IS_UNREBALANCED = PaperCard::isUnRebalanced; + public static final Predicate IS_REBALANCED = PaperCard::isRebalanced; +} diff --git a/forge-core/src/main/java/forge/item/SealedProduct.java b/forge-core/src/main/java/forge/item/SealedProduct.java index 2c2f6c1e342..1049a14bb78 100644 --- a/forge-core/src/main/java/forge/item/SealedProduct.java +++ b/forge-core/src/main/java/forge/item/SealedProduct.java @@ -113,8 +113,8 @@ public abstract class SealedProduct implements InventoryItemFromSet { } protected List getRandomBasicLands(final String setCode, final int count) { - Predicate cardsRule = IPaperCard.Predicates.printedInSet(setCode) - .and(Predicates.compose(CardRulesPredicates.Presets.IS_BASIC_LAND, PaperCard::getRules)); + Predicate cardsRule = PaperCardPredicates.printedInSet(setCode) + .and(Predicates.compose(CardRulesPredicates.IS_BASIC_LAND, PaperCard::getRules)); return Aggregates.random(Iterables.filter(StaticData.instance().getCommonCards().getAllCards(), cardsRule), count); } } diff --git a/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java b/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java index d95b056190d..2b2d6220025 100644 --- a/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java +++ b/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java @@ -23,7 +23,6 @@ import forge.StaticData; import forge.card.*; import forge.card.CardEdition.FoilType; import forge.item.*; -import forge.item.IPaperCard.Predicates.Presets; import forge.util.*; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -510,20 +509,20 @@ public class BoosterGenerator { Predicate rarityPredicate = null; switch (toAdd.getRarity()) { case BasicLand: - rarityPredicate = Presets.IS_BASIC_LAND; + rarityPredicate = PaperCardPredicates.IS_BASIC_LAND; break; case Common: - rarityPredicate = Presets.IS_COMMON; + rarityPredicate = PaperCardPredicates.IS_COMMON; break; case Uncommon: - rarityPredicate = Presets.IS_UNCOMMON; + rarityPredicate = PaperCardPredicates.IS_UNCOMMON; break; case Rare: case MythicRare: - rarityPredicate = Presets.IS_RARE_OR_MYTHIC; + rarityPredicate = PaperCardPredicates.IS_RARE_OR_MYTHIC; break; default: - rarityPredicate = Presets.IS_SPECIAL; + rarityPredicate = PaperCardPredicates.IS_SPECIAL; } PaperCard toReplace = null; @@ -568,7 +567,7 @@ public class BoosterGenerator { public static PrintSheet makeSheet(String sheetKey, Iterable src) { PrintSheet ps = new PrintSheet(sheetKey); String[] sKey = TextUtil.splitWithParenthesis(sheetKey, ' ', 2); - Predicate setPred = sKey.length > 1 ? IPaperCard.Predicates.printedInSets(sKey[1].split(" ")) : x1 -> true; + Predicate setPred = sKey.length > 1 ? PaperCardPredicates.printedInSets(sKey[1].split(" ")) : x1 -> true; List operators = new LinkedList<>(Arrays.asList(TextUtil.splitWithParenthesis(sKey[0], ':'))); Predicate extraPred = buildExtraPredicate(operators); @@ -613,31 +612,31 @@ public class BoosterGenerator { ps.addAll(Iterables.filter(src, predicate)); } else if (mainCode.equalsIgnoreCase(BoosterSlots.UNCOMMON_RARE)) { // for sets like ARN, where U1 cards are considered rare and U3 are uncommon - Predicate predicateRares = setPred.and(Presets.IS_RARE).and(extraPred); + Predicate predicateRares = setPred.and(PaperCardPredicates.IS_RARE).and(extraPred); ps.addAll(Iterables.filter(src, predicateRares)); - Predicate predicateUncommon = setPred.and(Presets.IS_UNCOMMON).and(extraPred); + Predicate predicateUncommon = setPred.and(PaperCardPredicates.IS_UNCOMMON).and(extraPred); ps.addAll(Iterables.filter(src, predicateUncommon), 3); } else if (mainCode.equalsIgnoreCase(BoosterSlots.RARE_MYTHIC)) { // Typical ratio of rares to mythics is 53:15, changing to 35:10 in smaller sets. // To achieve the desired 1:8 are all mythics are added once, and all rares added twice per print sheet. - Predicate predicateMythic = setPred.and(Presets.IS_MYTHIC_RARE).and(extraPred); + Predicate predicateMythic = setPred.and(PaperCardPredicates.IS_MYTHIC_RARE).and(extraPred); ps.addAll(Iterables.filter(src, predicateMythic)); - Predicate predicateRare = setPred.and(Presets.IS_RARE).and(extraPred); + Predicate predicateRare = setPred.and(PaperCardPredicates.IS_RARE).and(extraPred); ps.addAll(Iterables.filter(src, predicateRare), 2); } else if (mainCode.equalsIgnoreCase(BoosterSlots.UNCOMMON_RARE_MYTHIC)) { // Extended version of RARE_MYTHIC, used for Alchemy slots - Predicate predicateMythic = setPred.and(Presets.IS_MYTHIC_RARE).and(extraPred); + Predicate predicateMythic = setPred.and(PaperCardPredicates.IS_MYTHIC_RARE).and(extraPred); ps.addAll(Iterables.filter(src, predicateMythic)); - Predicate predicateRare = setPred.and(Presets.IS_RARE).and(extraPred); + Predicate predicateRare = setPred.and(PaperCardPredicates.IS_RARE).and(extraPred); ps.addAll(Iterables.filter(src, predicateRare), 2); - Predicate predicateUncommon = setPred.and(Presets.IS_UNCOMMON).and(extraPred); + Predicate predicateUncommon = setPred.and(PaperCardPredicates.IS_UNCOMMON).and(extraPred); ps.addAll(Iterables.filter(src, predicateUncommon), 4); } else { throw new IllegalArgumentException("Booster generator: operator could not be parsed - " + mainCode); @@ -675,48 +674,48 @@ public class BoosterGenerator { .or(CardRulesPredicates.splitType(CardSplitType.Modal) ), PaperCard::getRules); - } else if (operator.equalsIgnoreCase(BoosterSlots.LAND)) { toAdd = Predicates.compose(CardRulesPredicates.Presets.IS_LAND, PaperCard::getRules); - } else if (operator.equalsIgnoreCase(BoosterSlots.BASIC_LAND)) { toAdd = IPaperCard.Predicates.Presets.IS_BASIC_LAND; - } else if (operator.equalsIgnoreCase(BoosterSlots.TIME_SHIFTED)) { toAdd = IPaperCard.Predicates.Presets.IS_SPECIAL; - } else if (operator.equalsIgnoreCase(BoosterSlots.SPECIAL)) { toAdd = IPaperCard.Predicates.Presets.IS_SPECIAL; - } else if (operator.equalsIgnoreCase(BoosterSlots.MYTHIC)) { toAdd = IPaperCard.Predicates.Presets.IS_MYTHIC_RARE; - } else if (operator.equalsIgnoreCase(BoosterSlots.RARE)) { toAdd = IPaperCard.Predicates.Presets.IS_RARE; - } else if (operator.equalsIgnoreCase(BoosterSlots.UNCOMMON)) { toAdd = IPaperCard.Predicates.Presets.IS_UNCOMMON; - } else if (operator.equalsIgnoreCase(BoosterSlots.COMMON)) { toAdd = IPaperCard.Predicates.Presets.IS_COMMON; + } else if (operator.equalsIgnoreCase(BoosterSlots.LAND)) { toAdd = Predicates.compose(CardRulesPredicates.IS_LAND, PaperCard::getRules); + } else if (operator.equalsIgnoreCase(BoosterSlots.BASIC_LAND)) { toAdd = PaperCardPredicates.IS_BASIC_LAND; + } else if (operator.equalsIgnoreCase(BoosterSlots.TIME_SHIFTED)) { toAdd = PaperCardPredicates.IS_SPECIAL; + } else if (operator.equalsIgnoreCase(BoosterSlots.SPECIAL)) { toAdd = PaperCardPredicates.IS_SPECIAL; + } else if (operator.equalsIgnoreCase(BoosterSlots.MYTHIC)) { toAdd = PaperCardPredicates.IS_MYTHIC_RARE; + } else if (operator.equalsIgnoreCase(BoosterSlots.RARE)) { toAdd = PaperCardPredicates.IS_RARE; + } else if (operator.equalsIgnoreCase(BoosterSlots.UNCOMMON)) { toAdd = PaperCardPredicates.IS_UNCOMMON; + } else if (operator.equalsIgnoreCase(BoosterSlots.COMMON)) { toAdd = PaperCardPredicates.IS_COMMON; } else if (operator.startsWith("name(")) { operator = StringUtils.strip(operator.substring(4), "() "); String[] cardNames = TextUtil.splitWithParenthesis(operator, ',', '"', '"'); - toAdd = IPaperCard.Predicates.names(Lists.newArrayList(cardNames)); + toAdd = PaperCardPredicates.names(Lists.newArrayList(cardNames)); } else if (operator.startsWith("color(")) { operator = StringUtils.strip(operator.substring("color(".length() + 1), "()\" "); switch (operator.toLowerCase()) { case "black": - toAdd = Presets.IS_BLACK; + toAdd = PaperCardPredicates.IS_BLACK; break; case "blue": - toAdd = Presets.IS_BLUE; + toAdd = PaperCardPredicates.IS_BLUE; break; case "green": - toAdd = Presets.IS_GREEN; + toAdd = PaperCardPredicates.IS_GREEN; break; case "red": - toAdd = Presets.IS_RED; + toAdd = PaperCardPredicates.IS_RED; break; case "white": - toAdd = Presets.IS_WHITE; + toAdd = PaperCardPredicates.IS_WHITE; break; case "colorless": - toAdd = Presets.IS_COLORLESS; + toAdd = PaperCardPredicates.IS_COLORLESS; break; } } else if (operator.startsWith("fromSets(")) { operator = StringUtils.strip(operator.substring("fromSets(".length() + 1), "()\" "); String[] sets = operator.split(","); - toAdd = IPaperCard.Predicates.printedInSets(sets); + toAdd = PaperCardPredicates.printedInSets(sets); } else if (operator.startsWith("fromSheet(") && invert) { String sheetName = StringUtils.strip(operator.substring(9), "()\" "); Iterable cards = StaticData.instance().getPrintSheets().get(sheetName).toFlatList(); - toAdd = IPaperCard.Predicates.cards(Lists.newArrayList(cards)); + toAdd = PaperCardPredicates.cards(Lists.newArrayList(cards)); } if (toAdd == null) { diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index 55bdd34eedd..278f697beed 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -1099,7 +1099,7 @@ public class Game { private void chooseRandomCardsForAnte(final Player player, final Multimap anteed) { final CardCollectionView lib = player.getCardsIn(ZoneType.Library); - Predicate goodForAnte = CardPredicates.Presets.BASIC_LANDS.negate(); + Predicate goodForAnte = CardPredicates.BASIC_LANDS.negate(); Card ante = Aggregates.random(Iterables.filter(lib, goodForAnte)); if (ante == null) { getGameLog().add(GameLogEntryType.ANTE, "Only basic lands found. Will ante one of them"); diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 126f9fa12f9..ad3653e9e86 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -817,14 +817,14 @@ public class GameAction { if (!stAb.hasParam("ValidAttacker") || (stAb.hasParam("ValidBlocker") && stAb.getParam("ValidBlocker").equals("Creature.Self"))) { continue; } - for (Card creature : Iterables.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES)) { + for (Card creature : Iterables.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.CREATURES)) { if (stAb.matchesValidParam("ValidAttacker", creature)) { creature.updateAbilityTextForView(); } } } if (stAb.checkMode(StaticAbilityCantAttackBlock.MinMaxBlockerMode)) { - for (Card creature : Iterables.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES)) { + for (Card creature : Iterables.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.CREATURES)) { if (stAb.matchesValidParam("ValidCard", creature)) { creature.updateAbilityTextForView(); } @@ -1431,7 +1431,7 @@ public class GameAction { if (desCreats != null) { if (desCreats.size() > 1 && !orderedDesCreats) { - desCreats = CardLists.filter(desCreats, CardPredicates.Presets.CAN_BE_DESTROYED); + desCreats = CardLists.filter(desCreats, CardPredicates.CAN_BE_DESTROYED); if (!desCreats.isEmpty()) { desCreats = (CardCollection) GameActionUtil.orderCardsByTheirOwners(game, desCreats, ZoneType.Graveyard, null); } diff --git a/forge-game/src/main/java/forge/game/GameEntity.java b/forge-game/src/main/java/forge/game/GameEntity.java index e7b839253eb..efbd2ab7fb0 100644 --- a/forge-game/src/main/java/forge/game/GameEntity.java +++ b/forge-game/src/main/java/forge/game/GameEntity.java @@ -144,7 +144,7 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { public final CardCollectionView getEnchantedBy() { // enchanted means attached by Aura - return CardLists.filter(getAttachedCards(), CardPredicates.Presets.AURA); + return CardLists.filter(getAttachedCards(), CardPredicates.AURA); } // doesn't include phased out cards @@ -176,7 +176,7 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { public final boolean isEnchanted() { // enchanted means attached by Aura - return Iterables.any(getAttachedCards(), CardPredicates.Presets.AURA); + return Iterables.any(getAttachedCards(), CardPredicates.AURA); } public final boolean hasCardAttachment(Card c) { diff --git a/forge-game/src/main/java/forge/game/GameFormat.java b/forge-game/src/main/java/forge/game/GameFormat.java index 4e9110b0521..10298834f56 100644 --- a/forge-game/src/main/java/forge/game/GameFormat.java +++ b/forge-game/src/main/java/forge/game/GameFormat.java @@ -25,8 +25,8 @@ import forge.card.CardEdition.CardInSet; import forge.card.CardRarity; import forge.deck.CardPool; import forge.deck.Deck; -import forge.item.IPaperCard; import forge.item.PaperCard; +import forge.item.PaperCardPredicates; import forge.util.FileSection; import forge.util.FileUtil; import forge.util.Predicates; @@ -138,17 +138,17 @@ public class GameFormat implements Comparable { this.filterPrinted = this.buildFilterPrinted(); } protected Predicate buildFilter(boolean printed) { - Predicate p = IPaperCard.Predicates.names(this.getBannedCardNames()).negate(); + Predicate p = PaperCardPredicates.names(this.getBannedCardNames()).negate(); if (FormatSubType.ARENA.equals(this.getFormatSubType())) { - p = p.and(IPaperCard.Predicates.Presets.IS_UNREBALANCED.negate()); + p = p.and(PaperCardPredicates.IS_UNREBALANCED.negate()); } else { - p = p.and(IPaperCard.Predicates.Presets.IS_REBALANCED.negate()); + p = p.and(PaperCardPredicates.IS_REBALANCED.negate()); } if (!this.getAllowedSetCodes().isEmpty()) { p = p.and(printed ? - IPaperCard.Predicates.printedInSets(this.getAllowedSetCodes(), printed) : + PaperCardPredicates.printedInSets(this.getAllowedSetCodes(), printed) : StaticData.instance().getCommonCards().wasPrintedInSets(this.getAllowedSetCodes())); } if (!this.getAllowedRarities().isEmpty()) { @@ -159,7 +159,7 @@ public class GameFormat implements Comparable { p = p.and(Predicates.or(crp)); } if (!this.getAdditionalCards().isEmpty()) { - p = p.or(IPaperCard.Predicates.names(this.getAdditionalCards())); + p = p.or(PaperCardPredicates.names(this.getAdditionalCards())); } return p; } diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 735a1817f3d..a4e2b9b397c 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -2225,7 +2225,7 @@ public class AbilityUtils { if (sq[0].equals("EnchantedControllerCreatures")) { // maybe refactor into a Valid with ControlledBy int v = 0; if (c.getEnchantingCard() != null) { - v = CardLists.count(c.getEnchantingCard().getController().getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES); + v = CardLists.count(c.getEnchantingCard().getController().getCardsIn(ZoneType.Battlefield), CardPredicates.CREATURES); } return doXMath(v, expr, c, ctb); } @@ -3877,9 +3877,9 @@ public class AbilityUtils { // Refined qualities // "Untapped Lands" - Count$UntappedTypeYouCtrl.Land - // if (sq[0].contains("Untapped")) { someCards = CardLists.filter(someCards, Presets.UNTAPPED); } + // if (sq[0].contains("Untapped")) { someCards = CardLists.filter(someCards, CardPredicates.UNTAPPED); } - // if (sq[0].contains("Tapped")) { someCards = CardLists.filter(someCards, Presets.TAPPED); } + // if (sq[0].contains("Tapped")) { someCards = CardLists.filter(someCards, CardPredicates.TAPPED); } // String sq0 = sq[0].toLowerCase(); // for (String color : MagicColor.Constant.ONLY_COLORS) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java index 5136dbb9051..5bb6fbc1001 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java @@ -17,7 +17,6 @@ import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; import forge.game.card.CardPredicates; -import forge.game.card.CardPredicates.Presets; import forge.game.player.Player; import forge.game.player.PlayerActionConfirmMode; import forge.game.spellability.SpellAbility; @@ -119,7 +118,7 @@ public class ChooseCardEffect extends SpellAbilityEffect { boolean dontRevealToOwner = true; if (sa.hasParam("EachBasicType")) { // Get all lands, - List land = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.LANDS); + List land = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.LANDS); String eachBasic = sa.getParam("EachBasicType"); if (eachBasic.equals("Controlled")) { land = CardLists.filterControlledBy(land, p); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java index d8c34e1985a..f47ef140fd7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java @@ -70,7 +70,7 @@ public class ChooseCardNameEffect extends SpellAbilityEffect { // Momir needs PaperCard //Collection cards = StaticData.instance().getCommonCards().getUniqueCards(); //Predicate cpp = Predicates.and( - // Predicates.compose(CardRulesPredicates.Presets.IS_CREATURE, PaperCard.FN_GET_RULES), + // Predicates.compose(CardRulesPredicates.IS_CREATURE, PaperCard.FN_GET_RULES), // Predicates.compose(CardRulesPredicates.cmc(ComparableOp.EQUALS, validAmount), PaperCard.FN_GET_RULES)); //cards = Lists.newArrayList(Iterables.filter(cards, cpp)); //if (!cards.isEmpty()) { chosen = Aggregates.random(cards).getName(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ConniveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ConniveEffect.java index 58bd46a43a5..793d80adb54 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ConniveEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ConniveEffect.java @@ -78,7 +78,7 @@ public class ConniveEffect extends SpellAbilityEffect { p.drawCards(num, sa, moveParams); - CardCollection validDiscards = CardLists.filter(p.getCardsIn(ZoneType.Hand), CardPredicates.Presets.NON_TOKEN); + CardCollection validDiscards = CardLists.filter(p.getCardsIn(ZoneType.Hand), CardPredicates.NON_TOKEN); if (validDiscards.isEmpty() || !p.canDiscardBy(sa, true)) { // hand being empty unlikely, just to be safe continue; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java index 36dcce6617f..74f520a2704 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java @@ -156,11 +156,11 @@ public class CopyPermanentEffect extends TokenEffectBase { "X", Integer.toString(AbilityUtils.calculateAmount(host, "X", sa))); } if (StringUtils.containsIgnoreCase(valid, "creature")) { - Predicate cpp = Predicates.compose(CardRulesPredicates.Presets.IS_CREATURE, PaperCard::getRules); + Predicate cpp = Predicates.compose(CardRulesPredicates.IS_CREATURE, PaperCard::getRules); cards = Lists.newArrayList(Iterables.filter(cards, cpp)); } if (StringUtils.containsIgnoreCase(valid, "equipment")) { - Predicate cpp = Predicates.compose(CardRulesPredicates.Presets.IS_EQUIPMENT, PaperCard::getRules); + Predicate cpp = Predicates.compose(CardRulesPredicates.IS_EQUIPMENT, PaperCard::getRules); cards = Lists.newArrayList(Iterables.filter(cards, cpp)); } if (sa.hasParam("RandomCopied")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/DestroyAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DestroyAllEffect.java index 7e5795aadec..56ceaeb5980 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DestroyAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DestroyAllEffect.java @@ -82,7 +82,7 @@ public class DestroyAllEffect extends SpellAbilityEffect { return; } // exclude cards that can't be destroyed at this moment - list = CardLists.filter(list, CardPredicates.Presets.CAN_BE_DESTROYED); + list = CardLists.filter(list, CardPredicates.CAN_BE_DESTROYED); list = GameActionUtil.orderCardsByTheirOwners(game, list, ZoneType.Graveyard, sa); diff --git a/forge-game/src/main/java/forge/game/ability/effects/InternalRadiationEffect.java b/forge-game/src/main/java/forge/game/ability/effects/InternalRadiationEffect.java index fadd9dab249..1b6f8ddf9cf 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/InternalRadiationEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/InternalRadiationEffect.java @@ -29,7 +29,7 @@ public class InternalRadiationEffect extends SpellAbilityEffect { final CardCollectionView milled = game.getAction().mill(new PlayerCollection(p), numRad, ZoneType.Graveyard, sa, moveParams); table.triggerChangesZoneAll(game, sa); - int n = CardLists.count(milled, CardPredicates.Presets.NON_LANDS); + int n = CardLists.count(milled, CardPredicates.NON_LANDS); if (StaticAbilityGainLifeRadiation.gainLifeRadiation(p)) { p.gainLife(n, sa.getHostCard(), sa); diff --git a/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java index 3ae63fd89c6..7bb160975e5 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java @@ -14,10 +14,7 @@ import forge.game.player.PlayerCollection; import forge.game.spellability.SpellAbility; import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; -import forge.item.BoosterPack; -import forge.item.IPaperCard; -import forge.item.PaperCard; -import forge.item.SealedTemplate; +import forge.item.*; import forge.util.Aggregates; import forge.util.CardTranslation; import forge.util.Iterables; @@ -153,7 +150,7 @@ public class MakeCardEffect extends SpellAbilityEffect { while (toMake > 0) { PaperCard pc; if (pack != null) { - pc = Iterables.getLast(Iterables.filter(pack, IPaperCard.Predicates.name(name))); + pc = Iterables.getLast(Iterables.filter(pack, PaperCardPredicates.name(name))); } else { pc = StaticData.instance().getCommonCards().getUniqueByName(name); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java index 0d3e0c3b5a6..543f76ffc7d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java @@ -121,11 +121,11 @@ public class PlayEffect extends SpellAbilityEffect { } } else if (valid.equalsIgnoreCase("sorcery")) { cards = Lists.newArrayList(StaticData.instance().getCommonCards().getUniqueCards()); - final Predicate cpp = Predicates.compose(CardRulesPredicates.Presets.IS_SORCERY, PaperCard::getRules); + final Predicate cpp = Predicates.compose(CardRulesPredicates.IS_SORCERY, PaperCard::getRules); cards = Lists.newArrayList(Iterables.filter(cards, cpp)); } else if (valid.equalsIgnoreCase("instant")) { cards = Lists.newArrayList(StaticData.instance().getCommonCards().getUniqueCards()); - final Predicate cpp = Predicates.compose(CardRulesPredicates.Presets.IS_INSTANT, PaperCard::getRules); + final Predicate cpp = Predicates.compose(CardRulesPredicates.IS_INSTANT, PaperCard::getRules); cards = Lists.newArrayList(Iterables.filter(cards, cpp)); } if (sa.hasParam("RandomCopied")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java index dbf3f8b3cb9..3feb0f4cc2e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java @@ -30,7 +30,7 @@ public class PlayLandVariantEffect extends SpellAbilityEffect { final String landType = sa.getParam("Clone"); List cards = Lists.newArrayList(StaticData.instance().getCommonCards().getUniqueCards()); if ("BasicLand".equals(landType)) { - final Predicate cpp = Predicates.compose(CardRulesPredicates.Presets.IS_BASIC_LAND, PaperCard::getRules); + final Predicate cpp = Predicates.compose(CardRulesPredicates.IS_BASIC_LAND, PaperCard::getRules); cards = Lists.newArrayList(Iterables.filter(cards, cpp)); } // current color of source card diff --git a/forge-game/src/main/java/forge/game/ability/effects/UntapEffect.java b/forge-game/src/main/java/forge/game/ability/effects/UntapEffect.java index 1a9485cdd91..03e180265e5 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/UntapEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/UntapEffect.java @@ -4,12 +4,7 @@ import com.google.common.collect.Maps; import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; -import forge.game.card.Card; -import forge.game.card.CardCollection; -import forge.game.card.CardCollectionView; -import forge.game.card.CardLists; -import forge.game.card.CardUtil; -import forge.game.card.CardPredicates.Presets; +import forge.game.card.*; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.trigger.TriggerType; @@ -102,7 +97,7 @@ public class UntapEffect extends SpellAbilityEffect { valid, sa.getActivatingPlayer(), sa.getHostCard(), sa); // the few mandatory are handled differently if (!mandatory) { - list = CardLists.filter(list, Presets.TAPPED); + list = CardLists.filter(list, CardPredicates.TAPPED); } final CardCollectionView selected = p.getController().chooseCardsForEffect(list, sa, Localizer.getInstance().getMessage("lblSelectCardToUntap"), mandatory ? num : 0, num, !mandatory, null); diff --git a/forge-game/src/main/java/forge/game/ability/effects/VentureEffect.java b/forge-game/src/main/java/forge/game/ability/effects/VentureEffect.java index c8ded7f8eed..f731d60e56c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/VentureEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/VentureEffect.java @@ -46,13 +46,13 @@ public class VentureEffect extends SpellAbilityEffect { if (sa.hasParam("Dungeon")) { dungeonCards = StaticData.instance().getVariantCards() .getAllCards(Predicates.compose( - CardRulesPredicates.Presets.IS_DUNGEON + CardRulesPredicates.IS_DUNGEON .and(CardRulesPredicates.subType(StringOp.EQUALS, sa.getParam("Dungeon"))), PaperCard::getRules)); } else { // Create a new dungeon card chosen by player in command zone. dungeonCards = StaticData.instance().getVariantCards().getAllCards( - Predicates.compose(CardRulesPredicates.Presets.IS_DUNGEON, PaperCard::getRules)); + Predicates.compose(CardRulesPredicates.IS_DUNGEON, PaperCard::getRules)); dungeonCards.removeIf(c -> !c.getRules().isEnterableDungeon()); } String message = Localizer.getInstance().getMessage("lblChooseDungeon"); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 8e850a055f7..f87840afb71 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -3862,11 +3862,11 @@ public class Card extends GameEntity implements Comparable, IHasSVars { } public final CardCollectionView getEquippedBy() { - return CardLists.filter(getAttachedCards(), CardPredicates.Presets.EQUIPMENT); + return CardLists.filter(getAttachedCards(), CardPredicates.EQUIPMENT); } public final boolean isEquipped() { - return Iterables.any(getAttachedCards(), CardPredicates.Presets.EQUIPMENT); + return Iterables.any(getAttachedCards(), CardPredicates.EQUIPMENT); } public final boolean isEquippedBy(Card c) { return this.hasCardAttachment(c); @@ -3876,11 +3876,11 @@ public class Card extends GameEntity implements Comparable, IHasSVars { } public final CardCollectionView getFortifiedBy() { - return CardLists.filter(getAttachedCards(), CardPredicates.Presets.FORTIFICATION); + return CardLists.filter(getAttachedCards(), CardPredicates.FORTIFICATION); } public final boolean isFortified() { - return Iterables.any(getAttachedCards(), CardPredicates.Presets.FORTIFICATION); + return Iterables.any(getAttachedCards(), CardPredicates.FORTIFICATION); } public final boolean isFortifiedBy(Card c) { // 301.5e + 301.6 diff --git a/forge-game/src/main/java/forge/game/card/CardPredicates.java b/forge-game/src/main/java/forge/game/card/CardPredicates.java index 62ac3ed4cb9..f1c2b62168a 100644 --- a/forge-game/src/main/java/forge/game/card/CardPredicates.java +++ b/forge-game/src/main/java/forge/game/card/CardPredicates.java @@ -302,109 +302,41 @@ public final class CardPredicates { return c -> c.isAttraction() && c.getAttractionLights().contains(light); } - public static class Presets { + public static final Predicate TAPPED = Card::isTapped; + public static final Predicate FACE_DOWN = Card::isFaceDown; + public static final Predicate UNTAPPED = Card::isUntapped; + public static final Predicate CAN_TAP = Card::canTap; + public static final Predicate CAN_CREW = Card::canCrew; + public static final Predicate CREATURES = Card::isCreature; + public static final Predicate NON_CREATURES = c -> !c.isCreature(); + public static final Predicate ENCHANTMENTS = Card::isEnchantment; + public static final Predicate AURA = Card::isAura; + public static final Predicate EQUIPMENT = Card::isEquipment; + public static final Predicate FORTIFICATION = Card::isFortification; + public static final Predicate CURSE = Card::isCurse; + public static final Predicate UNENCHANTED = c -> !c.isEnchanted(); + public static final Predicate ENCHANTED = GameEntity::isEnchanted; + public static final Predicate NON_TOKEN = c -> !(c.isToken() || c.isTokenCard()); + public static final Predicate TOKEN = c -> c.isToken() || c.isTokenCard(); + public static final Predicate BASIC_LANDS = c -> { + // the isBasicLand() check here may be sufficient... + return c.isLand() && c.isBasicLand(); + }; + public static final Predicate NONBASIC_LANDS = c -> c.isLand() && !c.isBasicLand(); - /** - * a Predicate to get all cards that are tapped. - */ - public static final Predicate TAPPED = Card::isTapped; - - public static final Predicate FACE_DOWN = Card::isFaceDown; - - /** - * a Predicate to get all cards that are untapped. - */ - public static final Predicate UNTAPPED = Card::isUntapped; - - public static final Predicate CAN_TAP = Card::canTap; - - public static final Predicate CAN_CREW = Card::canCrew; - /** - * a Predicate to get all creatures. - */ - public static final Predicate CREATURES = Card::isCreature; - public static final Predicate NON_CREATURES = c -> !c.isCreature(); - - /** - * a Predicate to get all enchantments. - */ - public static final Predicate ENCHANTMENTS = Card::isEnchantment; - /** - * a Predicate to get all aura. - */ - public static final Predicate AURA = Card::isAura; - /** - * a Predicate to get all equipment. - */ - public static final Predicate EQUIPMENT = Card::isEquipment; - /** - * a Predicate to get all fortification. - */ - public static final Predicate FORTIFICATION = Card::isFortification; - - /** - * a Predicate to get all curse. - */ - public static final Predicate CURSE = Card::isCurse; - - /** - * a Predicate to get all unenchanted cards in a list. - */ - public static final Predicate UNENCHANTED = c -> !c.isEnchanted(); - /** - * a Predicate to get all enchanted cards in a list. - */ - public static final Predicate ENCHANTED = GameEntity::isEnchanted; - /** - * a Predicate to get all nontoken cards. - */ - public static final Predicate NON_TOKEN = c -> !(c.isToken() || c.isTokenCard()); - /** - * a Predicate to get all token cards. - */ - public static final Predicate TOKEN = c -> c.isToken() || c.isTokenCard(); - /** - * a Predicate to get all basicLands. - */ - public static final Predicate BASIC_LANDS = c -> { - // the isBasicLand() check here may be sufficient... - return c.isLand() && c.isBasicLand(); - }; - public static final Predicate NONBASIC_LANDS = c -> c.isLand() && !c.isBasicLand(); - /** - * a Predicate to get all artifacts. - */ - public static final Predicate ARTIFACTS = Card::isArtifact; - /** - * a Predicate to get all nonartifacts. - */ - public static final Predicate NON_ARTIFACTS = c -> !c.isArtifact(); - public static final Predicate INSTANTS_AND_SORCERIES = Card::isInstantOrSorcery; - /** - * a Predicate to get all lands. - */ - public static final Predicate LANDS = Card::isLand; - public static final Predicate NON_LANDS = c -> !c.isLand(); - /** - * a Predicate to get all mana-producing lands. - */ - public static final Predicate LANDS_PRODUCING_MANA = c -> c.isBasicLand() || (c.isLand() && !c.getManaAbilities().isEmpty()); - /** - * a Predicate to get all permanents. - */ - public static final Predicate PERMANENTS = Card::isPermanent; - /** - * a Predicate to get all nonland permanents. - */ - public static final Predicate NONLAND_PERMANENTS = c -> c.isPermanent() && !c.isLand(); - - public static final Predicate hasFirstStrike = c -> c.isCreature() && (c.hasFirstStrike() || c.hasDoubleStrike()); - public static final Predicate hasSecondStrike = c -> c.isCreature() && (!c.hasFirstStrike() || c.hasDoubleStrike()); - public static final Predicate SNOW_LANDS = c -> c.isLand() && c.isSnow(); - public static final Predicate PLANESWALKERS = Card::isPlaneswalker; - public static final Predicate BATTLES = Card::isBattle; - public static final Predicate CAN_BE_DESTROYED = Card::canBeDestroyed; - public static final Predicate ATTRACTIONS = Card::isAttraction; - } + public static final Predicate ARTIFACTS = Card::isArtifact; + public static final Predicate INSTANTS_AND_SORCERIES = Card::isInstantOrSorcery; + public static final Predicate LANDS = Card::isLand; + public static final Predicate NON_LANDS = c -> !c.isLand(); + public static final Predicate LANDS_PRODUCING_MANA = c -> c.isBasicLand() || (c.isLand() && !c.getManaAbilities().isEmpty()); + public static final Predicate PERMANENTS = Card::isPermanent; + public static final Predicate NONLAND_PERMANENTS = c -> c.isPermanent() && !c.isLand(); + public static final Predicate hasFirstStrike = c -> c.isCreature() && (c.hasFirstStrike() || c.hasDoubleStrike()); + public static final Predicate hasSecondStrike = c -> c.isCreature() && (!c.hasFirstStrike() || c.hasDoubleStrike()); + public static final Predicate SNOW_LANDS = c -> c.isLand() && c.isSnow(); + public static final Predicate PLANESWALKERS = Card::isPlaneswalker; + public static final Predicate BATTLES = Card::isBattle; + public static final Predicate CAN_BE_DESTROYED = Card::canBeDestroyed; + public static final Predicate ATTRACTIONS = Card::isAttraction; } diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index a49a851280c..e1f99498f7c 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -14,7 +14,6 @@ import forge.game.Game; import forge.game.GameEntity; import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; -import forge.game.card.CardPredicates.Presets; import forge.game.combat.AttackRequirement; import forge.game.combat.AttackingBand; import forge.game.combat.Combat; @@ -646,7 +645,7 @@ public class CardProperty { return false; } } else if (property.startsWith("TopGraveyardCreature")) { - CardCollection cards = CardLists.filter(card.getOwner().getCardsIn(ZoneType.Graveyard), CardPredicates.Presets.CREATURES); + CardCollection cards = CardLists.filter(card.getOwner().getCardsIn(ZoneType.Graveyard), CardPredicates.CREATURES); Collections.reverse(cards); if (cards.isEmpty() || !card.equals(cards.get(0))) { return false; @@ -931,7 +930,7 @@ public class CardProperty { return false; } else if (restriction.equals("NonToken")) { return !CardLists.filter(game.getCardsIn(ZoneType.Battlefield), - Presets.NON_TOKEN, CardPredicates.sharesNameWith(card)).isEmpty(); + CardPredicates.NON_TOKEN, CardPredicates.sharesNameWith(card)).isEmpty(); } else if (restriction.equals("TriggeredCard")) { if (!(spellAbility instanceof SpellAbility)) { System.out.println("Looking at TriggeredCard but no SA?"); @@ -1305,7 +1304,7 @@ public class CardProperty { return false; } } else if (property.startsWith("greatestPower")) { - CardCollectionView cards = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.CREATURES); + CardCollectionView cards = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.CREATURES); if (property.contains("ControlledBy")) { FCollectionView p = AbilityUtils.getDefinedPlayers(source, property.split("ControlledBy")[1], spellAbility); cards = CardLists.filterControlledBy(cards, p); @@ -1319,14 +1318,14 @@ public class CardProperty { } } } else if (property.startsWith("yardGreatestPower")) { - final CardCollectionView cards = CardLists.filter(sourceController.getCardsIn(ZoneType.Graveyard), Presets.CREATURES); + final CardCollectionView cards = CardLists.filter(sourceController.getCardsIn(ZoneType.Graveyard), CardPredicates.CREATURES); for (final Card crd : cards) { if (crd.getNetPower() > card.getNetPower()) { return false; } } } else if (property.startsWith("leastPower")) { - CardCollectionView cards = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.CREATURES); + CardCollectionView cards = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.CREATURES); if (property.contains("ControlledBy")) { FCollectionView p = AbilityUtils.getDefinedPlayers(source, property.split("ControlledBy")[1], spellAbility); cards = CardLists.filterControlledBy(cards, p); @@ -1340,7 +1339,7 @@ public class CardProperty { } } } else if (property.startsWith("leastToughness")) { - CardCollectionView cards = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.CREATURES); + CardCollectionView cards = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.CREATURES); if (property.contains("ControlledBy")) { // 4/25/2023 only used for adventure mode Death Ring FCollectionView p = AbilityUtils.getDefinedPlayers(source, property.split("ControlledBy")[1], spellAbility); cards = CardLists.filterControlledBy(cards, p); @@ -1363,7 +1362,7 @@ public class CardProperty { } if ("NonLandPermanent".equals(prop)) { - cards = CardLists.filter(cards, CardPredicates.Presets.NONLAND_PERMANENTS); + cards = CardLists.filter(cards, CardPredicates.NONLAND_PERMANENTS); } else { cards = CardLists.getType(cards, prop); } diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index 1c572a7c078..204aa54a42a 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -222,11 +222,11 @@ public class Combat { } public final CardCollection getDefendingPlaneswalkers() { - return CardLists.filter(Iterables.filter(attackableEntries, Card.class), CardPredicates.Presets.PLANESWALKERS); + return CardLists.filter(Iterables.filter(attackableEntries, Card.class), CardPredicates.PLANESWALKERS); } public final CardCollection getDefendingBattles() { - return CardLists.filter(Iterables.filter(attackableEntries, Card.class), CardPredicates.Presets.BATTLES); + return CardLists.filter(Iterables.filter(attackableEntries, Card.class), CardPredicates.BATTLES); } public final Map getAttackersAndDefenders() { diff --git a/forge-game/src/main/java/forge/game/combat/CombatUtil.java b/forge-game/src/main/java/forge/game/combat/CombatUtil.java index 03013e36dde..aacc6d84af2 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -70,7 +70,7 @@ public class CombatUtil { // Relevant battles (protected by the attacking player's opponents) final Game game = playerWhoAttacks.getGame(); - final CardCollection battles = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.BATTLES); + final CardCollection battles = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.BATTLES); for (Card battle : battles) { if (battle.getType().hasSubtype("Siege") && battle.getProtectingPlayer().isOpponentOf(playerWhoAttacks)) { defenders.add(battle); diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index aa8133afe2f..7542f2fdc52 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -338,11 +338,11 @@ public class CostAdjustment { final Player activator = sa.getActivatingPlayer(); CardCollectionView untappedCards = CardLists.filter(activator.getCardsIn(ZoneType.Battlefield), - CardPredicates.Presets.CAN_TAP); + CardPredicates.CAN_TAP); if (improvise) { - untappedCards = CardLists.filter(untappedCards, CardPredicates.Presets.ARTIFACTS); + untappedCards = CardLists.filter(untappedCards, CardPredicates.ARTIFACTS); } else { - untappedCards = CardLists.filter(untappedCards, CardPredicates.Presets.CREATURES); + untappedCards = CardLists.filter(untappedCards, CardPredicates.CREATURES); } Map convokedCards = activator.getController().chooseCardsForConvokeOrImprovise(sa, diff --git a/forge-game/src/main/java/forge/game/cost/CostTapType.java b/forge-game/src/main/java/forge/game/cost/CostTapType.java index 509f402adf0..277c96b1706 100644 --- a/forge-game/src/main/java/forge/game/cost/CostTapType.java +++ b/forge-game/src/main/java/forge/game/cost/CostTapType.java @@ -20,7 +20,6 @@ package forge.game.cost; import forge.card.CardType; import forge.game.ability.AbilityKey; import forge.game.card.*; -import forge.game.card.CardPredicates.Presets; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.trigger.TriggerType; @@ -67,7 +66,7 @@ public class CostTapType extends CostPartWithList { if (!canTapSource) { typeList.remove(source); } - typeList = CardLists.filter(typeList, ability.isCrew() ? Presets.CAN_CREW : Presets.CAN_TAP); + typeList = CardLists.filter(typeList, ability.isCrew() ? CardPredicates.CAN_CREW : CardPredicates.CAN_TAP); return typeList.size(); } @@ -165,7 +164,7 @@ public class CostTapType extends CostPartWithList { if (!canTapSource) { typeList.remove(source); } - typeList = CardLists.filter(typeList, ability.isCrew() ? Presets.CAN_CREW : Presets.CAN_TAP); + typeList = CardLists.filter(typeList, ability.isCrew() ? CardPredicates.CAN_CREW : CardPredicates.CAN_TAP); if (sameType) { for (final Card card : typeList) { diff --git a/forge-game/src/main/java/forge/game/cost/CostUntapType.java b/forge-game/src/main/java/forge/game/cost/CostUntapType.java index 4fc1cbd34bc..1966b4e6463 100644 --- a/forge-game/src/main/java/forge/game/cost/CostUntapType.java +++ b/forge-game/src/main/java/forge/game/cost/CostUntapType.java @@ -19,11 +19,7 @@ package forge.game.cost; import com.google.common.collect.Maps; import forge.game.ability.AbilityKey; -import forge.game.card.Card; -import forge.game.card.CardCollection; -import forge.game.card.CardCollectionView; -import forge.game.card.CardLists; -import forge.game.card.CardPredicates.Presets; +import forge.game.card.*; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.trigger.TriggerType; @@ -90,7 +86,7 @@ public class CostUntapType extends CostPartWithList { if (!canUntapSource) { typeList.remove(source); } - typeList = CardLists.filter(typeList, Presets.TAPPED); + typeList = CardLists.filter(typeList, CardPredicates.TAPPED); final int amount = this.getAbilityAmount(ability); return (typeList.size() != 0) && (typeList.size() >= amount); diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index 83a6245cead..a84b3ff50a4 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -26,7 +26,6 @@ import forge.game.ability.AbilityKey; import forge.game.ability.effects.AddTurnEffect; import forge.game.ability.effects.SkipPhaseEffect; import forge.game.card.*; -import forge.game.card.CardPredicates.Presets; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; import forge.game.cost.CostEnlist; @@ -185,7 +184,7 @@ public class PhaseHandler implements java.io.Serializable { game.getAction().resetActivationsPerTurn(); - final int lands = CardLists.count(playerTurn.getLandsInPlay(), Presets.UNTAPPED); + final int lands = CardLists.count(playerTurn.getLandsInPlay(), CardPredicates.UNTAPPED); playerTurn.setNumPowerSurgeLands(lands); } //update tokens @@ -287,7 +286,7 @@ public class PhaseHandler implements java.io.Serializable { } } // roll for attractions if we have any - if (Iterables.any(playerTurn.getCardsIn(ZoneType.Battlefield), Presets.ATTRACTIONS)) { + if (Iterables.any(playerTurn.getCardsIn(ZoneType.Battlefield), CardPredicates.ATTRACTIONS)) { playerTurn.rollToVisitAttractions(); } table.replaceCounterEffect(game, null, false); diff --git a/forge-game/src/main/java/forge/game/phase/Untap.java b/forge-game/src/main/java/forge/game/phase/Untap.java index 62ff222810c..b1a000dd657 100644 --- a/forge-game/src/main/java/forge/game/phase/Untap.java +++ b/forge-game/src/main/java/forge/game/phase/Untap.java @@ -34,7 +34,6 @@ import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardLists; import forge.game.card.CardPredicates; -import forge.game.card.CardPredicates.Presets; import forge.game.card.CardZoneTable; import forge.game.keyword.Keyword; import forge.game.keyword.KeywordInterface; @@ -113,7 +112,7 @@ public class Untap extends Phase { */ private void doUntap() { final Player player = game.getPhaseHandler().getPlayerTurn(); - final Predicate tappedCanUntap = Presets.TAPPED.and(CANUNTAP); + final Predicate tappedCanUntap = CardPredicates.TAPPED.and(CANUNTAP); Map untapMap = Maps.newHashMap(); CardCollection list = new CardCollection(player.getCardsIn(ZoneType.Battlefield)); diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 20428eb251b..4d0927210bb 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -30,7 +30,6 @@ import forge.game.ability.ApiType; import forge.game.ability.effects.DetachedCardEffect; import forge.game.ability.effects.RollDiceEffect; import forge.game.card.*; -import forge.game.card.CardPredicates.Presets; import forge.game.event.*; import forge.game.keyword.*; import forge.game.keyword.KeywordCollection.KeywordCollectionView; @@ -63,7 +62,6 @@ import org.apache.commons.lang3.tuple.Pair; import java.util.*; import java.util.Map.Entry; -import java.util.function.Predicate; /** *

@@ -2084,7 +2082,7 @@ public class Player extends GameEntity implements Comparable { } public final boolean hasMetalcraft() { - return CardLists.count(getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.ARTIFACTS) >= 3; + return CardLists.count(getCardsIn(ZoneType.Battlefield), CardPredicates.ARTIFACTS) >= 3; } public final boolean hasDesert() { @@ -2123,7 +2121,7 @@ public class Player extends GameEntity implements Comparable { } public final boolean hasLandfall() { - return Iterables.any(getZone(ZoneType.Battlefield).getCardsAddedThisTurn(null), CardPredicates.Presets.LANDS); + return Iterables.any(getZone(ZoneType.Battlefield).getCardsAddedThisTurn(null), CardPredicates.LANDS); } public boolean hasFerocious() { @@ -2436,29 +2434,29 @@ public class Player extends GameEntity implements Comparable { * use to get a list of creatures in play for a given player. */ public CardCollection getCreaturesInPlay() { - return CardLists.filter(getCardsIn(ZoneType.Battlefield), Presets.CREATURES); + return CardLists.filter(getCardsIn(ZoneType.Battlefield), CardPredicates.CREATURES); } public CardCollection getPlaneswalkersInPlay() { - return CardLists.filter(getCardsIn(ZoneType.Battlefield), Presets.PLANESWALKERS); + return CardLists.filter(getCardsIn(ZoneType.Battlefield), CardPredicates.PLANESWALKERS); } public CardCollection getBattlesInPlay() { - return CardLists.filter(getCardsIn(ZoneType.Battlefield), Presets.BATTLES); + return CardLists.filter(getCardsIn(ZoneType.Battlefield), CardPredicates.BATTLES); } /** * use to get a list of tokens in play for a given player. */ public CardCollection getTokensInPlay() { - return CardLists.filter(getCardsIn(ZoneType.Battlefield), Presets.TOKEN); + return CardLists.filter(getCardsIn(ZoneType.Battlefield), CardPredicates.TOKEN); } /** * use to get a list of all lands a given player has on the battlefield. */ public CardCollection getLandsInPlay() { - return CardLists.filter(getCardsIn(ZoneType.Battlefield), Presets.LANDS); + return CardLists.filter(getCardsIn(ZoneType.Battlefield), CardPredicates.LANDS); } public boolean isCardInPlay(final String cardName) { @@ -3596,7 +3594,7 @@ public class Player extends GameEntity implements Comparable { } public final boolean isCursed() { - return CardLists.count(getAttachedCards(), CardPredicates.Presets.CURSE) > 0; + return CardLists.count(getAttachedCards(), CardPredicates.CURSE) > 0; } public boolean canDiscardBy(SpellAbility sa, final boolean effect) { diff --git a/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java b/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java index 441d634e0b1..5831a95215b 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java +++ b/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java @@ -24,12 +24,12 @@ import java.util.Map; import java.util.TreeMap; import java.util.function.Predicate; +import forge.item.PaperCardPredicates; import forge.util.Iterables; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import forge.card.CardEdition; -import forge.item.IPaperCard; import forge.item.PaperCard; import forge.localinstance.properties.ForgeConstants; import forge.model.FModel; @@ -374,7 +374,7 @@ public class ImportSourceAnalyzer { cardFileNamesBySet = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); for (final CardEdition ce : FModel.getMagicDb().getEditions()) { final Map cardFileNames = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - final Predicate filter = IPaperCard.Predicates.printedInSet(ce.getCode()); + final Predicate filter = PaperCardPredicates.printedInSet(ce.getCode()); addSetCards(cardFileNames, FModel.getMagicDb().getCommonCards().getAllCards(), filter); addSetCards(cardFileNames, FModel.getMagicDb().getVariantCards().getAllCards(), filter); cardFileNamesBySet.put(ce.getCode2(), cardFileNames); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardPowerFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardPowerFilter.java index 224ce72e726..ffd3399bb6f 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardPowerFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardPowerFilter.java @@ -33,7 +33,7 @@ public class CardPowerFilter extends ValueRangeFilter { if (predicate == null) { return x -> true; } - predicate = predicate.and(CardRulesPredicates.Presets.IS_CREATURE); + predicate = predicate.and(CardRulesPredicates.IS_CREATURE); return Predicates.compose(predicate, PaperCard::getRules); } } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardToughnessFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardToughnessFilter.java index d6d186c07fc..6296314e184 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardToughnessFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/CardToughnessFilter.java @@ -33,7 +33,7 @@ public class CardToughnessFilter extends ValueRangeFilter { if (predicate == null) { return x -> true; } - predicate = predicate.and(CardRulesPredicates.Presets.IS_CREATURE); + predicate = predicate.and(CardRulesPredicates.IS_CREATURE); return Predicates.compose(predicate, PaperCard::getRules); } } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java index 20a289ea65c..240866dda5c 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/filters/StatTypeFilter.java @@ -59,7 +59,7 @@ public abstract class StatTypeFilter extends ToggleButt protected boolean showUnsupportedItem(U item) { FLabel btnPackOrDeck = buttonMap.get(StatTypes.PACK_OR_DECK); //support special pack/deck case if (btnPackOrDeck != null && btnPackOrDeck.isSelected()) { - return ItemPredicate.Presets.IS_PACK_OR_DECK.test(item); + return ItemPredicate.IS_PACK_OR_DECK.test(item); } return false; } @@ -70,7 +70,7 @@ public abstract class StatTypeFilter extends ToggleButt FLabel btnPackOrDeck = buttonMap.get(StatTypes.PACK_OR_DECK); if (btnPackOrDeck != null) { //support special pack/deck case - int count = items.countAll(ItemPredicate.Presets.IS_PACK_OR_DECK, InventoryItem.class); + int count = items.countAll(ItemPredicate.IS_PACK_OR_DECK, InventoryItem.class); btnPackOrDeck.setText(String.valueOf(count)); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CDeckgen.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CDeckgen.java index 638f70239b8..cd2b71af8c7 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CDeckgen.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CDeckgen.java @@ -70,7 +70,7 @@ public enum CDeckgen implements ICDoc { final Deck randomDeck = new Deck(); - final Predicate notBasicLand = Predicates.compose(CardRulesPredicates.Presets.NOT_BASIC_LAND, PaperCard::getRules); + final Predicate notBasicLand = Predicates.compose(CardRulesPredicates.NOT_BASIC_LAND, PaperCard::getRules); final Iterable source = Iterables.filter(FModel.getMagicDb().getCommonCards().getUniqueCards(), notBasicLand); randomDeck.getMain().addAllFlat(Aggregates.random(source, 15 * 5)); diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java index 114092f7fdb..39fda0ed516 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java @@ -82,14 +82,14 @@ public final class CEditorCommander extends CDeckEditor { CardDb commonCards = FModel.getMagicDb().getCommonCards(); if (gameType == GameType.Brawl){ GameFormat format = FModel.getFormats().get("Brawl"); - Predicate commanderFilter = CardRulesPredicates.Presets.CAN_BE_BRAWL_COMMANDER; + Predicate commanderFilter = CardRulesPredicates.CAN_BE_BRAWL_COMMANDER; commanderPool = ItemPool.createFrom(commonCards.getAllCardsNoAlt(format.getFilterPrinted().and(Predicates.compose(commanderFilter, PaperCard::getRules))), PaperCard.class); normalPool = ItemPool.createFrom(format.getAllCards(), PaperCard.class); } else { Predicate commanderFilter = gameType == GameType.Oathbreaker - ? CardRulesPredicates.Presets.CAN_BE_OATHBREAKER.or(CardRulesPredicates.Presets.CAN_BE_SIGNATURE_SPELL) - : CardRulesPredicates.Presets.CAN_BE_COMMANDER; + ? CardRulesPredicates.CAN_BE_OATHBREAKER.or(CardRulesPredicates.CAN_BE_SIGNATURE_SPELL) + : CardRulesPredicates.CAN_BE_COMMANDER; commanderPool = ItemPool.createFrom(commonCards.getAllCardsNoAlt(Predicates.compose(commanderFilter, PaperCard::getRules)),PaperCard.class); normalPool = ItemPool.createFrom(commonCards.getAllCardsNoAlt(), PaperCard.class); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index 74673727bd2..a9f3d572acf 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -346,7 +346,7 @@ public final class CEditorQuest extends CDeckEditor { } private ItemPool getCommanderCardPool(){ - Predicate commanderPredicate = Predicates.compose(CardRulesPredicates.Presets.CAN_BE_COMMANDER, PaperCard::getRules); + Predicate commanderPredicate = Predicates.compose(CardRulesPredicates.CAN_BE_COMMANDER, PaperCard::getRules); return getRemainingCardPool().getFilteredPool(commanderPredicate); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CStatistics.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CStatistics.java index 25f20ae4cf1..b57bed33111 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CStatistics.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CStatistics.java @@ -76,16 +76,16 @@ public enum CStatistics implements ICDoc { // Hack-ish: avoid /0 cases, but still populate labels :) if (total == 0) { total = 1; } - setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblCreature(), deck, CardRulesPredicates.Presets.IS_CREATURE, total); - setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblLand(), deck, CardRulesPredicates.Presets.IS_LAND, total); - setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblEnchantment(), deck, CardRulesPredicates.Presets.IS_ENCHANTMENT, total); - setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblArtifact(), deck, CardRulesPredicates.Presets.IS_ARTIFACT, total); - setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblInstant(), deck, CardRulesPredicates.Presets.IS_INSTANT, total); - setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblSorcery(), deck, CardRulesPredicates.Presets.IS_SORCERY, total); - setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblPlaneswalker(), deck, CardRulesPredicates.Presets.IS_PLANESWALKER, total); + setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblCreature(), deck, CardRulesPredicates.IS_CREATURE, total); + setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblLand(), deck, CardRulesPredicates.IS_LAND, total); + setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblEnchantment(), deck, CardRulesPredicates.IS_ENCHANTMENT, total); + setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblArtifact(), deck, CardRulesPredicates.IS_ARTIFACT, total); + setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblInstant(), deck, CardRulesPredicates.IS_INSTANT, total); + setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblSorcery(), deck, CardRulesPredicates.IS_SORCERY, total); + setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblPlaneswalker(), deck, CardRulesPredicates.IS_PLANESWALKER, total); - setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblMulti(), deck, CardRulesPredicates.Presets.IS_MULTICOLOR, total); - setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblColorless(), deck, CardRulesPredicates.Presets.IS_COLORLESS, total); + setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblMulti(), deck, CardRulesPredicates.IS_MULTICOLOR, total); + setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblColorless(), deck, CardRulesPredicates.IS_COLORLESS, total); setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblBlack(), deck, CardRulesPredicates.isMonoColor(MagicColor.BLACK), total); setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblBlue(), deck, CardRulesPredicates.isMonoColor(MagicColor.BLUE), total); setLabelValue(VStatistics.SINGLETON_INSTANCE.getLblGreen(), deck, CardRulesPredicates.isMonoColor(MagicColor.GREEN), total); diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CStatisticsImporter.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CStatisticsImporter.java index 7fe9be51257..7d54cecf340 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CStatisticsImporter.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CStatisticsImporter.java @@ -57,16 +57,16 @@ public class CStatisticsImporter { // Hack-ish: avoid /0 cases, but still populate labels :) if (total == 0) { total = 1; } - setLabelValue(this.view.getLblCreature(), deck, CardRulesPredicates.Presets.IS_CREATURE, total); - setLabelValue(this.view.getLblLand(), deck, CardRulesPredicates.Presets.IS_LAND, total); - setLabelValue(this.view.getLblEnchantment(), deck, CardRulesPredicates.Presets.IS_ENCHANTMENT, total); - setLabelValue(this.view.getLblArtifact(), deck, CardRulesPredicates.Presets.IS_ARTIFACT, total); - setLabelValue(this.view.getLblInstant(), deck, CardRulesPredicates.Presets.IS_INSTANT, total); - setLabelValue(this.view.getLblSorcery(), deck, CardRulesPredicates.Presets.IS_SORCERY, total); - setLabelValue(this.view.getLblPlaneswalker(), deck, CardRulesPredicates.Presets.IS_PLANESWALKER, total); + setLabelValue(this.view.getLblCreature(), deck, CardRulesPredicates.IS_CREATURE, total); + setLabelValue(this.view.getLblLand(), deck, CardRulesPredicates.IS_LAND, total); + setLabelValue(this.view.getLblEnchantment(), deck, CardRulesPredicates.IS_ENCHANTMENT, total); + setLabelValue(this.view.getLblArtifact(), deck, CardRulesPredicates.IS_ARTIFACT, total); + setLabelValue(this.view.getLblInstant(), deck, CardRulesPredicates.IS_INSTANT, total); + setLabelValue(this.view.getLblSorcery(), deck, CardRulesPredicates.IS_SORCERY, total); + setLabelValue(this.view.getLblPlaneswalker(), deck, CardRulesPredicates.IS_PLANESWALKER, total); - setLabelValue(this.view.getLblMulti(), deck, CardRulesPredicates.Presets.IS_MULTICOLOR, total); - setLabelValue(this.view.getLblColorless(), deck, CardRulesPredicates.Presets.IS_COLORLESS, total); + setLabelValue(this.view.getLblMulti(), deck, CardRulesPredicates.IS_MULTICOLOR, total); + setLabelValue(this.view.getLblColorless(), deck, CardRulesPredicates.IS_COLORLESS, total); setLabelValue(this.view.getLblBlack(), deck, CardRulesPredicates.isMonoColor(MagicColor.BLACK), total); setLabelValue(this.view.getLblBlue(), deck, CardRulesPredicates.isMonoColor(MagicColor.BLUE), total); setLabelValue(this.view.getLblGreen(), deck, CardRulesPredicates.isMonoColor(MagicColor.GREEN), total); diff --git a/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestCommanderGeneraterGA.java b/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestCommanderGeneraterGA.java index 43f55d30bfd..763c8f9388f 100644 --- a/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestCommanderGeneraterGA.java +++ b/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestCommanderGeneraterGA.java @@ -77,8 +77,8 @@ public class PlanarConquestCommanderGeneraterGA extends PlanarConquestGeneraterG Iterable filtered= Iterables.filter(cards, Predicates.compose(CardRulesPredicates.IS_KEPT_IN_AI_DECKS, PaperCard::getRules) - .and(Predicates.compose(CardRulesPredicates.Presets.IS_PLANESWALKER, PaperCard::getRules)) - //.and(Predicates.compose(CardRulesPredicates.Presets.IS_LEGENDARY, PaperCard::getRules)) + .and(Predicates.compose(CardRulesPredicates.IS_PLANESWALKER, PaperCard::getRules)) + //.and(Predicates.compose(CardRulesPredicates.IS_LEGENDARY, PaperCard::getRules)) .and(gameFormat.getFilterPrinted()) ); diff --git a/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestGeneraterGA.java b/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestGeneraterGA.java index 7a2534bfc25..8ec054c963b 100644 --- a/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestGeneraterGA.java +++ b/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestGeneraterGA.java @@ -107,7 +107,7 @@ public class PlanarConquestGeneraterGA extends AbstractGeneticAlgorithm { Iterable filtered= Iterables.filter(cards, Predicates.compose(CardRulesPredicates.IS_KEPT_IN_AI_DECKS, PaperCard::getRules) - .and(Predicates.compose(CardRulesPredicates.Presets.IS_NON_LAND, PaperCard::getRules)) + .and(Predicates.compose(CardRulesPredicates.IS_NON_LAND, PaperCard::getRules)) .and(gameFormat.getFilterPrinted()) ); diff --git a/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestTribalGeneraterGA.java b/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestTribalGeneraterGA.java index 59d110880b1..9c90a7ca876 100644 --- a/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestTribalGeneraterGA.java +++ b/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestTribalGeneraterGA.java @@ -80,7 +80,7 @@ public class PlanarConquestTribalGeneraterGA extends PlanarConquestGeneraterGA { Iterable filteredTribe= Iterables.filter(cards, Predicates.compose(CardRulesPredicates.IS_KEPT_IN_AI_DECKS, PaperCard::getRules) .and(Predicates.compose(CardRulesPredicates.hasCreatureType("Pirate"), PaperCard::getRules)) - .and(Predicates.compose(CardRulesPredicates.Presets.IS_CREATURE, PaperCard::getRules)) + .and(Predicates.compose(CardRulesPredicates.IS_CREATURE, PaperCard::getRules)) .and(gameFormat.getFilterPrinted()) ); diff --git a/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java b/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java index fffc91daedb..af16285b3cd 100644 --- a/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java +++ b/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java @@ -481,7 +481,7 @@ public class EnemySprite extends CharacterSprite implements Steerable { if(data.rewards != null) { //Collect standard rewards. Deck enemyDeck = Current.latestDeck(); // By popular demand, remove basic lands from the reward pool. - CardPool deckNoBasicLands = enemyDeck.getMain().getFilteredPool(Predicates.compose(CardRulesPredicates.Presets.NOT_BASIC_LAND, PaperCard::getRules)); + CardPool deckNoBasicLands = enemyDeck.getMain().getFilteredPool(Predicates.compose(CardRulesPredicates.NOT_BASIC_LAND, PaperCard::getRules)); for (RewardData rdata : data.rewards) { ret.addAll(rdata.generate(false, enemyDeck == null ? null : deckNoBasicLands.toFlatList(),true )); diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/CardPowerFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/CardPowerFilter.java index 7c9a21b6836..cab9fd8ba73 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/CardPowerFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/CardPowerFilter.java @@ -30,7 +30,7 @@ public class CardPowerFilter extends ValueRangeFilter { if (predicate == null) { return x -> true; } - predicate = predicate.and(CardRulesPredicates.Presets.IS_CREATURE); + predicate = predicate.and(CardRulesPredicates.IS_CREATURE); return Predicates.compose(predicate, PaperCard::getRules); } } diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/CardToughnessFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/CardToughnessFilter.java index 70cac770f7e..421cdbead0f 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/CardToughnessFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/CardToughnessFilter.java @@ -30,7 +30,7 @@ public class CardToughnessFilter extends ValueRangeFilter { if (predicate == null) { return x -> true; } - predicate = predicate.and(CardRulesPredicates.Presets.IS_CREATURE); + predicate = predicate.and(CardRulesPredicates.IS_CREATURE); return Predicates.compose(predicate, PaperCard::getRules); } } diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/StatTypeFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/StatTypeFilter.java index 430f8f389e7..0966ed1e010 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/StatTypeFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/StatTypeFilter.java @@ -37,7 +37,7 @@ public abstract class StatTypeFilter extends ToggleButt protected boolean showUnsupportedItem(U item) { FLabel btnPackOrDeck = buttonMap.get(StatTypes.PACK_OR_DECK); //support special pack/deck case if (btnPackOrDeck != null && btnPackOrDeck.isSelected()) { - return ItemPredicate.Presets.IS_PACK_OR_DECK.test(item); + return ItemPredicate.IS_PACK_OR_DECK.test(item); } return false; } diff --git a/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java b/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java index 9e5028a05ba..0dff136bd7a 100644 --- a/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java +++ b/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java @@ -74,7 +74,7 @@ public final class CardRelationMatrixGenerator { true); final Iterable cards = Iterables.filter(format.getAllCards() - , Predicates.compose(CardRulesPredicates.Presets.NOT_TRUE_BASIC_LAND, PaperCard::getRules)); + , Predicates.compose(CardRulesPredicates.NOT_TRUE_BASIC_LAND, PaperCard::getRules)); List cardList = Lists.newArrayList(cards); cardList.add(FModel.getMagicDb().getCommonCards().getCard("Wastes")); Map cardIntegerMap = new HashMap<>(); @@ -90,7 +90,7 @@ public final class CardRelationMatrixGenerator { for (Deck deck:decks){ if (deck.getMain().contains(card)){ for (PaperCard pairCard:Iterables.filter(deck.getMain().toFlatList(), - Predicates.compose(CardRulesPredicates.Presets.NOT_TRUE_BASIC_LAND, PaperCard::getRules))){ + Predicates.compose(CardRulesPredicates.NOT_TRUE_BASIC_LAND, PaperCard::getRules))){ if (!pairCard.getName().equals(card.getName())){ try { int old = matrix[cardIntegerMap.get(card.getName())][cardIntegerMap.get(pairCard.getName())]; @@ -143,7 +143,7 @@ public final class CardRelationMatrixGenerator { //get all cards final Iterable cards = Iterables.filter(FModel.getMagicDb().getCommonCards().getUniqueCards() - , Predicates.compose(CardRulesPredicates.Presets.NOT_TRUE_BASIC_LAND, PaperCard::getRules)); + , Predicates.compose(CardRulesPredicates.NOT_TRUE_BASIC_LAND, PaperCard::getRules)); List cardList = Lists.newArrayList(cards); cardList.add(FModel.getMagicDb().getCommonCards().getCard("Wastes")); Map cardIntegerMap = new HashMap<>(); @@ -200,7 +200,7 @@ public final class CardRelationMatrixGenerator { public static void updateLegendMatrix(Deck deck, PaperCard legend, Map cardIntegerMap, Map legendIntegerMap, int[][] matrix){ for (PaperCard pairCard:Iterables.filter(deck.getMain().toFlatList(), - Predicates.compose(CardRulesPredicates.Presets.NOT_TRUE_BASIC_LAND, PaperCard::getRules))){ + Predicates.compose(CardRulesPredicates.NOT_TRUE_BASIC_LAND, PaperCard::getRules))){ if (!pairCard.getName().equals(legend.getName())){ try { int old = matrix[legendIntegerMap.get(legend.getName())][cardIntegerMap.get(pairCard.getName())]; diff --git a/forge-gui/src/main/java/forge/deck/CommanderDeckGenerator.java b/forge-gui/src/main/java/forge/deck/CommanderDeckGenerator.java index 84aef7ff47a..64861c96cf8 100644 --- a/forge-gui/src/main/java/forge/deck/CommanderDeckGenerator.java +++ b/forge-gui/src/main/java/forge/deck/CommanderDeckGenerator.java @@ -65,7 +65,7 @@ public class CommanderDeckGenerator extends DeckProxy implements Comparable canPlay = isForAi ? DeckGeneratorBase.AI_CAN_PLAY : CardRulesPredicates.IS_KEPT_IN_RANDOM_DECKS; @SuppressWarnings("unchecked") Iterable legends = Iterables.filter(uniqueCards.toFlatList(), format.isLegalCardPredicate() - .and(Predicates.compose(CardRulesPredicates.Presets.CAN_BE_BRAWL_COMMANDER.and(canPlay), PaperCard::getRules))); + .and(Predicates.compose(CardRulesPredicates.CAN_BE_BRAWL_COMMANDER.and(canPlay), PaperCard::getRules))); final List decks = new ArrayList<>(); for (PaperCard legend: legends) { decks.add(new CommanderDeckGenerator(legend, format, isForAi, isCardGen)); diff --git a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java index ac47b4f4f4a..24f9795babc 100644 --- a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java +++ b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java @@ -10,6 +10,7 @@ import java.util.Map; import java.util.Set; import java.util.function.Predicate; +import forge.item.PaperCardPredicates; import forge.util.*; import org.apache.commons.lang3.tuple.Pair; @@ -61,7 +62,7 @@ public class DeckgenUtil { try { List keys = new ArrayList<>(CardArchetypeLDAGenerator.ldaPools.get(format.getName()).keySet()); String randomKey = keys.get( MyRandom.getRandom().nextInt(keys.size()) ); - Predicate cardFilter = format.getFilterPrinted().and(PaperCard.Predicates.name(randomKey)); + Predicate cardFilter = format.getFilterPrinted().and(PaperCardPredicates.name(randomKey)); PaperCard keyCard = FModel.getMagicDb().getCommonCards().getAllCards(cardFilter).get(0); return buildCardGenDeck(keyCard,format,isForAI); @@ -73,7 +74,7 @@ public class DeckgenUtil { public static Deck buildCardGenDeck(String cardName, GameFormat format, boolean isForAI){ try { - Predicate cardFilter = format.getFilterPrinted().and(PaperCard.Predicates.name(cardName)); + Predicate cardFilter = format.getFilterPrinted().and(PaperCardPredicates.name(cardName)); return buildCardGenDeck(FModel.getMagicDb().getCommonCards().getAllCards(cardFilter).get(0),format,isForAI); }catch (Exception e){ e.printStackTrace(); @@ -214,8 +215,8 @@ public class DeckgenUtil { System.out.println("Wrong card count "+deck.getMain().countAll()); deck=buildLDACArchetypeDeck(format,isForAI); } - if(deck.getMain().countAll(Predicates.compose(CardRulesPredicates.Presets.IS_LAND, PaperCard::getRules))>27){ - System.out.println("Too many lands "+deck.getMain().countAll(Predicates.compose(CardRulesPredicates.Presets.IS_LAND, PaperCard::getRules))); + if(deck.getMain().countAll(Predicates.compose(CardRulesPredicates.IS_LAND, PaperCard::getRules))>27){ + System.out.println("Too many lands "+deck.getMain().countAll(Predicates.compose(CardRulesPredicates.IS_LAND, PaperCard::getRules))); deck=buildLDACArchetypeDeck(format,isForAI); } while(deck.get(DeckSection.Sideboard).countAll()>15){ @@ -313,8 +314,8 @@ public class DeckgenUtil { System.out.println("Wrong card count "+deck.getMain().countAll()); deck=buildLDACArchetypeDeck(format,isForAI); } - if(deck.getMain().countAll(Predicates.compose(CardRulesPredicates.Presets.IS_LAND, PaperCard::getRules))>27){ - System.out.println("Too many lands "+deck.getMain().countAll(Predicates.compose(CardRulesPredicates.Presets.IS_LAND, PaperCard::getRules))); + if(deck.getMain().countAll(Predicates.compose(CardRulesPredicates.IS_LAND, PaperCard::getRules))>27){ + System.out.println("Too many lands "+deck.getMain().countAll(Predicates.compose(CardRulesPredicates.IS_LAND, PaperCard::getRules))); deck=buildLDACArchetypeDeck(format,isForAI); } while(deck.get(DeckSection.Sideboard).countAll()>15){ @@ -841,7 +842,7 @@ public class DeckgenUtil { // determine how many additional lands we need, but don't take lands already in deck into consideration, // or we risk incorrectly determining the target deck size - int numLands = Iterables.size(Iterables.filter(cards, Predicates.compose(CardRulesPredicates.Presets.IS_LAND, PaperCard::getRules))); + int numLands = Iterables.size(Iterables.filter(cards, Predicates.compose(CardRulesPredicates.IS_LAND, PaperCard::getRules))); int sizeNoLands = cards.size() - numLands; // attempt to determine if building for sealed, constructed or EDH diff --git a/forge-gui/src/main/java/forge/gamemodes/limited/CardThemedDeckBuilder.java b/forge-gui/src/main/java/forge/gamemodes/limited/CardThemedDeckBuilder.java index a2a6f57402f..20a56efed60 100644 --- a/forge-gui/src/main/java/forge/gamemodes/limited/CardThemedDeckBuilder.java +++ b/forge-gui/src/main/java/forge/gamemodes/limited/CardThemedDeckBuilder.java @@ -30,6 +30,7 @@ import forge.deck.generation.IDeckGenPool; import forge.game.GameFormat; import forge.item.IPaperCard; import forge.item.PaperCard; +import forge.item.PaperCardPredicates; import forge.localinstance.properties.ForgePreferences; import forge.model.FModel; import forge.util.Iterables; @@ -192,8 +193,8 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { Predicates.compose(hasColor, PaperCard::getRules)); rankedColorList = Lists.newArrayList(colorList); onColorCreaturesAndSpells = Iterables.filter(rankedColorList, - Predicates.compose(CardRulesPredicates.Presets.IS_CREATURE - .or(CardRulesPredicates.Presets.IS_NON_CREATURE_SPELL), PaperCard::getRules)); + Predicates.compose(CardRulesPredicates.IS_CREATURE + .or(CardRulesPredicates.IS_NON_CREATURE_SPELL), PaperCard::getRules)); // Guava iterables do not copy the collection contents, instead they act // as filters and iterate over _source_ collection each time. So even if @@ -320,7 +321,7 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { final CardPool cp = result.getOrCreate(DeckSection.Sideboard); Iterable potentialSideboard = Iterables.filter(aiPlayables, Predicates.compose(hasColor, PaperCard::getRules) - .and(Predicates.compose(CardRulesPredicates.Presets.IS_NON_LAND, PaperCard::getRules))); + .and(Predicates.compose(CardRulesPredicates.IS_NON_LAND, PaperCard::getRules))); int i=0; while(i<15 && potentialSideboard.iterator().hasNext()){ PaperCard sbCard = potentialSideboard.iterator().next(); @@ -391,7 +392,7 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { protected void addKeyCards(){ // Add the first keycard if not land if(!keyCard.getRules().getMainPart().getType().isLand()) { - keyCards = Iterables.filter(aiPlayables,PaperCard.Predicates.name(keyCard.getName())); + keyCards = Iterables.filter(aiPlayables, PaperCardPredicates.name(keyCard.getName())); final List keyCardList = Lists.newArrayList(keyCards); deckList.addAll(keyCardList); aiPlayables.removeAll(keyCardList); @@ -399,7 +400,7 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { } // Add the second keycard if not land if(secondKeyCard!=null && !secondKeyCard.getRules().getMainPart().getType().isLand()) { - Iterable secondKeyCards = Iterables.filter(aiPlayables,PaperCard.Predicates.name(secondKeyCard.getName())); + Iterable secondKeyCards = Iterables.filter(aiPlayables, PaperCardPredicates.name(secondKeyCard.getName())); final List keyCardList = Lists.newArrayList(secondKeyCards); deckList.addAll(keyCardList); aiPlayables.removeAll(keyCardList); @@ -410,7 +411,7 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { protected void addLandKeyCards(){ // Add the deck card if(keyCard.getRules().getMainPart().getType().isLand()) { - keyCards = Iterables.filter(aiPlayables,PaperCard.Predicates.name(keyCard.getName())); + keyCards = Iterables.filter(aiPlayables, PaperCardPredicates.name(keyCard.getName())); final List keyCardList = Lists.newArrayList(keyCards); deckList.addAll(keyCardList); aiPlayables.removeAll(keyCardList); @@ -419,7 +420,7 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { } // Add the deck card if(secondKeyCard!=null && secondKeyCard.getRules().getMainPart().getType().isLand()) { - Iterable secondKeyCards = Iterables.filter(aiPlayables,PaperCard.Predicates.name(secondKeyCard.getName())); + Iterable secondKeyCards = Iterables.filter(aiPlayables, PaperCardPredicates.name(secondKeyCard.getName())); final List keyCardList = Lists.newArrayList(secondKeyCards); deckList.addAll(keyCardList); aiPlayables.removeAll(keyCardList); @@ -445,7 +446,7 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { * If evolving wilds is in the deck and there are fewer than 4 spaces for basic lands - remove evolving wilds */ protected void checkEvolvingWilds(){ - List evolvingWilds = Lists.newArrayList(Iterables.filter(deckList,PaperCard.Predicates.name("Evolving Wilds"))); + List evolvingWilds = Lists.newArrayList(Iterables.filter(deckList, PaperCardPredicates.name("Evolving Wilds"))); if((evolvingWilds.size()>0 && landsNeeded<4 ) || colors.countColors()<2){ deckList.removeAll(evolvingWilds); landsNeeded=landsNeeded+evolvingWilds.size(); @@ -462,7 +463,7 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { protected void addThirdColorCards(int num) { if (num > 0) { final Iterable others = Iterables.filter(aiPlayables, - Predicates.compose(CardRulesPredicates.Presets.IS_NON_LAND, PaperCard::getRules)); + Predicates.compose(CardRulesPredicates.IS_NON_LAND, PaperCard::getRules)); // We haven't yet ranked the off-color cards. // Compare them to the cards already in the deckList. //List rankedOthers = CardRanker.rankCardsInPack(others, deckList, colors, true); @@ -476,7 +477,7 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { } } - hasColor = CardRulesPredicates.Presets.IS_NON_LAND.and(new MatchColorIdentity(colors) + hasColor = CardRulesPredicates.IS_NON_LAND.and(new MatchColorIdentity(colors) .or(DeckGeneratorBase.COLORLESS_CARDS)); final Iterable threeColorList = Iterables.filter(aiPlayables, Predicates.compose(hasColor, PaperCard::getRules)); @@ -499,7 +500,7 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { protected void addLowCMCCard(){ final Iterable nonLands = Iterables.filter(rankedColorList, - Predicates.compose(CardRulesPredicates.Presets.IS_NON_LAND, PaperCard::getRules)); + Predicates.compose(CardRulesPredicates.IS_NON_LAND, PaperCard::getRules)); final PaperCard card = Iterables.getFirst(nonLands, null); if (card != null) { deckList.add(card); @@ -521,10 +522,10 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { protected boolean setBasicLandPool(String edition){ Predicate isSetBasicLand; if (edition !=null){ - isSetBasicLand = IPaperCard.Predicates.printedInSet(edition) - .and(Predicates.compose(CardRulesPredicates.Presets.IS_BASIC_LAND, PaperCard::getRules)); + isSetBasicLand = PaperCardPredicates.printedInSet(edition) + .and(Predicates.compose(CardRulesPredicates.IS_BASIC_LAND, PaperCard::getRules)); }else{ - isSetBasicLand = Predicates.compose(CardRulesPredicates.Presets.IS_BASIC_LAND, PaperCard::getRules); + isSetBasicLand = Predicates.compose(CardRulesPredicates.IS_BASIC_LAND, PaperCard::getRules); } landPool = new DeckGenPool(format.getCardPool(fullCardDB).getAllCards(isSetBasicLand)); @@ -667,7 +668,7 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { */ private void addLands(final int[] clrCnts) { // basic lands that are available in the deck - final Iterable basicLands = Iterables.filter(aiPlayables, Predicates.compose(CardRulesPredicates.Presets.IS_BASIC_LAND, PaperCard::getRules)); + final Iterable basicLands = Iterables.filter(aiPlayables, Predicates.compose(CardRulesPredicates.IS_BASIC_LAND, PaperCard::getRules)); // total of all ClrCnts int totalColor = 0; @@ -809,7 +810,7 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { */ private void addNonBasicLands() { Iterable lands = Iterables.filter(aiPlayables, - Predicates.compose(CardRulesPredicates.Presets.IS_NONBASIC_LAND, PaperCard::getRules)); + Predicates.compose(CardRulesPredicates.IS_NONBASIC_LAND, PaperCard::getRules)); List landsToAdd = new ArrayList<>(); int minBasics;//Keep a minimum number of basics to ensure playable decks if(colors.isColorless()) { @@ -823,7 +824,7 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { } lands = Iterables.filter(aiPlayables, - Predicates.compose(CardRulesPredicates.Presets.IS_NONBASIC_LAND, PaperCard::getRules)); + Predicates.compose(CardRulesPredicates.IS_NONBASIC_LAND, PaperCard::getRules)); for (final PaperCard card : lands) { if (landsNeeded > minBasics) { @@ -923,7 +924,7 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { for (int i = 1; i < 7; i++) { creatureCosts.put(i, 0); } - final Predicate filter = Predicates.compose(CardRulesPredicates.Presets.IS_CREATURE, + final Predicate filter = Predicates.compose(CardRulesPredicates.IS_CREATURE, PaperCard::getRules); for (final IPaperCard creature : Iterables.filter(deckList, filter)) { int cmc = creature.getRules().getManaCost().getCMC(); diff --git a/forge-gui/src/main/java/forge/gamemodes/limited/LimitedDeckBuilder.java b/forge-gui/src/main/java/forge/gamemodes/limited/LimitedDeckBuilder.java index bc74e36f859..3c5ecd08330 100644 --- a/forge-gui/src/main/java/forge/gamemodes/limited/LimitedDeckBuilder.java +++ b/forge-gui/src/main/java/forge/gamemodes/limited/LimitedDeckBuilder.java @@ -139,16 +139,16 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { Predicates.compose(hasColor, PaperCard::getRules)); rankedColorList = CardRanker.rankCardsInDeck(colorList); onColorCreatures = Iterables.filter(rankedColorList, - Predicates.compose(CardRulesPredicates.Presets.IS_CREATURE, PaperCard::getRules)); + Predicates.compose(CardRulesPredicates.IS_CREATURE, PaperCard::getRules)); onColorNonCreatures = Iterables.filter(rankedColorList, - Predicates.compose(CardRulesPredicates.Presets.IS_NON_CREATURE_SPELL, PaperCard::getRules)); + Predicates.compose(CardRulesPredicates.IS_NON_CREATURE_SPELL, PaperCard::getRules)); // Guava iterables do not copy the collection contents, instead they act // as filters and iterate over _source_ collection each time. So even if // aiPlayable has changed, there is no need to create a new iterable. // 2. Add any planeswalkers final Iterable onColorWalkers = Iterables.filter(colorList, - Predicates.compose(CardRulesPredicates.Presets.IS_PLANESWALKER, PaperCard::getRules)); + Predicates.compose(CardRulesPredicates.IS_PLANESWALKER, PaperCard::getRules)); final List walkers = Lists.newArrayList(onColorWalkers); deckList.addAll(walkers); aiPlayables.removeAll(walkers); @@ -171,7 +171,7 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { // an extra. if (deckList.size() == numSpellsNeeded && getAverageCMC(deckList) < 4) { final Iterable nonLands = Iterables.filter(rankedColorList, - Predicates.compose(CardRulesPredicates.Presets.IS_NON_LAND, PaperCard::getRules)); + Predicates.compose(CardRulesPredicates.IS_NON_LAND, PaperCard::getRules)); final PaperCard card = Iterables.getFirst(nonLands, null); if (card != null) { deckList.add(card); @@ -342,7 +342,7 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { */ private void addLands(final int[] clrCnts, final String landSetCode) { // basic lands that are available in the deck - final Iterable basicLands = Iterables.filter(aiPlayables, Predicates.compose(CardRulesPredicates.Presets.IS_BASIC_LAND, PaperCard::getRules)); + final Iterable basicLands = Iterables.filter(aiPlayables, Predicates.compose(CardRulesPredicates.IS_BASIC_LAND, PaperCard::getRules)); final Set snowLands = new HashSet<>(); // total of all ClrCnts @@ -455,7 +455,7 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { */ private void addNonBasicLands() { final Iterable lands = Iterables.filter(aiPlayables, - Predicates.compose(CardRulesPredicates.Presets.IS_NONBASIC_LAND, PaperCard::getRules)); + Predicates.compose(CardRulesPredicates.IS_NONBASIC_LAND, PaperCard::getRules)); List landsToAdd = new ArrayList<>(); for (final PaperCard card : lands) { if (landsNeeded > 0) { @@ -483,7 +483,7 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { private void addThirdColorCards(int num) { if (num > 0) { final Iterable others = Iterables.filter(aiPlayables, - Predicates.compose(CardRulesPredicates.Presets.IS_NON_LAND, PaperCard::getRules)); + Predicates.compose(CardRulesPredicates.IS_NON_LAND, PaperCard::getRules)); // We haven't yet ranked the off-color cards. // Compare them to the cards already in the deckList. List rankedOthers = CardRanker.rankCardsInPack(others, deckList, colors, true); @@ -526,7 +526,7 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { */ private void addRandomCards(int num) { final Iterable others = Iterables.filter(aiPlayables, - Predicates.compose(CardRulesPredicates.Presets.IS_NON_LAND, PaperCard::getRules)); + Predicates.compose(CardRulesPredicates.IS_NON_LAND, PaperCard::getRules)); List toAdd = new ArrayList<>(); for (final PaperCard card : others) { if (num > 0) { @@ -669,7 +669,7 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { for (int i = 1; i < 7; i++) { creatureCosts.put(i, 0); } - final Predicate filter = Predicates.compose(CardRulesPredicates.Presets.IS_CREATURE, + final Predicate filter = Predicates.compose(CardRulesPredicates.IS_CREATURE, PaperCard::getRules); for (final IPaperCard creature : Iterables.filter(deckList, filter)) { int cmc = creature.getRules().getManaCost().getCMC(); diff --git a/forge-gui/src/main/java/forge/gamemodes/limited/SealedDeckBuilder.java b/forge-gui/src/main/java/forge/gamemodes/limited/SealedDeckBuilder.java index 3e1e1c8c987..346f6a7ec83 100644 --- a/forge-gui/src/main/java/forge/gamemodes/limited/SealedDeckBuilder.java +++ b/forge-gui/src/main/java/forge/gamemodes/limited/SealedDeckBuilder.java @@ -43,11 +43,11 @@ public class SealedDeckBuilder extends LimitedDeckBuilder { Iterable rules = Iterables.transform(colorChooserList, PaperCard::getRules); - int white = Iterables.size(Iterables.filter(rules, CardRulesPredicates.Presets.IS_WHITE)); - int blue = Iterables.size(Iterables.filter(rules, CardRulesPredicates.Presets.IS_BLUE)); - int black = Iterables.size(Iterables.filter(rules, CardRulesPredicates.Presets.IS_BLACK)); - int red = Iterables.size(Iterables.filter(rules, CardRulesPredicates.Presets.IS_RED)); - int green = Iterables.size(Iterables.filter(rules, CardRulesPredicates.Presets.IS_GREEN)); + int white = Iterables.size(Iterables.filter(rules, CardRulesPredicates.IS_WHITE)); + int blue = Iterables.size(Iterables.filter(rules, CardRulesPredicates.IS_BLUE)); + int black = Iterables.size(Iterables.filter(rules, CardRulesPredicates.IS_BLACK)); + int red = Iterables.size(Iterables.filter(rules, CardRulesPredicates.IS_RED)); + int green = Iterables.size(Iterables.filter(rules, CardRulesPredicates.IS_GREEN)); final int[] colorCounts = { white, blue, black, red, green }; int[] countsCopy = Arrays.copyOf(colorCounts, 5); diff --git a/forge-gui/src/main/java/forge/gamemodes/limited/WinstonDraft.java b/forge-gui/src/main/java/forge/gamemodes/limited/WinstonDraft.java index 3b8df8b73ff..ec0439ce7b2 100644 --- a/forge-gui/src/main/java/forge/gamemodes/limited/WinstonDraft.java +++ b/forge-gui/src/main/java/forge/gamemodes/limited/WinstonDraft.java @@ -9,6 +9,7 @@ import java.util.function.Supplier; import forge.deck.CardPool; import forge.deck.Deck; import forge.item.PaperCard; +import forge.item.PaperCardPredicates; import forge.util.Iterables; import forge.util.MyRandom; @@ -40,7 +41,7 @@ public class WinstonDraft extends BoosterDraft { for (final Supplier> supply : this.product) { for (int j = 0; j < NUM_PLAYERS; j++) { // Remove Basic Lands from draft for simplicity - for (final PaperCard paperCard : Iterables.filter(supply.get(), PaperCard.Predicates.Presets.IS_BASIC_LAND.negate())) { + for (final PaperCard paperCard : Iterables.filter(supply.get(), PaperCardPredicates.IS_BASIC_LAND.negate())) { this.deck.add(paperCard); } } diff --git a/forge-gui/src/main/java/forge/gamemodes/quest/BoosterUtils.java b/forge-gui/src/main/java/forge/gamemodes/quest/BoosterUtils.java index 5d543587e8e..f5888cb9d93 100644 --- a/forge-gui/src/main/java/forge/gamemodes/quest/BoosterUtils.java +++ b/forge-gui/src/main/java/forge/gamemodes/quest/BoosterUtils.java @@ -25,6 +25,7 @@ import java.util.Comparator; import java.util.List; import java.util.function.Predicate; +import forge.item.*; import forge.util.Iterables; import forge.util.Predicates; import org.apache.commons.lang3.StringUtils; @@ -38,12 +39,6 @@ import forge.card.MagicColor; import forge.card.PrintSheet; import forge.game.GameFormat; import forge.gamemodes.quest.data.QuestPreferences.QPref; -import forge.item.BoosterPack; -import forge.item.IPaperCard; -import forge.item.IPaperCard.Predicates.Presets; -import forge.item.InventoryItem; -import forge.item.PaperCard; -import forge.item.TournamentPack; import forge.model.FModel; import forge.util.Aggregates; import forge.util.MyRandom; @@ -142,18 +137,18 @@ public final class BoosterUtils { } final boolean allowDuplicates = userPrefs != null && userPrefs.allowDuplicates(); - final boolean mythicsAvailable = Iterables.any(cardPool, Presets.IS_MYTHIC_RARE); + final boolean mythicsAvailable = Iterables.any(cardPool, PaperCardPredicates.IS_MYTHIC_RARE); final int numMythics = mythicsAvailable ? numRares / RARES_PER_MYTHIC : 0; final int adjustedRares = numRares - numMythics; final List> colorFilters = getColorFilters(userPrefs, cardPool); - cards.addAll(BoosterUtils.generateCards(cardPool, Presets.IS_COMMON, numCommons, colorFilters, allowDuplicates)); - cards.addAll(BoosterUtils.generateCards(cardPool, Presets.IS_UNCOMMON, numUncommons, colorFilters, allowDuplicates)); - cards.addAll(BoosterUtils.generateCards(cardPool, Presets.IS_RARE, adjustedRares, colorFilters, allowDuplicates)); + cards.addAll(BoosterUtils.generateCards(cardPool, PaperCardPredicates.IS_COMMON, numCommons, colorFilters, allowDuplicates)); + cards.addAll(BoosterUtils.generateCards(cardPool, PaperCardPredicates.IS_UNCOMMON, numUncommons, colorFilters, allowDuplicates)); + cards.addAll(BoosterUtils.generateCards(cardPool, PaperCardPredicates.IS_RARE, adjustedRares, colorFilters, allowDuplicates)); if (numMythics > 0) { - cards.addAll(BoosterUtils.generateCards(cardPool, Presets.IS_MYTHIC_RARE, numMythics, colorFilters, allowDuplicates)); + cards.addAll(BoosterUtils.generateCards(cardPool, PaperCardPredicates.IS_MYTHIC_RARE, numMythics, colorFilters, allowDuplicates)); } return cards; @@ -271,7 +266,7 @@ public final class BoosterUtils { predicate = CardRulesPredicates.hasColor(color); } if (MyRandom.getRandom().nextDouble() < 0.1) { - predicate = predicate.and(CardRulesPredicates.Presets.IS_MULTICOLOR); + predicate = predicate.and(CardRulesPredicates.IS_MULTICOLOR); } colorFilters.add(predicate); } @@ -303,7 +298,7 @@ public final class BoosterUtils { //Add artifacts here if there's no colorless selection if (i % 8 == 0 && !preferredColors.contains(MagicColor.COLORLESS) && includeArtifacts) { - colorFilters.add(CardRulesPredicates.Presets.IS_ARTIFACT); + colorFilters.add(CardRulesPredicates.IS_ARTIFACT); } else if (i % 5 == 0) { //If colorless is the only color selected, add a small chance to get Phyrexian mana cost cards. @@ -328,7 +323,7 @@ public final class BoosterUtils { //Try to get multicolored cards that fit into the preferred colors. Predicate predicateRules = CardRulesPredicates.isColor(preferredColors.get(index)) - .and(CardRulesPredicates.Presets.IS_MULTICOLOR); + .and(CardRulesPredicates.IS_MULTICOLOR); Predicate predicateCard = Predicates.compose(predicateRules, PaperCard::getRules); //Adjust for the number of multicolored possibilities. This prevents flooding of non-selected @@ -351,7 +346,7 @@ public final class BoosterUtils { for (Byte color : otherColors) { if (i % 6 == 0) { - colorFilters.add(CardRulesPredicates.isColor(color).and(CardRulesPredicates.Presets.IS_MULTICOLOR)); + colorFilters.add(CardRulesPredicates.isColor(color).and(CardRulesPredicates.IS_MULTICOLOR)); } else { colorFilters.add(CardRulesPredicates.isMonoColor(color)); } @@ -448,21 +443,21 @@ public final class BoosterUtils { return null; } - if (input.equalsIgnoreCase("black")) return CardRulesPredicates.Presets.IS_BLACK; - if (input.equalsIgnoreCase("blue")) return CardRulesPredicates.Presets.IS_BLUE; - if (input.equalsIgnoreCase("green")) return CardRulesPredicates.Presets.IS_GREEN; - if (input.equalsIgnoreCase("red")) return CardRulesPredicates.Presets.IS_RED; - if (input.equalsIgnoreCase("white")) return CardRulesPredicates.Presets.IS_WHITE; - if (input.equalsIgnoreCase("colorless")) return CardRulesPredicates.Presets.IS_COLORLESS; - if (input.equalsIgnoreCase("multicolor")) return CardRulesPredicates.Presets.IS_MULTICOLOR; + if (input.equalsIgnoreCase("black")) return CardRulesPredicates.IS_BLACK; + if (input.equalsIgnoreCase("blue")) return CardRulesPredicates.IS_BLUE; + if (input.equalsIgnoreCase("green")) return CardRulesPredicates.IS_GREEN; + if (input.equalsIgnoreCase("red")) return CardRulesPredicates.IS_RED; + if (input.equalsIgnoreCase("white")) return CardRulesPredicates.IS_WHITE; + if (input.equalsIgnoreCase("colorless")) return CardRulesPredicates.IS_COLORLESS; + if (input.equalsIgnoreCase("multicolor")) return CardRulesPredicates.IS_MULTICOLOR; - if (input.equalsIgnoreCase("land")) return CardRulesPredicates.Presets.IS_LAND; - if (input.equalsIgnoreCase("creature")) return CardRulesPredicates.Presets.IS_CREATURE; - if (input.equalsIgnoreCase("artifact")) return CardRulesPredicates.Presets.IS_ARTIFACT; - if (input.equalsIgnoreCase("planeswalker")) return CardRulesPredicates.Presets.IS_PLANESWALKER; - if (input.equalsIgnoreCase("instant")) return CardRulesPredicates.Presets.IS_INSTANT; - if (input.equalsIgnoreCase("sorcery")) return CardRulesPredicates.Presets.IS_SORCERY; - if (input.equalsIgnoreCase("enchantment")) return CardRulesPredicates.Presets.IS_ENCHANTMENT; + if (input.equalsIgnoreCase("land")) return CardRulesPredicates.IS_LAND; + if (input.equalsIgnoreCase("creature")) return CardRulesPredicates.IS_CREATURE; + if (input.equalsIgnoreCase("artifact")) return CardRulesPredicates.IS_ARTIFACT; + if (input.equalsIgnoreCase("planeswalker")) return CardRulesPredicates.IS_PLANESWALKER; + if (input.equalsIgnoreCase("instant")) return CardRulesPredicates.IS_INSTANT; + if (input.equalsIgnoreCase("sorcery")) return CardRulesPredicates.IS_SORCERY; + if (input.equalsIgnoreCase("enchantment")) return CardRulesPredicates.IS_ENCHANTMENT; throw new IllegalArgumentException("No CardRules limitations could be parsed from: " + input); } @@ -483,7 +478,7 @@ public final class BoosterUtils { final int qty = Integer.parseInt(temp[0]); List> preds = new ArrayList<>(); - preds.add(IPaperCard.Predicates.Presets.IS_RARE_OR_MYTHIC); // Determine rarity + preds.add(PaperCardPredicates.IS_RARE_OR_MYTHIC); // Determine rarity if (temp.length > 2) { Predicate cr = parseRulesLimitation(temp[1]); diff --git a/forge-gui/src/main/java/forge/gamemodes/quest/QuestRewardCard.java b/forge-gui/src/main/java/forge/gamemodes/quest/QuestRewardCard.java index 5475c4af726..37e0f34913d 100644 --- a/forge-gui/src/main/java/forge/gamemodes/quest/QuestRewardCard.java +++ b/forge-gui/src/main/java/forge/gamemodes/quest/QuestRewardCard.java @@ -5,8 +5,8 @@ import java.util.List; import java.util.function.Predicate; import forge.card.CardRules; -import forge.item.IPaperCard; import forge.item.PaperCard; +import forge.item.PaperCardPredicates; import forge.model.FModel; import forge.util.Predicates; @@ -67,7 +67,7 @@ public abstract class QuestRewardCard implements IQuestRewardCard { // else { System.out.println("Unknown set code " + code); } } if (sets.size() > 0) { - filters = IPaperCard.Predicates.printedInSets(sets, true); + filters = PaperCardPredicates.printedInSets(sets, true); } } } @@ -91,13 +91,13 @@ public abstract class QuestRewardCard implements IQuestRewardCard { if (rarityCodes.length > 0) { for (final String rarity : rarityCodes) { if (rarity.startsWith("C") || rarity.startsWith("c")) { - filterRarity = filterRarity == null ? IPaperCard.Predicates.Presets.IS_COMMON : filterRarity.or(IPaperCard.Predicates.Presets.IS_COMMON); + filterRarity = filterRarity == null ? PaperCardPredicates.IS_COMMON : filterRarity.or(PaperCardPredicates.IS_COMMON); } else if (rarity.startsWith("U") || rarity.startsWith("u")) { - filterRarity = filterRarity == null ? IPaperCard.Predicates.Presets.IS_UNCOMMON : filterRarity.or(IPaperCard.Predicates.Presets.IS_UNCOMMON); + filterRarity = filterRarity == null ? PaperCardPredicates.IS_UNCOMMON : filterRarity.or(PaperCardPredicates.IS_UNCOMMON); } else if (rarity.startsWith("R") || rarity.startsWith("r")) { - filterRarity = filterRarity == null ? IPaperCard.Predicates.Presets.IS_RARE : filterRarity.or(IPaperCard.Predicates.Presets.IS_RARE); + filterRarity = filterRarity == null ? PaperCardPredicates.IS_RARE : filterRarity.or(PaperCardPredicates.IS_RARE); } else if (rarity.startsWith("M") || rarity.startsWith("m")) { - filterRarity = filterRarity == null ? IPaperCard.Predicates.Presets.IS_MYTHIC_RARE : filterRarity.or(IPaperCard.Predicates.Presets.IS_MYTHIC_RARE); + filterRarity = filterRarity == null ? PaperCardPredicates.IS_MYTHIC_RARE : filterRarity.or(PaperCardPredicates.IS_MYTHIC_RARE); } } } diff --git a/forge-gui/src/main/java/forge/gamemodes/quest/QuestUtilCards.java b/forge-gui/src/main/java/forge/gamemodes/quest/QuestUtilCards.java index c08917d3968..f948eb26b79 100644 --- a/forge-gui/src/main/java/forge/gamemodes/quest/QuestUtilCards.java +++ b/forge-gui/src/main/java/forge/gamemodes/quest/QuestUtilCards.java @@ -54,11 +54,11 @@ import java.util.function.Predicate; */ public final class QuestUtilCards { - private static final Predicate COMMON_PREDICATE = IPaperCard.Predicates.Presets.IS_COMMON; - private static final Predicate UNCOMMON_PREDICATE = IPaperCard.Predicates.Presets.IS_UNCOMMON; - private static final Predicate RARE_PREDICATE = IPaperCard.Predicates.Presets.IS_RARE_OR_MYTHIC; - private static final Predicate ONLY_RARE_PREDICATE = IPaperCard.Predicates.Presets.IS_RARE; - private static final Predicate MYTHIC_PREDICATE = IPaperCard.Predicates.Presets.IS_MYTHIC_RARE; + private static final Predicate COMMON_PREDICATE = PaperCardPredicates.IS_COMMON; + private static final Predicate UNCOMMON_PREDICATE = PaperCardPredicates.IS_UNCOMMON; + private static final Predicate RARE_PREDICATE = PaperCardPredicates.IS_RARE_OR_MYTHIC; + private static final Predicate ONLY_RARE_PREDICATE = PaperCardPredicates.IS_RARE; + private static final Predicate MYTHIC_PREDICATE = PaperCardPredicates.IS_MYTHIC_RARE; private final QuestController questController; private final QuestPreferences questPreferences; @@ -870,7 +870,7 @@ public final class QuestUtilCards { } // get all cards in the specified edition - Predicate filter = IPaperCard.Predicates.printedInSet(edition); + Predicate filter = PaperCardPredicates.printedInSet(edition); Iterable editionCards = Iterables.filter(FModel.getMagicDb().getCommonCards().getAllCards(), filter); ItemPool ownedCards = questAssets.getCardPool(); diff --git a/forge-gui/src/main/java/forge/gamemodes/quest/QuestWinLoseController.java b/forge-gui/src/main/java/forge/gamemodes/quest/QuestWinLoseController.java index 28e170b6d40..3cc2a52c06a 100644 --- a/forge-gui/src/main/java/forge/gamemodes/quest/QuestWinLoseController.java +++ b/forge-gui/src/main/java/forge/gamemodes/quest/QuestWinLoseController.java @@ -18,7 +18,7 @@ import forge.gui.interfaces.IButton; import forge.gui.interfaces.IWinLoseView; import forge.gui.util.SGuiChoose; import forge.item.*; -import forge.item.IPaperCard.Predicates; +import forge.item.PaperCardPredicates; import forge.item.generation.BoosterSlots; import forge.item.generation.IUnOpenedProduct; import forge.item.generation.UnOpenedProduct; @@ -575,7 +575,7 @@ public class QuestWinLoseController { final CardEdition chooseEd = SGuiChoose.one(Localizer.getInstance().getMessage("lblChooseBonusBoosterSet"), options); if (customBooster) { - List cards = FModel.getMagicDb().getCommonCards().getAllCards(Predicates.printedInSet(chooseEd.getCode())); + List cards = FModel.getMagicDb().getCommonCards().getAllCards(PaperCardPredicates.printedInSet(chooseEd.getCode())); final IUnOpenedProduct product = new UnOpenedProduct(getBoosterTemplate(), cards); cardsWon = product.get(); } else { diff --git a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java index 0ff5d6c84b9..1e338c281cd 100644 --- a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java +++ b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java @@ -29,24 +29,24 @@ import forge.util.Localizer; public final class SItemManagerUtil { /** An enum to encapsulate metadata for the stats/filter objects. */ public enum StatTypes implements IHasSkinProp { - WHITE (FSkinProp.IMG_MANA_W, CardRulesPredicates.Presets.IS_WHITE, "lblWhitecards"), - BLUE (FSkinProp.IMG_MANA_U, CardRulesPredicates.Presets.IS_BLUE, "lblBluecards"), - BLACK (FSkinProp.IMG_MANA_B, CardRulesPredicates.Presets.IS_BLACK, "lblBlackcards"), - RED (FSkinProp.IMG_MANA_R, CardRulesPredicates.Presets.IS_RED, "lblRedcards"), - GREEN (FSkinProp.IMG_MANA_G, CardRulesPredicates.Presets.IS_GREEN, "lblGreencards"), - COLORLESS (FSkinProp.IMG_MANA_COLORLESS, CardRulesPredicates.Presets.IS_COLORLESS, "lblColorlesscards"), + WHITE (FSkinProp.IMG_MANA_W, CardRulesPredicates.IS_WHITE, "lblWhitecards"), + BLUE (FSkinProp.IMG_MANA_U, CardRulesPredicates.IS_BLUE, "lblBluecards"), + BLACK (FSkinProp.IMG_MANA_B, CardRulesPredicates.IS_BLACK, "lblBlackcards"), + RED (FSkinProp.IMG_MANA_R, CardRulesPredicates.IS_RED, "lblRedcards"), + GREEN (FSkinProp.IMG_MANA_G, CardRulesPredicates.IS_GREEN, "lblGreencards"), + COLORLESS (FSkinProp.IMG_MANA_COLORLESS, CardRulesPredicates.IS_COLORLESS, "lblColorlesscards"), MULTICOLOR (GuiBase.getInterface().isLibgdxPort() ? FSkinProp.IMG_HDMULTI : - FSkinProp.IMG_MULTI, CardRulesPredicates.Presets.IS_MULTICOLOR, "lblMulticolorcards"), + FSkinProp.IMG_MULTI, CardRulesPredicates.IS_MULTICOLOR, "lblMulticolorcards"), PACK_OR_DECK (FSkinProp.IMG_PACK, null, "lblPackordeck"), - LAND (FSkinProp.IMG_LAND, CardRulesPredicates.Presets.IS_LAND, "lblLands"), - ARTIFACT (FSkinProp.IMG_ARTIFACT, CardRulesPredicates.Presets.IS_ARTIFACT, "lblArtifacts"), - CREATURE (FSkinProp.IMG_CREATURE, CardRulesPredicates.Presets.IS_CREATURE, "lblCreatures"), - ENCHANTMENT (FSkinProp.IMG_ENCHANTMENT, CardRulesPredicates.Presets.IS_ENCHANTMENT, "lblEnchantments"), - PLANESWALKER (FSkinProp.IMG_PLANESWALKER, CardRulesPredicates.Presets.IS_PLANESWALKER, "lblPlaneswalkers"), - INSTANT (FSkinProp.IMG_INSTANT, CardRulesPredicates.Presets.IS_INSTANT, "lblInstants"), - SORCERY (FSkinProp.IMG_SORCERY, CardRulesPredicates.Presets.IS_SORCERY, "lblSorceries"), - BATTLE (FSkinProp.IMG_BATTLE, CardRulesPredicates.Presets.IS_BATTLE, "lblBattles"), + LAND (FSkinProp.IMG_LAND, CardRulesPredicates.IS_LAND, "lblLands"), + ARTIFACT (FSkinProp.IMG_ARTIFACT, CardRulesPredicates.IS_ARTIFACT, "lblArtifacts"), + CREATURE (FSkinProp.IMG_CREATURE, CardRulesPredicates.IS_CREATURE, "lblCreatures"), + ENCHANTMENT (FSkinProp.IMG_ENCHANTMENT, CardRulesPredicates.IS_ENCHANTMENT, "lblEnchantments"), + PLANESWALKER (FSkinProp.IMG_PLANESWALKER, CardRulesPredicates.IS_PLANESWALKER, "lblPlaneswalkers"), + INSTANT (FSkinProp.IMG_INSTANT, CardRulesPredicates.IS_INSTANT, "lblInstants"), + SORCERY (FSkinProp.IMG_SORCERY, CardRulesPredicates.IS_SORCERY, "lblSorceries"), + BATTLE (FSkinProp.IMG_BATTLE, CardRulesPredicates.IS_BATTLE, "lblBattles"), CMC_0 (FSkinProp.IMG_MANA_0, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 0), "lblCCMC0"), CMC_1 (FSkinProp.IMG_MANA_1, new CardRulesPredicates.LeafNumber(CardRulesPredicates.LeafNumber.CardField.CMC, ComparableOp.EQUALS, 1), "lblCCMC1"), diff --git a/forge-gui/src/main/java/forge/model/CardBlock.java b/forge-gui/src/main/java/forge/model/CardBlock.java index b2aa31841df..7fc4f6ca5ff 100644 --- a/forge-gui/src/main/java/forge/model/CardBlock.java +++ b/forge-gui/src/main/java/forge/model/CardBlock.java @@ -23,10 +23,10 @@ import java.util.Map; import java.util.TreeMap; import java.util.function.Predicate; +import forge.item.PaperCardPredicates; import org.apache.commons.lang3.StringUtils; import forge.card.CardEdition; -import forge.item.IPaperCard; import forge.item.PaperCard; import forge.item.generation.IUnOpenedProduct; import forge.item.generation.UnOpenedProduct; @@ -141,7 +141,7 @@ public final class CardBlock implements Comparable { for (final CardEdition set : this.sets) { setCodes.add(set.getCode()); } - return IPaperCard.Predicates.printedInSets(setCodes, true); + return PaperCardPredicates.printedInSets(setCodes, true); } /* diff --git a/forge-gui/src/main/java/forge/model/FModel.java b/forge-gui/src/main/java/forge/model/FModel.java index e7a317bd820..fb2361ff127 100644 --- a/forge-gui/src/main/java/forge/model/FModel.java +++ b/forge-gui/src/main/java/forge/model/FModel.java @@ -324,13 +324,13 @@ public final class FModel { public static ItemPool getArchenemyCards() { if (archenemyCards == null) - return ItemPool.createFrom(getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_SCHEME, PaperCard::getRules)), PaperCard.class); + return ItemPool.createFrom(getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.IS_SCHEME, PaperCard::getRules)), PaperCard.class); return archenemyCards; } public static ItemPool getPlanechaseCards() { if (planechaseCards == null) - return ItemPool.createFrom(getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_PLANE_OR_PHENOMENON, PaperCard::getRules)), PaperCard.class); + return ItemPool.createFrom(getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.IS_PLANE_OR_PHENOMENON, PaperCard::getRules)), PaperCard.class); return planechaseCards; } @@ -338,7 +338,7 @@ public final class FModel { if (brawlCommander == null) { return ItemPool.createFrom(getMagicDb().getCommonCards().getAllCardsNoAlt( FModel.getFormats().get("Brawl").getFilterPrinted() - .and(Predicates.compose(CardRulesPredicates.Presets.CAN_BE_BRAWL_COMMANDER, PaperCard::getRules)) + .and(Predicates.compose(CardRulesPredicates.CAN_BE_BRAWL_COMMANDER, PaperCard::getRules)) ), PaperCard.class); } return brawlCommander; @@ -347,43 +347,43 @@ public final class FModel { public static ItemPool getOathbreakerCommander() { if (oathbreakerCommander == null) return ItemPool.createFrom(getMagicDb().getCommonCards().getAllCardsNoAlt(Predicates.compose( - CardRulesPredicates.Presets.CAN_BE_OATHBREAKER.or(CardRulesPredicates.Presets.CAN_BE_SIGNATURE_SPELL), PaperCard::getRules)), PaperCard.class); + CardRulesPredicates.CAN_BE_OATHBREAKER.or(CardRulesPredicates.CAN_BE_SIGNATURE_SPELL), PaperCard::getRules)), PaperCard.class); return oathbreakerCommander; } public static ItemPool getTinyLeadersCommander() { if (tinyLeadersCommander == null) - return ItemPool.createFrom(getMagicDb().getCommonCards().getAllCardsNoAlt(Predicates.compose(CardRulesPredicates.Presets.CAN_BE_TINY_LEADERS_COMMANDER, PaperCard::getRules)), PaperCard.class); + return ItemPool.createFrom(getMagicDb().getCommonCards().getAllCardsNoAlt(Predicates.compose(CardRulesPredicates.CAN_BE_TINY_LEADERS_COMMANDER, PaperCard::getRules)), PaperCard.class); return tinyLeadersCommander; } public static ItemPool getCommanderPool() { if (commanderPool == null) - return ItemPool.createFrom(getMagicDb().getCommonCards().getAllCardsNoAlt(Predicates.compose(CardRulesPredicates.Presets.CAN_BE_COMMANDER, PaperCard::getRules)), PaperCard.class); + return ItemPool.createFrom(getMagicDb().getCommonCards().getAllCardsNoAlt(Predicates.compose(CardRulesPredicates.CAN_BE_COMMANDER, PaperCard::getRules)), PaperCard.class); return commanderPool; } public static ItemPool getAvatarPool() { if (avatarPool == null) - return ItemPool.createFrom(getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_VANGUARD, PaperCard::getRules)), PaperCard.class); + return ItemPool.createFrom(getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.IS_VANGUARD, PaperCard::getRules)), PaperCard.class); return avatarPool; } public static ItemPool getConspiracyPool() { if (conspiracyPool == null) - return ItemPool.createFrom(getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_CONSPIRACY, PaperCard::getRules)), PaperCard.class); + return ItemPool.createFrom(getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.IS_CONSPIRACY, PaperCard::getRules)), PaperCard.class); return conspiracyPool; } public static ItemPool getDungeonPool() { if (dungeonPool == null) - return ItemPool.createFrom(getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_DUNGEON, PaperCard::getRules)), PaperCard.class); + return ItemPool.createFrom(getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.IS_DUNGEON, PaperCard::getRules)), PaperCard.class); return dungeonPool; } public static ItemPool getAttractionPool() { if (attractionPool == null) - return ItemPool.createFrom(getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_ATTRACTION, PaperCard::getRules)), PaperCard.class); + return ItemPool.createFrom(getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.IS_ATTRACTION, PaperCard::getRules)), PaperCard.class); return attractionPool; } private static boolean keywordsLoaded = false; diff --git a/forge-gui/src/main/java/forge/model/MetaSet.java b/forge-gui/src/main/java/forge/model/MetaSet.java index 25d779e1542..5c0ab8e8b20 100644 --- a/forge-gui/src/main/java/forge/model/MetaSet.java +++ b/forge-gui/src/main/java/forge/model/MetaSet.java @@ -20,8 +20,8 @@ package forge.model; import forge.gamemodes.limited.CustomLimited; import forge.gamemodes.limited.SealedCardPoolGenerator; -import forge.item.IPaperCard; import forge.item.PaperCard; +import forge.item.PaperCardPredicates; import forge.item.SealedTemplate; import forge.item.generation.IUnOpenedProduct; import forge.item.generation.UnOpenedProduct; @@ -177,7 +177,7 @@ public class MetaSet { return new UnOpenedProduct(FModel.getMagicDb().getTournamentPacks().get(data)); case JoinedSet: - Predicate predicate = IPaperCard.Predicates.printedInSets(data.split(" ")); + Predicate predicate = PaperCardPredicates.printedInSets(data.split(" ")); return new UnOpenedProduct(SealedTemplate.genericDraftBooster, predicate); case Choose: return UnOpenedMeta.choose(data); diff --git a/forge-gui/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java index dee557e4bd8..29f8e48abc5 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -6,7 +6,6 @@ import forge.card.MagicColor; import forge.game.*; import forge.game.ability.AbilityUtils; import forge.game.card.*; -import forge.game.card.CardPredicates.Presets; import forge.game.cost.*; import forge.game.player.Player; import forge.game.player.PlayerCollection; @@ -1232,7 +1231,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { CardCollection typeList = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), type.split(";"), player, source, ability); - typeList = CardLists.filter(typeList, ability.isCrew() ? Presets.CAN_CREW : Presets.CAN_TAP); + typeList = CardLists.filter(typeList, ability.isCrew() ? CardPredicates.CAN_CREW : CardPredicates.CAN_TAP); Integer c = null; if (!amount.equals("Any")) { @@ -1306,7 +1305,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { public PaymentDecision visit(final CostUntapType cost) { CardCollection typeList = CardLists.getValidCards(player.getGame().getCardsIn(ZoneType.Battlefield), cost.getType().split(";"), player, source, ability); - typeList = CardLists.filter(typeList, Presets.TAPPED); + typeList = CardLists.filter(typeList, CardPredicates.TAPPED); if (!cost.canUntapSource) { typeList.remove(source); } diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index 048dddef377..f32dca1faef 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -20,7 +20,6 @@ import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; import forge.game.card.CardPredicates; -import forge.game.card.CardPredicates.Presets; import forge.game.card.CardView; import forge.game.card.CardZoneTable; import forge.game.card.CounterEnumType; @@ -427,7 +426,7 @@ public class HumanPlay { } else if (part instanceof CostTapType) { CardCollectionView list = CardLists.getValidCards(p.getCardsIn(ZoneType.Battlefield), part.getType().split(";"), p, source, sourceAbility); - list = CardLists.filter(list, Presets.CAN_TAP); + list = CardLists.filter(list, CardPredicates.CAN_TAP); int amount = part.getAbilityAmount(sourceAbility); boolean hasPaid = payCostPart(controller, p, sourceAbility, hcd.isEffect(), (CostPartWithList)part, amount, list, Localizer.getInstance().getMessage("lblTap") + orString); if (!hasPaid) { return false; } diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 6b3542d9119..525dd6dd4d8 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -2618,7 +2618,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont public void tapPermanents() { getGame().getAction().invoke(() -> { final CardCollectionView untapped = CardLists.filter(getGame().getCardsIn(ZoneType.Battlefield), - CardPredicates.Presets.UNTAPPED); + CardPredicates.UNTAPPED); final InputSelectCardsFromList inp = new InputSelectCardsFromList(PlayerControllerHuman.this, 0, Integer.MAX_VALUE, untapped); inp.setCancelAllowed(true); @@ -2647,7 +2647,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont public void untapPermanents() { getGame().getAction().invoke(() -> { final CardCollectionView tapped = CardLists.filter(getGame().getCardsIn(ZoneType.Battlefield), - CardPredicates.Presets.TAPPED); + CardPredicates.TAPPED); final InputSelectCardsFromList inp = new InputSelectCardsFromList(PlayerControllerHuman.this, 0, Integer.MAX_VALUE, tapped); inp.setCancelAllowed(true); diff --git a/forge-lda/src/main/java/forge/lda/LDAModelGenetrator.java b/forge-lda/src/main/java/forge/lda/LDAModelGenetrator.java index eac701ec667..6806ee794fb 100644 --- a/forge-lda/src/main/java/forge/lda/LDAModelGenetrator.java +++ b/forge-lda/src/main/java/forge/lda/LDAModelGenetrator.java @@ -291,7 +291,7 @@ public final class LDAModelGenetrator { //get all cards final Iterable cards = Iterables.filter(FModel.getMagicDb().getCommonCards().getUniqueCards() - , Predicates.compose(CardRulesPredicates.Presets.NOT_TRUE_BASIC_LAND, PaperCard::getRules)); + , Predicates.compose(CardRulesPredicates.NOT_TRUE_BASIC_LAND, PaperCard::getRules)); List cardList = Lists.newArrayList(cards); cardList.add(FModel.getMagicDb().getCommonCards().getCard("Wastes")); Map cardIntegerMap = new HashMap<>(); @@ -350,7 +350,7 @@ public final class LDAModelGenetrator { public static void updateLegendMatrix(Deck deck, PaperCard legend, Map cardIntegerMap, Map legendIntegerMap, int[][] matrix){ for (PaperCard pairCard:Iterables.filter(deck.getMain().toFlatList(), - Predicates.compose(CardRulesPredicates.Presets.NOT_TRUE_BASIC_LAND, PaperCard::getRules))){ + Predicates.compose(CardRulesPredicates.NOT_TRUE_BASIC_LAND, PaperCard::getRules))){ if (!pairCard.getName().equals(legend.getName())){ try { int old = matrix[legendIntegerMap.get(legend.getName())][cardIntegerMap.get(pairCard.getName())];