Merge remote-tracking branch 'marcin/master' into gemp-dev

This commit is contained in:
Christian 'ketura' McCarty
2021-02-15 12:49:35 -06:00
3 changed files with 66 additions and 114 deletions

View File

@@ -68,18 +68,9 @@ public class CollectionRequestHandler extends LotroServerRequestHandler implemen
private void importCollection(HttpRequest request, ResponseWriter responseWriter) throws Exception {
QueryStringDecoder queryDecoder = new QueryStringDecoder(request.getUri());
String participantId = getQueryParameterSafely(queryDecoder, "participantId");
String rawDecklist = getQueryParameterSafely(queryDecoder, "decklist");
Player resourceOwner = getResourceOwnerSafely(request, participantId);
CardCollection collection = constructCollection(resourceOwner, "default");
if (collection == null)
throw new HttpProcessingException(404);
Iterable<CardCollection.Item> items = collection.getAll();
List<CardCollection.Item> importResult = _importCards.process(rawDecklist, items, _library);
List<CardCollection.Item> importResult = _importCards.process(rawDecklist, _library);
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

View File

@@ -6,144 +6,105 @@ import com.gempukku.lotro.logic.GameUtils;
import java.util.*;
public class ImportCards {
private SitesBlock _siteBlock;
//For a deck to be legal in a Pre-shadows format, it must contain one of these sites
private List<String> _fellowshipSiteCheck = new ArrayList<String>(Arrays.asList("Council Courtyard",
private Set<String> fellowshipSiteCheck = new HashSet<>(Arrays.asList("Council Courtyard",
"Ford of Bruinen", "Frodo's Bedroom", "Rivendell Terrace", "Rivendell Valley", "Rivendell Waterfall",
"House of Elrond"));
private List<String> _towersSiteCheck = new ArrayList<String>(Arrays.asList("Derndingle", "Eastfold",
private Set<String> towersSiteCheck = new HashSet<>(Arrays.asList("Derndingle", "Eastfold",
"Fangorn Forest", "Plains of Rohan Camp", "Rohirrim Village", "Uruk Camp", "Wold of Rohan"));
private List<String> _kingSiteCheck = new ArrayList<String>(Arrays.asList("King's Tent", "Rohirrim Camp",
private Set<String> kingSiteCheck = new HashSet<>(Arrays.asList("King's Tent", "Rohirrim Camp",
"West Road"));
public <T extends CardItem> List<T> process(String rawDecklist, Iterable<T> items, LotroCardBlueprintLibrary cardLibrary) {
List<String> decklist = getDecklist(rawDecklist);
_siteBlock = null;
List<T> result = new ArrayList<T>();
Set<T> pendingSites = new HashSet<T>();
Map<String, LotroCardBlueprint> cardBlueprintMap = new HashMap<>();
for (String line : decklist) {
for (T item : items) {
String blueprintId = item.getBlueprintId();
if (isPack(blueprintId))
continue;
try {
cardBlueprintMap.put(blueprintId, cardLibrary.getLotroCardBlueprint(blueprintId));
int outcome = importCriteria(cardLibrary, cardBlueprintMap, blueprintId, line);
if (outcome == 1) {
result.add(item);
public List<CardCollection.Item> process(String rawDecklist, LotroCardBlueprintLibrary cardLibrary) {
List<CardCount> decklist = getDecklist(rawDecklist);
SitesBlock sitesBlock = determineBlock(decklist);
List<CardCollection.Item> result = new ArrayList<>();
for (CardCount cardCount : decklist) {
for (Map.Entry<String, LotroCardBlueprint> cardBlueprint : cardLibrary.getBaseCards().entrySet()) {
String id = cardBlueprint.getKey();
if (isFromOfficialSet(id)) {
LotroCardBlueprint blueprint = cardBlueprint.getValue();
if (isNotSiteOrSiteFromBlock(blueprint, sitesBlock)) {
if (exactNameMatch(blueprint, cardCount.getName())) {
result.add(CardCollection.Item.createItem(id, cardCount.getCount()));
break;
}
}
if (outcome == 0)
pendingSites.add(item);
} catch (CardNotFoundException e) {
// Ignore the card
}
}
}
if (_siteBlock == null)
_siteBlock = SitesBlock.SHADOWS;
for (T siteItem : pendingSites) {
String siteId = siteItem.getBlueprintId();
try {
LotroCardBlueprint siteBlueprint = cardLibrary.getLotroCardBlueprint(siteId);
if (siteBlockFilter(siteBlueprint))
result.add(siteItem);
} catch (CardNotFoundException e) {
// Ignore the card
}
}
return result;
}
private int importCriteria(LotroCardBlueprintLibrary library, Map<String, LotroCardBlueprint> cardBlueprint, String blueprintId, String title) {
final LotroCardBlueprint blueprint = cardBlueprint.get(blueprintId);
if (exactMatch(blueprint,title)) {
if (setFilter(blueprintId)) {
if (blueprint.getCardType() == CardType.SITE) {
if (_siteBlock == null)
findSiteBlock(blueprint);
//add all sites to the set, as some formats would add duplicates otherwise
return 0;
}
return 1;
}
}
return -1;
private boolean isNotSiteOrSiteFromBlock(LotroCardBlueprint blueprint, SitesBlock sitesBlock) {
return blueprint.getCardType() != CardType.SITE || blueprint.getSiteBlock() == sitesBlock;
}
private boolean exactMatch(LotroCardBlueprint blueprint, String title) {
if (blueprint == null || !replaceSpecialCharacters(GameUtils.getFullName(blueprint).toLowerCase()).equals(title))
return false;
return true;
}
private boolean setFilter(String blueprintId) {
try {
int setNo = Integer.parseInt(blueprintId.split("_")[0]);
if (setNo < 20)
return true;
} catch (Exception e) {
//Not a card
private SitesBlock determineBlock(List<CardCount> decklist) {
for (CardCount card : decklist) {
String name = card.getName();
if (fellowshipSiteCheck.contains(name))
return SitesBlock.FELLOWSHIP;
if (towersSiteCheck.contains(name))
return SitesBlock.TWO_TOWERS;
if (kingSiteCheck.contains(name))
return SitesBlock.KING;
}
return false;
return SitesBlock.SHADOWS;
}
private boolean siteBlockFilter(LotroCardBlueprint blueprint) {
if (blueprint.getSiteBlock() == _siteBlock)
return true;
return false;
private boolean exactNameMatch(LotroCardBlueprint blueprint, String title) {
return blueprint != null
&& SortAndFilterCards.replaceSpecialCharacters(GameUtils.getFullName(blueprint).toLowerCase()).equals(title);
}
private void findSiteBlock(LotroCardBlueprint cardBlueprint) {
String site = cardBlueprint.getTitle();
if (_fellowshipSiteCheck.contains(site))
_siteBlock = SitesBlock.FELLOWSHIP;
else if (_towersSiteCheck.contains(site))
_siteBlock = SitesBlock.TWO_TOWERS;
else if (_kingSiteCheck.contains(site))
_siteBlock = SitesBlock.KING;
private boolean isFromOfficialSet(String id) {
return Integer.parseInt(id.split("_")[0]) < 20;
}
private List<String> getDecklist(String rawDecklist) {
List<String> result = new ArrayList<String>();
private List<CardCount> getDecklist(String rawDecklist) {
List<CardCount> result = new ArrayList<>();
for (String line : rawDecklist.split("~")) {
if (line.length() == 0)
continue;
int quantity = 1;
line = line.toLowerCase();
String cardLine = "";
int quantity;
String cardLine;
if (Character.isDigit(line.charAt(0))) {
quantity = Character.getNumericValue(line.charAt(0));
cardLine = line.substring(line.indexOf(" "));
}
else if (Character.isDigit(line.charAt(line.length()-1))) {
quantity = Character.getNumericValue(line.charAt(line.length()-1));
cardLine = line.substring(0,line.indexOf(" ",line.length()-3));
}
else {
} else if (Character.isDigit(line.charAt(line.length() - 1))) {
quantity = Character.getNumericValue(line.charAt(line.length() - 1));
cardLine = line.substring(0, line.indexOf(" ", line.length() - 3));
} else {
quantity = 1;
cardLine = line;
}
for (int i = 0; i < quantity; i++)
result.add(replaceSpecialCharacters(cardLine).trim());
result.add(new CardCount(SortAndFilterCards.replaceSpecialCharacters(cardLine).trim(), quantity));
}
return result;
}
private String replaceSpecialCharacters(String text) {
return text
.replace('é', 'e')
.replace('ú', 'u')
.replace('ë', 'e')
.replace('û', 'u')
.replace('ó', 'o');
}
private static class CardCount {
private String name;
private int count;
private static boolean isPack(String blueprintId) {
return !blueprintId.contains("_");
public CardCount(String name, int count) {
this.name = name;
this.count = count;
}
public String getName() {
return name;
}
public int getCount() {
return count;
}
}
}

View File

@@ -279,7 +279,7 @@ public class SortAndFilterCards {
return true;
}
private String replaceSpecialCharacters(String text) {
public static String replaceSpecialCharacters(String text) {
return text
.replace('é', 'e')
.replace('ú', 'u')