diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index b2c07fe89cd..4cef0a05593 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -2314,6 +2314,11 @@ public static CardCollection getCardsToDiscardFromOpponent(Player chooser, Playe return new CardCollection(goodChoices.getFirst()); } + Card nearTermThreat = getBestNearTermDiscardThreat(discarder, goodChoices); + if (nearTermThreat != null) { + return new CardCollection(nearTermThreat); + } + if (sa.hasParam("DiscardValid")) { final String validString = sa.getParam("DiscardValid"); if (validString.contains("Creature") && !validString.contains("nonCreature")) { @@ -2373,6 +2378,22 @@ public static CardCollection getCardsToDiscardFromOpponent(Player chooser, Playe return goodChoices.subList(0, max); } + private static Card getBestNearTermDiscardThreat(Player discarder, CardCollection goodChoices) { + int manaSources = ComputerUtilMana.getAvailableManaEstimate(discarder, false); + if (CardLists.count(discarder.getCardsIn(ZoneType.Hand), CardPredicates.LANDS_PRODUCING_MANA) > 0) { + manaSources++; + } + + final int nearTermMana = manaSources + 1; + CardCollection nearTermChoices = CardLists.filter(goodChoices, + c -> !c.isLand() && c.getCMC() <= nearTermMana); + if (nearTermChoices.isEmpty()) { + return null; + } + + return ComputerUtilCard.getBestAI(nearTermChoices); + } + public static CardCollection getCardsToDiscardFromFriend(Player aiChooser, Player p, SpellAbility sa, CardCollection validCards, int min, int max) { if (p == aiChooser) { // ask that ai player what he would like to discard final AiController aic = ((PlayerControllerAi)p.getController()).getAi(); 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 358ed76359c..d2f5e1f4930 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -605,6 +605,22 @@ private static Card chooseCreature(final Player ai, CardCollection list) { return null; } + CardCollection castable = CardLists.filter(list, + c -> ComputerUtilMana.hasEnoughManaSourcesToCast(c.getFirstSpellAbility(), ai)); + if (!castable.isEmpty()) { + return ComputerUtilCard.getBestCreatureAI(castable); + } + + int manaSources = ComputerUtilMana.getAvailableManaEstimate(ai, false); + if (CardLists.count(ai.getCardsIn(ZoneType.Hand), CardPredicates.LANDS_PRODUCING_MANA) > 0) { + manaSources++; + } + final int nearTermMana = manaSources + 1; + CardCollection nearTerm = CardLists.filter(list, c -> c.getCMC() <= nearTermMana); + if (!nearTerm.isEmpty()) { + return ComputerUtilCard.getBestCreatureAI(nearTerm); + } + // not urgent, get the largest creature possible // TODO checkETBEffects return ComputerUtilCard.getBestCreatureAI(list);