From 0f246f16f82f988bd042eb6b0277599ee5d2d481 Mon Sep 17 00:00:00 2001 From: drdev Date: Sun, 3 Jan 2016 01:10:30 +0000 Subject: [PATCH] Prevent generated decks with restricted pools coming out too small due to trying to add dual lands not in pool --- .../src/main/java/forge/card/CardDb.java | 5 +++ .../forge/deck/generation/DeckGenPool.java | 7 ++- .../deck/generation/DeckGeneratorBase.java | 44 ++++++++++--------- .../forge/deck/generation/IDeckGenPool.java | 1 + 4 files changed, 36 insertions(+), 21 deletions(-) diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index 05168a20fe6..d00e6db580b 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -467,6 +467,11 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { return Lists.newArrayList(Iterables.filter(this.roAllCards, predicate)); } + @Override + public boolean contains(String name) { + return allCardsByName.containsKey(name); + } + @Override public Iterator iterator() { return this.roAllCards.iterator(); diff --git a/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java b/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java index 4ebb0175a23..5de342fb626 100644 --- a/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java +++ b/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java @@ -46,7 +46,12 @@ public class DeckGenPool implements IDeckGenPool { } public boolean contains(PaperCard card) { - return cards.containsKey(card.getName()); + return contains(card.getName()); + } + + @Override + public boolean contains(String name) { + return cards.containsKey(name); } @Override diff --git a/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java b/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java index 7ef8a59c93d..d89df247614 100644 --- a/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java +++ b/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java @@ -153,9 +153,8 @@ public abstract class DeckGeneratorBase { } return res; } - - protected void addBasicLand(int cnt) - { + + protected void addBasicLand(int cnt) { addBasicLand(cnt, null); } @@ -269,32 +268,32 @@ public abstract class DeckGeneratorBase { protected static Map countLands(ItemPool outList) { // attempt to optimize basic land counts according // to color representation - Map res = new TreeMap(); // count each card color using mana costs // TODO: count hybrid mana differently? for (Entry cpe : outList) { - int profile = cpe.getKey().getRules().getManaCost().getColorProfile(); if ((profile & MagicColor.WHITE) != 0) { increment(res, MagicColor.Constant.BASIC_LANDS.get(0), cpe.getValue()); - } else if ((profile & MagicColor.BLUE) != 0) { + } + else if ((profile & MagicColor.BLUE) != 0) { increment(res, MagicColor.Constant.BASIC_LANDS.get(1), cpe.getValue()); - } else if ((profile & MagicColor.BLACK) != 0) { + } + else if ((profile & MagicColor.BLACK) != 0) { increment(res, MagicColor.Constant.BASIC_LANDS.get(2), cpe.getValue()); - } else if ((profile & MagicColor.RED) != 0) { + } + else if ((profile & MagicColor.RED) != 0) { increment(res, MagicColor.Constant.BASIC_LANDS.get(3), cpe.getValue()); - } else if ((profile & MagicColor.GREEN) != 0) { + } + else if ((profile & MagicColor.GREEN) != 0) { increment(res, MagicColor.Constant.BASIC_LANDS.get(4), cpe.getValue()); } - } return res; } - protected static void increment(Map map, String key, int delta) - { + protected static void increment(Map map, String key, int delta) { final Integer boxed = map.get(key); map.put(key, boxed == null ? delta : boxed.intValue() + delta); } @@ -377,22 +376,21 @@ public abstract class DeckGeneratorBase { * @return dual land names */ protected List getDualLandList() { - final List dLands = new ArrayList(); if (colors.countColors() > 3) { - dLands.add("Rupture Spire"); - dLands.add("Undiscovered Paradise"); + addCardNameToList("Rupture Spire", dLands); + addCardNameToList("Undiscovered Paradise", dLands); } if (colors.countColors() > 2) { - dLands.add("Evolving Wilds"); - dLands.add("Terramorphic Expanse"); + addCardNameToList("Evolving Wilds", dLands); + addCardNameToList("Terramorphic Expanse", dLands); } for (Entry dual : dualLands.entrySet()) { if (colors.hasAllColors(dual.getKey())) { for (String s : dual.getValue()) { - dLands.add(s); + addCardNameToList(s, dLands); } } } @@ -413,10 +411,16 @@ public abstract class DeckGeneratorBase { for (Entry dual : dualLands.entrySet()) { if (!colors.hasAllColors(dual.getKey())) { for (String s : dual.getValue()) { - dLands.add(s); + addCardNameToList(s, dLands); } } } return dLands; - } + } + + private void addCardNameToList(String cardName, List cardNameList) { + if (pool.contains(cardName)) { //avoid adding card if it's not in pool + cardNameList.add(cardName); + } + } } diff --git a/forge-core/src/main/java/forge/deck/generation/IDeckGenPool.java b/forge-core/src/main/java/forge/deck/generation/IDeckGenPool.java index d97a2eb085c..84d44916327 100644 --- a/forge-core/src/main/java/forge/deck/generation/IDeckGenPool.java +++ b/forge-core/src/main/java/forge/deck/generation/IDeckGenPool.java @@ -10,4 +10,5 @@ public interface IDeckGenPool { PaperCard getCard(String name, String edition, int artIndex); Iterable getAllCards(); Iterable getAllCards(Predicate filter); + boolean contains(String name); }