data for booster generation incorporated into CardSet

This commit is contained in:
Maxmtg
2011-09-14 21:54:19 +00:00
parent fccb3ee63a
commit 63de7ff3c1
7 changed files with 100 additions and 53 deletions

View File

@@ -46,7 +46,7 @@ public final class SetUtils {
// Perform that first of all
static {
loadSetData();
loadSetData(loadBoosterData());
loadBlockData();
loadFormatData();
}
@@ -67,8 +67,35 @@ public final class SetUtils {
return set == null ? "" : set.getCode2();
}
private static Map<String, CardSet.BoosterData> loadBoosterData()
{
ArrayList<String> fData = FileUtil.readFile("res/blockdata/boosters.txt");
Map<String, CardSet.BoosterData> result = new HashMap<String, CardSet.BoosterData>();
for (String s : fData) {
if (StringUtils.isBlank(s)) { continue; }
String[] sParts = s.trim().split("\\|");
String code = null;
int nC = 0, nU = 0, nR = 0, nS = 0;
for (String sPart : sParts) {
String[] kv = sPart.split(":", 2);
String key = kv[0].toLowerCase();
if (key.equalsIgnoreCase("Set")) { code = kv[1]; }
if (key.equalsIgnoreCase("Commons")) { nC = Integer.parseInt(kv[1]); }
if (key.equalsIgnoreCase("Uncommons")) { nU = Integer.parseInt(kv[1]); }
if (key.equalsIgnoreCase("Rares")) { nR = Integer.parseInt(kv[1]); }
if (key.equalsIgnoreCase("Special")) { nS = Integer.parseInt(kv[1]); }
}
result.put(code, new CardSet.BoosterData(nC, nU, nR, nS));
}
return result;
}
// parser code - quite boring.
private static void loadSetData() {
private static void loadSetData(Map<String, CardSet.BoosterData> boosters) {
ArrayList<String> fData = FileUtil.readFile("res/blockdata/setdata.txt");
for (String s : fData) {
@@ -94,11 +121,13 @@ public final class SetUtils {
alias = kv[1];
}
}
CardSet set = new CardSet(index, name, code, code2);
CardSet set = new CardSet(index, name, code, code2, boosters.get(code));
boosters.remove(code);
setsByCode.put(code, set);
if (alias != null) { setsByCode.put(alias, set); }
allSets.add(set);
}
assert boosters.isEmpty();
Collections.sort(allSets);
allSets = Collections.unmodifiableList(allSets);
}

View File

@@ -6,6 +6,8 @@ import forge.MyRandom;
import forge.deck.Deck;
import forge.item.CardDb;
import forge.item.CardPrinted;
import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -36,7 +38,8 @@ public class BoosterGenerator {
}
// These lists are to hold cards grouped by rarity in advance.
private final List<CardPrinted> allNoLands = new ArrayList<CardPrinted>();
private final List<CardPrinted> basicLands = new ArrayList<CardPrinted>();
private final List<CardPrinted> allButLands = new ArrayList<CardPrinted>();
private final List<CardPrinted> commons = new ArrayList<CardPrinted>();
private final List<CardPrinted> uncommons = new ArrayList<CardPrinted>();
private final List<CardPrinted> rares = new ArrayList<CardPrinted>();
@@ -48,21 +51,17 @@ public class BoosterGenerator {
private static final List<CardPrinted> emptyList = Collections.unmodifiableList( new ArrayList<CardPrinted>(0) );
// This set of cards
private int numCommons = 0;
private int numUncommons = 0;
private int numRareSlots = 0;
// Modern boosters contain 10 commons, 3 uncommmons, 1 rare/mythic
// They also contain 1 land and 1 token/rules, but we don't pick them now.
private int numCommons = 10;
private int numUncommons = 3;
private int numRareSlots = 1;
private int numSpecials = 0;
/**
* <p>Constructor for BoosterGenerator.</p>
*/
public BoosterGenerator(Iterable<CardPrinted> cards) {
numCommons = 11;
numUncommons = 3;
numRareSlots = 1;
numSpecials = 0;
for (CardPrinted c : cards) {
addToRarity(c);
}
@@ -78,42 +77,24 @@ public class BoosterGenerator {
*
* @param setCode a {@link java.lang.String} object.
*/
public BoosterGenerator(final String setCode) {
numCommons = 0;
numUncommons = 0;
numRareSlots = 0;
numSpecials = 0;
public BoosterGenerator(final CardSet cardSet) {
if (!cardSet.canGenerateBooster()) {
throw new InvalidParameterException("BoosterGenerator: Set " + cardSet + " cannot generate boosters!");
}
CardSet.BoosterData bs = cardSet.getBoosterData();
List<String> setsList = Arrays.asList(new String[]{setCode});
Predicate<CardPrinted> filter = CardPrinted.Predicates.printedInSets(setsList, true);
numCommons = bs.getCommon();
numUncommons = bs.getUncommon();
numRareSlots = bs.getRare();
numSpecials = bs.getSpecial();
Predicate<CardPrinted> filter = CardPrinted.Predicates.printedInSets(cardSet.getCode());
List<CardPrinted> cardsInThisSet = filter.select(CardDb.instance().getAllCards());
for (CardPrinted c : cardsInThisSet) {
addToRarity(c);
}
ArrayList<String> bpData = FileUtil.readFile("res/boosterdata/" + setCode + ".pack");
for (String line : bpData) {
if (line.startsWith("Commons:")) {
numCommons = Integer.parseInt(line.substring(8));
} else if (line.startsWith("Uncommons:")) {
numUncommons = Integer.parseInt(line.substring(10));
} else if (line.startsWith("Rares:")) {
numRareSlots = Integer.parseInt(line.substring(6));
} else if (line.startsWith("Specials:")) {
numSpecials = Integer.parseInt(line.substring(9));
}
}
if (Constant.Runtime.DevMode[0]) {
System.out.println("numCommons: " + numCommons);
System.out.println("numUncommons: " + numUncommons);
System.out.println("numRares: " + numRareSlots);
System.out.println("numSpecials: " + numSpecials);
}
}
private List<CardPrinted> pickRandomCards(List<CardPrinted> source, int count)
@@ -202,7 +183,7 @@ public class BoosterGenerator {
temp.addAll(pickRandomCards(specials, nSpecs));
temp.addAll(pickRandomCards(allNoLands, nAnyCard));
temp.addAll(pickRandomCards(allButLands, nAnyCard));
return temp;
}
@@ -216,9 +197,8 @@ public class BoosterGenerator {
case Special: specials.add(c); break;
default: return;
}
if (!c.getCard().getType().isBasicLand()) {
allNoLands.add(c);
}
if (c.getCard().getType().isBasicLand()) { basicLands.add(c); } else { allButLands.add(c); }
}
}

View File

@@ -13,12 +13,17 @@ public final class CardSet implements Comparable<CardSet> { // immutable
private final String code;
private final String code2;
private final String name;
private final BoosterData boosterData;
public CardSet(final int index, final String name, final String code, final String code2) {
this(index, name, code, code2, null);
}
public CardSet(final int index, final String name, final String code, final String code2, BoosterData booster) {
this.code = code;
this.code2 = code2;
this.index = index;
this.name = name;
this.boosterData = booster;
}
public static final CardSet unknown = new CardSet(-1, "Undefined", "???", "??");
@@ -28,6 +33,8 @@ public final class CardSet implements Comparable<CardSet> { // immutable
public String getCode2() { return code2; }
public int getIndex() { return index; }
public boolean canGenerateBooster() { return boosterData != null; }
public BoosterData getBoosterData() { return boosterData; }
public static final Lambda1<String, CardSet> fnGetName = new Lambda1<String, CardSet>() {
@Override public String apply(final CardSet arg1) { return arg1.name; } };
@@ -59,4 +66,35 @@ public final class CardSet implements Comparable<CardSet> { // immutable
public String toString() {
return this.name + " (set)";
}
public static class BoosterData {
private final int nCommon;
private final int nUncommon;
private final int nRare;
private final int nSpecial;
private final int nLand;
private final int foilRate;
private final static int CARDS_PER_BOOSTER = 15;
//private final String landCode;
public BoosterData(final int nC, final int nU, final int nR, final int nS) {
this(nC, nU, nR, nS, CARDS_PER_BOOSTER - nC - nR - nU - nS, 68);
}
public BoosterData(final int nC, final int nU, final int nR, final int nS, final int nL, final int oneFoilPer) {
nCommon = nC;
nUncommon = nU;
nRare = nR;
nSpecial = nS;
nLand = nL > 0 ? nL : 0;
foilRate = oneFoilPer;
}
public int getCommon() { return nCommon; }
public int getUncommon() { return nUncommon; }
public int getRare() { return nRare; }
public int getSpecial() { return nSpecial; }
public int getLand() { return nLand; }
public int getFoilChance() { return foilRate; }
}
}

View File

@@ -102,12 +102,12 @@ public final class BoosterDraft_1 implements BoosterDraft {
Object p = GuiUtils.getChoice("Choose Set Combination", setCombos.toArray());
String[] pp = p.toString().split("/");
for (int i = 0; i < nPacks; i++) {
BoosterGenerator bpMulti = new BoosterGenerator(pp[i]);
BoosterGenerator bpMulti = new BoosterGenerator(SetUtils.getSetByCode(pp[i]));
packs.add(BoosterGenerator.getSimplePicker(bpMulti));
}
} else {
BoosterGenerator bpOne = new BoosterGenerator(sets[0]);
BoosterGenerator bpOne = new BoosterGenerator(SetUtils.getSetByCode(sets[0]));
Closure1<List<CardPrinted>, BoosterGenerator> pick1 = BoosterGenerator.getSimplePicker(bpOne);
for (int i = 0; i < nPacks; i++) { packs.add(pick1); }
}

View File

@@ -83,11 +83,11 @@ public class SealedDeck {
String[] pp = p.toString().split("/");
for (int i = 0; i < nPacks; i++) {
BoosterGenerator bpMulti = new BoosterGenerator(pp[i]);
BoosterGenerator bpMulti = new BoosterGenerator(SetUtils.getSetByCode(pp[i]));
packs.add(BoosterGenerator.getSimplePicker(bpMulti));
}
} else {
BoosterGenerator bpOne = new BoosterGenerator(sets[0]);
BoosterGenerator bpOne = new BoosterGenerator(SetUtils.getSetByCode(sets[0]));
Closure1<List<CardPrinted>, BoosterGenerator> picker = BoosterGenerator.getSimplePicker(bpOne);
for (int i = 0; i < nPacks; i++) { packs.add(picker); }
}

View File

@@ -32,7 +32,7 @@ public class BoosterPack implements InventoryItemFromSet {
public List<CardPrinted> getCards() {
if (null == cards)
{
BoosterGenerator gen = new BoosterGenerator(cardSet);
BoosterGenerator gen = new BoosterGenerator(SetUtils.getSetByCode(cardSet));
cards = gen.getBoosterPack();
// TODO: Add land here!
}

View File

@@ -37,7 +37,7 @@ public class BoosterDraftTest implements BoosterDraft {
*/
public ItemPoolView<CardPrinted> nextChoice() {
n--;
BoosterGenerator pack = new BoosterGenerator("M11");
BoosterGenerator pack = new BoosterGenerator(SetUtils.getSetByCode("M11"));
return ItemPool.createFrom(pack.getBoosterPack(), CardPrinted.class);
}