From 545d64d23cf69453cc5759aaec92b58fef4440ad Mon Sep 17 00:00:00 2001 From: Sloth Date: Thu, 30 May 2013 10:16:32 +0000 Subject: [PATCH] - Improved ControlGainAI. --- .../forge/card/ability/ai/ControlGainAi.java | 20 +++++++++---------- .../ability/effects/ControlGainEffect.java | 7 ++++++- src/main/java/forge/game/ai/ComputerUtil.java | 4 ++-- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/main/java/forge/card/ability/ai/ControlGainAi.java b/src/main/java/forge/card/ability/ai/ControlGainAi.java index fa9f5add494..ebedbc40140 100644 --- a/src/main/java/forge/card/ability/ai/ControlGainAi.java +++ b/src/main/java/forge/card/ability/ai/ControlGainAi.java @@ -31,6 +31,7 @@ import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; import forge.game.Game; import forge.game.ai.ComputerUtilCard; +import forge.game.phase.CombatUtil; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -61,7 +62,7 @@ import forge.game.zone.ZoneType; */ public class ControlGainAi extends SpellAbilityAi { @Override - protected boolean canPlayAI(Player ai, final SpellAbility sa) { + protected boolean canPlayAI(final Player ai, final SpellAbility sa) { boolean hasCreature = false; boolean hasArtifact = false; boolean hasEnchantment = false; @@ -69,7 +70,6 @@ public class ControlGainAi extends SpellAbilityAi { final List lose = sa.hasParam("LoseControl") ? Arrays.asList(sa.getParam("LoseControl").split(",")) : null; - final Target tgt = sa.getTarget(); Player opp = ai.getOpponent(); @@ -93,6 +93,13 @@ public class ControlGainAi extends SpellAbilityAi { } } + // Don't steal something if I can't Attack without, or prevent it from + // blocking at least + if (lose != null && lose.contains("EOT") + && ai.getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { + return false; + } + List list = CardLists.getValidCards(opp.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getSourceCard()); // AI won't try to grab cards that are filtered out of AI decks on @@ -101,7 +108,7 @@ public class ControlGainAi extends SpellAbilityAi { @Override public boolean apply(final Card c) { final Map vars = c.getSVars(); - return !vars.containsKey("RemAIDeck") && c.canBeTargetedBy(sa); + return !vars.containsKey("RemAIDeck") && c.canBeTargetedBy(sa) && CombatUtil.canAttackNextTurn(c, ai.getOpponent()); } }); @@ -109,13 +116,6 @@ public class ControlGainAi extends SpellAbilityAi { return false; } - // Don't steal something if I can't Attack without, or prevent it from - // blocking at least - if ((lose != null) && lose.contains("EOT") - && ai.getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS)) { - return false; - } - while (tgt.getNumTargeted() < tgt.getMaxTargets(sa.getSourceCard(), sa)) { Card t = null; for (final Card c : list) { diff --git a/src/main/java/forge/card/ability/effects/ControlGainEffect.java b/src/main/java/forge/card/ability/effects/ControlGainEffect.java index 2f5f5054ebc..a8e3642c52c 100644 --- a/src/main/java/forge/card/ability/effects/ControlGainEffect.java +++ b/src/main/java/forge/card/ability/effects/ControlGainEffect.java @@ -13,6 +13,7 @@ import forge.card.spellability.Ability; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; import forge.game.Game; +import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.zone.ZoneType; @@ -164,6 +165,7 @@ public class ControlGainEffect extends SpellAbilityEffect { } if (lose.contains("EOT")) { game.getEndOfTurn().addAt(this.getLoseControlCommand(tgtC, tStamp, bTapOnLose, source, kws)); + tgtC.setSVar("SacMe", "6"); } } @@ -245,7 +247,10 @@ public class ControlGainEffect extends SpellAbilityEffect { private static final long serialVersionUID = 878543373519872418L; @Override - public void run() { doLoseControl(c, hostCard, bTapOnLose, kws, tStamp); } + public void run() { + doLoseControl(c, hostCard, bTapOnLose, kws, tStamp); + c.getSVars().remove("SacMe"); + } }; return loseControl; diff --git a/src/main/java/forge/game/ai/ComputerUtil.java b/src/main/java/forge/game/ai/ComputerUtil.java index 26d152da238..d3cb0c89b05 100644 --- a/src/main/java/forge/game/ai/ComputerUtil.java +++ b/src/main/java/forge/game/ai/ComputerUtil.java @@ -350,7 +350,7 @@ public class ComputerUtil { } } if (pref.contains("SacCost")) { // search for permanents with SacMe - for (int ip = 0; ip < 6; ip++) { // priority 0 is the lowest, + for (int ip = 1; ip < 6; ip++) { // priority 1 is the lowest, // priority 5 the highest final int priority = 6 - ip; final List sacMeList = CardLists.filter(typeList, new Predicate() { @@ -359,7 +359,7 @@ public class ComputerUtil { return (c.hasSVar("SacMe") && (Integer.parseInt(c.getSVar("SacMe")) == priority)); } }); - if (sacMeList.size() != 0) { + if (!sacMeList.isEmpty()) { CardLists.shuffle(sacMeList); return sacMeList.get(0); }