mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 11:48:02 +00:00
Support showing only colorless or multicolor cards
This commit is contained in:
@@ -35,54 +35,76 @@ public class SFilterUtil {
|
|||||||
final List<Predicate<CardRules>> colors = new ArrayList<Predicate<CardRules>>();
|
final List<Predicate<CardRules>> colors = new ArrayList<Predicate<CardRules>>();
|
||||||
final List<Predicate<CardRules>> notColors = new ArrayList<Predicate<CardRules>>();
|
final List<Predicate<CardRules>> notColors = new ArrayList<Predicate<CardRules>>();
|
||||||
final List<Predicate<CardRules>> types = new ArrayList<Predicate<CardRules>>();
|
final List<Predicate<CardRules>> types = new ArrayList<Predicate<CardRules>>();
|
||||||
|
|
||||||
boolean wantMulticolor = false;
|
boolean wantMulticolor = false;
|
||||||
Predicate<CardRules> preExceptMulti = null;
|
|
||||||
for (SItemManagerUtil.StatTypes s : SItemManagerUtil.StatTypes.values()) {
|
for (SItemManagerUtil.StatTypes s : SItemManagerUtil.StatTypes.values()) {
|
||||||
switch (s) {
|
switch (s) {
|
||||||
case WHITE: case BLUE: case BLACK: case RED: case GREEN: case COLORLESS:
|
case WHITE: case BLUE: case BLACK: case RED: case GREEN:
|
||||||
if (statLabels.get(s).getSelected()) { colors.add(s.predicate); }
|
if (statLabels.get(s).getSelected()) { colors.add(s.predicate); }
|
||||||
else { notColors.add(Predicates.not(s.predicate)); }
|
else { notColors.add(Predicates.not(s.predicate)); }
|
||||||
break;
|
break;
|
||||||
|
case COLORLESS:
|
||||||
|
if (statLabels.get(s).getSelected()) { colors.add(s.predicate); }
|
||||||
|
break;
|
||||||
case MULTICOLOR:
|
case MULTICOLOR:
|
||||||
wantMulticolor = statLabels.get(s).getSelected();
|
wantMulticolor = statLabels.get(s).getSelected();
|
||||||
preExceptMulti = wantMulticolor ? null : Predicates.not(s.predicate);
|
|
||||||
break;
|
break;
|
||||||
case LAND: case ARTIFACT: case CREATURE: case ENCHANTMENT: case PLANESWALKER: case INSTANT: case SORCERY:
|
case LAND: case ARTIFACT: case CREATURE: case ENCHANTMENT: case PLANESWALKER: case INSTANT: case SORCERY:
|
||||||
if (statLabels.get(s).getSelected()) { types.add(s.predicate); }
|
if (statLabels.get(s).getSelected()) { types.add(s.predicate); }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TOTAL: case PACK:
|
case TOTAL: case PACK:
|
||||||
// ignore
|
// ignore
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new RuntimeException("unhandled enum value: " + s);
|
throw new RuntimeException("unhandled enum value: " + s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wantMulticolor && !colors.isEmpty() && !notColors.isEmpty()) {
|
Predicate<CardRules> preFinal;
|
||||||
preExceptMulti = Predicates.and(notColors); //ensure multicolor cards with filtered colors don't show up
|
Predicate<CardRules> preColors = colors.size() == 6 ? null : Predicates.or(colors);
|
||||||
|
|
||||||
|
//ensure multicolor cards with filtered out colors don't show up
|
||||||
|
//unless card is hybrid playable using colors that aren't filtered out
|
||||||
|
if (wantMulticolor) {
|
||||||
|
if (colors.isEmpty()) {
|
||||||
|
preFinal = CardRulesPredicates.Presets.IS_MULTICOLOR;
|
||||||
|
}
|
||||||
|
else if (!notColors.isEmpty()) {
|
||||||
|
if (notColors.size() == 5) {
|
||||||
|
//if all 5 colors filtered, show only cards that either multicolor or colorless
|
||||||
|
preFinal = Predicates.or(CardRulesPredicates.Presets.IS_MULTICOLOR, preColors);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
preFinal = optimizedAnd(
|
||||||
|
Predicates.or(
|
||||||
|
Predicates.not(CardRulesPredicates.Presets.IS_MULTICOLOR),
|
||||||
|
Predicates.and(notColors)
|
||||||
|
),
|
||||||
|
preColors);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
preFinal = preColors;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
preFinal = optimizedAnd(Predicates.not(CardRulesPredicates.Presets.IS_MULTICOLOR), preColors);
|
||||||
}
|
}
|
||||||
|
|
||||||
Predicate<CardRules> preColors = colors.size() == 6 ? null : Predicates.or(colors);
|
if (preFinal == null && types.size() == 7) {
|
||||||
Predicate<CardRules> preFinal = colors.isEmpty() && wantMulticolor ?
|
|
||||||
CardRulesPredicates.Presets.IS_MULTICOLOR : optimizedAnd(preExceptMulti, preColors);
|
|
||||||
|
|
||||||
if (null == preFinal && 7 == types.size()) {
|
|
||||||
return Predicates.alwaysTrue();
|
return Predicates.alwaysTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
Predicate<PaperCard> typesFinal = Predicates.compose(Predicates.or(types), PaperCard.FN_GET_RULES);
|
Predicate<PaperCard> typesFinal = Predicates.compose(Predicates.or(types), PaperCard.FN_GET_RULES);
|
||||||
if (null == preFinal) {
|
if (preFinal == null) {
|
||||||
return typesFinal;
|
return typesFinal;
|
||||||
}
|
}
|
||||||
|
|
||||||
Predicate<PaperCard> colorFinal = Predicates.compose(preFinal, PaperCard.FN_GET_RULES);
|
Predicate<PaperCard> colorFinal = Predicates.compose(preFinal, PaperCard.FN_GET_RULES);
|
||||||
if (7 == types.size()) {
|
if (types.size() == 7) {
|
||||||
return colorFinal;
|
return colorFinal;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Predicates.and(colorFinal, typesFinal);
|
return Predicates.and(colorFinal, typesFinal);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,7 +115,7 @@ public class SFilterUtil {
|
|||||||
if (text.trim().isEmpty()) {
|
if (text.trim().isEmpty()) {
|
||||||
return Predicates.alwaysTrue();
|
return Predicates.alwaysTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
String[] splitText = text.replaceAll(",", "").replaceAll(" ", " ").split(" ");
|
String[] splitText = text.replaceAll(",", "").replaceAll(" ", " ").split(" ");
|
||||||
|
|
||||||
List<Predicate<CardRules>> terms = new ArrayList<Predicate<CardRules>>();
|
List<Predicate<CardRules>> terms = new ArrayList<Predicate<CardRules>>();
|
||||||
@@ -107,7 +129,7 @@ public class SFilterUtil {
|
|||||||
terms.add(Predicates.or(subands));
|
terms.add(Predicates.or(subands));
|
||||||
}
|
}
|
||||||
Predicate<CardRules> textFilter = invert ? Predicates.not(Predicates.or(terms)) : Predicates.and(terms);
|
Predicate<CardRules> textFilter = invert ? Predicates.not(Predicates.or(terms)) : Predicates.and(terms);
|
||||||
|
|
||||||
return Predicates.compose(textFilter, PaperCard.FN_GET_RULES);
|
return Predicates.compose(textFilter, PaperCard.FN_GET_RULES);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,8 +143,7 @@ public class SFilterUtil {
|
|||||||
return optimizedAnd(pMin, pMax);
|
return optimizedAnd(pMin, pMax);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static <T> Predicate<T> optimizedAnd(Predicate<T> p1, Predicate<T> p2)
|
private static <T> Predicate<T> optimizedAnd(Predicate<T> p1, Predicate<T> p2) {
|
||||||
{
|
|
||||||
return p1 == null ? p2 : (p2 == null ? p1 : Predicates.and(p1, p2));
|
return p1 == null ? p2 : (p2 == null ? p1 : Predicates.and(p1, p2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user