From 79cea286305697ee0ac294b92ff84fccbd39ddf5 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 2 Apr 2021 14:31:21 +0800 Subject: [PATCH] Skip loading filtered card --- .../src/main/java/forge/StaticData.java | 23 ++++++++-- .../src/main/java/forge/card/CardDb.java | 46 ++++++------------- 2 files changed, 33 insertions(+), 36 deletions(-) diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java index 2ec2f0c8d1a..44444e12cba 100644 --- a/forge-core/src/main/java/forge/StaticData.java +++ b/forge-core/src/main/java/forge/StaticData.java @@ -79,16 +79,30 @@ public class StaticData { this.customEditions = new CardEdition.Collection(new CardEdition.Reader(new File(customEditionsFolder))); this.prefferedArt = prefferedArt; lastInstance = this; + List funnyCards = new ArrayList<>(); + List filtered = new ArrayList<>(); { final Map regularCards = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); final Map variantsCards = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); final Map customizedCards = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + for (CardEdition e : editions) { + if (e.getType() == CardEdition.Type.FUNNY || e.getBorderColor() == CardEdition.BorderColor.SILVER) { + for (CardEdition.CardInSet cis : e.getAllCardsInSet()) { + funnyCards.add(cis.name); + } + } + } + for (CardRules card : cardReader.loadCards()) { if (null == card) continue; final String cardName = card.getName(); + + if (!loadNonLegalCards && !card.getType().isBasicLand() && funnyCards.contains(cardName)) + filtered.add(cardName); + if (card.isVariant()) { variantsCards.put(cardName, card); } else { @@ -104,15 +118,18 @@ public class StaticData { } } + if (!filtered.isEmpty()) { + Collections.sort(filtered); + } commonCards = new CardDb(regularCards, editions); variantCards = new CardDb(variantsCards, editions); customCards = new CardDb(customizedCards, customEditions); //must initialize after establish field values for the sake of card image logic - commonCards.initialize(false, false, enableUnknownCards, loadNonLegalCards); - variantCards.initialize(false, false, enableUnknownCards, loadNonLegalCards); - customCards.initialize(false, false, enableUnknownCards, loadNonLegalCards); + commonCards.initialize(false, false, enableUnknownCards, filtered); + variantCards.initialize(false, false, enableUnknownCards, filtered); + customCards.initialize(false, false, enableUnknownCards, filtered); } { diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index 874f3f64a21..dab320099fc 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -56,7 +56,6 @@ import forge.util.TextUtil; public final class CardDb implements ICardDatabase, IDeckGenPool { public final static String foilSuffix = "+"; public final static char NameSetSeparator = '|'; - private boolean loadNonLegalCards = true; // need this to obtain cardReference by name+set+artindex private final ListMultimap allCardsByName = Multimaps.newListMultimap(new TreeMap<>(String.CASE_INSENSITIVE_ORDER), CollectionSuppliers.arrayLists()); @@ -69,6 +68,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { private final Map artIds = new HashMap<>(); private final CardEdition.Collection editions; + private List filtered; public enum SetPreference { Latest(false), @@ -157,19 +157,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { } private ListMultimap getAllCardsByName() { - if (loadNonLegalCards) - return allCardsByName; - return Multimaps.filterKeys(allCardsByName, new Predicate() { - @Override - public boolean apply(String s) { - PaperCard pc = getUniqueByName(s); - if (pc != null) { - if (checkNonLegal(pc)) - return false; - } - return true; - } - }); + return allCardsByName; } private void addSetCard(CardEdition e, CardInSet cis, CardRules cr) { @@ -199,12 +187,12 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { reIndex(); } - public void initialize(boolean logMissingPerEdition, boolean logMissingSummary, boolean enableUnknownCards, boolean loadNonLegalCards) { + public void initialize(boolean logMissingPerEdition, boolean logMissingSummary, boolean enableUnknownCards, List filtered) { + this.filtered = filtered; Set allMissingCards = new LinkedHashSet<>(); List missingCards = new ArrayList<>(); CardEdition upcomingSet = null; Date today = new Date(); - this.loadNonLegalCards = loadNonLegalCards; for (CardEdition e : editions.getOrderedEditions()) { boolean coreOrExpSet = e.getType() == CardEdition.Type.CORE || e.getType() == CardEdition.Type.EXPANSION; @@ -264,6 +252,15 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { } public void addCard(PaperCard paperCard) { + if (filtered.contains(paperCard.getName())) { + //TODO: Funny cards (filtered) may have real cards (except basic lands which is excluded) + //This is needed since Concentrate is a real card and DS0 set (Drake Stone) has Concentrate card + if (paperCard.getEdition().equalsIgnoreCase("DS0") && paperCard.getName().equalsIgnoreCase("Concentrate")) + return; + else if (!paperCard.getName().equalsIgnoreCase("Concentrate")) + return; + } + allCardsByName.put(paperCard.getName(), paperCard); if (paperCard.getRules().getSplitType() == CardSplitType.None) { return; } @@ -282,21 +279,10 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { uniqueCardsByName.clear(); for (Entry> kv : getAllCardsByName().asMap().entrySet()) { PaperCard pc = getFirstWithImage(kv.getValue()); - if (checkNonLegal(pc)) - continue; uniqueCardsByName.put(kv.getKey(), pc); } } - private boolean checkNonLegal(PaperCard pc) { - try { - if (!loadNonLegalCards && (editions.get(pc.getEdition()).getType() == CardEdition.Type.FUNNY || editions.get(pc.getEdition()).getBorderColor() == CardEdition.BorderColor.SILVER)) - return true; - } catch (Exception e) { - return false; - } - return false; - } private static PaperCard getFirstWithImage(final Collection cards) { //NOTE: this is written this way to avoid checking final card in list final Iterator iterator = cards.iterator(); @@ -588,8 +574,6 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { public boolean apply(Entry e) { if (e == null) return false; - if (checkNonLegal(e.getValue())) - return false; return e.getKey().equals(e.getValue().getName()); } }).values(); @@ -616,8 +600,6 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { return Multimaps.filterEntries(getAllCardsByName(), new Predicate>() { @Override public boolean apply(Entry entry) { - if (checkNonLegal(entry.getValue())) - return false; return entry.getKey().equals(entry.getValue().getName()); } }).values(); @@ -654,8 +636,6 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { return Lists.newArrayList(Multimaps.filterEntries(getAllCardsByName(), new Predicate>() { @Override public boolean apply(Entry entry) { - if (checkNonLegal(entry.getValue())) - return false; return entry.getKey().equals(entry.getValue().getName()); } }).get(getName(cardName)));