From 6d9aa988cbde83db5edbeade50394da61127697c Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Thu, 19 Jan 2012 11:20:28 +0000 Subject: [PATCH] Adding some features to card filtering. --- .../lotro/game/DefaultCardCollection.java | 77 +++++++++++++------ 1 file changed, 55 insertions(+), 22 deletions(-) diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/DefaultCardCollection.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/DefaultCardCollection.java index 4da2f1e9b..aef182463 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/DefaultCardCollection.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/DefaultCardCollection.java @@ -229,14 +229,12 @@ public class DefaultCardCollection implements MutableCardCollection { filter = ""; String[] filterParams = filter.split(" "); - String setStr = getSetNumber(filterParams); - String[] sets = null; - if (setStr != null) - sets = setStr.split(","); + String type = getTypeFilter(filterParams); + String[] sets = getSetFilter(filterParams); List words = getWords(filterParams); - List cardTypes = getEnumFilter(CardType.values(), CardType.class, "cardType", null, filterParams); - List cultures = getEnumFilter(Culture.values(), Culture.class, "culture", null, filterParams); - List keywords = getEnumFilter(Keyword.values(), Keyword.class, "keyword", Collections.emptyList(), filterParams); + Set cardTypes = getEnumFilter(CardType.values(), CardType.class, "cardType", null, filterParams); + Set cultures = getEnumFilter(Culture.values(), Culture.class, "culture", null, filterParams); + Set keywords = getEnumFilter(Keyword.values(), Keyword.class, "keyword", Collections.emptySet(), filterParams); Integer siteNumber = getSiteNumber(filterParams); List result = new ArrayList(); @@ -245,19 +243,14 @@ public class DefaultCardCollection implements MutableCardCollection { String blueprintId = itemCount.getKey(); int count = itemCount.getValue(); - if (!blueprintId.contains("_")) - result.add(new Item(Item.Type.PACK, count, blueprintId)); - else { - final LotroCardBlueprint blueprint = library.getLotroCardBlueprint(blueprintId); - if (sets == null || isInSets(blueprintId, sets, library)) - if (cardTypes == null || cardTypes.contains(blueprint.getCardType())) - if (cultures == null || cultures.contains(blueprint.getCulture())) - if (containsAllKeywords(blueprint, keywords)) - if (containsAllWords(blueprint, words)) - if (siteNumber == null || blueprint.getSiteNumber() == siteNumber) - result.add(new Item(Item.Type.CARD, count, blueprintId)); + if (acceptsFilters(library, blueprintId, type, sets, cardTypes, cultures, keywords, words, siteNumber)) { + if (!blueprintId.contains("_")) + result.add(new Item(Item.Type.PACK, count, blueprintId)); + else + result.add(new Item(Item.Type.CARD, count, blueprintId)); } } + String sort = getSort(filterParams); if (sort != null && sort.equals("twilight")) Collections.sort(result, new TwilightComparator(library)); @@ -271,6 +264,46 @@ public class DefaultCardCollection implements MutableCardCollection { return result; } + private boolean acceptsFilters( + LotroCardBlueprintLibrary library, String blueprintId, String type, String[] sets, + Set cardTypes, Set cultures, Set keywords, List words, Integer siteNumber) { + if (!blueprintId.contains("_")) { + if (type == null || type.equals("pack")) + return true; + } else { + if (type == null + || type.equals("card") + || (type.equals("foil") && blueprintId.endsWith("*")) + || (type.equals("nonFoil") && !blueprintId.endsWith("*"))) { + final LotroCardBlueprint blueprint = library.getLotroCardBlueprint(blueprintId); + if (sets == null || isInSets(blueprintId, sets, library)) + if (cardTypes == null || cardTypes.contains(blueprint.getCardType())) + if (cultures == null || cultures.contains(blueprint.getCulture())) + if (containsAllKeywords(blueprint, keywords)) + if (containsAllWords(blueprint, words)) + if (siteNumber == null || blueprint.getSiteNumber() == siteNumber) + return true; + } + } + return false; + } + + private String getTypeFilter(String[] filterParams) { + for (String filterParam : filterParams) { + if (filterParam.startsWith("type:")) + return filterParam.substring("type:".length()); + } + return null; + } + + private String[] getSetFilter(String[] filterParams) { + String setStr = getSetNumber(filterParams); + String[] sets = null; + if (setStr != null) + sets = setStr.split(","); + return sets; + } + private boolean isInSets(String blueprintId, String[] sets, LotroCardBlueprintLibrary library) { for (String set : sets) if (blueprintId.startsWith(set + "_") || library.hasAlternateInSet(blueprintId, Integer.parseInt(set))) @@ -312,7 +345,7 @@ public class DefaultCardCollection implements MutableCardCollection { return null; } - private boolean containsAllKeywords(LotroCardBlueprint blueprint, List keywords) { + private boolean containsAllKeywords(LotroCardBlueprint blueprint, Set keywords) { for (Keyword keyword : keywords) { if (blueprint == null || !blueprint.hasKeyword(keyword)) return false; @@ -328,13 +361,13 @@ public class DefaultCardCollection implements MutableCardCollection { return true; } - private List getEnumFilter(T[] enumValues, Class enumType, String prefix, List defaultResult, String[] filterParams) { + private Set getEnumFilter(T[] enumValues, Class enumType, String prefix, Set defaultResult, String[] filterParams) { for (String filterParam : filterParams) { if (filterParam.startsWith(prefix + ":")) { String values = filterParam.substring((prefix + ":").length()); if (values.startsWith("-")) { values = values.substring(1); - List cardTypes = new LinkedList(Arrays.asList(enumValues)); + Set cardTypes = new HashSet(Arrays.asList(enumValues)); for (String v : values.split(",")) { T t = (T) Enum.valueOf(enumType, v); if (t != null) @@ -342,7 +375,7 @@ public class DefaultCardCollection implements MutableCardCollection { } return cardTypes; } else { - List cardTypes = new LinkedList(); + Set cardTypes = new HashSet(); for (String v : values.split(",")) cardTypes.add((T) Enum.valueOf(enumType, v)); return cardTypes;