package mage.target.common; import mage.abilities.Ability; import mage.abilities.dynamicvalue.common.PredicateCardAssignment; import mage.cards.Card; import mage.cards.Cards; import mage.cards.CardsImpl; import mage.constants.CardType; import mage.filter.FilterCard; import mage.filter.predicate.Predicate; import mage.filter.predicate.Predicates; import mage.game.Game; import mage.util.CardUtil; import java.util.HashSet; import java.util.Set; import java.util.UUID; /** * @author Susucr *
* almost identical to {@link TargetCardAndOrCardInLibrary}
*/
public class TargetCardAndOrCardInGraveyard extends TargetCardInGraveyard {
private static FilterCard makeFilter(Predicate super Card> firstPredicate,
Predicate super Card> secondPredicate,
String filterText) {
FilterCard filter = new FilterCard(filterText);
filter.add(Predicates.or(
firstPredicate, secondPredicate
));
return filter;
}
private static String makeFilterText(String first, String second) {
return CardUtil.addArticle(first) + " card and/or " + CardUtil.addArticle(second) + " card";
}
private final PredicateCardAssignment assignment;
/**
* a [firstType] card and/or a [secondType] card
*/
protected TargetCardAndOrCardInGraveyard(Predicate super Card> firstPredicate, Predicate super Card> secondPredicate, String filterText) {
super(0, 2, makeFilter(firstPredicate, secondPredicate, filterText));
this.assignment = new PredicateCardAssignment(firstPredicate, secondPredicate);
}
public TargetCardAndOrCardInGraveyard(CardType firstType, CardType secondType) {
this(firstType.getPredicate(), secondType.getPredicate(), makeFilterText(
CardUtil.getTextWithFirstCharLowerCase(firstType.toString()),
CardUtil.getTextWithFirstCharLowerCase(secondType.toString())));
}
protected TargetCardAndOrCardInGraveyard(final TargetCardAndOrCardInGraveyard target) {
super(target);
this.assignment = target.assignment;
}
@Override
public TargetCardAndOrCardInGraveyard copy() {
return new TargetCardAndOrCardInGraveyard(this);
}
@Override
public boolean canTarget(UUID playerId, UUID id, Ability source, Game game) {
if (!super.canTarget(playerId, id, source, game)) {
return false;
}
Card card = game.getCard(id);
if (card == null) {
return false;
}
if (this.getTargets().isEmpty()) {
return true;
}
Cards cards = new CardsImpl(this.getTargets());
cards.add(card);
return assignment.getRoleCount(cards, game) >= cards.size();
}
@Override
public Set