From 87e607755dce2f96f58d0d9bd84949a3f29b074d Mon Sep 17 00:00:00 2001 From: Sloth Date: Thu, 21 Mar 2013 08:33:10 +0000 Subject: [PATCH] - Improved TapAllAI. --- res/cardsfolder/t/thoughtweft_gambit.txt | 5 +-- .../java/forge/card/ability/ai/TapAllAi.java | 45 ++++++++++++------- .../java/forge/game/phase/CombatUtil.java | 6 ++- 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/res/cardsfolder/t/thoughtweft_gambit.txt b/res/cardsfolder/t/thoughtweft_gambit.txt index 9f18a78b249..dedf570dc41 100644 --- a/res/cardsfolder/t/thoughtweft_gambit.txt +++ b/res/cardsfolder/t/thoughtweft_gambit.txt @@ -1,9 +1,8 @@ Name:Thoughtweft Gambit ManaCost:4 WU WU Types:Instant -#Switched order of abilities since DB$UntapAll doesn't exist yet -A:SP$ UntapAll | Cost$ 4 WU WU | ValidCards$ Creature.YouCtrl | SubAbility$ DBTap | SpellDescription$ Tap all creatures your opponents control and untap all creatures you control. -SVar:DBTap:DB$ TapAll | ValidCards$ Creature.OppCtrl +A:SP$ TapAll | Cost$ 4 WU WU | ValidCards$ Creature.OppCtrl | SubAbility$ DBUnTap | SpellDescription$ Tap all creatures your opponents control and untap all creatures you control. +SVar:DBUnTap:DB$ UntapAll | ValidCards$ Creature.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/thoughtweft_gambit.jpg Oracle:Tap all creatures your opponents control and untap all creatures you control. SetInfo:SHM Uncommon \ No newline at end of file diff --git a/src/main/java/forge/card/ability/ai/TapAllAi.java b/src/main/java/forge/card/ability/ai/TapAllAi.java index 1bc058cdf26..38061a9647d 100644 --- a/src/main/java/forge/card/ability/ai/TapAllAi.java +++ b/src/main/java/forge/card/ability/ai/TapAllAi.java @@ -13,6 +13,7 @@ import forge.Singletons; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.phase.CombatUtil; import forge.game.phase.PhaseType; import forge.game.player.AIPlayer; import forge.game.player.Player; @@ -56,29 +57,43 @@ public class TapAllAi extends SpellAbilityAi { validTappables = CardLists.filter(validTappables, Presets.UNTAPPED); final Random r = MyRandom.getRandom(); - boolean rr = false; - if (r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn())) { - rr = true; + if (r.nextFloat() > Math.pow(.6667, sa.getActivationsThisTurn())) { + return false; } - if (validTappables.size() > 0) { - final List human = CardLists.filter(validTappables, new Predicate() { + if (validTappables.isEmpty()) { + return false; + } + + final List human = CardLists.filter(validTappables, new Predicate() { + @Override + public boolean apply(final Card c) { + return c.getController().equals(opp); + } + }); + final List compy = CardLists.filter(validTappables, new Predicate() { + @Override + public boolean apply(final Card c) { + return c.getController().equals(ai); + } + }); + if (human.size() <= compy.size()) { + return false; + } + // in AI's turn, check if there are possible attackers, before tapping blockers + if (Singletons.getModel().getGame().getPhaseHandler().isPlayerTurn(ai) && !SpellAbilityAi.isSorcerySpeed(sa)) { + validTappables = ai.getCardsIn(ZoneType.Battlefield); + final boolean any = Iterables.any(validTappables, new Predicate() { @Override public boolean apply(final Card c) { - return c.getController().equals(opp); + return CombatUtil.canAttack(c) && CombatUtil.canAttackNextTurn(c); } }); - final List compy = CardLists.filter(validTappables, new Predicate() { - @Override - public boolean apply(final Card c) { - return c.getController().equals(ai); - } - }); - if (human.size() > compy.size()) { - return rr; + if(!any) { + return false; } } - return false; + return true; } /** diff --git a/src/main/java/forge/game/phase/CombatUtil.java b/src/main/java/forge/game/phase/CombatUtil.java index 29a2a4264ff..ca05584df4a 100644 --- a/src/main/java/forge/game/phase/CombatUtil.java +++ b/src/main/java/forge/game/phase/CombatUtil.java @@ -807,13 +807,17 @@ public class CombatUtil { * @return a boolean. */ public static boolean canAttack(final Card c, final GameEntity defender) { + return canAttack(c) && canAttackNextTurn(c, defender); + } + + public static boolean canAttack(final Card c) { if (c.isTapped() || c.isPhasedOut() || (c.hasSickness() && !c.hasKeyword("CARDNAME can attack as though it had haste.")) || Singletons.getModel().getGame().getPhaseHandler().getPhase() .isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { return false; } - return CombatUtil.canAttackNextTurn(c, defender); + return true; } // can a creature attack if untapped and without summoning sickness?