diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 3a67fdd31fd..edab1ee7792 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -670,10 +670,9 @@ public class AiController { // This is for playing spells regularly (no Cascade/Ripple etc.) private AiPlayDecision canPlayAndPayFor(final SpellAbility sa) { - boolean XCost = sa.getPayCosts() != null && sa.getPayCosts().getCostMana() != null - && sa.getPayCosts().getCostMana().getAmountOfX() > 0; + boolean xCost = ComputerUtilMana.hasXInAnyCostPart(sa); - if (!XCost && !ComputerUtilCost.canPayCost(sa, player)) { + if (!xCost && !ComputerUtilCost.canPayCost(sa, player)) { // for most costs, it's OK to check if they can be paid early in order to avoid running a heavy API check // when the AI won't even be able to play the spell in the first place (even if it could afford it) return AiPlayDecision.CantAfford; @@ -688,7 +687,7 @@ public class AiController { return canPlay; } - if (XCost && !ComputerUtilCost.canPayCost(sa, player)) { + if (xCost && !ComputerUtilCost.canPayCost(sa, player)) { // for dependent costs with X, e.g. Repeal, which require a valid target to be specified before a decision can be made // on whether the cost can be paid, this can only be checked late after canPlaySa has been run (or the AI will misplay) return AiPlayDecision.CantAfford; diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 02ffc322634..faaae9b1859 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -16,11 +16,7 @@ import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.card.*; import forge.game.combat.CombatUtil; -import forge.game.cost.Cost; -import forge.game.cost.CostAdjustment; -import forge.game.cost.CostPartMana; -import forge.game.cost.CostPayEnergy; -import forge.game.cost.CostPayment; +import forge.game.cost.*; import forge.game.mana.Mana; import forge.game.mana.ManaCostBeingPaid; import forge.game.mana.ManaPool; @@ -1560,6 +1556,24 @@ public class ComputerUtilMana { return convoke; } + public static boolean hasXInAnyCostPart(SpellAbility sa) { + boolean xCost = false; + if (sa.getPayCosts() != null) { + for (CostPart p : sa.getPayCosts().getCostParts()) { + if (p instanceof CostPartMana) { + if (((CostPartMana) p).getAmountOfX() > 0) { + xCost = true; + break; + } + } else if (p.getAmount().equals("X")) { + xCost = true; + break; + } + } + } + return xCost; + } + public static int determineMaxAffordableX(Player ai, SpellAbility sa) { if (sa.getPayCosts() == null || sa.getPayCosts().getCostMana() == null) { return -1;