diff --git a/.gitattributes b/.gitattributes index e6b04660506..6eecb37f4d8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -14206,9 +14206,10 @@ src/main/java/forge/game/limited/DraftRankCache.java -text src/main/java/forge/game/limited/GauntletMini.java -text src/main/java/forge/game/limited/IBoosterDraft.java svneol=native#text/plain src/main/java/forge/game/limited/LimitedDeckBuilder.java -text +src/main/java/forge/game/limited/LimitedPoolType.java -text src/main/java/forge/game/limited/ReadDraftRankings.java -text +src/main/java/forge/game/limited/SealedCardPoolGenerator.java svneol=native#text/plain src/main/java/forge/game/limited/SealedDeckBuilder.java svneol=native#text/plain -src/main/java/forge/game/limited/SealedDeckFormat.java svneol=native#text/plain src/main/java/forge/game/limited/package-info.java svneol=native#text/plain src/main/java/forge/game/package-info.java -text src/main/java/forge/game/phase/Cleanup.java -text diff --git a/src/main/java/forge/game/limited/LimitedPoolType.java b/src/main/java/forge/game/limited/LimitedPoolType.java new file mode 100644 index 00000000000..b7e06e7160a --- /dev/null +++ b/src/main/java/forge/game/limited/LimitedPoolType.java @@ -0,0 +1,18 @@ +package forge.game.limited; + +public enum LimitedPoolType { + Full("Full Cardpool"), + Block("Block / Set"), + FantasyBlock("Fantasy Block"), + Custom("Custom"); + + private final String displayName; + private LimitedPoolType(String name) { + displayName = name; + } + + @Override + public String toString() { + return displayName; + } +} \ No newline at end of file diff --git a/src/main/java/forge/game/limited/SealedCardPoolGenerator.java b/src/main/java/forge/game/limited/SealedCardPoolGenerator.java new file mode 100644 index 00000000000..e17a8c0a1ac --- /dev/null +++ b/src/main/java/forge/game/limited/SealedCardPoolGenerator.java @@ -0,0 +1,355 @@ +/* + * Forge: Play Magic: the Gathering. + * Copyright (C) 2011 Forge Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package forge.game.limited; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import javax.swing.JOptionPane; + +import org.apache.commons.lang.ArrayUtils; + +import forge.Singletons; +import forge.card.BoosterTemplate; +import forge.card.CardBlock; +import forge.card.CardEdition; +import forge.card.IUnOpenedProduct; +import forge.card.UnOpenedMeta; +import forge.card.UnOpenedProduct; +import forge.deck.CardPool; +import forge.gui.GuiChoose; +import forge.item.CardDb; +import forge.item.CardPrinted; +import forge.item.ItemPool; +import forge.util.FileUtil; +import forge.util.TextUtil; + +/** + *

+ * SealedDeckFormat class. + *

