diff --git a/src/main/java/forge/card/CardSet.java b/src/main/java/forge/card/CardSet.java index 2a1739d8e5d..3070f0c0335 100644 --- a/src/main/java/forge/card/CardSet.java +++ b/src/main/java/forge/card/CardSet.java @@ -1,6 +1,8 @@ package forge.card; +import forge.game.GameFormat; import net.slightlymagic.braids.util.lambda.Lambda1; +import net.slightlymagic.maxmtg.Predicate; /** *

CardSet class.

@@ -97,4 +99,22 @@ public final class CardSet implements Comparable { // immutable public int getLand() { return nLand; } public int getFoilChance() { return foilRate; } } + + public static abstract class Predicates { + public final static Predicate canMakeBooster = new CanMakeBooster(); + public final static Predicate isLegalInFormat(GameFormat format) { return new LegalInFormat(format); } + + private static class CanMakeBooster extends Predicate { + public boolean isTrue(CardSet subject) { + return subject.canGenerateBooster(); + } + } + private static class LegalInFormat extends Predicate { + private final GameFormat format; + public LegalInFormat(final GameFormat fmt) { format = fmt; } + public boolean isTrue(CardSet subject) { + return format.isSetLegal(subject.getCode()); + } + } + } } diff --git a/src/main/java/forge/game/GameFormat.java b/src/main/java/forge/game/GameFormat.java index d0b123a2d4f..cbab3dcf94a 100644 --- a/src/main/java/forge/game/GameFormat.java +++ b/src/main/java/forge/game/GameFormat.java @@ -54,6 +54,8 @@ public final class GameFormat { public Predicate getFilterRules() { return filterRules; } public Predicate getFilterPrinted() { return filterPrinted; } + public boolean isSetLegal(String setCode) { return allowedSetCodes.isEmpty() || allowedSetCodes.contains(setCode); } + @Override public String toString() { diff --git a/src/main/java/forge/item/BoosterPack.java b/src/main/java/forge/item/BoosterPack.java index 5f044ecdafc..53bf40bf0be 100644 --- a/src/main/java/forge/item/BoosterPack.java +++ b/src/main/java/forge/item/BoosterPack.java @@ -2,6 +2,8 @@ package forge.item; import java.util.List; +import net.slightlymagic.braids.util.lambda.Lambda1; + import forge.SetUtils; import forge.card.BoosterGenerator; import forge.card.CardSet; @@ -12,6 +14,9 @@ import forge.card.CardSet; */ public class BoosterPack implements InventoryItemFromSet { + public final static Lambda1 fnFromSet = new Lambda1() { + @Override public BoosterPack apply(CardSet arg1) { return new BoosterPack(arg1); } }; + private final CardSet cardSet; private final String name; diff --git a/src/main/java/forge/quest/data/QuestUtilCards.java b/src/main/java/forge/quest/data/QuestUtilCards.java index 0288b03c11e..70786b0677c 100644 --- a/src/main/java/forge/quest/data/QuestUtilCards.java +++ b/src/main/java/forge/quest/data/QuestUtilCards.java @@ -7,9 +7,11 @@ import java.util.Map.Entry; import net.slightlymagic.braids.util.lambda.Lambda1; import net.slightlymagic.maxmtg.Predicate; +import forge.SetUtils; import forge.card.BoosterGenerator; import forge.card.CardRarity; import forge.card.BoosterUtils; +import forge.card.CardSet; import forge.deck.Deck; import forge.item.BoosterPack; import forge.item.CardDb; @@ -163,7 +165,11 @@ public final class QuestUtilCards { addBasicLands(q.shopList, 10, 5); - q.shopList.add(new BoosterPack("M10")); + Predicate filterT2 = CardSet.Predicates.isLegalInFormat(SetUtils.getStandard()); + q.shopList.addAllCards(filterT2.random(SetUtils.getAllSets(), 2, BoosterPack.fnFromSet)); + Predicate filterExt = CardSet.Predicates.isLegalInFormat(SetUtils.getExtended()); + Predicate filterExtButT2 = Predicate.and(filterExt, Predicate.not(filterT2)); + q.shopList.addAllCards(filterExtButT2.random(SetUtils.getAllSets(), 3, BoosterPack.fnFromSet)); } public ItemPool getCardpool() { diff --git a/src/main/java/net/slightlymagic/maxmtg/Predicate.java b/src/main/java/net/slightlymagic/maxmtg/Predicate.java index b1035256ab6..fe3db346479 100644 --- a/src/main/java/net/slightlymagic/maxmtg/Predicate.java +++ b/src/main/java/net/slightlymagic/maxmtg/Predicate.java @@ -193,6 +193,15 @@ public abstract class Predicate { } return result; } + public final List random(final Iterable source, final int count, final Lambda1 transformer) { + List result = new ArrayList(); + for (int i = 0; i < count; ++i) { + T toAdd = random(source); + if (toAdd == null) { break; } + result.add(transformer.apply(toAdd)); + } + return result; + } // Static builder methods - they choose concrete implementation by themselves public static Predicate brigde(final Predicate predicate, final Lambda1 fnBridge) {