diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java index a984f68288e..9e8629baf20 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 CardRules attemptToLoadCard(String encodedCardName, String setCode) { + public void attemptToLoadCard(String encodedCardName, String setCode) { CardDb.CardRequest r = CardRequest.fromString(encodedCardName); String cardName = r.cardName; CardRules rules = cardReader.attemptToLoadCard(cardName, setCode); @@ -142,7 +142,6 @@ 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 4f8ea7a33f1..16af453f57a 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -18,15 +18,18 @@ package forge.card; import com.google.common.base.Predicate; -import com.google.common.collect.*; +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 forge.card.CardEdition.CardInSet; import forge.card.CardEdition.Type; import forge.deck.generation.IDeckGenPool; import forge.item.PaperCard; -import forge.util.CollectionSuppliers; -import forge.util.Lang; -import forge.util.MyRandom; -import forge.util.TextUtil; +import forge.util.*; + import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -337,7 +340,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { } if (request.artIndex <= 0) { // this stands for 'random art' - List candidates; + Collection candidates; if (reqEdition == null) { candidates = new ArrayList(cards); } @@ -352,15 +355,12 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { if (candidates.isEmpty()) { return null; } - - Collections.shuffle(candidates); + result = Aggregates.random(candidates); //if card image doesn't exist for chosen candidate, try another one if possible - for(PaperCard candidate : candidates) { - result = candidate; - if (result.hasImage()) { - break; - } + while (candidates.size() > 1 && !result.hasImage()) { + candidates.remove(result); + result = Aggregates.random(candidates); } } else { diff --git a/forge-core/src/main/java/forge/deck/CardPool.java b/forge-core/src/main/java/forge/deck/CardPool.java index e9f3b7171a9..b484f31ab98 100644 --- a/forge-core/src/main/java/forge/deck/CardPool.java +++ b/forge-core/src/main/java/forge/deck/CardPool.java @@ -21,7 +21,6 @@ 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; @@ -74,12 +73,29 @@ 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); - 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; + 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; if (artIndexExplicitlySet || artCount <= 1) { // either a specific art index is specified, or there is only one art, so just add the card @@ -98,43 +114,7 @@ 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.