diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index eff1abb586b..e1a9e70e8da 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -313,7 +313,6 @@ public class AiController { // need to set TriggeredObject exSA.setTriggeringObject(AbilityKey.Card, card); - // for trigger test, need to ignore the conditions SpellAbilityCondition cons = exSA.getConditions(); if (cons != null) { diff --git a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java index 6b65082c41a..cab5c81ed2a 100644 --- a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java @@ -162,7 +162,7 @@ public abstract class SpellAbilityAi { if (ComputerUtil.preventRunAwayActivations(sa)) { return false; // prevent infinite loop } - return MyRandom.getRandom().nextFloat() < .8f; // random success + return MyRandom.getRandom().nextFloat() < .8f; // random success } public final boolean doTriggerAI(final Player aiPlayer, final SpellAbility sa, final boolean mandatory) { @@ -193,7 +193,7 @@ public abstract class SpellAbilityAi { * Handles the AI decision to play a triggered SpellAbility */ protected boolean doTriggerAINoCost(final Player aiPlayer, final SpellAbility sa, final boolean mandatory) { - if (canPlayWithoutRestrict(aiPlayer, sa)) { + if (canPlayWithoutRestrict(aiPlayer, sa) && (!mandatory || sa.isTargetNumberValid())) { return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java index 43d4e48fe80..02e582b8e69 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -400,7 +400,6 @@ public class PumpAi extends PumpAiBase { if (ComputerUtilCard.shouldPumpCard(ai, sa, card, defense, attack, keywords, false)) { return true; } else if (containsUsefulKeyword(ai, keywords, card, sa, attack)) { - Card pumped = ComputerUtilCard.getPumpedCreature(ai, sa, card, 0, 0, keywords); if (game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_ATTACKERS, ai) || game.getPhaseHandler().is(PhaseType.COMBAT_BEGIN, ai)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java index 5c100147fb8..5e708dbdd9f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java @@ -44,7 +44,6 @@ public abstract class PumpAiBase extends SpellAbilityAi { return false; } - public boolean grantsUsefulExtraBlockOpts(final Player ai, final SpellAbility sa, final Card card, List keywords) { PhaseHandler ph = ai.getGame().getPhaseHandler(); Card pumped = ComputerUtilCard.getPumpedCreature(ai, sa, card, 0, 0, keywords); @@ -506,7 +505,6 @@ public abstract class PumpAiBase extends SpellAbilityAi { else { final boolean addsKeywords = !keywords.isEmpty(); if (addsKeywords) { - // If the keyword can prevent a creature from attacking, see if there's some kind of viable prioritization if (keywords.contains("CARDNAME can't attack.") || keywords.contains("CARDNAME can't attack or block.") || keywords.contains("HIDDEN CARDNAME can't attack.") || keywords.contains("HIDDEN CARDNAME can't attack or block.")) { diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java index d6fc76bad15..cb68ba3a711 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java @@ -151,6 +151,12 @@ public class PumpAllAi extends PumpAiBase { return true; } + @Override + protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { + // important to call canPlay first so targets are added if needed + return canPlayAI(ai, sa) || mandatory; + } + boolean pumpAgainstRemoval(Player ai, SpellAbility sa, List comp) { final List objects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa, true); for (final Card c : comp) { diff --git a/forge-ai/src/main/java/forge/ai/ability/TapOrUntapAi.java b/forge-ai/src/main/java/forge/ai/ability/TapOrUntapAi.java index e1f7e5b90c0..e052b4737c9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapOrUntapAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapOrUntapAi.java @@ -39,6 +39,4 @@ public class TapOrUntapAi extends TapAiBase { return randomReturn; } - - } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java index c52a7dca849..6439f786c3a 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java @@ -244,7 +244,6 @@ public class SpellAbilityCondition extends SpellAbilityVariables { * @return a boolean. */ public final boolean areMet(final SpellAbility sa) { - Player activator = sa.getActivatingPlayer(); if (activator == null) { activator = sa.getHostCard().getController();