diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/DeckRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/DeckRequestHandler.java index 4b852a8dd..1de56f562 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/DeckRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/DeckRequestHandler.java @@ -401,10 +401,31 @@ public class DeckRequestHandler extends LotroServerRequestHandler implements Uri private String generateCardTooltip(LotroCardBlueprint bp, String bpid) throws CardNotFoundException { String[] parts = bpid.split("_"); - String cardnum = parts[1].replace("*", "").replace("T", ""); - String tlhhID = "LOTR" + String.format("%02d", Integer.parseInt(parts[0])) + String.format("%03d", Integer.parseInt(cardnum)); + int setnum = Integer.parseInt(parts[0]); + String set = String.format("%02d", setnum); + String subset = "S"; + int version = 0; + if(setnum >= 50 && setnum <= 69) { + setnum -= 50; + set = String.format("%02d", setnum); + subset = "E"; + version = 1; + } + else if(setnum >= 70 && setnum <= 89) { + setnum -= 70; + set = String.format("%02d", setnum); + subset = "E"; + version = 1; + } + else if(setnum >= 100 && setnum <= 149) { + setnum -= 100; + set = "V" + setnum; + } + int cardnum = Integer.parseInt(parts[1].replace("*", "").replace("T", "")); + + String id = "LOTR-EN" + set + subset + String.format("%03d", cardnum) + "." + String.format("%01d", version); String result = "" + GameUtils.getFullName(bp) - + ""; + + ""; return result; } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV01/V1_elven_playtest.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV01/V1_elven_playtest.hjson index c89c0bc7f..6cb44ec4b 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV01/V1_elven_playtest.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV01/V1_elven_playtest.hjson @@ -298,7 +298,7 @@ 101_12: { - title: Three Rings for the Elven Kings + title: Three Rings for the Elven-kings unique: true culture: elven twilight: 1 diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV01/V1_gandalf_playtest.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV01/V1_gandalf_playtest.hjson index 421ebf1af..b0adbc170 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV01/V1_gandalf_playtest.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV01/V1_gandalf_playtest.hjson @@ -112,7 +112,7 @@ } 101_15: { title: Gwaihir - subtitle: Lord of All Eagles + subtitle: Lord of Eagles unique: true culture: gandalf twilight: 4 diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV01/V1_shire_playtest.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV01/V1_shire_playtest.hjson index 13643dbf6..fc61e32c7 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV01/V1_shire_playtest.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/setV01/V1_shire_playtest.hjson @@ -246,7 +246,7 @@ } 101_56: { - title: We're Coming Too + title: We're Coming, Too! culture: shire twilight: 2 type: event diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/ImportCards.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/ImportCards.java index 8ee473182..8ebb79017 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/ImportCards.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/ImportCards.java @@ -4,12 +4,13 @@ import com.gempukku.lotro.common.*; import com.gempukku.lotro.logic.GameUtils; import java.util.*; +import java.util.regex.Pattern; public class ImportCards { //For a deck to be legal in a Pre-shadows format, it must contain one of these sites private final Set fellowshipSiteCheck = new HashSet<>(Arrays.asList("council courtyard", "ford of bruinen", "frodo's bedroom", "rivendell terrace", "rivendell valley", "rivendell waterfall", - "house of elrond")); + "house of elrond", "rivendell gateway")); private final Set towersSiteCheck = new HashSet<>(Arrays.asList("derndingle", "eastfold", "fangorn forest", "plains of rohan camp", "rohirrim village", "uruk camp", "wold of rohan")); private final Set kingSiteCheck = new HashSet<>(Arrays.asList("king's tent", "rohirrim camp", "west road")); @@ -22,7 +23,7 @@ public class ImportCards { for (CardCount cardCount : decklist) { for (Map.Entry cardBlueprint : cardLibrary.getBaseCards().entrySet()) { String id = cardBlueprint.getKey(); - if (isFromOfficialSet(id)) { + if (isFromSupportedSet(id)) { LotroCardBlueprint blueprint = cardBlueprint.getValue(); if (isNotSiteOrSiteFromBlock(blueprint, sitesBlock)) { if (exactNameMatch(blueprint, cardCount.getName())) { @@ -60,14 +61,17 @@ public class ImportCards { && SortAndFilterCards.replaceSpecialCharacters(GameUtils.getFullName(blueprint).toLowerCase()).equals(title); } - private boolean isFromOfficialSet(String id) { + private boolean isFromSupportedSet(String id) { try { - return Integer.parseInt(id.split("_")[0]) < 20; + int set = Integer.parseInt(id.split("_")[0]); + return set < 20 || (set > 99 && set < 149); } catch (NumberFormatException exp) { return false; } } + private Pattern cardLinePattern = Pattern.compile("^(x?\\s*\\d+\\s*x?)?\\s*(.*)\\s*(x?\\d+x?)?\\s*$"); + private List getDecklist(String rawDecklist) { int quantity; String cardLine; @@ -79,17 +83,22 @@ public class ImportCards { line = line.toLowerCase(); try { - 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 { - quantity = 1; - cardLine = line; + var matches = cardLinePattern.matcher(line); + + if(matches.matches()) { + if(!matches.group(1).isBlank()) { + quantity = Integer.parseInt(matches.group(1).replaceAll("\\D+", "")); + } + else if(!matches.group(3).isBlank()) { + quantity = Integer.parseInt(matches.group(3).replaceAll("\\D+", "")); + } + else { + quantity = 1; + } + + cardLine = matches.group(2).trim(); + result.add(new CardCount(SortAndFilterCards.replaceSpecialCharacters(cardLine).trim(), quantity)); } - result.add(new CardCount(SortAndFilterCards.replaceSpecialCharacters(cardLine).trim(), quantity)); } catch (Exception exp) { // Ignore the card } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/SortAndFilterCards.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/SortAndFilterCards.java index fa04dc6cd..703c77056 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/SortAndFilterCards.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/SortAndFilterCards.java @@ -6,6 +6,7 @@ import com.gempukku.lotro.game.packs.SetDefinition; import com.gempukku.lotro.logic.GameUtils; import com.gempukku.util.MultipleComparator; +import java.text.Normalizer; import java.util.*; public class SortAndFilterCards { @@ -281,22 +282,12 @@ public class SortAndFilterCards { } public static String replaceSpecialCharacters(String text) { - return text - .replace('á', 'a') - .replace('â', 'a') - .replace('ä', 'a') - .replace('é', 'e') - .replace('ê', 'e') - .replace('ë', 'e') - .replace('í', 'i') - .replace('ï', 'i') - .replace('ó', 'o') - .replace('ú', 'u') - .replace('û', 'u') - .replace('’', '\'') - .replace('‘', '\'') - .replace('”', '"') - .replace('“', '"'); + return Normalizer.normalize(text, Normalizer.Form.NFD) + .replaceAll("’", "'") + .replaceAll("‘", "'") + .replaceAll("”", "\"") + .replaceAll("“", "\"") + .replaceAll("\\p{M}", ""); } private Set getEnumFilter(T[] enumValues, Class enumType, String prefix, Set defaultResult, String[] filterParams) {