From 63de7ff3c1d3abfe62755edd1fcd4feffbb15979 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Wed, 14 Sep 2011 21:54:19 +0000 Subject: [PATCH] data for booster generation incorporated into CardSet --- src/main/java/forge/SetUtils.java | 35 +++++++++- .../java/forge/card/BoosterGenerator.java | 66 +++++++------------ src/main/java/forge/card/CardSet.java | 40 ++++++++++- .../forge/game/limited/BoosterDraft_1.java | 4 +- .../java/forge/game/limited/SealedDeck.java | 4 +- src/main/java/forge/item/BoosterPack.java | 2 +- src/test/java/forge/BoosterDraftTest.java | 2 +- 7 files changed, 100 insertions(+), 53 deletions(-) diff --git a/src/main/java/forge/SetUtils.java b/src/main/java/forge/SetUtils.java index f2bf99d5ba2..a6fe10511a4 100644 --- a/src/main/java/forge/SetUtils.java +++ b/src/main/java/forge/SetUtils.java @@ -46,7 +46,7 @@ public final class SetUtils { // Perform that first of all static { - loadSetData(); + loadSetData(loadBoosterData()); loadBlockData(); loadFormatData(); } @@ -66,9 +66,36 @@ public final class SetUtils { CardSet set = setsByCode.get(code); return set == null ? "" : set.getCode2(); } + + private static Map loadBoosterData() + { + ArrayList fData = FileUtil.readFile("res/blockdata/boosters.txt"); + Map result = new HashMap(); + + + 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 boosters) { ArrayList 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); } diff --git a/src/main/java/forge/card/BoosterGenerator.java b/src/main/java/forge/card/BoosterGenerator.java index bb72c894adc..bfc607fb3d3 100644 --- a/src/main/java/forge/card/BoosterGenerator.java +++ b/src/main/java/forge/card/BoosterGenerator.java @@ -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 allNoLands = new ArrayList(); + private final List basicLands = new ArrayList(); + private final List allButLands = new ArrayList(); private final List commons = new ArrayList(); private final List uncommons = new ArrayList(); private final List rares = new ArrayList(); @@ -48,21 +51,17 @@ public class BoosterGenerator { private static final List emptyList = Collections.unmodifiableList( new ArrayList(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; /** *

Constructor for BoosterGenerator.

*/ public BoosterGenerator(Iterable 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(); + + numCommons = bs.getCommon(); + numUncommons = bs.getUncommon(); + numRareSlots = bs.getRare(); + numSpecials = bs.getSpecial(); - List setsList = Arrays.asList(new String[]{setCode}); - Predicate filter = CardPrinted.Predicates.printedInSets(setsList, true); + Predicate filter = CardPrinted.Predicates.printedInSets(cardSet.getCode()); List cardsInThisSet = filter.select(CardDb.instance().getAllCards()); for (CardPrinted c : cardsInThisSet) { addToRarity(c); } - ArrayList 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 pickRandomCards(List 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); } } } diff --git a/src/main/java/forge/card/CardSet.java b/src/main/java/forge/card/CardSet.java index 282e1aa765e..2a1739d8e5d 100644 --- a/src/main/java/forge/card/CardSet.java +++ b/src/main/java/forge/card/CardSet.java @@ -13,12 +13,17 @@ public final class CardSet implements Comparable { // 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", "???", "??"); @@ -27,7 +32,9 @@ public final class CardSet implements Comparable { // immutable public String getCode() { return code; } 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 fnGetName = new Lambda1() { @Override public String apply(final CardSet arg1) { return arg1.name; } }; @@ -59,4 +66,35 @@ public final class CardSet implements Comparable { // 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; } + } } diff --git a/src/main/java/forge/game/limited/BoosterDraft_1.java b/src/main/java/forge/game/limited/BoosterDraft_1.java index b4d62c57fd8..2efb6a794b9 100644 --- a/src/main/java/forge/game/limited/BoosterDraft_1.java +++ b/src/main/java/forge/game/limited/BoosterDraft_1.java @@ -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, BoosterGenerator> pick1 = BoosterGenerator.getSimplePicker(bpOne); for (int i = 0; i < nPacks; i++) { packs.add(pick1); } } diff --git a/src/main/java/forge/game/limited/SealedDeck.java b/src/main/java/forge/game/limited/SealedDeck.java index b8cf8ee805b..e4dedd0b3eb 100644 --- a/src/main/java/forge/game/limited/SealedDeck.java +++ b/src/main/java/forge/game/limited/SealedDeck.java @@ -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, BoosterGenerator> picker = BoosterGenerator.getSimplePicker(bpOne); for (int i = 0; i < nPacks; i++) { packs.add(picker); } } diff --git a/src/main/java/forge/item/BoosterPack.java b/src/main/java/forge/item/BoosterPack.java index 18749bac3f1..49f173a8835 100644 --- a/src/main/java/forge/item/BoosterPack.java +++ b/src/main/java/forge/item/BoosterPack.java @@ -32,7 +32,7 @@ public class BoosterPack implements InventoryItemFromSet { public List getCards() { if (null == cards) { - BoosterGenerator gen = new BoosterGenerator(cardSet); + BoosterGenerator gen = new BoosterGenerator(SetUtils.getSetByCode(cardSet)); cards = gen.getBoosterPack(); // TODO: Add land here! } diff --git a/src/test/java/forge/BoosterDraftTest.java b/src/test/java/forge/BoosterDraftTest.java index 67722ad39d9..ee0aae8a0fc 100644 --- a/src/test/java/forge/BoosterDraftTest.java +++ b/src/test/java/forge/BoosterDraftTest.java @@ -37,7 +37,7 @@ public class BoosterDraftTest implements BoosterDraft { */ public ItemPoolView nextChoice() { n--; - BoosterGenerator pack = new BoosterGenerator("M11"); + BoosterGenerator pack = new BoosterGenerator(SetUtils.getSetByCode("M11")); return ItemPool.createFrom(pack.getBoosterPack(), CardPrinted.class); }