Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions forge-ai/src/main/java/forge/ai/ComputerUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -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")) {
Expand Down Expand Up @@ -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();
Expand Down
16 changes: 16 additions & 0 deletions forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down