Support showing only colorless or multicolor cards

This commit is contained in:
drdev
2013-11-30 00:27:47 +00:00
parent abd182e17f
commit df50a0a38d

View File

@@ -37,49 +37,71 @@ public class SFilterUtil {
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;
} }
@@ -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));
} }