diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/WickedAkuba.java b/Mage.Sets/src/mage/sets/championsofkamigawa/WickedAkuba.java index a8dbe119bf2..de6a1312e05 100644 --- a/Mage.Sets/src/mage/sets/championsofkamigawa/WickedAkuba.java +++ b/Mage.Sets/src/mage/sets/championsofkamigawa/WickedAkuba.java @@ -33,24 +33,31 @@ import mage.Constants.CardType; import mage.Constants.Rarity; import mage.Constants.Zone; import mage.MageInt; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ColoredManaCost; import mage.abilities.effects.common.LoseLifeTargetEffect; import mage.cards.CardImpl; +import mage.filter.FilterPlayer; +import mage.filter.predicate.ObjectSourcePlayer; +import mage.filter.predicate.ObjectSourcePlayerPredicate; import mage.game.Game; -import mage.game.permanent.Permanent; -import mage.game.stack.StackAbility; +import mage.players.Player; import mage.target.TargetPlayer; import mage.watchers.common.PlayerDamagedBySourceWatcher; /** * - * @author LevelX + * @author North */ public class WickedAkuba extends CardImpl { + private static final FilterPlayer filter = new FilterPlayer("player dealt damage by Wicked Akuba this turn"); + + static { + filter.add(new WickedAkubaPredicate()); + } + public WickedAkuba(UUID ownerId) { super(ownerId, 150, "Wicked Akuba", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{B}{B}"); this.expansionSetCode = "CHK"; @@ -62,7 +69,7 @@ public class WickedAkuba extends CardImpl { // {B}: Target player dealt damage by Wicked Akuba this turn loses 1 life. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new LoseLifeTargetEffect(1), new ColoredManaCost(Constants.ColoredManaSymbol.B)); - ability.addTarget(new WickedAkubaTarget()); + ability.addTarget(new TargetPlayer(1, 1, false, filter)); this.addAbility(ability); } @@ -73,63 +80,23 @@ public class WickedAkuba extends CardImpl { @Override public WickedAkuba copy() { return new WickedAkuba(this); - } - + } } -class WickedAkubaTarget extends TargetPlayer { +class WickedAkubaPredicate implements ObjectSourcePlayerPredicate> { - public WickedAkubaTarget() { - super(); - this.targetName = "player dealt damage by Wicked Akuba this turn"; - } + @Override + public boolean apply(ObjectSourcePlayer input, Game game) { + PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get("PlayerDamagedBySource", input.getObject().getId()); + if (watcher != null && watcher.damageSources.contains(input.getSourceId())) { + return true; + } - public WickedAkubaTarget(final WickedAkubaTarget target) { - super(target); + return false; } @Override - public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) { - filter.getPlayerId().clear(); - UUID source = null; - MageObject targetSource = game.getObject(sourceId); - if (targetSource instanceof StackAbility) { - StackAbility stackAbility = (StackAbility) targetSource; - source = stackAbility.getSourceId(); - } - if (targetSource instanceof Permanent) { - Permanent permanent = (Permanent) targetSource; - source = permanent.getId(); - } - if (source != null) { - for (UUID playerId: game.getPlayer(sourceControllerId).getInRange()){ - PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get("PlayerDamagedBySource", playerId); - if (watcher != null && watcher.damageSources.contains(source)) - filter.getPlayerId().add(playerId); - } - } - if (filter.getPlayerId().isEmpty()) // neccessary because empty playerId filter allows all players - return false; - return super.canChoose(sourceId, sourceControllerId, game); + public String toString() { + return "(Player dealt damage by {source} this turn)"; } - - @Override - public boolean canTarget(UUID id, Ability source, Game game) { - filter.getPlayerId().clear(); - for (UUID playerId: game.getPlayer(source.getControllerId()).getInRange()){ - PlayerDamagedBySourceWatcher watcher = (PlayerDamagedBySourceWatcher) game.getState().getWatchers().get("PlayerDamagedBySource", playerId); - - if (watcher != null && watcher.damageSources.contains(source.getSourceId())) - filter.getPlayerId().add(playerId); - } - if (filter.getPlayerId().isEmpty()) // neccessary because empty playerId filter allows all players - return false; - return super.canTarget(id, source, game); - } - - @Override - public WickedAkubaTarget copy() { - return new WickedAkubaTarget(this); - } - -} \ No newline at end of file +} diff --git a/Mage/src/mage/filter/FilterPlayer.java b/Mage/src/mage/filter/FilterPlayer.java index 7ce9efddc98..b14d1a2c7c1 100644 --- a/Mage/src/mage/filter/FilterPlayer.java +++ b/Mage/src/mage/filter/FilterPlayer.java @@ -28,35 +28,49 @@ package mage.filter; -import mage.Constants.TargetController; -import mage.game.Game; -import mage.players.Player; - import java.util.ArrayList; import java.util.List; import java.util.UUID; +import mage.Constants.TargetController; +import mage.filter.predicate.ObjectPlayer; +import mage.filter.predicate.ObjectPlayerPredicate; +import mage.filter.predicate.ObjectSourcePlayer; +import mage.filter.predicate.Predicates; +import mage.game.Game; +import mage.players.Player; /** * * @author BetaSteward_at_googlemail.com + * @author North */ public class FilterPlayer extends FilterImpl { + protected List>> extraPredicates = new ArrayList>>(); protected List playerId = new ArrayList(); protected boolean notPlayer; protected TargetController playerTarget = TargetController.ANY; public FilterPlayer() { - super("player"); + this("player"); } - public FilterPlayer(FilterPlayer filter) { + public FilterPlayer(String name) { + super(name); + } + + public FilterPlayer(final FilterPlayer filter) { super(filter); + this.extraPredicates = new ArrayList>>(filter.extraPredicates); this.playerId.addAll(filter.playerId); this.notPlayer = filter.notPlayer; this.playerTarget = filter.playerTarget; } + public void add(ObjectPlayerPredicate predicate) { + extraPredicates.add(predicate); + } + @Override public boolean match(Player player, Game game) { @@ -66,28 +80,28 @@ public class FilterPlayer extends FilterImpl { return !notFilter; } - public boolean match(Player player, UUID sourceId, UUID playerId, Game game) { + public boolean match(Player player, UUID sourceId, UUID controllerId, Game game) { if (!this.match(player, game)) return notFilter; - if (playerTarget != TargetController.ANY && playerId != null) { + if (playerTarget != TargetController.ANY && controllerId != null) { switch(playerTarget) { case YOU: - if (!player.getId().equals(playerId)) + if (!player.getId().equals(controllerId)) return notFilter; break; case OPPONENT: - if (!game.getOpponents(playerId).contains(player.getId())) + if (!game.getOpponents(controllerId).contains(player.getId())) return notFilter; break; case NOT_YOU: - if (player.getId().equals(playerId)) + if (player.getId().equals(controllerId)) return notFilter; break; } } - return !notFilter; + return Predicates.and(extraPredicates).apply(new ObjectSourcePlayer(player, sourceId, controllerId), game); } public List getPlayerId() { diff --git a/Mage/src/mage/filter/common/FilterCreatureOrPlayer.java b/Mage/src/mage/filter/common/FilterCreatureOrPlayer.java index 8f1f104e18f..f0dc78c36bd 100644 --- a/Mage/src/mage/filter/common/FilterCreatureOrPlayer.java +++ b/Mage/src/mage/filter/common/FilterCreatureOrPlayer.java @@ -74,12 +74,12 @@ public class FilterCreatureOrPlayer extends FilterImpl implements Filter } @Override - public boolean match(Object o, UUID sourceId, UUID playerId, Game game) { + public boolean match(Object o, UUID sourceId, UUID controllerId, Game game) { if (o instanceof Player) { - return playerFilter.match((Player)o, sourceId, playerId, game); + return playerFilter.match((Player)o, sourceId, controllerId, game); } else if (o instanceof Permanent) { - return creatureFilter.match((Permanent)o, sourceId, playerId, game); + return creatureFilter.match((Permanent)o, sourceId, controllerId, game); } return notFilter; } diff --git a/Mage/src/mage/target/TargetPlayer.java b/Mage/src/mage/target/TargetPlayer.java index 555a01eeba7..ef9a516c63b 100644 --- a/Mage/src/mage/target/TargetPlayer.java +++ b/Mage/src/mage/target/TargetPlayer.java @@ -44,7 +44,7 @@ import java.util.UUID; */ public class TargetPlayer> extends TargetImpl> { - protected FilterPlayer filter = new FilterPlayer(); + protected FilterPlayer filter; public TargetPlayer(boolean required) { this(); @@ -60,9 +60,14 @@ public class TargetPlayer> extends TargetImpl> extends TargetImpl= this.minNumberOfTargets) @@ -130,7 +135,7 @@ public class TargetPlayer> extends TargetImpl> extends TargetImpl