From b7f57c8a2340fd484c55de38fdf44dffe9af184b Mon Sep 17 00:00:00 2001 From: North Date: Tue, 17 Jul 2012 18:58:18 +0300 Subject: [PATCH] [filters] Replaced conditions in StackObject filters with Predicates --- .../mage/sets/avacynrestored/SecondGuess.java | 71 +++++-------------- .../darkascension/IncreasingVengeance.java | 3 +- .../sets/darkascension/SecretsOfTheDead.java | 26 ++++++- .../sets/magic2011/LeylineOfSanctity.java | 3 +- .../mage/sets/scarsofmirrodin/Asceticism.java | 3 +- .../common/CantCounterControlledEffect.java | 17 ++--- .../abilities/keyword/HexproofAbility.java | 3 +- Mage/src/mage/filter/FilterSpell.java | 45 +----------- Mage/src/mage/filter/FilterStackObject.java | 59 ++------------- 9 files changed, 63 insertions(+), 167 deletions(-) diff --git a/Mage.Sets/src/mage/sets/avacynrestored/SecondGuess.java b/Mage.Sets/src/mage/sets/avacynrestored/SecondGuess.java index 6b89f07f29a..9b96b458e31 100644 --- a/Mage.Sets/src/mage/sets/avacynrestored/SecondGuess.java +++ b/Mage.Sets/src/mage/sets/avacynrestored/SecondGuess.java @@ -27,7 +27,6 @@ */ package mage.sets.avacynrestored; -import mage.Constants; import mage.Constants.CardType; import mage.Constants.Rarity; import mage.abilities.effects.common.CounterTargetEffect; @@ -35,7 +34,7 @@ import mage.cards.CardImpl; import mage.filter.FilterSpell; import mage.game.Game; import mage.game.stack.Spell; -import mage.game.stack.StackObject; +import mage.filter.predicate.Predicate; import mage.target.TargetSpell; import mage.watchers.common.CastSpellLastTurnWatcher; @@ -47,6 +46,12 @@ import java.util.UUID; */ public class SecondGuess extends CardImpl { + private static final FilterSpell filter = new FilterSpell("spell that's the second spell cast this turn"); + + static { + filter.add(new SecondSpellPredicate()); + } + public SecondGuess(UUID ownerId) { super(ownerId, 74, "Second Guess", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{U}"); this.expansionSetCode = "AVR"; @@ -55,7 +60,7 @@ public class SecondGuess extends CardImpl { // Counter target spell that's the second spell cast this turn. this.getSpellAbility().addEffect(new CounterTargetEffect()); - this.getSpellAbility().addTarget(new TargetSpell(new FilterSecondSpell())); + this.getSpellAbility().addTarget(new TargetSpell(filter)); } public SecondGuess(final SecondGuess card) { @@ -68,65 +73,21 @@ public class SecondGuess extends CardImpl { } } -class FilterSecondSpell extends FilterSpell { - - public FilterSecondSpell() { - super("spell that's the second spell cast this turn"); - } - - public FilterSecondSpell(final FilterSecondSpell filter) { - super(filter); - } +class SecondSpellPredicate implements Predicate { @Override - public boolean match(StackObject spell, Game game) { - if (!super.match(spell, game)) - return notFilter; + public boolean apply(Spell input, Game game) { + CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get("CastSpellLastTurnWatcher"); - if (spell instanceof Spell) { - CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get("CastSpellLastTurnWatcher"); - - int index = watcher.getSpellOrder((Spell)spell); - - if (index == 2) { - return !notFilter; - } + if (watcher.getSpellOrder(input) == 2) { + return true; } - return notFilter; + return false; } @Override - public boolean match(StackObject spell, UUID playerId, Game game) { - if (!super.match(spell, playerId, game)) - return notFilter; - - if (spell instanceof Spell) { - CastSpellLastTurnWatcher watcher = (CastSpellLastTurnWatcher) game.getState().getWatchers().get("CastSpellLastTurnWatcher"); - - int index = watcher.getSpellOrder((Spell)spell); - - if (index == 2) { - return notFilter; - } - } - - return !notFilter; + public String toString() { + return "SecondSpellThisTurn"; } - - @Override - public FilterSecondSpell copy() { - return new FilterSecondSpell(this); - } - - @Override - public void setFromZone(Constants.Zone fromZone) { - this.fromZone = fromZone; - } - - @Override - public void setNotFromZone(boolean notFromZone) { - this.notFromZone = notFromZone; - } - } diff --git a/Mage.Sets/src/mage/sets/darkascension/IncreasingVengeance.java b/Mage.Sets/src/mage/sets/darkascension/IncreasingVengeance.java index 7fead2840bc..13050d75b93 100644 --- a/Mage.Sets/src/mage/sets/darkascension/IncreasingVengeance.java +++ b/Mage.Sets/src/mage/sets/darkascension/IncreasingVengeance.java @@ -39,6 +39,7 @@ import mage.cards.CardImpl; import mage.filter.FilterSpell; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.permanent.ControllerPredicate; import mage.game.Game; import mage.game.stack.Spell; import mage.target.TargetSpell; @@ -55,7 +56,7 @@ public class IncreasingVengeance extends CardImpl { filter.add(Predicates.or( new CardTypePredicate(CardType.INSTANT), new CardTypePredicate(CardType.SORCERY))); - filter.setTargetController(Constants.TargetController.YOU); + filter.add(new ControllerPredicate(Constants.TargetController.YOU)); } public IncreasingVengeance(UUID ownerId) { diff --git a/Mage.Sets/src/mage/sets/darkascension/SecretsOfTheDead.java b/Mage.Sets/src/mage/sets/darkascension/SecretsOfTheDead.java index 1f66c3333fa..a1391b24e6a 100644 --- a/Mage.Sets/src/mage/sets/darkascension/SecretsOfTheDead.java +++ b/Mage.Sets/src/mage/sets/darkascension/SecretsOfTheDead.java @@ -28,13 +28,16 @@ package mage.sets.darkascension; import java.util.UUID; -import mage.Constants; import mage.Constants.CardType; import mage.Constants.Rarity; +import mage.Constants.Zone; import mage.abilities.common.SpellCastTriggeredAbility; import mage.abilities.effects.common.DrawCardControllerEffect; import mage.cards.CardImpl; import mage.filter.FilterSpell; +import mage.filter.predicate.Predicate; +import mage.game.Game; +import mage.game.stack.Spell; /** * @@ -45,7 +48,7 @@ public class SecretsOfTheDead extends CardImpl { private final static FilterSpell filter = new FilterSpell("a spell from your graveyard"); static { - filter.setFromZone(Constants.Zone.GRAVEYARD); + filter.add(new SpellZonePredicate(Zone.GRAVEYARD)); } public SecretsOfTheDead(UUID ownerId) { @@ -67,3 +70,22 @@ public class SecretsOfTheDead extends CardImpl { return new SecretsOfTheDead(this); } } + +class SpellZonePredicate implements Predicate { + + private final Zone zone; + + public SpellZonePredicate(Zone zone) { + this.zone = zone; + } + + @Override + public boolean apply(Spell input, Game game) { + return input.getFromZone().match(zone); + } + + @Override + public String toString() { + return "SpellZone(" + zone + ')'; + } +} diff --git a/Mage.Sets/src/mage/sets/magic2011/LeylineOfSanctity.java b/Mage.Sets/src/mage/sets/magic2011/LeylineOfSanctity.java index 7f59cb54f09..4c905828f9a 100644 --- a/Mage.Sets/src/mage/sets/magic2011/LeylineOfSanctity.java +++ b/Mage.Sets/src/mage/sets/magic2011/LeylineOfSanctity.java @@ -39,6 +39,7 @@ import mage.abilities.keyword.HexproofAbility; import mage.abilities.keyword.LeylineAbility; import mage.cards.CardImpl; import mage.filter.FilterStackObject; +import mage.filter.predicate.permanent.ControllerPredicate; /** * @@ -49,7 +50,7 @@ public class LeylineOfSanctity extends CardImpl { private static final FilterStackObject filter = new FilterStackObject("spells or abilities your opponents control"); static { - filter.setTargetController(TargetController.OPPONENT); + filter.add(new ControllerPredicate(TargetController.OPPONENT)); } public LeylineOfSanctity(UUID ownerId) { diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/Asceticism.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/Asceticism.java index 90f367c4a3a..1fa1dacad89 100644 --- a/Mage.Sets/src/mage/sets/scarsofmirrodin/Asceticism.java +++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/Asceticism.java @@ -39,6 +39,7 @@ import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.effects.common.RegenerateTargetEffect; import mage.cards.CardImpl; import mage.filter.FilterStackObject; +import mage.filter.predicate.permanent.ControllerPredicate; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; @@ -55,7 +56,7 @@ public class Asceticism extends CardImpl { private static final FilterStackObject filter = new FilterStackObject("spells or abilities your opponents control"); static { - filter.setTargetController(Constants.TargetController.OPPONENT); + filter.add(new ControllerPredicate(Constants.TargetController.OPPONENT)); } public Asceticism(UUID ownerId) { diff --git a/Mage/src/mage/abilities/effects/common/CantCounterControlledEffect.java b/Mage/src/mage/abilities/effects/common/CantCounterControlledEffect.java index dda538b3672..5e84c72c1d5 100644 --- a/Mage/src/mage/abilities/effects/common/CantCounterControlledEffect.java +++ b/Mage/src/mage/abilities/effects/common/CantCounterControlledEffect.java @@ -86,18 +86,15 @@ public class CantCounterControlledEffect extends ReplacementEffectImpl { public FilterSpell() { super("spell"); @@ -54,43 +46,10 @@ public class FilterSpell extends FilterStackObject { public FilterSpell(final FilterSpell filter) { super(filter); - for (Object cId: filter.getControllerId()) { - this.controllerId.add((UUID)cId); - } - this.notController = filter.notController; - this.controller = filter.controller; - } - - @Override - public boolean match(StackObject spell, Game game) { - if (!(spell instanceof Spell)) - return notFilter; - - if (((Spell)spell).getFromZone().match(fromZone) == notFromZone) - return notFilter; - - return super.match(spell, game); - } - - @Override - public boolean match(StackObject spell, UUID playerId, Game game) { - if (!this.match(spell, game)) - return notFilter; - - return super.match(spell, playerId, game); } @Override public FilterSpell copy() { return new FilterSpell(this); } - - public void setFromZone(Zone fromZone) { - this.fromZone = fromZone; - } - - public void setNotFromZone(boolean notFromZone) { - this.notFromZone = notFromZone; - } - } diff --git a/Mage/src/mage/filter/FilterStackObject.java b/Mage/src/mage/filter/FilterStackObject.java index 1a9b80b18f2..519862826bf 100644 --- a/Mage/src/mage/filter/FilterStackObject.java +++ b/Mage/src/mage/filter/FilterStackObject.java @@ -31,24 +31,20 @@ package mage.filter; 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.Predicates; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.stack.StackObject; /** * - * @author BetaSteward_at_googlemail.com * @author North */ -public class FilterStackObject extends FilterObject { +public class FilterStackObject extends FilterObject { protected List>> extraPredicates = new ArrayList>>(); - protected List controllerId = new ArrayList(); - protected boolean notController = false; - protected TargetController controller = TargetController.ANY; public FilterStackObject() { super("spell or ability"); @@ -60,64 +56,21 @@ public class FilterStackObject extends FilterObject { public FilterStackObject(final FilterStackObject filter) { super(filter); - this.controllerId.addAll(filter.controllerId); - this.notController = filter.notController; - this.controller = filter.controller; this.extraPredicates = new ArrayList>>(extraPredicates); } - @Override - public boolean match(StackObject spell, Game game) { - - if (!super.match(spell, game)) - return notFilter; - - if (controllerId.size() > 0 && controllerId.contains(spell.getControllerId()) == notController) - return notFilter; - - return !notFilter; - } - - public boolean match(StackObject spell, UUID playerId, Game game) { - if (!this.match(spell, game)) - return notFilter; - - if (controller != TargetController.ANY && playerId != null) { - switch(controller) { - case YOU: - if (!spell.getControllerId().equals(playerId)) - return notFilter; - break; - case OPPONENT: - if (!game.getOpponents(playerId).contains(spell.getControllerId())) - return notFilter; - break; - case NOT_YOU: - if (spell.getControllerId().equals(playerId)) - return notFilter; - break; - } + public boolean match(T stackObject, UUID playerId, Game game) { + if (!this.match(stackObject, game)) { + return false; } - return !notFilter; + return Predicates.and(extraPredicates).apply(new ObjectPlayer(stackObject, playerId), game); } public void add(ObjectPlayerPredicate predicate) { extraPredicates.add(predicate); } - public List getControllerId() { - return controllerId; - } - - public void setNotController(boolean notController) { - this.notController = notController; - } - - public void setTargetController(TargetController controller) { - this.controller = controller; - } - @Override public FilterStackObject copy() { return new FilterStackObject(this);