From 09b0452d5f0307d05bbc95b93033d3e597877816 Mon Sep 17 00:00:00 2001 From: Eradev Date: Sun, 2 Nov 2025 23:27:25 -0500 Subject: [PATCH] Allow NameCard | ValidCards$ to filter on colors --- .../java/forge/card/CardFacePredicates.java | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/forge-core/src/main/java/forge/card/CardFacePredicates.java b/forge-core/src/main/java/forge/card/CardFacePredicates.java index fb3126d3a84..92b2379313f 100644 --- a/forge-core/src/main/java/forge/card/CardFacePredicates.java +++ b/forge-core/src/main/java/forge/card/CardFacePredicates.java @@ -93,6 +93,7 @@ public boolean test(ICardFace input) { } else if (!input.getType().hasStringType(k[0])) { return false; } + if (k.length > 1) { for (final String m : k[1].split("\\+")) { if (m.contains("ManaCost")) { @@ -102,7 +103,32 @@ public boolean test(ICardFace input) { } } else if (m.contains("cmcEQ")) { int i = Integer.parseInt(m.substring(5)); - if (!hasCMC(input, i)) return false; + if (!hasCMC(input, i)) { + return false; + } + } else if (m.contains("White") || + m.contains("Blue") || + m.contains("Black") || + m.contains("Red") || + m.contains("Green")) { + boolean mustHave = !m.startsWith("non"); + final String colorName = m.substring(mustHave ? 0 : 3); + + if (mustHave != hasColor(input, colorName)) { + return false; + } + } else if (m.contains("Colorless")) { + boolean mustBe = !m.startsWith("non"); + + if (mustBe != input.getColor().isColorless()) { + return false; + } + } else if (m.contains("MultiColor")) { + boolean mustBe = !m.startsWith("non"); + + if (mustBe != input.getColor().isMulticolor()) { + return false; + } } else if (!hasProperty(input, m)) { return false; } @@ -127,6 +153,10 @@ static protected boolean hasCMC(ICardFace input, final int value) { return cost != null && cost.getCMC() == value; } + static protected boolean hasColor(ICardFace input, final String colorName) { + int desiredColor = MagicColor.fromName(colorName); + return input.getColor().hasAnyColor(desiredColor); + } } public static Predicate valid(final String val) {