From 7c75781138eb23d77a5a4842b882bd033be686aa Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Sat, 20 Feb 2021 09:24:43 +0300 Subject: [PATCH] - Rankle, Master of Pranks: improve logic a little --- .../src/main/java/forge/ai/ability/DiscardAi.java | 12 ++++++++++-- .../src/main/java/forge/ai/ability/LifeLoseAi.java | 2 +- .../res/cardsfolder/r/rankle_master_of_pranks.txt | 4 ++-- 3 files changed, 13 insertions(+), 5 deletions(-) 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.