From 346523632a3ac05dd36197d2f97cac1c2e6da9f1 Mon Sep 17 00:00:00 2001 From: Sol Date: Sat, 23 Jan 2016 19:18:11 +0000 Subject: [PATCH] - Now that the AI can target multiple things for Support, it's failing to actually target anything for the Animation triggers and getting stuck --- .../main/java/forge/ai/ComputerUtilCard.java | 19 +++++++++++++++++++ .../java/forge/ai/ability/CountersAi.java | 7 ++++++- .../java/forge/ai/ability/CountersPutAi.java | 9 +++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index 0d69f167b9a..bb9c6338bf3 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -716,6 +716,25 @@ public class ComputerUtilCard { return worstLand; } // end getWorstLand + public static Card getBestLandToAnimate(final Iterable lands) { + Card land = null; + int maxScore = 0; + // first, check for tapped, basic lands + for (Card tmp : lands) { + // TODO Improve this by choosing basic lands that I have plenty of mana in + int score = tmp.isTapped() ? 0 : 2; + score += tmp.isBasicLand() ? 2 : 0; + score -= tmp.isCreature() ? 4 : 0; + score -= 5 * tmp.getEnchantedBy(false).size(); + + if (score >= maxScore) { + land = tmp; + maxScore = score; + } + } + return land; + } // end getBestLandToAnimate + public static final Predicate AI_KNOWS_HOW_TO_PLAY_ALL_CARDS = new Predicate() { @Override public boolean apply(Deck d) { diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersAi.java index 291c653491b..b4483d4a00e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersAi.java @@ -88,9 +88,14 @@ public abstract class CountersAi { * @return a {@link forge.game.card.Card} object. */ public static Card chooseBoonTarget(final CardCollectionView list, final String type) { - Card choice; + Card choice = null; if (type.equals("P1P1")) { choice = ComputerUtilCard.getBestCreatureAI(list); + + if (choice == null) { + // We'd only get here if list isn't empty, maybe we're trying to animate a land? + choice = ComputerUtilCard.getBestLandToAnimate(list); + } } else if (type.equals("DIVINITY")) { final CardCollection boon = CardLists.filter(list, new Predicate() { @Override 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 68bdb84aed2..0e6b53f28ac 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -482,6 +482,9 @@ public class CountersPutAi extends SpellAbilityAi { if (isCurse) { if (preferred) { choice = CountersAi.chooseCursedTarget(list, type, amount); + if (choice == null && mandatory) { + choice = Aggregates.random(list); + } } else { if (type.equals("M1M1")) { choice = ComputerUtilCard.getWorstCreatureAI(list); @@ -493,6 +496,9 @@ public class CountersPutAi extends SpellAbilityAi { if (preferred) { list = ComputerUtil.getSafeTargets(ai, sa, list); choice = CountersAi.chooseBoonTarget(list, type); + if (choice == null && mandatory) { + choice = Aggregates.random(list); + } } else { if (type.equals("P1P1")) { choice = ComputerUtilCard.getWorstCreatureAI(list); @@ -508,6 +514,9 @@ public class CountersPutAi extends SpellAbilityAi { if (choice != null) { sa.getTargets().add(choice); list.remove(choice); + } else { + // Didn't want to choose anything? + list.clear(); } }