From 2f3d1026bc4b36d204c15c77be66a4a9280e360d Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 21 Jan 2017 09:28:18 +0000 Subject: [PATCH] CardPredicates: add greaterCMC and lessCMC which does respect SplitCards --- .../src/main/java/forge/ai/SpecialCardAi.java | 24 ++++++--------- .../main/java/forge/ai/ability/DestroyAi.java | 12 +++----- .../java/forge/game/card/CardPredicates.java | 30 +++++++++++++++++++ 3 files changed, 43 insertions(+), 23 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java index affffafa6de..cdeb95def3f 100644 --- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java +++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java @@ -17,10 +17,15 @@ */ package forge.ai; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; + import forge.card.MagicColor; import forge.card.mana.ManaCost; import forge.game.Game; @@ -42,8 +47,6 @@ import forge.game.player.PlayerPredicates; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.Aggregates; -import java.util.Collections; -import java.util.List; /** * Special logic for individual cards @@ -70,20 +73,11 @@ public class SpecialCardAi { CardCollection manaSources = ComputerUtilMana.getAvailableMana(ai, true); int numManaSrcs = manaSources.size(); - CardCollection allCards = CardLists.filter(ai.getAllCards(), Predicates.and(CardPredicates.Presets.NON_TOKEN, CardPredicates.isOwner(ai))); + CardCollection allCards = CardLists.filter(ai.getAllCards(), Arrays.asList(CardPredicates.Presets.NON_TOKEN, + Predicates.not(CardPredicates.Presets.LANDS), CardPredicates.isOwner(ai))); - int numHighCMC = CardLists.filter(allCards, new Predicate() { - @Override - public boolean apply(final Card c) { - return c.getCMC() >= 5; - } - }).size(); - int numLowCMC = CardLists.filter(allCards, new Predicate() { - @Override - public boolean apply(final Card c) { - return c.getCMC() >= 1 && c.getCMC() <= 3; - } - }).size(); + int numHighCMC = CardLists.count(allCards, CardPredicates.greaterCMC(5)); + int numLowCMC = CardLists.count(allCards, CardPredicates.lessCMC(3)); boolean isLowCMCDeck = numHighCMC <= 6 && numLowCMC >= 25; 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 e84330765df..4b1f221c140 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java @@ -12,6 +12,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; import forge.game.card.CounterType; import forge.game.cost.Cost; import forge.game.cost.CostPart; @@ -90,15 +91,10 @@ public class DestroyAi extends SpellAbilityAi { sa.getTargets().add(worst); return true; } - list = CardLists.getTargetableCards(ai.getOpponent().getCardsIn(ZoneType.Battlefield), sa); + list = CardLists.getTargetableCards(ai.getOpponents().getCardsIn(ZoneType.Battlefield), sa); if ("FatalPush".equals(logic)) { final int cmcMax = ai.hasRevolt() ? 4 : 2; - list = CardLists.filter(list, new Predicate() { - @Override - public boolean apply(final Card c) { - return c.getCMC() <= cmcMax; - } - }); + list = CardLists.filter(list, CardPredicates.lessCMC(cmcMax)); } if (sa.hasParam("AITgts")) { if (sa.getParam("AITgts").equals("BetterThanSource")) { @@ -198,7 +194,7 @@ public class DestroyAi extends SpellAbilityAi { } } if ("Pongify".equals(logic)) { - final Card token = TokenAi.spawnToken(ai.getOpponent(), sa.getSubAbility()); + final Card token = TokenAi.spawnToken(choice.getController(), sa.getSubAbility()); if (token == null) { return true; // becomes Terminate } else { 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 a32abc1b620..920f25a9bed 100644 --- a/forge-game/src/main/java/forge/game/card/CardPredicates.java +++ b/forge-game/src/main/java/forge/game/card/CardPredicates.java @@ -244,6 +244,36 @@ public final class CardPredicates { } }; } + + public static final Predicate greaterCMC(final int cmc) { + return new Predicate() { + @Override + public boolean apply(final Card c) { + if (c.isSplitCard()) { + return c.getCMC(Card.SplitCMCMode.LeftSplitCMC) >= cmc + || c.getCMC(Card.SplitCMCMode.RightSplitCMC) >= cmc; + } else { + return c.getCMC() >= cmc; + } + + } + }; + } + + public static final Predicate lessCMC(final int cmc) { + return new Predicate() { + @Override + public boolean apply(final Card c) { + if (c.isSplitCard()) { + return c.getCMC(Card.SplitCMCMode.LeftSplitCMC) <= cmc + || c.getCMC(Card.SplitCMCMode.RightSplitCMC) <= cmc; + } else { + return c.getCMC() <= cmc; + } + + } + }; + } public static final Predicate hasCounters() { return new Predicate() {