diff --git a/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java b/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java index 7c41b15d514..3cf639917e3 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java @@ -130,12 +130,20 @@ public class DiscardAi extends SpellAbilityAi { } } - // Don't use draw abilities before main 2 if possible + // Don't use discard abilities before main 2 if possible if (ai.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) - && !sa.hasParam("ActivationPhases")) { + && !sa.hasParam("ActivationPhases") && !aiLogic.startsWith("AnyPhase")) { return false; } + if (aiLogic.equals("AnyPhaseIfFavored")) { + if (ai.getGame().getCombat() != null) { + if (ai.getCardsIn(ZoneType.Hand).size() < ai.getGame().getCombat().getDefenderPlayerByAttacker(source).getCardsIn(ZoneType.Hand).size()) { + return false; + } + } + } + // Don't tap creatures that may be able to block if (ComputerUtil.waitForBlocking(sa)) { return false; diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java index da3f85fa2e3..c7f8f13f404 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java @@ -137,7 +137,7 @@ public class LifeLoseAi extends SpellAbilityAi { // Don't use loselife before main 2 if possible if (ai.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) && !sa.hasParam("ActivationPhases") - && !ComputerUtil.castSpellInMain1(ai, sa)) { + && !ComputerUtil.castSpellInMain1(ai, sa) && !"AnyPhase".equals(sa.getParam("AILogic"))) { return false; } diff --git a/forge-gui/res/cardsfolder/r/rankle_master_of_pranks.txt b/forge-gui/res/cardsfolder/r/rankle_master_of_pranks.txt index bb8d49e458e..0128a2b8aba 100644 --- a/forge-gui/res/cardsfolder/r/rankle_master_of_pranks.txt +++ b/forge-gui/res/cardsfolder/r/rankle_master_of_pranks.txt @@ -6,8 +6,8 @@ K:Flying K:Haste T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigCharm | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, ABILITY SVar:TrigCharm:DB$ Charm | Choices$ DBDiscard,DBLoseLife,DBSac | MinCharmNum$ 0 | CharmNum$ 3 -SVar:DBDiscard:DB$ Discard | NumCards$ 1 | Mode$ TgtChoose | Defined$ Player | SpellDescription$ Each player discards a card. -SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 1 | Defined$ Player | SubAbility$ DBDraw | SpellDescription$ Each player loses 1 life and draws a card. +SVar:DBDiscard:DB$ Discard | NumCards$ 1 | Mode$ TgtChoose | Defined$ Player | AILogic$ AnyPhaseIfFavored | SpellDescription$ Each player discards a card. +SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 1 | Defined$ Player | SubAbility$ DBDraw | AILogic$ AnyPhase | SpellDescription$ Each player loses 1 life and draws a card. SVar:DBDraw:DB$ Draw | Defined$ Player | NumCards$ 1 | StackDescription$ None SVar:DBSac:DB$ Sacrifice | SacValid$ Creature | Defined$ Player | SpellDescription$ Each player sacrifices a creature. Oracle:Flying, haste\nWhenever Rankle, Master of Pranks deals combat damage to a player, choose any number —\n• Each player discards a card.\n• Each player loses 1 life and draws a card.\n• Each player sacrifices a creature.