diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java index 5447c4f1ce0..3c435e85241 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java @@ -256,6 +256,36 @@ public class ComputerPlayer extends PlayerImpl implements Player { if (target.getOriginalTarget() instanceof TargetAnyTarget) { List targets; TargetAnyTarget t = ((TargetAnyTarget) target); + if (outcome.isGood()) { + targets = threats(abilityControllerId, sourceId, ((FilterCreaturePlayerOrPlaneswalker) t.getFilter()).getCreatureFilter(), game, target.getTargets()); + } else { + targets = threats(randomOpponentId, sourceId, ((FilterCreaturePlayerOrPlaneswalker) t.getFilter()).getCreatureFilter(), game, target.getTargets()); + } + for (Permanent permanent : targets) { + List alreadyTargetted = target.getTargets(); + if (t.canTarget(abilityControllerId, permanent.getId(), null, game)) { + if (alreadyTargetted != null && !alreadyTargetted.contains(permanent.getId())) { + target.add(permanent.getId(), game); + return true; + } + } + } + if (outcome.isGood()) { + if (target.canTarget(abilityControllerId, null, game)) { + target.add(abilityControllerId, game); + return true; + } + } else if (target.canTarget(randomOpponentId, null, game)) { + target.add(randomOpponentId, game); + return true; + } + if (!target.isRequired(sourceId, game)) { + return false; + } + } + if (target.getOriginalTarget() instanceof TargetCreatureOrPlayer) { + List targets; + TargetCreatureOrPlayer t = ((TargetCreatureOrPlayer) target); if (outcome.isGood()) { targets = threats(abilityControllerId, sourceId, ((FilterCreatureOrPlayer) t.getFilter()).getCreatureFilter(), game, target.getTargets()); } else { @@ -496,9 +526,9 @@ public class ComputerPlayer extends PlayerImpl implements Player { } return target.isChosen(); } - if (target.getOriginalTarget() instanceof TargetAnyTarget) { + if (target.getOriginalTarget() instanceof TargetCreatureOrPlayer) { List targets; - TargetAnyTarget t = ((TargetAnyTarget) target); + TargetCreatureOrPlayer t = ((TargetCreatureOrPlayer) target); if (outcome.isGood()) { targets = threats(abilityControllerId, source.getSourceId(), ((FilterCreatureOrPlayer) t.getFilter()).getCreatureFilter(), game, target.getTargets()); } else { @@ -543,6 +573,53 @@ public class ComputerPlayer extends PlayerImpl implements Player { //if (!target.isRequired()) return false; } + if (target.getOriginalTarget() instanceof TargetAnyTarget) { + List targets; + TargetAnyTarget t = ((TargetAnyTarget) target); + if (outcome.isGood()) { + targets = threats(abilityControllerId, source.getSourceId(), ((FilterCreaturePlayerOrPlaneswalker) t.getFilter()).getCreatureFilter(), game, target.getTargets()); + } else { + targets = threats(randomOpponentId, source.getSourceId(), ((FilterCreaturePlayerOrPlaneswalker) t.getFilter()).getCreatureFilter(), game, target.getTargets()); + } + + if (targets.isEmpty()) { + if (outcome.isGood()) { + if (target.canTarget(getId(), abilityControllerId, source, game)) { + target.addTarget(abilityControllerId, source, game); + return true; + } + } else if (target.canTarget(getId(), randomOpponentId, source, game)) { + target.addTarget(randomOpponentId, source, game); + return true; + } + } + + if (targets.isEmpty() && target.isRequired(source)) { + targets = game.getBattlefield().getActivePermanents(((FilterCreaturePlayerOrPlaneswalker) t.getFilter()).getCreatureFilter(), playerId, game); + } + for (Permanent permanent : targets) { + List alreadyTargetted = target.getTargets(); + if (t.canTarget(abilityControllerId, permanent.getId(), source, game)) { + if (alreadyTargetted != null && !alreadyTargetted.contains(permanent.getId())) { + target.addTarget(permanent.getId(), source, game); + return true; + } + } + } + + if (outcome.isGood()) { + if (target.canTarget(getId(), abilityControllerId, source, game)) { + target.addTarget(abilityControllerId, source, game); + return true; + } + } else if (target.canTarget(getId(), randomOpponentId, source, game)) { + target.addTarget(randomOpponentId, source, game); + return true; + } + + //if (!target.isRequired()) + return false; + } if (target.getOriginalTarget() instanceof TargetPermanentOrPlayer) { List targets; TargetPermanentOrPlayer t = ((TargetPermanentOrPlayer) target); diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index d94173b35a7..e0eadcb549b 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -913,7 +913,10 @@ public class TestPlayer implements Player { if (target.getTargetController() != null && target.getAbilityController() != null) { abilityControllerId = target.getAbilityController(); } - if (target instanceof TargetPlayer || target instanceof TargetAnyTarget || target instanceof TargetCreatureOrPlayer) { + if (target instanceof TargetPlayer + || target instanceof TargetAnyTarget + || target instanceof TargetCreatureOrPlayer + || target instanceof TargetPermanentOrPlayer) { for (String targetDefinition : targets) { if (targetDefinition.startsWith("targetPlayer=")) { String playerName = targetDefinition.substring(targetDefinition.indexOf("targetPlayer=") + 13); @@ -929,7 +932,10 @@ public class TestPlayer implements Player { } } - if ((target instanceof TargetPermanent) || (target instanceof TargetPermanentOrPlayer) || (target instanceof TargetAnyTarget) || (target instanceof TargetCreatureOrPlayer)) { + if ((target instanceof TargetPermanent) + || (target instanceof TargetPermanentOrPlayer) + || (target instanceof TargetAnyTarget) + || (target instanceof TargetCreatureOrPlayer)) { for (String targetDefinition : targets) { String[] targetList = targetDefinition.split("\\^"); boolean targetFound = false; @@ -947,9 +953,15 @@ public class TestPlayer implements Player { } } Filter filter = target.getFilter(); - if (filter instanceof FilterCreatureOrPlayer || filter instanceof FilterCreaturePlayerOrPlaneswalker) { + if (filter instanceof FilterCreatureOrPlayer) { filter = ((FilterCreatureOrPlayer) filter).getCreatureFilter(); } + if (filter instanceof FilterCreaturePlayerOrPlaneswalker) { + filter = ((FilterCreaturePlayerOrPlaneswalker) filter).getCreatureFilter(); + } + if (filter instanceof TargetPermanentOrPlayer) { + filter = ((TargetPermanentOrPlayer) filter).getFilterPermanent(); + } for (Permanent permanent : game.getBattlefield().getAllActivePermanents((FilterPermanent) filter, game)) { if (permanent.getName().equals(targetName) || (permanent.getName() + '-' + permanent.getExpansionSetCode()).equals(targetName)) { if (target.canTarget(abilityControllerId, permanent.getId(), source, game) && !target.getTargets().contains(permanent.getId())) {