mirror of
https://github.com/magefree/mage.git
synced 2025-12-20 10:40:06 -08:00
initial implementation
This commit is contained in:
parent
cfd51d7dce
commit
6e85b2e4ab
15 changed files with 132 additions and 251 deletions
|
|
@ -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<>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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();
|
|
||||||
}
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue