Prerelease standardization

This commit is contained in:
Sol
2020-01-07 05:59:26 +00:00
committed by Michael Kamensky
parent 3aca94dc9b
commit 2cc39c2580
7 changed files with 100 additions and 2 deletions

View File

@@ -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<PaperCard> getAllCardsFromEdition(CardEdition edition) {
List<PaperCard> 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));

View File

@@ -110,6 +110,7 @@ public final class CardEdition implements Comparable<CardEdition> { // 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<CardEdition> { // 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<CardEdition> { // 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<CardEdition> { // immutable
return res;
}
public Iterable<CardEdition> getPrereleaseEditions() {
List<CardEdition> res = Lists.newArrayList(this);
return Iterables.filter(res, new Predicate<CardEdition>() {
@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) {

View File

@@ -28,6 +28,8 @@ public interface ICardDatabase extends Iterable<PaperCard> {
List<PaperCard> getAllCards(String cardName);
List<PaperCard> getAllCards(Predicate<PaperCard> predicate);
List<PaperCard> getAllCardsFromEdition(CardEdition edition);
Predicate<? super PaperCard> wasPrintedInSets(List<String> allowedSetCodes);
}

View File

@@ -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

View File

@@ -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

View File

@@ -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");

View File

@@ -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<CardEdition> 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
// # <Edition> 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<Pair<String, Integer>> 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<CardBlock> 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();