diff --git a/forge-ai/src/main/java/forge/ai/ability/EncodeAi.java b/forge-ai/src/main/java/forge/ai/ability/EncodeAi.java index 33109a5be6e..975251ec9b8 100644 --- a/forge-ai/src/main/java/forge/ai/ability/EncodeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/EncodeAi.java @@ -17,6 +17,8 @@ */ package forge.ai.ability; +import java.util.List; + import com.google.common.base.Predicate; import forge.ai.ComputerUtilCard; @@ -29,8 +31,6 @@ import forge.game.player.Player; import forge.game.player.PlayerActionConfirmMode; import forge.game.spellability.SpellAbility; -import java.util.List; - /** *

* AbilityFactoryBond class. @@ -63,20 +63,36 @@ public final class EncodeAi extends SpellAbilityAi { } + /* + * (non-Javadoc) + * + * @see forge.ai.SpellAbilityAi#confirmAction(forge.game.player.Player, + * forge.game.spellability.SpellAbility, + * forge.game.player.PlayerActionConfirmMode, java.lang.String) + */ @Override public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { - return true; + // only try to encode if there is a creature it can be used on + return chooseCard(player, player.getCreaturesInPlay(), true) != null; } - - /* (non-Javadoc) - * @see forge.card.ability.SpellAbilityAi#chooseSingleCard(forge.game.player.Player, forge.card.spellability.SpellAbility, java.util.List, boolean) + + /* + * (non-Javadoc) + * + * @see forge.ai.SpellAbilityAi#chooseSingleCard(forge.game.player.Player, + * forge.game.spellability.SpellAbility, java.lang.Iterable, boolean, + * forge.game.player.Player) */ @Override public Card chooseSingleCard(final Player ai, SpellAbility sa, Iterable options, boolean isOptional, Player targetedPlayer) { + return chooseCard(ai, options, isOptional); + } + + private Card chooseCard(final Player ai, Iterable list, boolean isOptional) { Card choice = null; -// final String logic = sa.getParam("AILogic"); -// if (logic == null) { - final List attackers = CardLists.filter(options, new Predicate() { + // final String logic = sa.getParam("AILogic"); + // if (logic == null) { + final List attackers = CardLists.filter(list, new Predicate() { @Override public boolean apply(final Card c) { return ComputerUtilCombat.canAttackNextTurn(c); @@ -85,17 +101,24 @@ public final class EncodeAi extends SpellAbilityAi { final List unblockables = CardLists.filter(attackers, new Predicate() { @Override public boolean apply(final Card c) { - return !CombatUtil.canBeBlocked(c, ai.getOpponent()); + boolean canAttackOpponent = false; + for (Player opp : ai.getOpponents()) { + if (CombatUtil.canAttack(c, opp) && !CombatUtil.canBeBlocked(c, opp)) { + canAttackOpponent = true; + break; + } + } + return canAttackOpponent; } }); if (!unblockables.isEmpty()) { choice = ComputerUtilCard.getBestAI(unblockables); } else if (!attackers.isEmpty()) { choice = ComputerUtilCard.getBestAI(attackers); - } else { - choice = ComputerUtilCard.getBestAI(options); + } else if (!isOptional) { + choice = ComputerUtilCard.getBestAI(list); } -// } + // } return choice; } }