diff --git a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java index 8f1872893bb..7636f166389 100644 --- a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java +++ b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java @@ -5,6 +5,7 @@ import com.google.common.base.Predicates; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import forge.StaticData; import forge.card.CardDb; import forge.card.CardRules; import forge.card.CardRulesPredicates; @@ -540,7 +541,7 @@ public class DeckgenUtil { if(partners.size()>0&&commander.getRules().canBePartnerCommander()){ selectedPartner=partners.get(MyRandom.getRandom().nextInt(partners.size())); - preSelectedCards.remove(selectedPartner); + preSelectedCards.removeAll(StaticData.instance().getCommonCards().getAllCards(selectedPartner.getName())); } //randomly remove cards int removeCount=0; @@ -562,6 +563,7 @@ public class DeckgenUtil { ++i; } preSelectedCards.removeAll(toRemove); + preSelectedCards.removeAll(StaticData.instance().getCommonCards().getAllCards(commander.getName())); gen = new CardThemedCommanderDeckBuilder(commander, selectedPartner,preSelectedCards,forAi,format); }else{ cardDb = FModel.getMagicDb().getCommonCards(); @@ -582,6 +584,7 @@ public class DeckgenUtil { } List shortList = cardList.subList(1, shortlistlength); shortList.remove(commander); + shortList.removeAll(StaticData.instance().getCommonCards().getAllCards(commander.getName())); gen = new CardThemedCommanderDeckBuilder(commander, selectedPartner,shortList,forAi,format); } diff --git a/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java b/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java index 57c709bdcba..de75375989b 100644 --- a/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java +++ b/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java @@ -4,6 +4,7 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import forge.StaticData; import forge.card.*; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostShard; @@ -478,6 +479,14 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { } } + private Set getDeckListNames(){ + Set deckListNames = new HashSet<>(); + for(PaperCard card:deckList){ + deckListNames.add(card.getName()); + } + return deckListNames; + } + /** * If the deck does not have 40 cards, fix it. This method should not be * called if the stuff above it is working correctly. @@ -500,20 +509,27 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { } Predicate possibleFromFullPool = new Predicate() { + Set deckListNames = getDeckListNames(); @Override public boolean apply(PaperCard card) { return format.isLegalCard(card) - &&!card.getRules().getManaCost().isPureGeneric() + && !card.getRules().getManaCost().isPureGeneric() && colors.containsAllColorsFrom(card.getRules().getColorIdentity().getColor()) - && !deckList.contains(card) - && (keyCard == null || !keyCard.equals(card)) - && (secondKeyCard==null || !secondKeyCard.equals(card)) - &&!card.getRules().getAiHints().getRemAIDecks() - &&!card.getRules().getAiHints().getRemRandomDecks() - &&!card.getRules().getMainPart().getType().isLand(); + && !deckListNames.contains(card.getName()) + && !card.getRules().getAiHints().getRemAIDecks() + && !card.getRules().getAiHints().getRemRandomDecks() + && !card.getRules().getMainPart().getType().isLand(); } }; - List randomPool = Lists.newArrayList(pool.getAllCards(possibleFromFullPool)); + List possibleList = Lists.newArrayList(pool.getAllCards(possibleFromFullPool)); + //ensure we do not add more keycards in case they are commanders + if (keyCard != null) { + possibleList.removeAll(StaticData.instance().getCommonCards().getAllCards(keyCard.getName())); + } + if (secondKeyCard != null) { + possibleList.removeAll(StaticData.instance().getCommonCards().getAllCards(secondKeyCard.getName())); + } + List randomPool = CardRanker.rankCardsInDeck(possibleList).subList(0,new Float(possibleList.size()*0.25).intValue()); Collections.shuffle(randomPool, MyRandom.getRandom()); Iterator iRandomPool=randomPool.iterator(); while (deckList.size() < targetSize) { @@ -728,20 +744,29 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { * number to add */ private void addRandomCards(int num) { + Set deckListNames = getDeckListNames(); Predicate possibleFromFullPool = new Predicate() { @Override public boolean apply(PaperCard card) { return format.isLegalCard(card) &&!card.getRules().getManaCost().isPureGeneric() && colors.containsAllColorsFrom(card.getRules().getColorIdentity().getColor()) - && !deckList.contains(card) + && !deckListNames.contains(card.getName()) &&!card.getRules().getAiHints().getRemAIDecks() &&!card.getRules().getAiHints().getRemRandomDecks() &&!card.getRules().getMainPart().getType().isLand(); } }; - List randomPool = Lists.newArrayList(pool.getAllCards(possibleFromFullPool)); - Collections.shuffle(randomPool, MyRandom.getRandom()); + List possibleList = Lists.newArrayList(pool.getAllCards(possibleFromFullPool)); + //ensure we do not add more keycards in case they are commanders + if (keyCard != null) { + possibleList.removeAll(StaticData.instance().getCommonCards().getAllCards(keyCard.getName())); + } + if (secondKeyCard != null) { + possibleList.removeAll(StaticData.instance().getCommonCards().getAllCards(secondKeyCard.getName())); + } + List randomPool = CardRanker.rankCardsInDeck(possibleList).subList(0,new Float(possibleList.size()*0.25).intValue()); + Collections.shuffle(randomPool); Iterator iRandomPool=randomPool.iterator(); for(int i=0;i