diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java index 9e8629baf20..a984f68288e 100644 --- a/forge-core/src/main/java/forge/StaticData.java +++ b/forge-core/src/main/java/forge/StaticData.java @@ -2,10 +2,10 @@ package forge; import com.google.common.base.Predicate; import forge.card.CardDb; +import forge.card.CardDb.CardRequest; import forge.card.CardEdition; import forge.card.CardRules; import forge.card.PrintSheet; -import forge.card.CardDb.CardRequest; import forge.item.BoosterBox; import forge.item.FatPack; import forge.item.PaperCard; @@ -131,7 +131,7 @@ public class StaticData { return foil ? commonCards.getFoiled(card) : card; } - public void attemptToLoadCard(String encodedCardName, String setCode) { + public CardRules attemptToLoadCard(String encodedCardName, String setCode) { CardDb.CardRequest r = CardRequest.fromString(encodedCardName); String cardName = r.cardName; CardRules rules = cardReader.attemptToLoadCard(cardName, setCode); @@ -142,6 +142,7 @@ public class StaticData { commonCards.loadCard(cardName, rules); } } + return rules; } /** @return {@link forge.util.storage.IStorage}<{@link forge.item.SealedProduct.Template}> */ diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index 16af453f57a..4f8ea7a33f1 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -18,18 +18,15 @@ package forge.card; import com.google.common.base.Predicate; -import com.google.common.collect.Iterables; -import com.google.common.collect.ListMultimap; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Multimaps; - +import com.google.common.collect.*; import forge.card.CardEdition.CardInSet; import forge.card.CardEdition.Type; import forge.deck.generation.IDeckGenPool; import forge.item.PaperCard; -import forge.util.*; - +import forge.util.CollectionSuppliers; +import forge.util.Lang; +import forge.util.MyRandom; +import forge.util.TextUtil; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -340,7 +337,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { } if (request.artIndex <= 0) { // this stands for 'random art' - Collection candidates; + List candidates; if (reqEdition == null) { candidates = new ArrayList(cards); } @@ -355,12 +352,15 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { if (candidates.isEmpty()) { return null; } - result = Aggregates.random(candidates); + + Collections.shuffle(candidates); //if card image doesn't exist for chosen candidate, try another one if possible - while (candidates.size() > 1 && !result.hasImage()) { - candidates.remove(result); - result = Aggregates.random(candidates); + for(PaperCard candidate : candidates) { + result = candidate; + if (result.hasImage()) { + break; + } } } else { diff --git a/forge-core/src/main/java/forge/deck/CardPool.java b/forge-core/src/main/java/forge/deck/CardPool.java index b484f31ab98..e9f3b7171a9 100644 --- a/forge-core/src/main/java/forge/deck/CardPool.java +++ b/forge-core/src/main/java/forge/deck/CardPool.java @@ -21,6 +21,7 @@ import com.google.common.base.Predicate; import com.google.common.collect.Lists; import forge.StaticData; import forge.card.CardDb; +import forge.card.CardRules; import forge.item.PaperCard; import forge.util.ItemPool; import forge.util.ItemPoolSorter; @@ -73,29 +74,12 @@ public class CardPool extends ItemPool { // NOTE: ART indices are "1" -based public void add(String cardName, String setCode, final int artIndex, final int amount) { + PaperCard paperCard = determineRequestedPaperCard(cardName, setCode, artIndex); - PaperCard paperCard = StaticData.instance().getCommonCards().getCard(cardName, setCode, artIndex); - final boolean isCommonCard = paperCard != null; - - if (!isCommonCard) { - paperCard = StaticData.instance().getVariantCards().getCard(cardName, setCode); - if (paperCard == null) { - StaticData.instance().attemptToLoadCard(cardName, setCode); - paperCard = StaticData.instance().getVariantCards().getCard(cardName, setCode); - } - } - - int artCount = 1; - if (paperCard != null) { - setCode = paperCard.getEdition(); - cardName = paperCard.getName(); - artCount = isCommonCard ? StaticData.instance().getCommonCards().getArtCount(cardName, setCode) : 1; - } else { - System.err.print("An unsupported card was requested: \"" + cardName + "\" from \"" + setCode + "\". "); - paperCard = StaticData.instance().getCommonCards().createUnsupportedCard(cardName); - } - - boolean artIndexExplicitlySet = artIndex > 0 || Character.isDigit(cardName.charAt(cardName.length() - 1)) && cardName.charAt(cardName.length() - 2) == CardDb.NameSetSeparator; + int artCount = Math.max(StaticData.instance().getCommonCards().getArtCount(cardName, setCode), 1); + boolean artIndexExplicitlySet = artIndex > 0 || + Character.isDigit(cardName.charAt(cardName.length() - 1)) && + cardName.charAt(cardName.length() - 2) == CardDb.NameSetSeparator; if (artIndexExplicitlySet || artCount <= 1) { // either a specific art index is specified, or there is only one art, so just add the card @@ -114,7 +98,43 @@ public class CardPool extends ItemPool { } } + private PaperCard determineRequestedPaperCard(String cardName, String setCode, final int artIndex) { + // Does Forge even know this card exists? + PaperCard uniqueCard = StaticData.instance().getCommonCards().getUniqueByName(cardName); + if (uniqueCard == null) { + uniqueCard = StaticData.instance().getVariantCards().getUniqueByName(cardName); + } + CardDb db = null; + boolean isCommonCard = true; + if (uniqueCard == null) { + // Both database lookups failed, made up card OR lazy loading? + CardRules rules = StaticData.instance().attemptToLoadCard(cardName, setCode); + if (rules == null) { + // Failed to find a common/variant/or unloaded version of that card + System.err.print("An unsupported card was requested: \"" + cardName + "\" from \"" + setCode + "\". "); + return StaticData.instance().getCommonCards().createUnsupportedCard(cardName); + } + isCommonCard = !rules.isVariant(); + + db = isCommonCard ? StaticData.instance().getCommonCards() : StaticData.instance().getVariantCards(); + uniqueCard = db.getUniqueByName(cardName); + } else { + isCommonCard = !uniqueCard.getRules().isVariant(); + db = isCommonCard ? StaticData.instance().getCommonCards() : StaticData.instance().getVariantCards(); + } + + PaperCard paperCard = db.getCard(cardName, setCode, artIndex); + if (paperCard == null) { + paperCard = db.getCard(cardName, setCode); + } + + if (paperCard == null) { + paperCard = uniqueCard; + } + + return paperCard; + } /** * Add all from a List of CardPrinted.