diff --git a/forge-core/src/main/java/forge/card/CardFacePredicates.java b/forge-core/src/main/java/forge/card/CardFacePredicates.java index 80209bb43b1..ee83dda3787 100644 --- a/forge-core/src/main/java/forge/card/CardFacePredicates.java +++ b/forge-core/src/main/java/forge/card/CardFacePredicates.java @@ -76,6 +76,51 @@ public final class CardFacePredicates { }; } + static class ValidPredicate implements Predicate { + 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 valid(final String val) { + return new ValidPredicate(val); + } + public static class Presets { /** The Constant isBasicLand. */ public static final Predicate IS_BASIC_LAND = new Predicate() { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java index 7e35b96c0ca..4938ecb370e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java @@ -105,17 +105,8 @@ public class ChooseCardNameEffect extends SpellAbilityEffect { final String message = validDesc.equals("card") ? "Name a card" : "Name a " + validDesc + " card."; Predicate 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);