+ * + * @author Forge + * @version $Id$ + * @since 1.0.15 + */ +public class SealedCardPoolGenerator { + private final ArrayList product = new ArrayList(); + + private static final Integer[] ints3to12 = {3,4,5,6,7,8,9,10,11,12}; + + /** The Land set code. */ + private String landSetCode = null; + + /** + *

+ * Constructor for SealedDeck. + *

+ * + * @param poolType + * a {@link java.lang.String} object. + */ + public SealedCardPoolGenerator(final LimitedPoolType poolType) { + switch(poolType) { + case Full: + // Choose number of boosters + + chooseNumberOfBoosters(new UnOpenedProduct(BoosterTemplate.genericBooster)); + landSetCode = CardDb.instance().getCard("Plains").getEdition(); + break; + + case Block: + case FantasyBlock: + List blocks = new ArrayList(); + Iterable src = poolType == LimitedPoolType.Block ? Singletons.getModel().getBlocks() : Singletons.getModel().getFantasyBlocks(); + for (CardBlock b : src) { + blocks.add(b); + } + + final CardBlock block = GuiChoose.oneOrNone("Choose Block", blocks); + if( null == block) return; + + final int nPacks = block.getCntBoostersSealed(); + final Stack sets = new Stack(); + + for (CardEdition edition : block.getSets()) { + sets.add(edition.getCode()); + } + + for(String ms : block.getMetaSetNames()) { + sets.push(ms); + } + + if (sets.size() > 1 ) { + final List setCombos = getSetCombos(sets, nPacks); + if (setCombos == null || setCombos.isEmpty()) { + throw new RuntimeException("Unsupported amount of packs (" + nPacks + ") in a Sealed Deck block!"); + } + + final String p = setCombos.size() > 1 ? GuiChoose.oneOrNone("Choose packs to play with", setCombos) : setCombos.get(0); + if( p == null ) + return; + + for (String pz : TextUtil.split(p, ',')) { + String pp = pz.trim(); + int idxSp = pp.indexOf(' '); + String setCode = idxSp > 0 ? pp.substring(idxSp+1) : pp; + int nBoosters = idxSp > 0 ? Integer.parseInt(pp.substring(0, idxSp)) : 1; + while(nBoosters-- > 0) + this.product.add(block.getBooster(setCode)); + } + } else { + IUnOpenedProduct prod = block.getBooster(sets.get(0)); + for (int i = 0; i < nPacks; i++) { + this.product.add(prod); + } + } + + landSetCode = block.getLandSet().getCode(); + break; + + case Custom: + String[] dList; + final ArrayList customs = new ArrayList(); + + // get list of custom draft files + final File dFolder = new File("res/sealed/"); + if (!dFolder.exists()) { + throw new RuntimeException("GenerateSealed : folder not found -- folder is " + + dFolder.getAbsolutePath()); + } + + if (!dFolder.isDirectory()) { + throw new RuntimeException("GenerateSealed : not a folder -- " + dFolder.getAbsolutePath()); + } + + dList = dFolder.list(); + + for (final String element : dList) { + if (element.endsWith(".sealed")) { + final List dfData = FileUtil.readFile("res/sealed/" + element); + final CustomLimited cs = CustomLimited.parse(dfData, Singletons.getModel().getDecks().getCubes()); + if (cs.getSealedProductTemplate().getNumberOfCardsExpected() > 5) { // Do not allow too small cubes to be played as 'stand-alone'! + customs.add(cs); + } + } + } + + // present list to user + if (customs.isEmpty()) { + JOptionPane.showMessageDialog(null, "No custom sealed files found.", "", JOptionPane.INFORMATION_MESSAGE); + } else { + final CustomLimited draft = GuiChoose.one("Choose Custom Sealed Pool", customs); + + UnOpenedProduct toAdd = new UnOpenedProduct(draft.getSealedProductTemplate(), draft.getCardPool()); + toAdd.setLimitedPool(draft.isSingleton()); + chooseNumberOfBoosters(toAdd); + landSetCode = draft.getLandSetCode(); + } + break; + } + } + + + private void chooseNumberOfBoosters(final IUnOpenedProduct product1) { + + Integer cntBoosters = GuiChoose.one("How many booster packs?", ints3to12); + + for (int i = 0; i < cntBoosters; i++) { + this.product.add(product1); + } + } + + + /** + *

+ * getSetCombos. + *

+ * + * @return an ArrayList of the set choices. + */ + private ArrayList getSetCombos(final List setz, final int nPacks) { + String[] sets = setz.toArray(ArrayUtils.EMPTY_STRING_ARRAY); + ArrayList setCombos = new ArrayList(); + + if (nPacks == 3) { + if (sets.length >= 2) { + setCombos.add(String.format("%s, %s, %s", sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s", sets[1], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s", sets[1], sets[1], sets[0])); + setCombos.add(String.format("%s, %s, %s", sets[1], sets[1], sets[1])); + } + if (sets.length >= 3) { + setCombos.add(String.format("%s, %s, %s", sets[2], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s", sets[0], sets[2], sets[0])); + setCombos.add(String.format("%s, %s, %s", sets[2], sets[2], sets[2])); + setCombos.add(String.format("%s, %s, %s", sets[2], sets[1], sets[0])); + } + } + else if (nPacks == 4) { + if (sets.length >= 2) { + setCombos.add(String.format("%s, %s, %s, %s", sets[0], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s", sets[1], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s", sets[1], sets[1], sets[0], sets[0])); + } + if (sets.length >= 3) { + setCombos.add(String.format("%s, %s, %s, %s", sets[2], sets[2], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s", sets[2], sets[1], sets[0], sets[0])); + } + if (sets.length >= 4) { + setCombos.add(String.format("%s, %s, %s, %s", sets[3], sets[2], sets[1], sets[0])); + } + } + else if (nPacks == 5) { + if (sets.length >= 2) { + setCombos.add(String.format("%s, %s, %s, %s, %s", sets[0], sets[0], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s", sets[1], sets[1], sets[0], sets[0], sets[0])); + } + if (sets.length >= 3) { + setCombos.add(String.format("%s, %s, %s, %s, %s", sets[2], sets[2], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s", sets[2], sets[1], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s", sets[2], sets[1], sets[1], sets[0], sets[0])); + } + if (sets.length >= 4) { + setCombos.add(String.format("%s, %s, %s, %s, %s", sets[3], sets[2], sets[1], sets[0], sets[0])); + } + if (sets.length >= 5) { + setCombos.add(String.format("%s, %s, %s, %s, %s", sets[4], sets[3], sets[2], sets[1], sets[0])); + } + } + else if (nPacks == 7 && sets.length >= 7) { + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s", sets[6], sets[5], sets[4], sets[3], sets[2], sets[1], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s", sets[5], sets[4], sets[3], sets[2], sets[1], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s", sets[4], sets[3], sets[2], sets[1], sets[1], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s", sets[4], sets[3], sets[2], sets[1], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s", sets[3], sets[2], sets[2], sets[1], sets[1], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s", sets[3], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s", sets[3], sets[2], sets[1], sets[0], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s", sets[2], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s", sets[2], sets[1], sets[1], sets[0], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s", sets[2], sets[2], sets[2], sets[0], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s", sets[1], sets[1], sets[1], sets[0], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s", sets[0], sets[0], sets[0], sets[0], sets[0], sets[0], sets[0])); + } + else if (nPacks == 8 && sets.length >= 8) { + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s", sets[7], sets[6], sets[5], sets[4], sets[3], sets[2], sets[1], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s", sets[6], sets[5], sets[4], sets[3], sets[2], sets[1], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s", sets[5], sets[4], sets[3], sets[2], sets[1], sets[1], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s", sets[5], sets[4], sets[3], sets[2], sets[1], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s", sets[4], sets[3], sets[2], sets[2], sets[1], sets[1], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s", sets[4], sets[3], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s", sets[4], sets[3], sets[2], sets[1], sets[0], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s", sets[3], sets[3], sets[2], sets[2], sets[1], sets[1], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s", sets[3], sets[2], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s", sets[3], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s", sets[3], sets[2], sets[1], sets[0], sets[0], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s", sets[2], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s", sets[2], sets[2], sets[2], sets[2], sets[0], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s", sets[1], sets[1], sets[1], sets[1], sets[0], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s", sets[0], sets[0], sets[0], sets[0], sets[0], sets[0], sets[0], sets[0])); + + } + else if (nPacks == 9 && sets.length >= 9) { + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s, %s", sets[8], sets[7], sets[6], sets[5], sets[4], sets[3], sets[2], sets[1], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s, %s", sets[7], sets[6], sets[5], sets[4], sets[3], sets[2], sets[1], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s, %s", sets[6], sets[5], sets[4], sets[3], sets[2], sets[1], sets[1], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s, %s", sets[6], sets[5], sets[4], sets[3], sets[2], sets[1], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s, %s", sets[4], sets[3], sets[3], sets[2], sets[2], sets[1], sets[1], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s, %s", sets[4], sets[3], sets[2], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s, %s", sets[4], sets[3], sets[2], sets[1], sets[1], sets[1], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s, %s", sets[4], sets[3], sets[2], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s, %s", sets[4], sets[3], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s, %s", sets[4], sets[3], sets[2], sets[1], sets[0], sets[0], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s, %s", sets[3], sets[3], sets[2], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s, %s", sets[3], sets[2], sets[2], sets[1], sets[1], sets[1], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s, %s", sets[3], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s, %s", sets[2], sets[2], sets[2], sets[1], sets[1], sets[1], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s, %s", sets[2], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s, %s", sets[2], sets[1], sets[0], sets[0], sets[0], sets[0], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s, %s", sets[2], sets[2], sets[2], sets[2], sets[0], sets[0], sets[0], sets[0], sets[0])); + setCombos.add(String.format("%s, %s, %s, %s, %s, %s, %s, %s, %s", sets[1], sets[1], sets[1], sets[1], sets[0], sets[0], sets[0], sets[0], sets[0])); + setCombos.add(String.format("9 %s", sets[0])); + } + else { // Default to 6 packs + if (sets.length >= 2 && !sets[0].equals(sets[1])) { + setCombos.add(String.format("6 %s", sets[0])); + setCombos.add(String.format("4 %s, 2 %s", sets[0], sets[1])); + setCombos.add(String.format("3 %s, 3 %s", sets[0], sets[1])); + } + if (sets.length >= 3 && !sets[0].equals(sets[2])) { + setCombos.add(String.format("3 %s, 3 %s", sets[0], sets[2])); + setCombos.add(String.format("2 %s, 2 %s, 2 %s", sets[0], sets[1], sets[2])); + } + if (sets.length >= 4) { + if( sets[1].equals(sets[2]) && sets[1].equals(sets[0])) { + setCombos.add(String.format("%s, 5 %s", sets[3], sets[0])); // for guild sealed + } else { + setCombos.add(String.format("%s, %s, %s, 3 %s", sets[3], sets[2], sets[1], sets[0])); + setCombos.add(String.format("%s, %s, 2 %s, 2 %s", sets[3], sets[2], sets[1], sets[0])); + } + } + if (sets.length >= 5) { + setCombos.add(String.format("%s, %s, %s, %s, 2 %s", sets[4], sets[3], sets[2], sets[1], sets[0])); + } + if (sets.length >= 6) { + setCombos.add(String.format("%s, %s, %s, %s, %s, %s", sets[5], sets[4], sets[3], sets[2], sets[1], sets[0])); + } + + } + return setCombos; + } + + + /** + *

+ * getCardpool. + *

+ * + * @param isHuman + * boolean, get pool for human (possible choices) + * @return a {@link forge.CardList} object. + */ + public ItemPool getCardpool(final boolean isHuman) { + final CardPool pool = new CardPool(); + + for (IUnOpenedProduct prod : product) { + if( prod instanceof UnOpenedMeta ) + pool.addAllFlat(((UnOpenedMeta) prod).open(isHuman)); + else + pool.addAllFlat(prod.get()); + } + return pool; + } + + + /** + * Gets the land set code. + * + * @return the landSetCode + */ + public String getLandSetCode() { + return this.landSetCode; + } + + public boolean isEmpty() { + return product.isEmpty(); + } + +} diff --git a/src/main/java/forge/game/limited/SealedDeckFormat.java b/src/main/java/forge/game/limited/SealedDeckFormat.java deleted file mode 100644 index 948bd0b7da2..00000000000 --- a/src/main/java/forge/game/limited/SealedDeckFormat.java +++ /dev/null @@ -1,470 +0,0 @@ -/* - * Forge: Play Magic: the Gathering. - * Copyright (C) 2011 Forge Team - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package forge.game.limited; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.Stack; - -import javax.swing.JOptionPane; - -import org.apache.commons.lang.ArrayUtils; - -import forge.Singletons; -import forge.card.BoosterTemplate; -import forge.card.CardBlock; -import forge.card.CardEdition; -import forge.card.IUnOpenedProduct; -import forge.card.UnOpenedMeta; -import forge.card.UnOpenedProduct; -import forge.gui.GuiChoose; -import forge.item.CardDb; -import forge.item.CardPrinted; -import forge.item.ItemPool; -import forge.util.FileUtil; - -/** - *

- * SealedDeckFormat class. - *

- * - * @author Forge - * @version $Id$ - * @since 1.0.15 - */ -public class SealedDeckFormat { - private final ArrayList product = new ArrayList(); - - /** The Land set code. */ - private String[] landSetCode = { "" }; - - /** - *

- * Constructor for SealedDeck. - *

- * - * @param sealedType - * a {@link java.lang.String} object. - */ - public SealedDeckFormat(final String sealedType) { - if (sealedType.equals("Full")) { - // Choose number of boosters - final Integer[] integers = new Integer[10]; - - for (int i = 0; i < 10; i++) { - integers[i] = Integer.valueOf(i + 3); - } - - Integer nrBoosters = GuiChoose.one("How many booster packs?", integers); - - for (int i = 0; i < nrBoosters; i++) { - this.product.add(new UnOpenedProduct(BoosterTemplate.genericBooster)); - } - - this.getLandSetCode()[0] = CardDb.instance().getCard("Plains").getEdition(); - } else if (sealedType.equals("Block") || sealedType.equals("FBlock")) { - - List blocks = new ArrayList(); - - if (sealedType.equals("Block")) { - for (CardBlock b : Singletons.getModel().getBlocks()) { - blocks.add(b); - } - } - else { - for (CardBlock b : Singletons.getModel().getFantasyBlocks()) { - blocks.add(b); - } - } - - final CardBlock block = GuiChoose.one("Choose Block", blocks); - - final CardEdition[] cardSets = block.getSets(); - final Stack sets = new Stack(); - - for (int k = cardSets.length - 1; k >= 0; --k) { - sets.add(cardSets[k].getCode()); - } - - final int nPacks = block.getCntBoostersSealed(); - - for(String ms : block.getMetaSetNames()) { - sets.push(ms); - } - - final List setCombos = getSetCombos(sets, nPacks); - - while (setCombos == null) { - throw new RuntimeException("Unsupported amount of packs (" + nPacks + ") in a Sealed Deck block!"); - } - - if (sets.size() > 1) { - final Object p = GuiChoose.one("Choose Set Combination", setCombos); - - final String[] pp = p.toString().split("/"); - - // Consider up to two starter packs --BBU - boolean starter1 = false; - boolean starter2 = false; - int starter1idx = -1; - int starter2idx = -2; - - for (int j = nPacks - 1; j >= 0 && !starter2; j--) { - - if (Singletons.getModel().getTournamentPacks().contains(pp[j])) { - if (starter1) { - starter2 = true; - starter2idx = j; - - // Prefer a different second set - if (j > 0 && pp[starter1idx].equals(pp[starter2idx])) { - for (int k = j; k >= 0; k--) { - if (Singletons.getModel().getTournamentPacks().contains(pp[k]) - && !(pp[k].equals(pp[j]))) { - starter2idx = k; - break; // Found, don't look any further. - } - } - } - } - else { - starter1 = true; - starter1idx = j; - } - } - } - - if (starter1 || starter2) { - final List starterPacks = new ArrayList(); - - // The option to use booster packs only, no starter packs - starterPacks.add("(None)"); - - // Add option for the first starter pack - if (starter1) { - starterPacks.add(String.format("%s", pp[starter1idx])); - } - - // Add a separate option for the second starter pack if different from the first - if (starter2 && !(pp[starter2idx].equals(pp[starter1idx]))) { - starterPacks.add(String.format("%s", pp[starter2idx])); - } - - // If both can have starter packs, add option for both - if (starter1 && starter2) { - starterPacks.add(String.format("Two packs (%s, %s)", pp[starter1idx], pp[starter2idx])); - } - - final Object starterResult = GuiChoose.one("Choose starter pack(s):", starterPacks); - - // Analyze the choice - final String starters = starterResult.toString(); - - if (starters.equals("(None)")) { - starter1 = false; - starter2 = false; - } - else if (starters.equals(pp[starter1idx])) { - starter1 = true; - starter2 = false; - } - else if (starters.equals(pp[starter2idx])) { - starter1 = false; - starter2 = true; - } - // NOTE: No code needed for the last option (both) since if we selected it, - // both are already true... - } - - // End starter pack selection - - for (int i = 0; i < nPacks; i++) { - if (pp[i].charAt(0) == '*') { - this.product.add(block.getBooster(pp[i])); - } - else if ((i == starter1idx && starter1) || (i == starter2idx && starter2)) { - this.product.add(new UnOpenedProduct(Singletons.getModel().getTournamentPacks().get(pp[i]))); - } - else { - this.product.add(new UnOpenedProduct(Singletons.getModel().getBoosters().get(pp[i]))); - } - } - } else { - IUnOpenedProduct product1; - product1 = block.getBooster(sets.get(0)); - - // Choose number of boosters - final Integer[] integers = new Integer[10]; - - for (int i = 0; i < 10; i++) { - integers[i] = Integer.valueOf(i + 3); - } - - Integer nrBoosters = GuiChoose.one("How many booster packs?", integers); - - for (int i = 0; i < nrBoosters; i++) { - this.product.add(product1); - } - } - - this.getLandSetCode()[0] = block.getLandSet().getCode(); - - } else if (sealedType.equals("Custom")) { - String[] dList; - final ArrayList customs = new ArrayList(); - - // get list of custom draft files - final File dFolder = new File("res/sealed/"); - if (!dFolder.exists()) { - throw new RuntimeException("GenerateSealed : folder not found -- folder is " - + dFolder.getAbsolutePath()); - } - - if (!dFolder.isDirectory()) { - throw new RuntimeException("GenerateSealed : not a folder -- " + dFolder.getAbsolutePath()); - } - - dList = dFolder.list(); - - for (final String element : dList) { - if (element.endsWith(".sealed")) { - final List dfData = FileUtil.readFile("res/sealed/" + element); - final CustomLimited cs = CustomLimited.parse(dfData, Singletons.getModel().getDecks().getCubes()); - if (cs.getSealedProductTemplate().getNumberOfCardsExpected() > 5) { // Do not allow too small cubes to be played as 'stand-alone'! - customs.add(cs); - } - } - } - - // present list to user - if (customs.isEmpty()) { - JOptionPane.showMessageDialog(null, "No custom sealed files found.", "", JOptionPane.INFORMATION_MESSAGE); - } else { - final CustomLimited draft = GuiChoose.one("Choose Custom Sealed Pool", customs); - - - // Choose number of boosters - final Integer[] integers = new Integer[10]; - - for (int i = 0; i < 10; i++) { - integers[i] = Integer.valueOf(i + 3); - } - - Integer nrBoosters = GuiChoose.one("How many booster packs?", integers); - - UnOpenedProduct toAdd = new UnOpenedProduct(draft.getSealedProductTemplate(), draft.getCardPool()); - toAdd.setLimitedPool(draft.isSingleton()); - for (int i = 0; i < nrBoosters; i++) { - this.product.add(toAdd); - } - - this.getLandSetCode()[0] = draft.getLandSetCode(); - } - } - } - - - /** - *

- * getSetCombos. - *

- * - * @return an ArrayList of the set choices. - */ - private ArrayList getSetCombos(final List setz, final int nPacks) { - String[] sets = setz.toArray(ArrayUtils.EMPTY_STRING_ARRAY); - ArrayList setCombos = new ArrayList(); - - if (nPacks == 3) { - if (sets.length >= 2) { - setCombos.add(String.format("%s/%s/%s", sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s", sets[1], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s", sets[1], sets[1], sets[0])); - setCombos.add(String.format("%s/%s/%s", sets[1], sets[1], sets[1])); - } - if (sets.length >= 3) { - setCombos.add(String.format("%s/%s/%s", sets[2], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s", sets[0], sets[2], sets[0])); - setCombos.add(String.format("%s/%s/%s", sets[2], sets[2], sets[2])); - setCombos.add(String.format("%s/%s/%s", sets[2], sets[1], sets[0])); - } - } - else if (nPacks == 4) { - if (sets.length >= 2) { - setCombos.add(String.format("%s/%s/%s/%s", sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s", sets[1], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s", sets[1], sets[1], sets[0], sets[0])); - } - if (sets.length >= 3) { - setCombos.add(String.format("%s/%s/%s/%s", sets[2], sets[2], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s", sets[2], sets[1], sets[0], sets[0])); - } - if (sets.length >= 4) { - setCombos.add(String.format("%s/%s/%s/%s", sets[3], sets[2], sets[1], sets[0])); - } - } - else if (nPacks == 5) { - if (sets.length >= 2) { - setCombos.add(String.format("%s/%s/%s/%s/%s", sets[0], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s", sets[1], sets[1], sets[0], sets[0], sets[0])); - } - if (sets.length >= 3) { - setCombos.add(String.format("%s/%s/%s/%s/%s", sets[2], sets[2], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s", sets[2], sets[1], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s", sets[2], sets[1], sets[1], sets[0], sets[0])); - } - if (sets.length >= 4) { - setCombos.add(String.format("%s/%s/%s/%s/%s", sets[3], sets[2], sets[1], sets[0], sets[0])); - } - if (sets.length >= 5) { - setCombos.add(String.format("%s/%s/%s/%s/%s", sets[4], sets[3], sets[2], sets[1], sets[0])); - } - } - else if (nPacks == 7 && sets.length >= 7) { - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s", sets[6], sets[5], sets[4], sets[3], sets[2], sets[1], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s", sets[5], sets[4], sets[3], sets[2], sets[1], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s", sets[4], sets[3], sets[2], sets[1], sets[1], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s", sets[4], sets[3], sets[2], sets[1], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s", sets[3], sets[2], sets[2], sets[1], sets[1], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s", sets[3], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s", sets[3], sets[2], sets[1], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s", sets[2], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s", sets[2], sets[1], sets[1], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s", sets[2], sets[2], sets[2], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s", sets[1], sets[1], sets[1], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s", sets[0], sets[0], sets[0], sets[0], sets[0], sets[0], sets[0])); - } - else if (nPacks == 8 && sets.length >= 8) { - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s", sets[7], sets[6], sets[5], sets[4], sets[3], sets[2], sets[1], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s", sets[6], sets[5], sets[4], sets[3], sets[2], sets[1], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s", sets[5], sets[4], sets[3], sets[2], sets[1], sets[1], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s", sets[5], sets[4], sets[3], sets[2], sets[1], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s", sets[4], sets[3], sets[2], sets[2], sets[1], sets[1], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s", sets[4], sets[3], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s", sets[4], sets[3], sets[2], sets[1], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s", sets[3], sets[3], sets[2], sets[2], sets[1], sets[1], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s", sets[3], sets[2], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s", sets[3], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s", sets[3], sets[2], sets[1], sets[0], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s", sets[2], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s", sets[2], sets[2], sets[2], sets[2], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s", sets[1], sets[1], sets[1], sets[1], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s", sets[0], sets[0], sets[0], sets[0], sets[0], sets[0], sets[0], sets[0])); - - } - else if (nPacks == 9 && sets.length >= 9) { - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s/%s", sets[8], sets[7], sets[6], sets[5], sets[4], sets[3], sets[2], sets[1], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s/%s", sets[7], sets[6], sets[5], sets[4], sets[3], sets[2], sets[1], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s/%s", sets[6], sets[5], sets[4], sets[3], sets[2], sets[1], sets[1], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s/%s", sets[6], sets[5], sets[4], sets[3], sets[2], sets[1], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s/%s", sets[4], sets[3], sets[3], sets[2], sets[2], sets[1], sets[1], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s/%s", sets[4], sets[3], sets[2], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s/%s", sets[4], sets[3], sets[2], sets[1], sets[1], sets[1], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s/%s", sets[4], sets[3], sets[2], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s/%s", sets[4], sets[3], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s/%s", sets[4], sets[3], sets[2], sets[1], sets[0], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s/%s", sets[3], sets[3], sets[2], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s/%s", sets[3], sets[2], sets[2], sets[1], sets[1], sets[1], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s/%s", sets[3], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s/%s", sets[2], sets[2], sets[2], sets[1], sets[1], sets[1], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s/%s", sets[2], sets[2], sets[1], sets[1], sets[0], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s/%s", sets[2], sets[1], sets[0], sets[0], sets[0], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s/%s", sets[2], sets[2], sets[2], sets[2], sets[0], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s/%s", sets[1], sets[1], sets[1], sets[1], sets[0], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s/%s/%s/%s", sets[0], sets[0], sets[0], sets[0], sets[0], sets[0], sets[0], sets[0], sets[0])); - } - else { // Default to 6 packs - if (sets.length >= 6) { - setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[5], sets[4], sets[3], sets[2], sets[1], sets[0])); - } - if (sets.length >= 5) { - setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[4], sets[3], sets[2], sets[1], sets[0], sets[0])); - } - if (sets.length >= 4) { - setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[3], sets[2], sets[1], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[3], sets[2], sets[1], sets[1], sets[0], sets[0])); - } - if (sets.length >= 3) { - setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[2], sets[2], sets[2], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[2], sets[2], sets[1], sets[1], sets[0], sets[0])); - } - if (sets.length >= 2) { - setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[1], sets[1], sets[1], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[1], sets[1], sets[0], sets[0], sets[0], sets[0])); - setCombos.add(String.format("%s/%s/%s/%s/%s/%s", sets[0], sets[0], sets[0], sets[0], sets[0], sets[0])); - } - } - return setCombos; - } - /** - *

- * getCardpool. - *

- * - * @return a {@link forge.CardList} object. - */ - public ItemPool getCardpool() { - return getCardpool(true); - } - - - /** - *

- * getCardpool. - *

- * - * @param isHuman - * boolean, get pool for human (possible choices) - * @return a {@link forge.CardList} object. - */ - public ItemPool getCardpool(final boolean isHuman) { - - - final ItemPool pool = new ItemPool(CardPrinted.class); - - for (IUnOpenedProduct prod : product) { - if( prod instanceof UnOpenedMeta ) - pool.addAllFlat(((UnOpenedMeta) prod).open(isHuman)); - else - pool.addAllFlat(prod.get()); - } - return pool; - } - - - /** - * Gets the land set code. - * - * @return the landSetCode - */ - public String[] getLandSetCode() { - return this.landSetCode; - } - - /** - * Sets the land set code. - * - * @param landSetCode0 - * the landSetCode to set - */ - public void setLandSetCode(final String[] landSetCode0) { - this.landSetCode = landSetCode0; - } - -} diff --git a/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java b/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java index 9b32986bc26..5e7f57e676c 100644 --- a/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java +++ b/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java @@ -23,9 +23,10 @@ import forge.deck.DeckBase; import forge.deck.DeckGroup; import forge.deck.DeckSection; import forge.game.GameType; +import forge.game.limited.LimitedPoolType; import forge.game.limited.ReadDraftRankings; import forge.game.limited.SealedDeckBuilder; -import forge.game.limited.SealedDeckFormat; +import forge.game.limited.SealedCardPoolGenerator; import forge.gui.GuiChoose; import forge.gui.deckeditor.CDeckEditorUI; import forge.gui.deckeditor.controllers.ACEditorBase; @@ -34,7 +35,6 @@ import forge.gui.framework.ICDoc; import forge.item.CardPrinted; import forge.item.InventoryItem; import forge.item.ItemPool; -import forge.util.TextUtil; import forge.util.storage.IStorage; /** @@ -142,53 +142,25 @@ public enum CSubmenuSealed implements ICDoc { @SuppressWarnings("unchecked") private void setupSealed() { - final List sealedTypes = new ArrayList(); - sealedTypes.add("Full Cardpool"); - sealedTypes.add("Block / Set"); - sealedTypes.add("Fantasy Block"); - sealedTypes.add("Custom"); final String prompt = "Choose Sealed Deck Format:"; - final Object o = GuiChoose.one(prompt, sealedTypes); + final LimitedPoolType o = GuiChoose.oneOrNone(prompt, LimitedPoolType.values()); + if ( o == null ) return; + + SealedCardPoolGenerator sd = new SealedCardPoolGenerator(o); + if (sd.isEmpty()) return; - SealedDeckFormat sd = null; - - if (o.toString().equals(sealedTypes.get(0))) { - sd = new SealedDeckFormat("Full"); - } - - else if (o.toString().equals(sealedTypes.get(1))) { - sd = new SealedDeckFormat("Block"); - } - - else if (o.toString().equals(sealedTypes.get(2))) { - sd = new SealedDeckFormat("FBlock"); - } - - else if (o.toString().equals(sealedTypes.get(3))) { - sd = new SealedDeckFormat("Custom"); - } - else { - throw new IllegalStateException("choice <<" + TextUtil.safeToString(o) - + ">> does not equal any of the sealedTypes."); - } - - if (sd.getCardpool(false).isEmpty()) { - return; - } + final ItemPool humanPool = sd.getCardpool(true); + + // System.out.println(humanPool); // This seems to be limited by the MAX_DRAFT_PLAYERS constant // in DeckGroupSerializer.java. You could create more AI decks // but only the first seven would load. --BBU - final Integer[] integers = new Integer[7]; + final Integer[] integers = {1,2,3,4,5,6,7}; + Integer rounds = GuiChoose.oneOrNone("How many opponents are you willing to face?", integers); + if ( null == rounds ) return; - for (int i = 0; i <= 6; i++) { - integers[i] = Integer.valueOf(i + 1); - } - - Integer rounds = GuiChoose.one("How many matches?", integers); - - // System.out.println("You selected " + rounds + " rounds."); final String sDeckName = JOptionPane.showInputDialog(null, "Save this card pool as:", @@ -199,6 +171,14 @@ public enum CSubmenuSealed implements ICDoc { return; } + + final Deck deck = new Deck(sDeckName); + deck.getOrCreate(DeckSection.Sideboard).addAll(humanPool); + + for (final String element : Constant.Color.BASIC_LANDS) { + deck.get(DeckSection.Sideboard).add(element, sd.getLandSetCode(), 18); + } + final IStorage sealedDecks = Singletons.getModel().getDecks().getSealed(); if (!(sealedDecks.isUnique(sDeckName))) { @@ -212,24 +192,11 @@ public enum CSubmenuSealed implements ICDoc { sealedDecks.delete(sDeckName); } - final ItemPool sDeck = sd.getCardpool(true); - ItemPool aiDecks = sd.getCardpool(false); - - final Deck deck = new Deck(sDeckName); - deck.getOrCreate(DeckSection.Sideboard).addAll(sDeck); - - for (final String element : Constant.Color.BASIC_LANDS) { - deck.get(DeckSection.Sideboard).add(element, sd.getLandSetCode()[0], 18); - } - final DeckGroup sealed = new DeckGroup(sDeckName); sealed.setHumanDeck(deck); for (int i = 0; i < rounds; i++) { - if (i > 0) { - // Re-randomize for AI decks beyond the first... - aiDecks = sd.getCardpool(false); - } - sealed.addAiDeck(new SealedDeckBuilder(aiDecks.toFlatList()).buildDeck()); + // Generate other decks for next N opponents + sealed.addAiDeck(new SealedDeckBuilder(sd.getCardpool(false).toFlatList()).buildDeck()); } // Rank the AI decks