initial implementation

This commit is contained in:
Susucre 2025-06-01 17:17:38 +02:00
parent cfd51d7dce
commit 6e85b2e4ab
15 changed files with 132 additions and 251 deletions

View file

@ -1,5 +1,7 @@
package mage.filter; package mage.filter;
import mage.abilities.Ability;
import mage.filter.predicate.ObjectSourcePlayerPredicate;
import mage.filter.predicate.Predicate; import mage.filter.predicate.Predicate;
import mage.game.Game; import mage.game.Game;
import mage.util.Copyable; import mage.util.Copyable;
@ -7,6 +9,7 @@ import mage.util.Copyable;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID;
/** /**
* @param <E> * @param <E>
@ -21,6 +24,8 @@ public interface Filter<E> extends Serializable, Copyable<Filter<E>> {
boolean match(E o, Game game); boolean match(E o, Game game);
boolean match(E object, UUID sourceControllerId, Ability source, Game game);
Filter<E> add(Predicate<? super E> predicate); Filter<E> add(Predicate<? super E> predicate);
boolean checkObjectClass(Object object); boolean checkObjectClass(Object object);
@ -37,7 +42,7 @@ public interface Filter<E> extends Serializable, Copyable<Filter<E>> {
List<Predicate<? super E>> getPredicates(); List<Predicate<? super E>> getPredicates();
default List<Predicate> getExtraPredicates() { default List<ObjectSourcePlayerPredicate<E>> getExtraPredicates() {
return new ArrayList<>(); return new ArrayList<>();
} }
} }

View file

@ -1,9 +1,7 @@
package mage.filter; package mage.filter;
import mage.abilities.Ability;
import mage.cards.Card; import mage.cards.Card;
import mage.constants.TargetController; import mage.constants.TargetController;
import mage.filter.predicate.ObjectSourcePlayer;
import mage.filter.predicate.ObjectSourcePlayerPredicate; import mage.filter.predicate.ObjectSourcePlayerPredicate;
import mage.filter.predicate.Predicate; import mage.filter.predicate.Predicate;
import mage.filter.predicate.Predicates; import mage.filter.predicate.Predicates;
@ -24,7 +22,6 @@ import java.util.stream.Collectors;
public class FilterCard extends FilterObject<Card> { public class FilterCard extends FilterObject<Card> {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
protected final List<ObjectSourcePlayerPredicate<Card>> extraPredicates = new ArrayList<>();
public FilterCard() { public FilterCard() {
super("card"); super("card");
@ -36,56 +33,6 @@ public class FilterCard extends FilterObject<Card> {
protected FilterCard(final FilterCard filter) { protected FilterCard(final FilterCard filter) {
super(filter); super(filter);
this.extraPredicates.addAll(filter.extraPredicates);
}
//20130711 708.6c
/* If anything performs a comparison involving multiple characteristics or
* values of one or more split cards in any zone other than the stack or
* involving multiple characteristics or values of one or more fused split
* spells, each characteristic or value is compared separately. If each of
* the individual comparisons would return a yes answer, the whole
* comparison returns a yes answer. The individual comparisons may involve
* different halves of the same split card.
*/
@Override
public boolean match(Card card, Game game) {
if (card == null) {
return false;
}
return super.match(card, game);
}
public boolean match(Card card, UUID playerId, Game game) {
return match(card, playerId, null, game);
}
public boolean match(Card card, UUID playerId, Ability source, Game game) {
if (!this.match(card, game)) {
return false;
}
ObjectSourcePlayer<Card> osp = new ObjectSourcePlayer<>(card, playerId, source);
return extraPredicates.stream().allMatch(p -> p.apply(osp, game));
}
public final void add(ObjectSourcePlayerPredicate predicate) {
if (isLockedFilter()) {
throw new UnsupportedOperationException("You may not modify a locked filter");
}
// verify check
checkPredicateIsSuitableForCardFilter(predicate);
Predicates.makeSurePredicateCompatibleWithFilter(predicate, Card.class);
extraPredicates.add(predicate);
}
public Set<Card> filter(Set<Card> cards, Game game) {
return cards.stream().filter(card -> match(card, game)).collect(Collectors.toSet());
}
public boolean hasPredicates() {
return !predicates.isEmpty() || !extraPredicates.isEmpty();
} }
@Override @Override
@ -93,13 +40,16 @@ public class FilterCard extends FilterObject<Card> {
return new FilterCard(this); return new FilterCard(this);
} }
@Override public boolean match(Card card, UUID playerId, Game game) {
public List<Predicate> getExtraPredicates() { return match(card, playerId, null, game);
return new ArrayList<>(extraPredicates); }
public Set<Card> filter(Set<Card> cards, Game game) {
return cards.stream().filter(card -> match(card, game)).collect(Collectors.toSet());
} }
public static void checkPredicateIsSuitableForCardFilter(Predicate predicate) { public static void checkPredicateIsSuitableForCardFilter(Predicate predicate) {
// card filter can't contain controller predicate (only permanents on battlefield have controller) // card filter can't contain controller predicate (only permanents on battlefield and StackObjects have controller)
List<Predicate> list = new ArrayList<>(); List<Predicate> list = new ArrayList<>();
Predicates.collectAllComponents(predicate, list); Predicates.collectAllComponents(predicate, list);
if (list.stream().anyMatch(TargetController.ControllerPredicate.class::isInstance)) { if (list.stream().anyMatch(TargetController.ControllerPredicate.class::isInstance)) {
@ -107,8 +57,22 @@ public class FilterCard extends FilterObject<Card> {
} }
} }
public FilterCard withMessage(String message) { public FilterCard withMessage(String message) {
this.setMessage(message); this.setMessage(message);
return this; return this;
} }
@Override
public void add(ObjectSourcePlayerPredicate predicate) {
// verify checks
checkPredicateIsSuitableForCardFilter(predicate);
Predicates.makeSurePredicateCompatibleWithFilter(predicate, Card.class);
this.addExtra(predicate);
}
@Override
public boolean checkObjectClass(Object object) {
return object instanceof Card;
}
} }

