From 373cd9bd24d07993c1dcf75cd3e72006503a864f Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 4 Dec 2018 12:21:04 +0300 Subject: [PATCH] - Further updated mana ritual cards to properly account for Battery effect. --- .../src/main/java/forge/ai/AiController.java | 2 +- .../main/java/forge/ai/ComputerUtilMana.java | 18 ------------------ .../java/forge/ai/ability/ManaEffectAi.java | 5 +++-- .../src/main/java/forge/game/cost/Cost.java | 18 ++++++++++++++++++ 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 0cc505a855c..35b666e0781 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -670,7 +670,7 @@ public class AiController { // This is for playing spells regularly (no Cascade/Ripple etc.) private AiPlayDecision canPlayAndPayFor(final SpellAbility sa) { - boolean xCost = ComputerUtilMana.hasXInAnyCostPart(sa); + boolean xCost = sa.getPayCosts().hasXInAnyCostPart(sa); 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 diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index faaae9b1859..1330e32a0f3 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -1556,24 +1556,6 @@ 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; 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 535b4c34f74..d01e1ca4683 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java @@ -203,8 +203,9 @@ public class ManaEffectAi extends SpellAbilityAi { Predicates.or(CardPredicates.isColorless(), CardPredicates.isColor(producedColor)))); if ("ManaRitualBattery".equals(sa.getParam("AILogic"))) { - // Don't remove more counters than would be needed to cast everything we want to cast - int maxCtrs = Aggregates.sum(castableSpells, CardPredicates.Accessors.fnGetCmc); + // Don't remove more counters than would be needed to cast the more expensive thing we want to cast, + // otherwise the AI grabs too many counters at once. + int maxCtrs = Aggregates.max(castableSpells, CardPredicates.Accessors.fnGetCmc) - 1; sa.setSVar("ChosenX", "Number$" + Math.min(numCounters, maxCtrs)); } diff --git a/forge-game/src/main/java/forge/game/cost/Cost.java b/forge-game/src/main/java/forge/game/cost/Cost.java index c4c31aff270..5a48859876a 100644 --- a/forge-game/src/main/java/forge/game/cost/Cost.java +++ b/forge-game/src/main/java/forge/game/cost/Cost.java @@ -935,5 +935,23 @@ public class Cost implements Serializable { return true; } + public 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 final Cost Zero = new Cost(0); }