diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/cost/alternate/CastFromHandWithoutPayingManaCostTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/cost/alternate/CastFromHandWithoutPayingManaCostTest.java index d0b8d4e8e11..e0ef557c53e 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/cost/alternate/CastFromHandWithoutPayingManaCostTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/cost/alternate/CastFromHandWithoutPayingManaCostTest.java @@ -146,7 +146,7 @@ public class CastFromHandWithoutPayingManaCostTest extends CardTestPlayerBase { addCard(Zone.HAND, playerA, "Shrapnel Blast", 1); - castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Shrapnel Blast"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Shrapnel Blast", "Ornithopter"); setChoice(playerA, "Yes"); setStopAt(1, PhaseStep.BEGIN_COMBAT); diff --git a/Mage/src/main/java/mage/filter/common/FilterOpponentOrPlaneswalker.java b/Mage/src/main/java/mage/filter/common/FilterOpponentOrPlaneswalker.java index 36d93524405..95eaa60b17f 100644 --- a/Mage/src/main/java/mage/filter/common/FilterOpponentOrPlaneswalker.java +++ b/Mage/src/main/java/mage/filter/common/FilterOpponentOrPlaneswalker.java @@ -5,81 +5,24 @@ */ package mage.filter.common; -import java.util.UUID; -import mage.MageItem; -import mage.filter.FilterImpl; -import mage.filter.FilterInPlay; import mage.filter.FilterOpponent; -import mage.filter.FilterPlayer; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; +import mage.filter.FilterPermanent; /** * * @author LevelX2 */ -public class FilterOpponentOrPlaneswalker extends FilterImpl implements FilterInPlay { - - protected FilterPlaneswalkerPermanent planeswalkerFilter; - protected final FilterPlayer playerFilter; +public class FilterOpponentOrPlaneswalker extends FilterPermanentOrPlayer { public FilterOpponentOrPlaneswalker() { this("opponent or planeswalker"); } public FilterOpponentOrPlaneswalker(String name) { - super(name); - planeswalkerFilter = new FilterPlaneswalkerPermanent(); - playerFilter = new FilterOpponent(); + super(name, new FilterPermanent(), new FilterOpponent()); } public FilterOpponentOrPlaneswalker(final FilterOpponentOrPlaneswalker filter) { super(filter); - this.planeswalkerFilter = filter.planeswalkerFilter.copy(); - this.playerFilter = filter.playerFilter.copy(); } - - @Override - public boolean checkObjectClass(Object object) { - return true; - } - - @Override - public boolean match(MageItem o, Game game) { - if (o instanceof Player) { - return playerFilter.match((Player) o, game); - } else if (o instanceof Permanent) { - return planeswalkerFilter.match((Permanent) o, game); - } - return false; - } - - @Override - public boolean match(MageItem o, UUID sourceId, UUID playerId, Game game) { - if (o instanceof Player) { - return playerFilter.match((Player) o, sourceId, playerId, game); - } else if (o instanceof Permanent) { - return planeswalkerFilter.match((Permanent) o, sourceId, playerId, game); - } - return false; - } - - public FilterPlaneswalkerPermanent getPlaneswalkerFilter() { - return this.planeswalkerFilter; - } - - public FilterPlayer getPlayerFilter() { - return this.playerFilter; - } - - public void setPlaneswalkerFilter(FilterPlaneswalkerPermanent planeswalkerFilter) { - this.planeswalkerFilter = planeswalkerFilter; - } - - @Override - public FilterOpponentOrPlaneswalker copy() { - return new FilterOpponentOrPlaneswalker(this); - } - } diff --git a/Mage/src/main/java/mage/filter/common/FilterPermanentOrPlayer.java b/Mage/src/main/java/mage/filter/common/FilterPermanentOrPlayer.java index d4e024f4762..9c2827181f3 100644 --- a/Mage/src/main/java/mage/filter/common/FilterPermanentOrPlayer.java +++ b/Mage/src/main/java/mage/filter/common/FilterPermanentOrPlayer.java @@ -50,9 +50,13 @@ public class FilterPermanentOrPlayer extends FilterImpl implements Fil } public FilterPermanentOrPlayer(String name) { + this(name, new FilterPermanent(), new FilterPlayer()); + } + + public FilterPermanentOrPlayer(String name, FilterPermanent permanentFilter, FilterPlayer playerFilter) { super(name); - permanentFilter = new FilterPermanent(); - playerFilter = new FilterPlayer(); + this.permanentFilter = permanentFilter; + this.playerFilter = playerFilter; } public FilterPermanentOrPlayer(final FilterPermanentOrPlayer filter) { diff --git a/Mage/src/main/java/mage/filter/common/FilterPlayerOrPlaneswalker.java b/Mage/src/main/java/mage/filter/common/FilterPlayerOrPlaneswalker.java index 63848adb214..e02bb5a03aa 100644 --- a/Mage/src/main/java/mage/filter/common/FilterPlayerOrPlaneswalker.java +++ b/Mage/src/main/java/mage/filter/common/FilterPlayerOrPlaneswalker.java @@ -5,80 +5,24 @@ */ package mage.filter.common; -import java.util.UUID; -import mage.MageItem; -import mage.filter.FilterImpl; -import mage.filter.FilterInPlay; +import mage.filter.FilterPermanent; import mage.filter.FilterPlayer; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; /** * * @author LevelX2 */ -public class FilterPlayerOrPlaneswalker extends FilterImpl implements FilterInPlay { - - protected FilterPlaneswalkerPermanent planeswalkerFilter; - protected final FilterPlayer playerFilter; +public class FilterPlayerOrPlaneswalker extends FilterPermanentOrPlayer { public FilterPlayerOrPlaneswalker() { this("player or planeswalker"); } public FilterPlayerOrPlaneswalker(String name) { - super(name); - planeswalkerFilter = new FilterPlaneswalkerPermanent(); - playerFilter = new FilterPlayer(); + super(name, new FilterPermanent(), new FilterPlayer()); } public FilterPlayerOrPlaneswalker(final FilterPlayerOrPlaneswalker filter) { super(filter); - this.planeswalkerFilter = filter.planeswalkerFilter.copy(); - this.playerFilter = filter.playerFilter.copy(); } - - @Override - public boolean checkObjectClass(Object object) { - return true; - } - - @Override - public boolean match(MageItem o, Game game) { - if (o instanceof Player) { - return playerFilter.match((Player) o, game); - } else if (o instanceof Permanent) { - return planeswalkerFilter.match((Permanent) o, game); - } - return false; - } - - @Override - public boolean match(MageItem o, UUID sourceId, UUID playerId, Game game) { - if (o instanceof Player) { - return playerFilter.match((Player) o, sourceId, playerId, game); - } else if (o instanceof Permanent) { - return planeswalkerFilter.match((Permanent) o, sourceId, playerId, game); - } - return false; - } - - public FilterPlaneswalkerPermanent getPlaneswalkerFilter() { - return this.planeswalkerFilter; - } - - public FilterPlayer getPlayerFilter() { - return this.playerFilter; - } - - public void setPlaneswalkerFilter(FilterPlaneswalkerPermanent planeswalkerFilter) { - this.planeswalkerFilter = planeswalkerFilter; - } - - @Override - public FilterPlayerOrPlaneswalker copy() { - return new FilterPlayerOrPlaneswalker(this); - } - } diff --git a/Mage/src/main/java/mage/target/common/TargetOpponentOrPlaneswalker.java b/Mage/src/main/java/mage/target/common/TargetOpponentOrPlaneswalker.java index 9dbb6b721fc..4685e32c3b4 100644 --- a/Mage/src/main/java/mage/target/common/TargetOpponentOrPlaneswalker.java +++ b/Mage/src/main/java/mage/target/common/TargetOpponentOrPlaneswalker.java @@ -5,217 +5,31 @@ */ package mage.target.common; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; -import mage.MageObject; -import mage.abilities.Ability; -import mage.constants.Zone; -import mage.filter.Filter; import mage.filter.common.FilterOpponentOrPlaneswalker; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.TargetImpl; /** * * @author LevelX2 */ -public class TargetOpponentOrPlaneswalker extends TargetImpl { - - protected FilterOpponentOrPlaneswalker filter; +public class TargetOpponentOrPlaneswalker extends TargetPermanentOrPlayer { public TargetOpponentOrPlaneswalker() { - this(1, 1, new FilterOpponentOrPlaneswalker()); + this(1, 1, new FilterOpponentOrPlaneswalker(), false); } public TargetOpponentOrPlaneswalker(int numTargets) { - this(numTargets, numTargets, new FilterOpponentOrPlaneswalker()); + this(numTargets, numTargets, new FilterOpponentOrPlaneswalker(), false); } public TargetOpponentOrPlaneswalker(FilterOpponentOrPlaneswalker filter) { - this(1, 1, filter); + this(1, 1, filter, false); } - public TargetOpponentOrPlaneswalker(int minNumTargets, int maxNumTargets, FilterOpponentOrPlaneswalker filter) { - this.minNumberOfTargets = minNumTargets; - this.maxNumberOfTargets = maxNumTargets; - this.zone = Zone.ALL; - this.filter = filter; - this.targetName = filter.getMessage(); + public TargetOpponentOrPlaneswalker(int minNumTargets, int maxNumTargets, FilterOpponentOrPlaneswalker filter, boolean notTarget) { + super(minNumTargets, maxNumTargets, filter, notTarget); } public TargetOpponentOrPlaneswalker(final TargetOpponentOrPlaneswalker target) { super(target); - this.filter = target.filter.copy(); } - - @Override - public Filter getFilter() { - return this.filter; - } - - @Override - public boolean canTarget(UUID id, Game game) { - Permanent permanent = game.getPermanent(id); - if (permanent != null) { - return filter.match(permanent, game); - } - Player player = game.getPlayer(id); - return player != null && filter.match(player, game); - } - - @Override - public boolean canTarget(UUID id, Ability source, Game game) { - return canTarget(source.getControllerId(), id, source, game); - } - - @Override - public boolean canTarget(UUID controllerId, UUID id, Ability source, Game game) { - Permanent permanent = game.getPermanent(id); - Player player = game.getPlayer(id); - - if (source != null) { - MageObject targetSource = game.getObject(source.getSourceId()); - if (permanent != null) { - return permanent.canBeTargetedBy(targetSource, source.getControllerId(), game) && filter.match(permanent, source.getSourceId(), source.getControllerId(), game); - } - if (player != null) { - return player.canBeTargetedBy(targetSource, source.getControllerId(), game) && filter.match(player, game); - } - } - - if (permanent != null) { - return filter.match(permanent, game); - } - return player != null && filter.match(player, game); - } - - /** - * Checks if there are enough {@link Permanent} or {@link Player} that can - * be chosen. Should only be used for Ability targets since this checks for - * protection, shroud etc. - * - * @param sourceId - the target event source - * @param sourceControllerId - controller of the target event source - * @param game - * @return - true if enough valid {@link Permanent} or {@link Player} exist - */ - @Override - public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) { - int count = 0; - MageObject targetSource = game.getObject(sourceId); - for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) { - Player player = game.getPlayer(playerId); - if (player != null && player.canBeTargetedBy(targetSource, sourceControllerId, game) && filter.match(player, game)) { - count++; - if (count >= this.minNumberOfTargets) { - return true; - } - } - } - for (Permanent permanent : game.getBattlefield().getActivePermanents(filter.getPlaneswalkerFilter(), sourceControllerId, game)) { - if (permanent.canBeTargetedBy(targetSource, sourceControllerId, game) && filter.match(permanent, sourceId, sourceControllerId, game)) { - count++; - if (count >= this.minNumberOfTargets) { - return true; - } - } - } - return false; - } - - /** - * Checks if there are enough {@link Permanent} or {@link Player} that can - * be selected. Should not be used for Ability targets since this does not - * check for protection, shroud etc. - * - * @param sourceControllerId - controller of the select event - * @param game - * @return - true if enough valid {@link Permanent} or {@link Player} exist - */ - @Override - public boolean canChoose(UUID sourceControllerId, Game game) { - int count = 0; - for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) { - Player player = game.getPlayer(playerId); - if (player != null && filter.match(player, game)) { - count++; - if (count >= this.minNumberOfTargets) { - return true; - } - } - } - for (Permanent permanent : game.getBattlefield().getActivePermanents(filter.getPlaneswalkerFilter(), sourceControllerId, game)) { - if (filter.match(permanent, null, sourceControllerId, game)) { - count++; - if (count >= this.minNumberOfTargets) { - return true; - } - } - } - return false; - } - - @Override - public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { - Set possibleTargets = new HashSet<>(); - MageObject targetSource = game.getObject(sourceId); - for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) { - Player player = game.getPlayer(playerId); - if (player != null - && player.canBeTargetedBy(targetSource, sourceControllerId, game) - && filter.getPlayerFilter().match(player, sourceId, sourceControllerId, game)) { - possibleTargets.add(playerId); - } - } - for (Permanent permanent : game.getBattlefield().getActivePermanents(filter.getPlaneswalkerFilter(), sourceControllerId, game)) { - if (permanent.canBeTargetedBy(targetSource, sourceControllerId, game) - && filter.getPlaneswalkerFilter().match(permanent, sourceId, sourceControllerId, game)) { - possibleTargets.add(permanent.getId()); - } - } - return possibleTargets; - } - - @Override - public Set possibleTargets(UUID sourceControllerId, Game game) { - Set possibleTargets = new HashSet<>(); - for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) { - Player player = game.getPlayer(playerId); - if (player != null && filter.getPlayerFilter().match(player, game)) { - possibleTargets.add(playerId); - } - } - for (Permanent permanent : game.getBattlefield().getActivePermanents(filter.getPlaneswalkerFilter(), sourceControllerId, game)) { - if (filter.getPlaneswalkerFilter().match(permanent, null, sourceControllerId, game)) { - possibleTargets.add(permanent.getId()); - } - } - return possibleTargets; - } - - @Override - public String getTargetedName(Game game) { - StringBuilder sb = new StringBuilder(); - for (UUID targetId : getTargets()) { - Permanent permanent = game.getPermanent(targetId); - if (permanent != null) { - sb.append(permanent.getLogName()).append(' '); - } else { - Player player = game.getPlayer(targetId); - if (player != null) { - sb.append(player.getLogName()).append(' '); - } - } - } - return sb.toString(); - } - - @Override - public TargetOpponentOrPlaneswalker copy() { - return new TargetOpponentOrPlaneswalker(this); - } - } diff --git a/Mage/src/main/java/mage/target/common/TargetPermanentOrPlayer.java b/Mage/src/main/java/mage/target/common/TargetPermanentOrPlayer.java index 7cf54490bf3..4be0a4b88b4 100644 --- a/Mage/src/main/java/mage/target/common/TargetPermanentOrPlayer.java +++ b/Mage/src/main/java/mage/target/common/TargetPermanentOrPlayer.java @@ -65,7 +65,7 @@ public class TargetPermanentOrPlayer extends TargetImpl { this.zone = Zone.ALL; this.filter = new FilterPermanentOrPlayer(); this.targetName = filter.getMessage(); - this.filterPermanent = new FilterPermanent(); + this.filterPermanent = this.filter.getPermanentFilter(); } public TargetPermanentOrPlayer(int minNumTargets, int maxNumTargets, boolean notTarget) { @@ -73,6 +73,11 @@ public class TargetPermanentOrPlayer extends TargetImpl { this.notTarget = notTarget; } + public TargetPermanentOrPlayer(int minNumTargets, int maxNumTargets, FilterPermanentOrPlayer filter, boolean notTarget) { + this(minNumTargets, maxNumTargets, notTarget); + this.filter = filter; + } + public TargetPermanentOrPlayer(final TargetPermanentOrPlayer target) { super(target); this.filter = target.filter.copy(); diff --git a/Mage/src/main/java/mage/target/common/TargetPlayerOrPlaneswalker.java b/Mage/src/main/java/mage/target/common/TargetPlayerOrPlaneswalker.java index 5de959572c9..aec9615ce50 100644 --- a/Mage/src/main/java/mage/target/common/TargetPlayerOrPlaneswalker.java +++ b/Mage/src/main/java/mage/target/common/TargetPlayerOrPlaneswalker.java @@ -5,217 +5,31 @@ */ package mage.target.common; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; -import mage.MageObject; -import mage.abilities.Ability; -import mage.constants.Zone; -import mage.filter.Filter; import mage.filter.common.FilterPlayerOrPlaneswalker; -import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.players.Player; -import mage.target.TargetImpl; /** * * @author LevelX2 */ -public class TargetPlayerOrPlaneswalker extends TargetImpl { - - protected FilterPlayerOrPlaneswalker filter; +public class TargetPlayerOrPlaneswalker extends TargetPermanentOrPlayer { public TargetPlayerOrPlaneswalker() { - this(1, 1, new FilterPlayerOrPlaneswalker()); + this(1, 1, new FilterPlayerOrPlaneswalker(), false); } public TargetPlayerOrPlaneswalker(int numTargets) { - this(numTargets, numTargets, new FilterPlayerOrPlaneswalker()); + this(numTargets, numTargets, new FilterPlayerOrPlaneswalker(), false); } public TargetPlayerOrPlaneswalker(FilterPlayerOrPlaneswalker filter) { - this(1, 1, filter); + this(1, 1, filter, false); } - public TargetPlayerOrPlaneswalker(int minNumTargets, int maxNumTargets, FilterPlayerOrPlaneswalker filter) { - this.minNumberOfTargets = minNumTargets; - this.maxNumberOfTargets = maxNumTargets; - this.zone = Zone.ALL; - this.filter = filter; - this.targetName = filter.getMessage(); + public TargetPlayerOrPlaneswalker(int minNumTargets, int maxNumTargets, FilterPlayerOrPlaneswalker filter, boolean notTarget) { + super(minNumTargets, maxNumTargets, filter, notTarget); } public TargetPlayerOrPlaneswalker(final TargetPlayerOrPlaneswalker target) { super(target); - this.filter = target.filter.copy(); } - - @Override - public Filter getFilter() { - return this.filter; - } - - @Override - public boolean canTarget(UUID id, Game game) { - Permanent permanent = game.getPermanent(id); - if (permanent != null) { - return filter.match(permanent, game); - } - Player player = game.getPlayer(id); - return player != null && filter.match(player, game); - } - - @Override - public boolean canTarget(UUID id, Ability source, Game game) { - return canTarget(source.getControllerId(), id, source, game); - } - - @Override - public boolean canTarget(UUID controllerId, UUID id, Ability source, Game game) { - Permanent permanent = game.getPermanent(id); - Player player = game.getPlayer(id); - - if (source != null) { - MageObject targetSource = game.getObject(source.getSourceId()); - if (permanent != null) { - return permanent.canBeTargetedBy(targetSource, source.getControllerId(), game) && filter.match(permanent, source.getSourceId(), source.getControllerId(), game); - } - if (player != null) { - return player.canBeTargetedBy(targetSource, source.getControllerId(), game) && filter.match(player, game); - } - } - - if (permanent != null) { - return filter.match(permanent, game); - } - return player != null && filter.match(player, game); - } - - /** - * Checks if there are enough {@link Permanent} or {@link Player} that can - * be chosen. Should only be used for Ability targets since this checks for - * protection, shroud etc. - * - * @param sourceId - the target event source - * @param sourceControllerId - controller of the target event source - * @param game - * @return - true if enough valid {@link Permanent} or {@link Player} exist - */ - @Override - public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) { - int count = 0; - MageObject targetSource = game.getObject(sourceId); - for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) { - Player player = game.getPlayer(playerId); - if (player != null && player.canBeTargetedBy(targetSource, sourceControllerId, game) && filter.match(player, game)) { - count++; - if (count >= this.minNumberOfTargets) { - return true; - } - } - } - for (Permanent permanent : game.getBattlefield().getActivePermanents(filter.getPlaneswalkerFilter(), sourceControllerId, game)) { - if (permanent.canBeTargetedBy(targetSource, sourceControllerId, game) && filter.match(permanent, sourceId, sourceControllerId, game)) { - count++; - if (count >= this.minNumberOfTargets) { - return true; - } - } - } - return false; - } - - /** - * Checks if there are enough {@link Permanent} or {@link Player} that can - * be selected. Should not be used for Ability targets since this does not - * check for protection, shroud etc. - * - * @param sourceControllerId - controller of the select event - * @param game - * @return - true if enough valid {@link Permanent} or {@link Player} exist - */ - @Override - public boolean canChoose(UUID sourceControllerId, Game game) { - int count = 0; - for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) { - Player player = game.getPlayer(playerId); - if (player != null && filter.match(player, game)) { - count++; - if (count >= this.minNumberOfTargets) { - return true; - } - } - } - for (Permanent permanent : game.getBattlefield().getActivePermanents(filter.getPlaneswalkerFilter(), sourceControllerId, game)) { - if (filter.match(permanent, null, sourceControllerId, game)) { - count++; - if (count >= this.minNumberOfTargets) { - return true; - } - } - } - return false; - } - - @Override - public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { - Set possibleTargets = new HashSet<>(); - MageObject targetSource = game.getObject(sourceId); - for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) { - Player player = game.getPlayer(playerId); - if (player != null - && player.canBeTargetedBy(targetSource, sourceControllerId, game) - && filter.getPlayerFilter().match(player, sourceId, sourceControllerId, game)) { - possibleTargets.add(playerId); - } - } - for (Permanent permanent : game.getBattlefield().getActivePermanents(filter.getPlaneswalkerFilter(), sourceControllerId, game)) { - if (permanent.canBeTargetedBy(targetSource, sourceControllerId, game) - && filter.getPlaneswalkerFilter().match(permanent, sourceId, sourceControllerId, game)) { - possibleTargets.add(permanent.getId()); - } - } - return possibleTargets; - } - - @Override - public Set possibleTargets(UUID sourceControllerId, Game game) { - Set possibleTargets = new HashSet<>(); - for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) { - Player player = game.getPlayer(playerId); - if (player != null && filter.getPlayerFilter().match(player, game)) { - possibleTargets.add(playerId); - } - } - for (Permanent permanent : game.getBattlefield().getActivePermanents(filter.getPlaneswalkerFilter(), sourceControllerId, game)) { - if (filter.getPlaneswalkerFilter().match(permanent, null, sourceControllerId, game)) { - possibleTargets.add(permanent.getId()); - } - } - return possibleTargets; - } - - @Override - public String getTargetedName(Game game) { - StringBuilder sb = new StringBuilder(); - for (UUID targetId : getTargets()) { - Permanent permanent = game.getPermanent(targetId); - if (permanent != null) { - sb.append(permanent.getLogName()).append(' '); - } else { - Player player = game.getPlayer(targetId); - if (player != null) { - sb.append(player.getLogName()).append(' '); - } - } - } - return sb.toString(); - } - - @Override - public TargetPlayerOrPlaneswalker copy() { - return new TargetPlayerOrPlaneswalker(this); - } - }