If a DeckList references a bogus card set/art combo ignore parts of it until it works

This commit is contained in:
Chris H
2019-03-03 21:47:28 -05:00
parent 69661cab63
commit 888f5953b1
3 changed files with 58 additions and 37 deletions

View File

@@ -2,10 +2,10 @@ package forge;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import forge.card.CardDb; import forge.card.CardDb;
import forge.card.CardDb.CardRequest;
import forge.card.CardEdition; import forge.card.CardEdition;
import forge.card.CardRules; import forge.card.CardRules;
import forge.card.PrintSheet; import forge.card.PrintSheet;
import forge.card.CardDb.CardRequest;
import forge.item.BoosterBox; import forge.item.BoosterBox;
import forge.item.FatPack; import forge.item.FatPack;
import forge.item.PaperCard; import forge.item.PaperCard;
@@ -131,7 +131,7 @@ public class StaticData {
return foil ? commonCards.getFoiled(card) : card; 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); CardDb.CardRequest r = CardRequest.fromString(encodedCardName);
String cardName = r.cardName; String cardName = r.cardName;
CardRules rules = cardReader.attemptToLoadCard(cardName, setCode); CardRules rules = cardReader.attemptToLoadCard(cardName, setCode);
@@ -142,6 +142,7 @@ public class StaticData {
commonCards.loadCard(cardName, rules); commonCards.loadCard(cardName, rules);
} }
} }
return rules;
} }
/** @return {@link forge.util.storage.IStorage}<{@link forge.item.SealedProduct.Template}> */ /** @return {@link forge.util.storage.IStorage}<{@link forge.item.SealedProduct.Template}> */

View File

@@ -18,18 +18,15 @@
package forge.card; package forge.card;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.collect.Iterables; import com.google.common.collect.*;
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.CardInSet;
import forge.card.CardEdition.Type; import forge.card.CardEdition.Type;
import forge.deck.generation.IDeckGenPool; import forge.deck.generation.IDeckGenPool;
import forge.item.PaperCard; 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.StringUtils;
import org.apache.commons.lang3.tuple.Pair; 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' if (request.artIndex <= 0) { // this stands for 'random art'
Collection<PaperCard> candidates; List<PaperCard> candidates;
if (reqEdition == null) { if (reqEdition == null) {
candidates = new ArrayList<PaperCard>(cards); candidates = new ArrayList<PaperCard>(cards);
} }
@@ -355,12 +352,15 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
if (candidates.isEmpty()) { if (candidates.isEmpty()) {
return null; return null;
} }
result = Aggregates.random(candidates);
Collections.shuffle(candidates);
//if card image doesn't exist for chosen candidate, try another one if possible //if card image doesn't exist for chosen candidate, try another one if possible
while (candidates.size() > 1 && !result.hasImage()) { for(PaperCard candidate : candidates) {
candidates.remove(result); result = candidate;
result = Aggregates.random(candidates); if (result.hasImage()) {
break;
}
} }
} }
else { else {

View File

@@ -21,6 +21,7 @@ import com.google.common.base.Predicate;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import forge.StaticData; import forge.StaticData;
import forge.card.CardDb; import forge.card.CardDb;
import forge.card.CardRules;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.util.ItemPool; import forge.util.ItemPool;
import forge.util.ItemPoolSorter; import forge.util.ItemPoolSorter;
@@ -73,29 +74,12 @@ public class CardPool extends ItemPool<PaperCard> {
// NOTE: ART indices are "1" -based // NOTE: ART indices are "1" -based
public void add(String cardName, String setCode, final int artIndex, final int amount) { 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); int artCount = Math.max(StaticData.instance().getCommonCards().getArtCount(cardName, setCode), 1);
final boolean isCommonCard = paperCard != null; boolean artIndexExplicitlySet = artIndex > 0 ||
Character.isDigit(cardName.charAt(cardName.length() - 1)) &&
if (!isCommonCard) { cardName.charAt(cardName.length() - 2) == CardDb.NameSetSeparator;
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) { if (artIndexExplicitlySet || artCount <= 1) {
// either a specific art index is specified, or there is only one art, so just add the card // 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<PaperCard> {
} }
} }
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. * Add all from a List of CardPrinted.