diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index 97da3497bc3..16bda3d97cf 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -7,12 +7,15 @@ import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardLists; +import forge.game.card.CardPredicates; import forge.game.card.CounterType; import forge.game.combat.Combat; import forge.game.cost.*; import forge.game.player.Player; import forge.game.spellability.Spell; import forge.game.spellability.SpellAbility; +import forge.game.spellability.TargetChoices; +import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; import forge.util.collect.FCollectionView; import forge.util.MyRandom; @@ -426,7 +429,17 @@ public class ComputerUtilCost { // try to determine that there is a valid target for a spell (very basic, consider expanding) boolean requirementsMet = true; if (c.isAura()) { + // for auras, make sure that a good enough target exists requirementsMet = ComputerUtil.hasGoodTargetForAura(payer, c); + } else if (c.isSorcery()) { + // for sorceries with one mode that has a target, consider actually having a target that makes the AI decide to play the spell ability + if (c.getAllSpellAbilities().size() == 1) { + SpellAbility ability = c.getFirstSpellAbility(); + if (ability != null && ability.usesTargeting()) { + AiPlayDecision decision = ((PlayerControllerAi)payer.getController()).getAi().canPlaySa(ability); + requirementsMet = decision == AiPlayDecision.WillPlay || decision == AiPlayDecision.WaitForMain2; + } + } } if (landsize == cmc && canPay && requirementsMet) { return true;