CardFacePredicate: use new valid Predicate

This commit is contained in:
Hanmac
2018-06-28 22:40:16 +02:00
parent db9114986f
commit d890ee248c
2 changed files with 47 additions and 11 deletions

View File

@@ -76,6 +76,51 @@ public final class CardFacePredicates {
};
}
static class ValidPredicate implements Predicate<ICardFace> {
private String valid;
public ValidPredicate(final String valid) {
this.valid = valid;
}
@Override
public boolean apply(ICardFace input) {
String k[] = valid.split("\\.", 2);
if ("Card".equals(k[0])) {
// okay
} else if ("Permanent".equals(k[0])) {
if (input.getType().isInstant() || input.getType().isSorcery()) {
return false;
}
} else if (!input.getType().hasStringType(k[0])) {
return false;
}
if (k.length > 1) {
for (final String m : k[1].split("\\+")) {
if (!hasProperty(input, m)) {
return false;
}
}
}
return true;
}
static protected boolean hasProperty(ICardFace input, final String v) {
if (v.startsWith("non")) {
return !hasProperty(input, v.substring(3));
} else if (!input.getType().hasStringType(v)) {
return false;
}
return true;
}
}
public static Predicate<ICardFace> valid(final String val) {
return new ValidPredicate(val);
}
public static class Presets {
/** The Constant isBasicLand. */
public static final Predicate<ICardFace> IS_BASIC_LAND = new Predicate<ICardFace>() {

View File

@@ -105,17 +105,8 @@ public class ChooseCardNameEffect extends SpellAbilityEffect {
final String message = validDesc.equals("card") ? "Name a card" : "Name a " + validDesc + " card.";
Predicate<ICardFace> cpp = Predicates.alwaysTrue();
if ( StringUtils.containsIgnoreCase(valid, "nonland") ) {
cpp = CardFacePredicates.Presets.IS_NON_LAND;
}
if ( StringUtils.containsIgnoreCase(valid, "nonbasic") ) {
cpp = Predicates.not(CardFacePredicates.Presets.IS_BASIC_LAND);
}
if ( StringUtils.containsIgnoreCase(valid, "noncreature") ) {
cpp = Predicates.not(CardFacePredicates.Presets.IS_CREATURE);
} else if ( StringUtils.containsIgnoreCase(valid, "creature") ) {
cpp = CardFacePredicates.Presets.IS_CREATURE;
if (sa.hasParam("ValidCards")) {
cpp = CardFacePredicates.valid(valid);
}
chosen = p.getController().chooseCardName(sa, cpp, valid, message);