diff --git a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java index 14f20be8488..b95e700f525 100644 --- a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java @@ -64,7 +64,7 @@ public abstract class SpellAbilityAi { * Checks if the AI will play a SpellAbility with the specified AiLogic */ protected boolean checkAiLogic(final Player ai, final SpellAbility sa, final String aiLogic) { - return true; + return !("Never".equals(aiLogic)); } /** @@ -204,8 +204,8 @@ public abstract class SpellAbilityAi { /** * TODO: Write javadoc for this method. - * @param ai - * @param subAb + * @param aiPlayer + * @param ab * @return */ public boolean chkDrawbackWithSubs(Player aiPlayer, AbilitySub ab) { diff --git a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java index 6c6c902537c..b6ee1edf22d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java @@ -19,7 +19,7 @@ public class SetStateAi extends SpellAbilityAi { // check if the other side is legendary and if such Card already is in Play final CardState other = source.getAlternateState(); - if (other.getType().isLegendary() && aiPlayer.isCardInPlay(other.getName())) { + if (other != null && other.getType().isLegendary() && aiPlayer.isCardInPlay(other.getName())) { return false; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java index 00d33b54a66..3686f20c116 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java @@ -20,12 +20,17 @@ import forge.game.zone.ZoneType; import java.util.List; public class UntapAi extends SpellAbilityAi { - @Override - protected boolean canPlayAI(Player ai, SpellAbility sa) { - final TargetRestrictions tgt = sa.getTargetRestrictions(); + protected boolean checkAiLogic(final Player ai, final SpellAbility sa, final String aiLogic) { final Card source = sa.getHostCard(); - final Cost cost = sa.getPayCosts(); + if ("EOT".equals(sa.getParam("AILogic")) && (source.getGame().getPhaseHandler().getNextTurn() != ai + || !source.getGame().getPhaseHandler().getPhase().equals(PhaseType.END_OF_TURN))) { + return false; + } + return !("Never".equals(aiLogic)); + } + + protected boolean willPayCosts(final Player ai, final SpellAbility sa, final Cost cost, final Card source) { if (!ComputerUtilCost.checkAddM1M1CounterCost(cost, source)) { return false; } @@ -34,17 +39,20 @@ public class UntapAi extends SpellAbilityAi { return false; } + return true; + } + + @Override + protected boolean checkApiLogic(Player ai, SpellAbility sa) { + final TargetRestrictions tgt = sa.getTargetRestrictions(); + final Card source = sa.getHostCard(); + if (ComputerUtil.preventRunAwayActivations(sa)) { - return false; - } - - if ("EOT".equals(sa.getParam("AILogic")) && (source.getGame().getPhaseHandler().getNextTurn() != ai - || !source.getGame().getPhaseHandler().getPhase().equals(PhaseType.END_OF_TURN))) { - return false; + return false; } if (tgt == null) { - final List pDefined = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa); + final List pDefined = AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa); if (pDefined != null && pDefined.get(0).isUntapped() && pDefined.get(0).getController() == ai) { return false; }