diff --git a/Mage.Server.Plugins/Mage.Player.AI/mage-player-ai.iml b/Mage.Server.Plugins/Mage.Player.AI/mage-player-ai.iml new file mode 100644 index 00000000000..6090a3a9e33 --- /dev/null +++ b/Mage.Server.Plugins/Mage.Player.AI/mage-player-ai.iml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + 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 e436b2be1d6..be03f87bb28 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 @@ -395,6 +395,20 @@ public class ComputerPlayer> extends PlayerImpl i else { targets = threats(opponentId, source.getSourceId(), ((FilterCreatureOrPlayer)t.getFilter()).getCreatureFilter(), game, target.getTargets()); } + + if (outcome.isGood()) { + if (target.canTarget(playerId, source, game)) { + target.addTarget(playerId, source, game); + return true; + } + } + else { + if (target.canTarget(opponentId, source, game)) { + target.addTarget(opponentId, source, game); + return true; + } + } + if (targets.isEmpty() && target.isRequired()) { targets = game.getBattlefield().getActivePermanents(((FilterCreatureOrPlayer)t.getFilter()).getCreatureFilter(), playerId, game); } @@ -407,18 +421,7 @@ public class ComputerPlayer> extends PlayerImpl i } } } - if (outcome.isGood()) { - if (target.canTarget(playerId, source, game)) { - target.addTarget(playerId, source, game); - return true; - } - } - else { - if (target.canTarget(opponentId, source, game)) { - target.addTarget(opponentId, source, game); - return true; - } - } + if (!target.isRequired()) return false; } @@ -1498,7 +1501,7 @@ public class ComputerPlayer> extends PlayerImpl i protected List threats(UUID playerId, UUID sourceId, FilterPermanent filter, Game game, List targets) { List threats = playerId == null ? game.getBattlefield().getAllActivePermanents(filter) : - game.getBattlefield().getActivePermanents(filter, playerId, sourceId, game); + game.getBattlefield().getAllActivePermanents(filter, playerId); Iterator it = threats.iterator(); while (it.hasNext()) { // remove permanents already targeted diff --git a/Mage.Sets/src/mage/sets/darkascension/FlayerOfTheHatebound.java b/Mage.Sets/src/mage/sets/darkascension/FlayerOfTheHatebound.java index 63d5b4777ce..e8b9a5e8a4b 100644 --- a/Mage.Sets/src/mage/sets/darkascension/FlayerOfTheHatebound.java +++ b/Mage.Sets/src/mage/sets/darkascension/FlayerOfTheHatebound.java @@ -27,7 +27,6 @@ */ package mage.sets.darkascension; -import java.util.UUID; import mage.Constants; import mage.Constants.CardType; import mage.Constants.Rarity; @@ -45,6 +44,8 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCreatureOrPlayer; +import java.util.UUID; + /** * * @author BetaSteward @@ -64,7 +65,7 @@ public class FlayerOfTheHatebound extends CardImpl { // Whenever Flayer of the Hatebound or another creature enters the battlefield from your graveyard, that creature deals damage equal to its power to target creature or player. Ability ability = new FlayerTriggeredAbility(); - ability.addTarget(new TargetCreatureOrPlayer()); + ability.addTarget(new TargetCreatureOrPlayer(true)); this.addAbility(ability); } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/FlayerOfTheHateboundTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/FlayerOfTheHateboundTest.java index c1c977aec11..dec58d5db7b 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/FlayerOfTheHateboundTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/FlayerOfTheHateboundTest.java @@ -20,6 +20,7 @@ public class FlayerOfTheHateboundTest extends CardTestPlayerBase { addCard(Constants.Zone.HAND, playerA, "Lightning Bolt", 1); castSpell(1, Constants.PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "Flayer of the Hatebound"); + setStopAt(2, Constants.PhaseStep.DRAW); execute(); diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/CardTestPlayerBase.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/CardTestPlayerBase.java index 01c7b9d356e..26defd3c9b5 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/CardTestPlayerBase.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/CardTestPlayerBase.java @@ -53,7 +53,7 @@ public abstract class CardTestPlayerBase extends CardTestPlayerAPIImpl { System.gc(); } - Game game = new TwoPlayerDuel(Constants.MultiplayerAttackOption.LEFT, Constants.RangeOfInfluence.ALL); + Game game = new TwoPlayerDuel(Constants.MultiplayerAttackOption.LEFT, Constants.RangeOfInfluence.ONE); playerA = createNewPlayer("PlayerA"); playerA.setTestMode(true); diff --git a/Mage/src/mage/target/common/TargetCreatureOrPlayer.java b/Mage/src/mage/target/common/TargetCreatureOrPlayer.java index e9bb85540eb..5ab3ac1d0dc 100644 --- a/Mage/src/mage/target/common/TargetCreatureOrPlayer.java +++ b/Mage/src/mage/target/common/TargetCreatureOrPlayer.java @@ -28,9 +28,6 @@ package mage.target.common; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; import mage.Constants.Zone; import mage.MageObject; import mage.abilities.Ability; @@ -42,6 +39,10 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetImpl; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + /** * * @author BetaSteward_at_googlemail.com @@ -50,6 +51,11 @@ public class TargetCreatureOrPlayer extends TargetImpl { protected FilterCreatureOrPlayer filter; + public TargetCreatureOrPlayer(boolean required) { + this(); + setRequired(required); + } + public TargetCreatureOrPlayer() { this(1, 1); }