mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 04:38:00 +00:00
CardPredicates: add greaterCMC and lessCMC which does respect SplitCards
This commit is contained in:
@@ -17,10 +17,15 @@
|
|||||||
*/
|
*/
|
||||||
package forge.ai;
|
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.Predicate;
|
||||||
import com.google.common.base.Predicates;
|
import com.google.common.base.Predicates;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
import forge.card.MagicColor;
|
import forge.card.MagicColor;
|
||||||
import forge.card.mana.ManaCost;
|
import forge.card.mana.ManaCost;
|
||||||
import forge.game.Game;
|
import forge.game.Game;
|
||||||
@@ -42,8 +47,6 @@ import forge.game.player.PlayerPredicates;
|
|||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
import forge.util.Aggregates;
|
import forge.util.Aggregates;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Special logic for individual cards
|
* Special logic for individual cards
|
||||||
@@ -70,20 +73,11 @@ public class SpecialCardAi {
|
|||||||
CardCollection manaSources = ComputerUtilMana.getAvailableMana(ai, true);
|
CardCollection manaSources = ComputerUtilMana.getAvailableMana(ai, true);
|
||||||
int numManaSrcs = manaSources.size();
|
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<Card>() {
|
int numHighCMC = CardLists.count(allCards, CardPredicates.greaterCMC(5));
|
||||||
@Override
|
int numLowCMC = CardLists.count(allCards, CardPredicates.lessCMC(3));
|
||||||
public boolean apply(final Card c) {
|
|
||||||
return c.getCMC() >= 5;
|
|
||||||
}
|
|
||||||
}).size();
|
|
||||||
int numLowCMC = CardLists.filter(allCards, new Predicate<Card>() {
|
|
||||||
@Override
|
|
||||||
public boolean apply(final Card c) {
|
|
||||||
return c.getCMC() >= 1 && c.getCMC() <= 3;
|
|
||||||
}
|
|
||||||
}).size();
|
|
||||||
|
|
||||||
boolean isLowCMCDeck = numHighCMC <= 6 && numLowCMC >= 25;
|
boolean isLowCMCDeck = numHighCMC <= 6 && numLowCMC >= 25;
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import forge.game.ability.ApiType;
|
|||||||
import forge.game.card.Card;
|
import forge.game.card.Card;
|
||||||
import forge.game.card.CardCollection;
|
import forge.game.card.CardCollection;
|
||||||
import forge.game.card.CardLists;
|
import forge.game.card.CardLists;
|
||||||
|
import forge.game.card.CardPredicates;
|
||||||
import forge.game.card.CounterType;
|
import forge.game.card.CounterType;
|
||||||
import forge.game.cost.Cost;
|
import forge.game.cost.Cost;
|
||||||
import forge.game.cost.CostPart;
|
import forge.game.cost.CostPart;
|
||||||
@@ -90,15 +91,10 @@ public class DestroyAi extends SpellAbilityAi {
|
|||||||
sa.getTargets().add(worst);
|
sa.getTargets().add(worst);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
list = CardLists.getTargetableCards(ai.getOpponent().getCardsIn(ZoneType.Battlefield), sa);
|
list = CardLists.getTargetableCards(ai.getOpponents().getCardsIn(ZoneType.Battlefield), sa);
|
||||||
if ("FatalPush".equals(logic)) {
|
if ("FatalPush".equals(logic)) {
|
||||||
final int cmcMax = ai.hasRevolt() ? 4 : 2;
|
final int cmcMax = ai.hasRevolt() ? 4 : 2;
|
||||||
list = CardLists.filter(list, new Predicate<Card>() {
|
list = CardLists.filter(list, CardPredicates.lessCMC(cmcMax));
|
||||||
@Override
|
|
||||||
public boolean apply(final Card c) {
|
|
||||||
return c.getCMC() <= cmcMax;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
if (sa.hasParam("AITgts")) {
|
if (sa.hasParam("AITgts")) {
|
||||||
if (sa.getParam("AITgts").equals("BetterThanSource")) {
|
if (sa.getParam("AITgts").equals("BetterThanSource")) {
|
||||||
@@ -198,7 +194,7 @@ public class DestroyAi extends SpellAbilityAi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ("Pongify".equals(logic)) {
|
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) {
|
if (token == null) {
|
||||||
return true; // becomes Terminate
|
return true; // becomes Terminate
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -245,6 +245,36 @@ public final class CardPredicates {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final Predicate<Card> greaterCMC(final int cmc) {
|
||||||
|
return new Predicate<Card>() {
|
||||||
|
@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<Card> lessCMC(final int cmc) {
|
||||||
|
return new Predicate<Card>() {
|
||||||
|
@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<Card> hasCounters() {
|
public static final Predicate<Card> hasCounters() {
|
||||||
return new Predicate<Card>() {
|
return new Predicate<Card>() {
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user