mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 04:38:00 +00:00
If a DeckList references a bogus card set/art combo ignore parts of it until it works
This commit is contained in:
@@ -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}> */
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user