diff --git a/res/cardsfolder/w/war_tax.txt b/res/cardsfolder/w/war_tax.txt index 02bc5ec948e..be9c32427a2 100644 --- a/res/cardsfolder/w/war_tax.txt +++ b/res/cardsfolder/w/war_tax.txt @@ -7,6 +7,7 @@ SVar:AttackTax:Mode$ CantAttackUnless | ValidCard$ Creature | EffectZone$ Comman SVar:DBReset:DB$ StoreSVar | SVar$ Y | Type$ Number | Expression$ 0 SVar:X:Count$xPaid SVar:Y:Number$0 +SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/war_tax.jpg Oracle:X U:This turn, creatures can't attack unless their controller pays X for each attacking creature he or she controls. SetInfo:MMQ Uncommon diff --git a/src/main/java/forge/card/ability/ai/DrawAi.java b/src/main/java/forge/card/ability/ai/DrawAi.java index c10d6c32fde..5e5ad620d8d 100644 --- a/src/main/java/forge/card/ability/ai/DrawAi.java +++ b/src/main/java/forge/card/ability/ai/DrawAi.java @@ -89,9 +89,7 @@ public class DrawAi extends SpellAbilityAi { } - final boolean bFlag = targetAI(ai, sa, false); - - if (!bFlag) { + if (!targetAI(ai, sa, false)) { return false; } @@ -104,7 +102,7 @@ public class DrawAi extends SpellAbilityAi { // Don't use draw abilities before main 2 if possible if (game.getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) - && !sa.hasParam("ActivationPhases")) { + && !sa.hasParam("ActivationPhases") && !ComputerUtil.castSpellInMain1(ai, sa)) { return false; } if ((!game.getPhaseHandler().getNextTurn().equals(ai) diff --git a/src/main/java/forge/card/ability/ai/TapAiBase.java b/src/main/java/forge/card/ability/ai/TapAiBase.java index ace071843de..c26f0de0d65 100644 --- a/src/main/java/forge/card/ability/ai/TapAiBase.java +++ b/src/main/java/forge/card/ability/ai/TapAiBase.java @@ -181,7 +181,7 @@ public abstract class TapAiBase extends SpellAbilityAi { List creatureList = CardLists.filter(tapList, findBlockers); if (!attackers.isEmpty() && !creatureList.isEmpty()) { choice = ComputerUtilCard.getBestCreatureAI(creatureList); - } else if (sa.isTrigger()) { + } else if (sa.isTrigger() || ComputerUtil.castSpellInMain1(ai, sa)) { choice = ComputerUtilCard.getMostExpensivePermanentAI(tapList, sa, false); } diff --git a/src/main/java/forge/card/ability/ai/TokenAi.java b/src/main/java/forge/card/ability/ai/TokenAi.java index ce07905e620..90195189dc4 100644 --- a/src/main/java/forge/card/ability/ai/TokenAi.java +++ b/src/main/java/forge/card/ability/ai/TokenAi.java @@ -105,7 +105,8 @@ public class TokenAi extends SpellAbilityAi { // Don't generate tokens without haste before main 2 if possible if (ph.getPhase().isBefore(PhaseType.MAIN2) && ph.isPlayerTurn(ai) && !haste - && !sa.hasParam("ActivationPhases")) { + && !sa.hasParam("ActivationPhases") + && !ComputerUtil.castSpellInMain1(ai, sa)) { return false; } if ((ph.isPlayerTurn(ai) diff --git a/src/main/java/forge/game/ai/ComputerUtil.java b/src/main/java/forge/game/ai/ComputerUtil.java index bf96bf8531c..c8cc653edf7 100644 --- a/src/main/java/forge/game/ai/ComputerUtil.java +++ b/src/main/java/forge/game/ai/ComputerUtil.java @@ -1000,6 +1000,41 @@ public class ComputerUtil { && (ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY) || !ph.getNextTurn().equals(sa.getActivatingPlayer()))); } + + /** + *

+ * castSpellMain1. + *

+ * + * @param sa + * a {@link forge.card.spellability.SpellAbility} object. + * @return a boolean (returns true if it's better to wait until blockers are declared). + */ + public static boolean castSpellInMain1(final Player ai, final SpellAbility sa) { + final Card source = sa.getSourceCard(); + final SpellAbility sub = sa.getSubAbility(); + + // Cipher spells + if (sub != null && ApiType.Encode == sa.getSubAbility().getApi() && !ai.getCreaturesInPlay().isEmpty()) { + return true; + } + final List buffed = ai.getCardsIn(ZoneType.Battlefield); + for (Card buffedcard : buffed) { + if (buffedcard.hasSVar("BuffedBy")) { + final String buffedby = buffedcard.getSVar("BuffedBy"); + final String[] bffdby = buffedby.split(","); + if (source.isValid(bffdby, buffedcard.getController(), buffedcard)) { + return true; + } + } + } + + if (sub != null) { + return castSpellInMain1(ai, sub); + } + + return false; + } // returns true if the AI should stop using the ability /**