diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index 2c4e54ad21a..22fe40aa112 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -312,17 +312,17 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { return tryGetCard(request); } - public int getCardCollectorNumber(String cardName, String reqEdition) { + public String getCardCollectorNumber(String cardName, String reqEdition) { cardName = getName(cardName); CardEdition edition = editions.get(reqEdition); if (edition == null) - return -1; + return null; for (CardInSet card : edition.getCards()) { if (card.name.equalsIgnoreCase(cardName)) { return card.collectorNumber; } } - return -1; + return null; } private PaperCard tryGetCard(CardRequest request) { diff --git a/forge-core/src/main/java/forge/card/CardEdition.java b/forge-core/src/main/java/forge/card/CardEdition.java index e2b786c0322..9eca4eb84d2 100644 --- a/forge-core/src/main/java/forge/card/CardEdition.java +++ b/forge-core/src/main/java/forge/card/CardEdition.java @@ -38,6 +38,8 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.Map.Entry; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** @@ -75,10 +77,10 @@ public final class CardEdition implements Comparable { // immutable public static class CardInSet { public final CardRarity rarity; - public final int collectorNumber; + public final String collectorNumber; public final String name; - public CardInSet(final String name, final int collectorNumber, final CardRarity rarity) { + public CardInSet(final String name, final String collectorNumber, final CardRarity rarity) { this.name = name; this.collectorNumber = collectorNumber; this.rarity = rarity; @@ -86,7 +88,7 @@ public final class CardEdition implements Comparable { // immutable public String toString() { StringBuilder sb = new StringBuilder(); - if (collectorNumber != -1) { + if (collectorNumber != null) { sb.append(collectorNumber); sb.append(' '); } @@ -266,24 +268,23 @@ public final class CardEdition implements Comparable { // immutable Map tokenNormalized = new HashMap<>(); List processedCards = new ArrayList<>(); if (contents.containsKey("cards")) { + final Pattern pattern = Pattern.compile( + /* + The following pattern will match the WAR Japanese art entries, + it should also match the Un-set and older alternate art cards + like Merseine from FEM (should the editions files ever be updated) + */ + "(^(?[0-9]+.?) )?((?[SCURML]) )?(?.*)$" + ); for(String line : contents.get("cards")) { - if (StringUtils.isBlank(line)) - continue; - - // Optional collector number at the start. - String[] split = line.split(" ", 2); - int collectorNumber = -1; - if (split.length >= 2 && StringUtils.isNumeric(split[0])) { - collectorNumber = Integer.parseInt(split[0]); - line = split[1]; + Matcher matcher = pattern.matcher(line); + if (matcher.matches()) { + String collectorNumber = matcher.group("cnum"); + CardRarity r = CardRarity.smartValueOf(matcher.group("rarity")); + String cardName = matcher.group("name"); + CardInSet cis = new CardInSet(cardName, collectorNumber, r); + processedCards.add(cis); } - - // You may omit rarity for early development - CardRarity r = CardRarity.smartValueOf(line.substring(0, 1)); - boolean hadRarity = r != CardRarity.Unknown && line.charAt(1) == ' '; - String cardName = hadRarity ? line.substring(2) : line; - CardInSet cis = new CardInSet(cardName, collectorNumber, r); - processedCards.add(cis); } } diff --git a/forge-gui/src/main/java/forge/util/ImageFetcher.java b/forge-gui/src/main/java/forge/util/ImageFetcher.java index cf219331dc8..323b9c39189 100644 --- a/forge-gui/src/main/java/forge/util/ImageFetcher.java +++ b/forge-gui/src/main/java/forge/util/ImageFetcher.java @@ -45,21 +45,20 @@ public abstract class ImageFetcher { final String filename = ImageUtil.getImageKey(paperCard, backFace, true); destFile = new File(ForgeConstants.CACHE_CARD_PICS_DIR + "/" + filename + ".jpg"); - // First try to download the LQ Set URL, then fetch from scryfall/magiccards.info + // First try to download the LQ Set URL, then fetch from scryfall StringBuilder setDownload = new StringBuilder(ForgeConstants.URL_PIC_DOWNLOAD); setDownload.append(ImageUtil.getDownloadUrl(paperCard, backFace)); downloadUrls.add(setDownload.toString()); final StaticData data = StaticData.instance(); - final int cardNum = data.getCommonCards().getCardCollectorNumber(paperCard.getName(), paperCard.getEdition()); - if (cardNum != -1) { + final String cardNum = data.getCommonCards().getCardCollectorNumber(paperCard.getName(), paperCard.getEdition()); + if (cardNum != null) { String suffix = ""; if (paperCard.getRules().getOtherPart() != null) { suffix = (backFace ? "b" : "a"); } final String editionMciCode = data.getEditions().getMciCodeByCode(paperCard.getEdition()); - downloadUrls.add(String.format("https://img.scryfall.com/cards/normal/en/%s/%d%s.jpg", editionMciCode, cardNum, suffix)); - downloadUrls.add(String.format("https://magiccards.info/scans/en/%s/%d%s.jpg", editionMciCode, cardNum, suffix)); + downloadUrls.add(String.format("https://img.scryfall.com/cards/normal/en/%s/%s%s.jpg", editionMciCode, cardNum, suffix)); } } else if (prefix.equals(ImageKeys.TOKEN_PREFIX)) { if (tokenImages == null) {