diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java b/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java index 2dd577bd08b..623b5a434d5 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java @@ -464,7 +464,7 @@ public class MageBook extends JComponent { // first run for numbers list LinkedList haveNumbers = new LinkedList<>(); for (ExpansionSet.SetCardInfo card: cards){ - int cardNumber = Integer.parseInt(card.getCardNumber()); + int cardNumber = card.getCardNumberAsInt(); startNumber = min(startNumber, cardNumber); endNumber = Math.max(endNumber, cardNumber); haveNumbers.add(cardNumber); diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java index 57047e783df..5330c542cf4 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSets.java @@ -220,9 +220,10 @@ public class GathererSets implements Iterable { continue; // can't do other checks } - // 2. missing rarity icon: - // WARNING, need too much time (60+ secs), only for debug mode if (logger.isDebugEnabled()) { + // 2. missing rarity icon: + // WARNING, need too much time (60+ secs), only for debug mode + ///* if ((set.getCardsByRarity(Rarity.COMMON).size() > 0) && !res.haveCommon) { logger.error(String.format("Symbols: set have common cards, but don't download icon: %s (%s)", set.getCode(), set.getName())); } @@ -235,6 +236,30 @@ public class GathererSets implements Iterable { if ((set.getCardsByRarity(Rarity.MYTHIC).size() > 0) && !res.haveMyth) { logger.error(String.format("Symbols: set have mythic cards, but don't download icon: %s (%s)", set.getCode(), set.getName())); } + //*/ + + // 3. wrong sets config with alternative numbers + // TODO: some sets have cards above maxCardNumberInBooster, need to check it (search code for maxCardNumberInBooster), maybe delete at all after getCardNumberAsInt implement + if ((set.getMaxCardNumberInBooster() == 0) || (set.getMaxCardNumberInBooster() == Integer.MAX_VALUE)) + { + for(ExpansionSet.SetCardInfo card: set.getSetCardInfo()){ + if (String.valueOf(card.getCardNumberAsInt()).length() != card.getCardNumber().length()){ + logger.error(String.format("Symbols: set have alternative card but do not config to it: %s (%s)", set.getCode(), set.getName())); + break; + } + } + } + + // 4. have nonland card above maxboosternumber (info) + if (set.getMaxCardNumberInBooster() != Integer.MAX_VALUE) + { + for(ExpansionSet.SetCardInfo card: set.getSetCardInfo()){ + if (card.getRarity() == Rarity.LAND) { continue; } + if (card.getCardNumberAsInt() > set.getMaxCardNumberInBooster()){ + logger.error(String.format("Symbols: set setup to cut off cards for boosters, non land card will be missing: %s (%s), %s - %s", set.getCode(), set.getName(), card.getCardNumber(), card.getName())); + } + } + } } } diff --git a/Mage/src/main/java/mage/cards/ExpansionSet.java b/Mage/src/main/java/mage/cards/ExpansionSet.java index 0b312c96aa1..790657e19bb 100644 --- a/Mage/src/main/java/mage/cards/ExpansionSet.java +++ b/Mage/src/main/java/mage/cards/ExpansionSet.java @@ -32,6 +32,7 @@ import mage.cards.repository.CardInfo; import mage.cards.repository.CardRepository; import mage.constants.Rarity; import mage.constants.SetType; +import mage.util.CardUtil; import mage.util.RandomUtil; import java.io.Serializable; @@ -82,6 +83,10 @@ public abstract class ExpansionSet implements Serializable { return this.cardNumber; } + public int getCardNumberAsInt(){ + return CardUtil.parseCardNumberAsInt(this.cardNumber); + } + public Rarity getRarity() { return this.rarity; } @@ -388,9 +393,10 @@ public abstract class ExpansionSet implements Serializable { criteria.doubleFaced(false); } savedCardsInfos = CardRepository.instance.findCards(criteria); - // Workaround after card number is numeric + // Workaround after card number is numeric (p.s. card number is not numeric for some cards) + // TODO: some sets have фывфывфывфывфыв if (maxCardNumberInBooster != Integer.MAX_VALUE) { - savedCardsInfos.removeIf(next -> Integer.valueOf(next.getCardNumber()) > maxCardNumberInBooster && rarity != Rarity.LAND); + savedCardsInfos.removeIf(next -> next.getCardNumberAsInt() > maxCardNumberInBooster && rarity != Rarity.LAND); } savedCards.put(rarity, savedCardsInfos); @@ -431,4 +437,6 @@ public abstract class ExpansionSet implements Serializable { savedCards.clear(); } + public int getMaxCardNumberInBooster() { return maxCardNumberInBooster; } + } diff --git a/Mage/src/main/java/mage/cards/repository/CardInfo.java b/Mage/src/main/java/mage/cards/repository/CardInfo.java index 1600f5b82ad..7a725647d13 100644 --- a/Mage/src/main/java/mage/cards/repository/CardInfo.java +++ b/Mage/src/main/java/mage/cards/repository/CardInfo.java @@ -40,6 +40,7 @@ import mage.cards.*; import mage.cards.mock.MockCard; import mage.cards.mock.MockSplitCard; import mage.constants.*; +import mage.util.CardUtil; import mage.util.SubTypeList; import org.apache.log4j.Logger; @@ -374,6 +375,10 @@ public class CardInfo { return cardNumber; } + public int getCardNumberAsInt() { + return CardUtil.parseCardNumberAsInt(cardNumber); + } + public boolean isSplitCard() { return splitCard; } diff --git a/Mage/src/main/java/mage/util/CardUtil.java b/Mage/src/main/java/mage/util/CardUtil.java index a91dd87bd07..301a26e83f2 100644 --- a/Mage/src/main/java/mage/util/CardUtil.java +++ b/Mage/src/main/java/mage/util/CardUtil.java @@ -382,6 +382,25 @@ public final class CardUtil { return true; } + + /** + * Parse card number as int (support base [123] and alternative numbers [123b]). + * + * @param cardNumber origin card number + * @return int + */ + public static int parseCardNumberAsInt(String cardNumber){ + + if (cardNumber.isEmpty()){ throw new IllegalArgumentException("Card number is empty.");} + + if(Character.isDigit(cardNumber.charAt(cardNumber.length() - 1))) + { + return Integer.parseInt(cardNumber); + }else{ + return Integer.parseInt(cardNumber.substring(0, cardNumber.length() - 1)); + } + } + /** * Creates and saves a (card + zoneChangeCounter) specific exileId. *