View file

@ -1,11 +1,15 @@
package mage.filter; package mage.filter;
import mage.abilities.Ability;
import mage.filter.predicate.ObjectSourcePlayer;
import mage.filter.predicate.ObjectSourcePlayerPredicate;
import mage.filter.predicate.Predicate; import mage.filter.predicate.Predicate;
import mage.filter.predicate.Predicates; import mage.filter.predicate.Predicates;
import mage.game.Game; import mage.game.Game;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID;
/** /**
* @param <E> * @param <E>
@ -14,7 +18,8 @@ import java.util.List;
*/ */
public abstract class FilterImpl<E> implements Filter<E> { public abstract class FilterImpl<E> implements Filter<E> {
protected List<Predicate<? super E>> predicates = new ArrayList<>(); private List<Predicate<? super E>> predicates = new ArrayList<>();
private List<ObjectSourcePlayerPredicate<E>> extraPredicates = new ArrayList<>();
protected String message; protected String message;
protected boolean lockedFilter; // Helps to prevent "accidentally" modifying the StaticFilters objects protected boolean lockedFilter; // Helps to prevent "accidentally" modifying the StaticFilters objects
@ -29,6 +34,7 @@ public abstract class FilterImpl<E> implements Filter<E> {
protected FilterImpl(final FilterImpl<E> filter) { protected FilterImpl(final FilterImpl<E> filter) {
this.message = filter.message; this.message = filter.message;
this.predicates = new ArrayList<>(filter.predicates); this.predicates = new ArrayList<>(filter.predicates);
this.extraPredicates.addAll(filter.extraPredicates);
this.lockedFilter = false;// After copying a filter it's allowed to modify this.lockedFilter = false;// After copying a filter it's allowed to modify
} }
@ -40,8 +46,16 @@ public abstract class FilterImpl<E> implements Filter<E> {
return false; return false;
} }
public boolean match(E object, UUID sourceControllerId, Ability source, Game game) {
if (!this.match(object, game)) {
return false;
}
ObjectSourcePlayer<E> osp = new ObjectSourcePlayer<>(object, sourceControllerId, source);
return extraPredicates.stream().allMatch(p -> p.apply(osp, game));
}
@Override @Override
public final Filter<E> add(Predicate<? super E> predicate) { public Filter<E> add(Predicate<? super E> predicate) {
if (isLockedFilter()) { if (isLockedFilter()) {
throw new UnsupportedOperationException("You may not modify a locked filter"); throw new UnsupportedOperationException("You may not modify a locked filter");
} }
@ -49,6 +63,24 @@ public abstract class FilterImpl<E> implements Filter<E> {
return this; return this;
} }
/**
* Make sure on setting a new Filter that you overwrite this method
* and call Predicates.makeSurePredicateCompatibleWithFilter
* to check that the filter is able to process objects
* of the right kind. Helps with checks the Compiler can't do
* due to ObjectSourcePlayer casting in the this.match(4 arguments).
*/
public void add(ObjectSourcePlayerPredicate predicate) {
addExtra(predicate);
}
public void addExtra(ObjectSourcePlayerPredicate predicate) {
if (isLockedFilter()) {
throw new UnsupportedOperationException("You may not modify a locked filter");
}
extraPredicates.add(predicate);
}
@Override @Override
public String getMessage() { public String getMessage() {
return message; return message;
@ -80,4 +112,12 @@ public abstract class FilterImpl<E> implements Filter<E> {
public List<Predicate<? super E>> getPredicates() { public List<Predicate<? super E>> getPredicates() {
return predicates; return predicates;
} }
public List<ObjectSourcePlayerPredicate<E>> getExtraPredicates() {
return new ArrayList<>(extraPredicates);
}
public boolean hasPredicates() {
return !predicates.isEmpty() || !extraPredicates.isEmpty();
}
} }

View file

@ -1,18 +0,0 @@
package mage.filter;
import mage.abilities.Ability;
import mage.game.Game;
import java.util.UUID;
/**
* @param <E>
* @author BetaSteward_at_googlemail.com
*/
public interface FilterInPlay<E> extends Filter<E> {
boolean match(E o, UUID playerId, Ability source, Game game);
@Override
FilterInPlay<E> copy();
}

View file

@ -7,6 +7,8 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
* TODO: Not really a Filter. Should be renamed?
*
* @author nantuko * @author nantuko
*/ */
public class FilterMana implements Serializable { public class FilterMana implements Serializable {

View file

@ -2,24 +2,17 @@
package mage.filter; package mage.filter;
import mage.MageObject; import mage.MageObject;
import mage.filter.predicate.ObjectSourcePlayerPredicate;
import mage.filter.predicate.Predicates;
/** /**
* // TODO: migrate all FilterObject to more specific ones, then remove this class?
* *
* @author North
* @param <E> * @param <E>
* @author North
*/ */
public class FilterObject<E extends MageObject> extends FilterImpl<E> { public class FilterObject<E extends MageObject> extends FilterImpl<E> {
@Override
public FilterObject<E> copy() {
return new FilterObject<>(this);
}
@Override
public boolean checkObjectClass(Object object) {
return object instanceof MageObject;
}
public FilterObject(String name) { public FilterObject(String name) {
super(name); super(name);
} }
@ -27,4 +20,21 @@ public class FilterObject<E extends MageObject> extends FilterImpl<E> {
protected FilterObject(final FilterObject<E> filter) { protected FilterObject(final FilterObject<E> filter) {
super(filter); super(filter);
} }
@Override
public FilterObject<E> copy() {
return new FilterObject(this);
}
@Override
public void add(ObjectSourcePlayerPredicate predicate) {
// verify checks
Predicates.makeSurePredicateCompatibleWithFilter(predicate, MageObject.class);
this.addExtra(predicate);
}
@Override
public boolean checkObjectClass(Object object) {
return object instanceof MageObject;
}
} }

View file

@ -1,25 +1,16 @@
package mage.filter; package mage.filter;
import mage.abilities.Ability;
import mage.constants.SubType; import mage.constants.SubType;
import mage.filter.predicate.ObjectSourcePlayer;
import mage.filter.predicate.ObjectSourcePlayerPredicate; import mage.filter.predicate.ObjectSourcePlayerPredicate;
import mage.filter.predicate.Predicate;
import mage.filter.predicate.Predicates; import mage.filter.predicate.Predicates;
import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import java.util.ArrayList;
import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.UUID;
/** /**
* @author North * @author North
*/ */
public class FilterPermanent extends FilterObject<Permanent> implements FilterInPlay<Permanent> { public class FilterPermanent extends FilterObject<Permanent> {
protected final List<ObjectSourcePlayerPredicate<Permanent>> extraPredicates = new ArrayList<>();
public FilterPermanent() { public FilterPermanent() {
super("permanent"); super("permanent");
@ -43,32 +34,6 @@ public class FilterPermanent extends FilterObject<Permanent> implements FilterIn
protected FilterPermanent(final FilterPermanent filter) { protected FilterPermanent(final FilterPermanent filter) {
super(filter); super(filter);
this.extraPredicates.addAll(filter.extraPredicates);
}
@Override
public boolean checkObjectClass(Object object) {
return object instanceof Permanent;
}
@Override
public boolean match(Permanent permanent, UUID playerId, Ability source, Game game) {
if (!this.match(permanent, game) || !permanent.isPhasedIn()) {
return false;
}
ObjectSourcePlayer<Permanent> osp = new ObjectSourcePlayer<>(permanent, playerId, source);
return extraPredicates.stream().allMatch(p -> p.apply(osp, game));
}
public final void add(ObjectSourcePlayerPredicate predicate) {
if (isLockedFilter()) {
throw new UnsupportedOperationException("You may not modify a locked filter");
}
// verify check
Predicates.makeSurePredicateCompatibleWithFilter(predicate, Permanent.class);
extraPredicates.add(predicate);
} }
@Override @Override
@ -77,7 +42,14 @@ public class FilterPermanent extends FilterObject<Permanent> implements FilterIn
} }
@Override @Override
public List<Predicate> getExtraPredicates() { public void add(ObjectSourcePlayerPredicate predicate) {
return new ArrayList<>(extraPredicates); // verify checks
Predicates.makeSurePredicateCompatibleWithFilter(predicate, Permanent.class);
this.addExtra(predicate);
}
@Override
public boolean checkObjectClass(Object object) {
return object instanceof Permanent;
} }
} }

View file

@ -1,25 +1,15 @@
package mage.filter; package mage.filter;
import mage.abilities.Ability;
import mage.filter.predicate.ObjectSourcePlayer;
import mage.filter.predicate.ObjectSourcePlayerPredicate; import mage.filter.predicate.ObjectSourcePlayerPredicate;
import mage.filter.predicate.Predicate;
import mage.filter.predicate.Predicates; import mage.filter.predicate.Predicates;
import mage.game.Game;
import mage.players.Player; import mage.players.Player;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/** /**
* @author BetaSteward_at_googlemail.com * @author BetaSteward_at_googlemail.com
* @author North * @author North
*/ */
public class FilterPlayer extends FilterImpl<Player> { public class FilterPlayer extends FilterImpl<Player> {
protected final List<ObjectSourcePlayerPredicate<Player>> extraPredicates = new ArrayList<>();
public FilterPlayer() { public FilterPlayer() {
this("player"); this("player");
} }
@ -30,32 +20,6 @@ public class FilterPlayer extends FilterImpl<Player> {
protected FilterPlayer(final FilterPlayer filter) { protected FilterPlayer(final FilterPlayer filter) {
super(filter); super(filter);
this.extraPredicates.addAll(filter.extraPredicates);
}
public FilterPlayer add(ObjectSourcePlayerPredicate predicate) {
if (isLockedFilter()) {
throw new UnsupportedOperationException("You may not modify a locked filter");
}
// verify check
Predicates.makeSurePredicateCompatibleWithFilter(predicate, Player.class);
extraPredicates.add(predicate);
return this;
}
@Override
public boolean checkObjectClass(Object object) {
return object instanceof Player;
}
public boolean match(Player checkPlayer, UUID sourceControllerId, Ability source, Game game) {
if (!this.match(checkPlayer, game)) {
return false;
}
ObjectSourcePlayer<Player> osp = new ObjectSourcePlayer<>(checkPlayer, sourceControllerId, source);
return extraPredicates.stream().allMatch(p -> p.apply(osp, game));
} }
@Override @Override
@ -64,7 +28,14 @@ public class FilterPlayer extends FilterImpl<Player> {
} }
@Override @Override
public List<Predicate> getExtraPredicates() { public void add(ObjectSourcePlayerPredicate predicate) {
return new ArrayList<>(extraPredicates); // verify checks
Predicates.makeSurePredicateCompatibleWithFilter(predicate, Player.class);
this.addExtra(predicate);
}
@Override
public boolean checkObjectClass(Object object) {
return object instanceof Player;
} }
} }

View file

@ -2,28 +2,18 @@
package mage.filter; package mage.filter;
import mage.MageObject; import mage.MageObject;
import mage.abilities.Ability;
import mage.cards.Card; import mage.cards.Card;
import mage.filter.predicate.ObjectSourcePlayer;
import mage.filter.predicate.ObjectSourcePlayerPredicate; import mage.filter.predicate.ObjectSourcePlayerPredicate;
import mage.filter.predicate.Predicate;
import mage.filter.predicate.Predicates; import mage.filter.predicate.Predicates;
import mage.game.Game;
import mage.game.command.CommandObject; import mage.game.command.CommandObject;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.game.stack.StackObject; import mage.game.stack.StackObject;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/** /**
* @author Susucr * @author Susucr
*/ */
public class FilterSource extends FilterObject<MageObject> { public class FilterSource extends FilterObject<MageObject> {
protected final List<ObjectSourcePlayerPredicate<MageObject>> extraPredicates = new ArrayList<>();
public FilterSource() { public FilterSource() {
super("source"); super("source");
} }
@ -34,7 +24,6 @@ public class FilterSource extends FilterObject<MageObject> {
private FilterSource(final FilterSource filter) { private FilterSource(final FilterSource filter) {
super(filter); super(filter);
this.extraPredicates.addAll(filter.extraPredicates);
} }
@Override @Override
@ -42,16 +31,12 @@ public class FilterSource extends FilterObject<MageObject> {
return new FilterSource(this); return new FilterSource(this);
} }
public FilterSource add(ObjectSourcePlayerPredicate predicate) { @Override
if (isLockedFilter()) { public void add(ObjectSourcePlayerPredicate predicate) {
throw new UnsupportedOperationException("You may not modify a locked filter"); // verify checks
} // A source can be a lot of different things, so a variety of predicates can be fed here
// verify check -- make sure predicates work with all 3 Class that could be a Source
Predicates.makeSurePredicateCompatibleWithFilter(predicate, Permanent.class, Card.class, StackObject.class, CommandObject.class); Predicates.makeSurePredicateCompatibleWithFilter(predicate, Permanent.class, Card.class, StackObject.class, CommandObject.class);
this.addExtra(predicate);
extraPredicates.add(predicate);
return this;
} }
@Override @Override
@ -61,17 +46,4 @@ public class FilterSource extends FilterObject<MageObject> {
|| object instanceof StackObject || object instanceof StackObject
|| object instanceof CommandObject; || object instanceof CommandObject;
} }
public boolean match(MageObject object, UUID sourceControllerId, Ability source, Game game) {
if (!this.match(object, game)) {
return false;
}
ObjectSourcePlayer<MageObject> osp = new ObjectSourcePlayer<>(object, sourceControllerId, source);
return extraPredicates.stream().allMatch(p -> p.apply(osp, game));
}
@Override
public List<Predicate> getExtraPredicates() {
return new ArrayList<>(extraPredicates);
}
} }

View file

@ -1,12 +1,7 @@
package mage.filter; package mage.filter;
import java.util.UUID;
import mage.abilities.Ability;
import mage.game.Game;
import mage.game.stack.Spell; import mage.game.stack.Spell;
import mage.game.stack.StackObject;
/** /**
* @author North, Quercitron * @author North, Quercitron
@ -26,11 +21,8 @@ public class FilterSpell extends FilterStackObject {
} }
@Override @Override
public boolean match(StackObject stackObject, UUID playerId, Ability source, Game game) { public boolean checkObjectClass(Object object) {
if (!(stackObject instanceof Spell)) { return object instanceof Spell;
return false;
}
return super.match(stackObject, playerId, source, game);
} }
@Override @Override

View file

@ -1,25 +1,16 @@
package mage.filter; package mage.filter;
import mage.abilities.Ability;
import mage.cards.Card; import mage.cards.Card;
import mage.filter.predicate.ObjectSourcePlayer;
import mage.filter.predicate.ObjectSourcePlayerPredicate; import mage.filter.predicate.ObjectSourcePlayerPredicate;
import mage.filter.predicate.Predicate;
import mage.filter.predicate.Predicates; import mage.filter.predicate.Predicates;
import mage.game.Game;
import mage.game.stack.Spell; import mage.game.stack.Spell;
import mage.game.stack.StackObject; import mage.game.stack.StackObject;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/** /**
* @author North * @author North
*/ */
public class FilterStackObject extends FilterObject<StackObject> { public class FilterStackObject extends FilterObject<StackObject> {
protected final List<ObjectSourcePlayerPredicate<StackObject>> extraPredicates = new ArrayList<>();
public FilterStackObject() { public FilterStackObject() {
this("spell or ability"); this("spell or ability");
@ -31,27 +22,6 @@ public class FilterStackObject extends FilterObject<StackObject> {
protected FilterStackObject(final FilterStackObject filter) { protected FilterStackObject(final FilterStackObject filter) {
super(filter); super(filter);
this.extraPredicates.addAll(filter.extraPredicates);
}
public boolean match(StackObject stackObject, UUID playerId, Ability source, Game game) {
if (!this.match(stackObject, game)) {
return false;
}
ObjectSourcePlayer<StackObject> osp = new ObjectSourcePlayer<>(stackObject, playerId, source);
return extraPredicates.stream().allMatch(p -> p.apply(osp, game));
}
public final void add(ObjectSourcePlayerPredicate predicate) {
if (isLockedFilter()) {
throw new UnsupportedOperationException("You may not modify a locked filter");
}
// verify check
// Spell implements Card interface, so it can use some default predicates like owner
Predicates.makeSurePredicateCompatibleWithFilter(predicate, StackObject.class, Spell.class, Card.class);
extraPredicates.add(predicate);
} }
@Override @Override
@ -59,8 +29,15 @@ public class FilterStackObject extends FilterObject<StackObject> {
return new FilterStackObject(this); return new FilterStackObject(this);
} }
public final void add(ObjectSourcePlayerPredicate predicate) {
// verify checks
// Spell implements Card interface, so it can use some default predicates like owner
Predicates.makeSurePredicateCompatibleWithFilter(predicate, StackObject.class, Spell.class, Card.class);
this.addExtra(predicate);
}
@Override @Override
public List<Predicate> getExtraPredicates() { public boolean checkObjectClass(Object object) {
return new ArrayList<>(extraPredicates); return object instanceof StackObject;
} }
} }

View file

@ -3,11 +3,8 @@ package mage.filter.common;
import mage.MageItem; import mage.MageItem;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.filter.FilterImpl; import mage.filter.FilterImpl;
import mage.filter.FilterInPlay;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.FilterPlayer; import mage.filter.FilterPlayer;
import mage.filter.predicate.ObjectSourcePlayerPredicate;
import mage.filter.predicate.Predicate;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
@ -17,7 +14,7 @@ import java.util.UUID;
/** /**
* @author nantuko * @author nantuko
*/ */
public class FilterPermanentOrPlayer extends FilterImpl<MageItem> implements FilterInPlay<MageItem> { public class FilterPermanentOrPlayer extends FilterImpl<MageItem> {
protected final FilterPermanent permanentFilter; protected final FilterPermanent permanentFilter;
protected final FilterPlayer playerFilter; protected final FilterPlayer playerFilter;

View file

@ -1,7 +1,5 @@
package mage.filter.common; package mage.filter.common;
import java.util.UUID;
import mage.MageObject; import mage.MageObject;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.keyword.SuspendAbility; import mage.abilities.keyword.SuspendAbility;
@ -9,16 +7,17 @@ import mage.cards.Card;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.FilterCard; import mage.filter.FilterCard;
import mage.filter.FilterImpl; import mage.filter.FilterImpl;
import mage.filter.FilterInPlay;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.predicate.mageobject.AbilityPredicate; import mage.filter.predicate.mageobject.AbilityPredicate;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import java.util.UUID;
/** /**
* @author emerald000 * @author emerald000
*/ */
public class FilterPermanentOrSuspendedCard extends FilterImpl<MageObject> implements FilterInPlay<MageObject> { public class FilterPermanentOrSuspendedCard extends FilterImpl<MageObject> {
protected FilterCard cardFilter; protected FilterCard cardFilter;
protected FilterPermanent permanentFilter; protected FilterPermanent permanentFilter;

View file

@ -3,7 +3,6 @@ package mage.filter.common;
import mage.MageObject; import mage.MageObject;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.filter.FilterImpl; import mage.filter.FilterImpl;
import mage.filter.FilterInPlay;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.FilterSpell; import mage.filter.FilterSpell;
import mage.game.Game; import mage.game.Game;
@ -15,7 +14,7 @@ import java.util.UUID;
/** /**
* @author LevelX * @author LevelX
*/ */
public class FilterSpellOrPermanent extends FilterImpl<MageObject> implements FilterInPlay<MageObject> { public class FilterSpellOrPermanent extends FilterImpl<MageObject> {
protected FilterPermanent permanentFilter; protected FilterPermanent permanentFilter;
protected FilterSpell spellFilter; protected FilterSpell spellFilter;

View file

@ -1,7 +1,6 @@
package mage.target.common; package mage.target.common;
import mage.filter.FilterOpponent; import mage.filter.FilterOpponent;
import mage.filter.FilterPlayer;
import mage.target.TargetPlayer; import mage.target.TargetPlayer;
/** /**