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) {