diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index 79776618bed..2c4e54ad21a 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -553,6 +553,23 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { return Lists.newArrayList(Iterables.filter(this.roAllCards, predicate)); } + // Do I want a foiled version of these cards? + @Override + public List getAllCardsFromEdition(CardEdition edition) { + List cards = Lists.newArrayList(); + + for(CardInSet cis : edition.getCards()) { + PaperCard card = this.getCard(cis.name, edition.getCode()); + if (card == null) { + // Just in case the card is listed in the edition file but Forge doesn't support it + continue; + } + + cards.add(card); + } + return cards; + } + @Override public boolean contains(String name) { return allCardsByName.containsKey(getName(name)); diff --git a/forge-core/src/main/java/forge/card/CardEdition.java b/forge-core/src/main/java/forge/card/CardEdition.java index 15fbaa7ec8f..e2b786c0322 100644 --- a/forge-core/src/main/java/forge/card/CardEdition.java +++ b/forge-core/src/main/java/forge/card/CardEdition.java @@ -110,6 +110,7 @@ public final class CardEdition implements Comparable { // immutable private Type type; private String name; private String alias = null; + private String prerelease = null; private boolean whiteBorder = false; private FoilType foilType = FoilType.NOT_SUPPORTED; private double foilChanceInBooster = 0; @@ -178,6 +179,7 @@ public final class CardEdition implements Comparable { // immutable public Type getType() { return type; } public String getName() { return name; } public String getAlias() { return alias; } + public String getPrerelease() { return prerelease; } public FoilType getFoilType() { return foilType; } public double getFoilChanceInBooster() { return foilChanceInBooster; } public boolean getFoilAlwaysInCommonSlot() { return foilAlwaysInCommonSlot; } @@ -333,6 +335,7 @@ public final class CardEdition implements Comparable { // immutable } } res.type = enumType; + res.prerelease = section.get("Prerelease", null); switch(section.get("foil", "newstyle").toLowerCase()) { case "notsupported": @@ -413,6 +416,16 @@ public final class CardEdition implements Comparable { // immutable return res; } + public Iterable getPrereleaseEditions() { + List res = Lists.newArrayList(this); + return Iterables.filter(res, new Predicate() { + @Override + public boolean apply(final CardEdition edition) { + return edition.getPrerelease() != null; + } + }); + } + public CardEdition getEditionByCodeOrThrow(final String code) { final CardEdition set = this.get(code); if (null == set) { diff --git a/forge-core/src/main/java/forge/card/ICardDatabase.java b/forge-core/src/main/java/forge/card/ICardDatabase.java index 7bec67853b1..a6256207fc7 100644 --- a/forge-core/src/main/java/forge/card/ICardDatabase.java +++ b/forge-core/src/main/java/forge/card/ICardDatabase.java @@ -28,6 +28,8 @@ public interface ICardDatabase extends Iterable { List getAllCards(String cardName); List getAllCards(Predicate predicate); + List getAllCardsFromEdition(CardEdition edition); + Predicate wasPrintedInSets(List allowedSetCodes); } \ No newline at end of file diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index 1d8d087fcfb..8e22e1c48ab 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -6,6 +6,7 @@ MciCode=thb Type=Expansion BoosterCovers=5 Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand +Prerelease=6 Boosters, 1 RareMythic+ [cards] 4 U Banishing Light diff --git a/forge-gui/res/editions/Throne of Eldraine.txt b/forge-gui/res/editions/Throne of Eldraine.txt index ae5ad7af5d0..26c33cf900a 100644 --- a/forge-gui/res/editions/Throne of Eldraine.txt +++ b/forge-gui/res/editions/Throne of Eldraine.txt @@ -7,6 +7,7 @@ MciCode=eld Type=Expansion BoosterCovers=5 Booster=10 Common:!fromSheet("ELD Secret Cards"), 3 Uncommon:!fromSheet("ELD Secret Cards"), 1 RareMythic:!fromSheet("ELD Secret Cards"), 1 BasicLand +Prerelease=6 Boosters, 1 RareMythic+ [cards] 1 R Acclaimed Contender diff --git a/forge-gui/src/main/java/forge/limited/LimitedPoolType.java b/forge-gui/src/main/java/forge/limited/LimitedPoolType.java index 7ce7fbd8828..73f92239bb6 100644 --- a/forge-gui/src/main/java/forge/limited/LimitedPoolType.java +++ b/forge-gui/src/main/java/forge/limited/LimitedPoolType.java @@ -3,6 +3,7 @@ package forge.limited; public enum LimitedPoolType { Full("Full Cardpool"), Block("Block / Set"), + Prerelease("Prerelease"), FantasyBlock("Fantasy Block"), Custom("Custom Cube"), Chaos("Chaos Draft"); diff --git a/forge-gui/src/main/java/forge/limited/SealedCardPoolGenerator.java b/forge-gui/src/main/java/forge/limited/SealedCardPoolGenerator.java index 89323950028..e7ed1d2fce4 100644 --- a/forge-gui/src/main/java/forge/limited/SealedCardPoolGenerator.java +++ b/forge-gui/src/main/java/forge/limited/SealedCardPoolGenerator.java @@ -17,6 +17,8 @@ */ package forge.limited; +import com.google.common.collect.Lists; +import forge.StaticData; import forge.assets.FSkinProp; import forge.card.CardEdition; import forge.card.MagicColor; @@ -39,12 +41,13 @@ import forge.util.TextUtil; import forge.util.gui.SGuiChoose; import forge.util.gui.SOptionPane; import forge.util.storage.IStorage; - import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; import java.io.File; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Stack; @@ -166,6 +169,67 @@ public class SealedCardPoolGenerator { landSetCode = CardEdition.Predicates.getRandomSetWithAllBasicLands(FModel.getMagicDb().getEditions()).getCode(); break; + case Prerelease: + ArrayList editions = Lists.newArrayList(StaticData.instance().getEditions().getPrereleaseEditions()); + Collections.sort(editions); + Collections.reverse(editions); + + CardEdition chosenEdition = SGuiChoose.oneOrNone("Choose an edition", editions); + if (chosenEdition == null) { + return; + } + + String bundle = chosenEdition.getPrerelease(); + + // Parse prerelease bundle. + // More recent sets are like 6 boosters of this edition + 1 Promo RareMythic from this edition + + // Expecting to see things like + // # Boosters, # Rarity+ + + String[] parts = bundle.split(", "); + for(String part : parts) { + boolean promo = part.endsWith("+"); + if (promo) { + part = part.substring(0, part.length() - 1); + } + + String[] pieces = part.split(" "); + int num = Integer.parseInt(pieces[0]); + String thing = pieces[pieces.length - 1]; + + // Booster, Rarity, Named, SpecialBooster? + + if (thing.equalsIgnoreCase("Booster") || thing.equalsIgnoreCase("Boosters")) { + // Normal Boosters of this or block editions + String code = chosenEdition.getCode(); + if (pieces.length > 2) { + // 2 USG Boosters + code = pieces[1]; + } + + // Generate boosters + for(int i = 0; i < num; i++) { + this.product.add(new UnOpenedProduct(FModel.getMagicDb().getBoosters().get(code))); + } + } else { + // Rarity + List> promoSlot = new ArrayList<>(); + promoSlot.add(Pair.of(pieces[1], num)); + + SealedProduct.Template promoProduct = new SealedProduct.Template("Prerelease Promo", promoSlot); + + // Create a "booster" with just the promo card. Rarity + Edition into a Template + this.product.add(new UnOpenedProduct(promoProduct, FModel.getMagicDb().getCommonCards().getAllCardsFromEdition(chosenEdition))); + // TODO This product should be Foiled only. How do I do that? + } + // TODO Add support for special boosters like GuildPacks + } + + //chosenEdition but really it should be defined by something in the edition file? + landSetCode = chosenEdition.getCode(); + + break; case Block: case FantasyBlock: List blocks = new ArrayList<>(); @@ -439,7 +503,6 @@ public class SealedCardPoolGenerator { * * @param isHuman * boolean, get pool for human (possible choices) - * @return a {@link forge.CardList} object. */ public CardPool getCardPool(final boolean isHuman) { final CardPool pool = new CardPool();