diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index 034e24f624d..598c218f7e4 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -580,7 +580,9 @@ public class ComputerUtilCost { for (Card c : cardsToConsider) { for (SpellAbility sa : c.getManaAbilities()) { - colorsAvailable.add(sa.getManaPart().getOrigProduced()); + if (sa.getManaPart() != null) { + colorsAvailable.add(sa.getManaPart().getOrigProduced()); + } } } diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java index 5f5bd8584c2..9e4fc10205d 100644 --- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java +++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java @@ -24,6 +24,7 @@ import java.util.List; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import forge.card.ColorSet; import forge.card.MagicColor; import forge.card.mana.ManaCost; @@ -346,13 +347,17 @@ public class SpecialCardAi { for (final SpellAbility testSa : ComputerUtilAbility.getOriginalAndAltCostAbilities(all, ai)) { ManaCost cost = testSa.getPayCosts().getTotalMana(); + boolean canPayWithAvailableColors = cost.canBePaidWithAvaliable(ColorSet.fromNames( + ComputerUtilCost.getAvailableManaColors(ai, sa.getHostCard())).getColor()); + byte colorProfile = cost.getColorProfile(); if (cost.getCMC() == 0 && cost.countX() == 0) { // no mana cost, no need to activate this SA then (additional mana not needed) continue; - } else if (colorProfile != 0 && (cost.getColorProfile() & MagicColor.fromName(prominentColor)) == 0) { - // does not feature prominent color, won't be able to pay for it with SA activated for this color + } else if (colorProfile != 0 && !canPayWithAvailableColors + && (cost.getColorProfile() & MagicColor.fromName(prominentColor)) == 0) { + // don't have at least one of each shard required to pay, so most likely won't be able to pay continue; } else if ((testSa.getPayCosts().getTotalMana().getCMC() > devotion + numManaSrcs - activationCost)) { // the cost may be too high even if we activate this SA diff --git a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java index 3cb8709a5d6..864caf56aea 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java @@ -4,9 +4,11 @@ import com.google.common.base.Predicates; import forge.ai.AiPlayDecision; import forge.ai.ComputerUtil; import forge.ai.ComputerUtilAbility; +import forge.ai.ComputerUtilCost; import forge.ai.ComputerUtilMana; import forge.ai.PlayerControllerAi; import forge.ai.SpellAbilityAi; +import forge.card.ColorSet; import forge.card.MagicColor; import forge.card.mana.ManaCost; import forge.game.ability.AbilityUtils; @@ -136,9 +138,15 @@ public class ManaEffectAi extends SpellAbilityAi { List all = ComputerUtilAbility.getSpellAbilities(ai.getCardsIn(ZoneType.Hand), ai); for (final SpellAbility testSa : ComputerUtilAbility.getOriginalAndAltCostAbilities(all, ai)) { ManaCost cost = testSa.getPayCosts().getTotalMana(); + boolean canPayWithAvailableColors = cost.canBePaidWithAvaliable(ColorSet.fromNames( + ComputerUtilCost.getAvailableManaColors(ai, (List)null)).getColor()); + if (cost.getCMC() == 0 && cost.countX() == 0) { // no mana cost, no need to activate this SA then (additional mana not needed) continue; + } else if (cost.getColorProfile() != 0 && !canPayWithAvailableColors) { + // don't have one of each shard represented, may not be able to pay the cost + continue; } if (testSa.getHostCard().getName().equals(host.getName()) || testSa.hasParam("AINoRecursiveCheck")) {