From ec98a428d38ade6b25e1fbf824bb96b26050b87a Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Thu, 7 Mar 2013 21:08:11 +0000 Subject: [PATCH] Monocolored decks generation --- .gitattributes | 1 + src/main/java/forge/deck/DeckgenUtil.java | 45 ++++----- .../deck/generate/Generate2ColorDeck.java | 2 +- .../deck/generate/Generate3ColorDeck.java | 2 +- .../deck/generate/Generate5ColorDeck.java | 2 +- .../generate/GenerateColoredDeckBase.java | 4 + .../deck/generate/GenerateMonoColorDeck.java | 99 +++++++++++++++++++ .../gui/deckeditor/controllers/CDeckgen.java | 6 +- .../deck/generate/Generate2ColorDeckTest.java | 2 +- .../deck/generate/Generate3ColorDeckTest.java | 2 +- .../deck/generate/Generate5ColorDeckTest.java | 2 +- 11 files changed, 132 insertions(+), 35 deletions(-) create mode 100644 src/main/java/forge/deck/generate/GenerateMonoColorDeck.java diff --git a/.gitattributes b/.gitattributes index 65ad7f1f2ab..fd5078245cd 100644 --- a/.gitattributes +++ b/.gitattributes @@ -14125,6 +14125,7 @@ src/main/java/forge/deck/generate/Generate3ColorDeck.java svneol=native#text/pla src/main/java/forge/deck/generate/Generate5ColorDeck.java svneol=native#text/plain src/main/java/forge/deck/generate/GenerateColoredDeckBase.java -text src/main/java/forge/deck/generate/GenerateDeckUtil.java -text +src/main/java/forge/deck/generate/GenerateMonoColorDeck.java -text src/main/java/forge/deck/generate/GenerateThemeDeck.java svneol=native#text/plain src/main/java/forge/deck/generate/package-info.java svneol=native#text/plain src/main/java/forge/deck/io/DeckFileHeader.java -text diff --git a/src/main/java/forge/deck/DeckgenUtil.java b/src/main/java/forge/deck/DeckgenUtil.java index 95a5adfe313..e370b055412 100644 --- a/src/main/java/forge/deck/DeckgenUtil.java +++ b/src/main/java/forge/deck/DeckgenUtil.java @@ -18,6 +18,8 @@ import forge.Singletons; import forge.deck.generate.Generate2ColorDeck; import forge.deck.generate.Generate3ColorDeck; import forge.deck.generate.Generate5ColorDeck; +import forge.deck.generate.GenerateColoredDeckBase; +import forge.deck.generate.GenerateMonoColorDeck; import forge.deck.generate.GenerateThemeDeck; import forge.game.player.PlayerType; import forge.item.CardDb; @@ -66,7 +68,7 @@ public class DeckgenUtil { * @return {@link forge.deck.Deck} */ public static Deck buildColorDeck(final String[] selection, PlayerType pt) { - ItemPoolView cards = null; + final Deck deck; // Replace "random" with "AI" for deck generation code @@ -74,22 +76,20 @@ public class DeckgenUtil { selection[i] = COLOR_VALS.get(selection[i]); } - // 2, 3, and 5 colors. - if (selection.length == 2) { - final Generate2ColorDeck gen = new Generate2ColorDeck( - selection[0], selection[1]); - cards = gen.get2ColorDeck(60, pt); + GenerateColoredDeckBase gen = null; + + if (selection.length == 1) { + gen = new GenerateMonoColorDeck(selection[0]); + } else if (selection.length == 2) { + gen = new Generate2ColorDeck(selection[0], selection[1]); + } else if (selection.length == 3) { + gen = new Generate3ColorDeck(selection[0], selection[1], selection[2]); + } else { + gen = new Generate5ColorDeck(); } - else if (selection.length == 3) { - final Generate3ColorDeck gen = new Generate3ColorDeck( - selection[0], selection[1], selection[2]); - cards = gen.get3ColorDeck(60, pt); - } - else { - final Generate5ColorDeck gen = new Generate5ColorDeck(); - cards = gen.get5ColorDeck(60, pt); - } - + + ItemPoolView cards = gen == null ? null : gen.getDeck(60, pt); + // After generating card lists, build deck. deck = new Deck(); deck.getMain().addAll(cards); @@ -131,8 +131,8 @@ public class DeckgenUtil { /** @return {@link forge.deck.Deck} */ public static Deck getRandomColorDeck(PlayerType pt) { - final int[] colorCount = new int[] {2, 3, 5}; - final int count = colorCount[(int) (Math.round(Math.random() * 2))]; + final int[] colorCount = new int[] {1, 2, 3, 5}; + final int count = colorCount[MyRandom.getRandom().nextInt(colorCount.length)]; final String[] selection = new String[count]; // A simulated selection of "random 1" will trigger the AI selection process. @@ -287,14 +287,7 @@ public class DeckgenUtil { public static boolean colorCheck(final String[] colors0) { boolean result = true; - if (colors0.length == 1) { - JOptionPane.showMessageDialog(null, - "Sorry, single color generated decks aren't supported yet." - + "\n\rPlease choose at least one more color for this deck.", - "Generate deck: 1 color", JOptionPane.ERROR_MESSAGE); - result = false; - } - else if (colors0.length == 4) { + if (colors0.length == 4) { JOptionPane.showMessageDialog(null, "Sorry, four color generated decks aren't supported yet." + "\n\rPlease use 2, 3, or 5 colors for this deck.", diff --git a/src/main/java/forge/deck/generate/Generate2ColorDeck.java b/src/main/java/forge/deck/generate/Generate2ColorDeck.java index 448c563f2e2..046b6f2f7b9 100644 --- a/src/main/java/forge/deck/generate/Generate2ColorDeck.java +++ b/src/main/java/forge/deck/generate/Generate2ColorDeck.java @@ -78,7 +78,7 @@ public class Generate2ColorDeck extends GenerateColoredDeckBase { } - public final ItemPoolView get2ColorDeck(final int size, final PlayerType pt) { + public final ItemPoolView getDeck(final int size, final PlayerType pt) { addCreaturesAndSpells(size, cmcLevels, cmcAmounts, pt); // Add lands diff --git a/src/main/java/forge/deck/generate/Generate3ColorDeck.java b/src/main/java/forge/deck/generate/Generate3ColorDeck.java index 0e944c6a02c..d0d6c68b548 100644 --- a/src/main/java/forge/deck/generate/Generate3ColorDeck.java +++ b/src/main/java/forge/deck/generate/Generate3ColorDeck.java @@ -77,7 +77,7 @@ public class Generate3ColorDeck extends GenerateColoredDeckBase { * the pt * @return a {@link forge.CardList} object. */ - public final ItemPoolView get3ColorDeck(final int size, final PlayerType pt) { + public final ItemPoolView getDeck(final int size, final PlayerType pt) { addCreaturesAndSpells(size, cmcLevels, cmcAmounts, pt); // Add lands diff --git a/src/main/java/forge/deck/generate/Generate5ColorDeck.java b/src/main/java/forge/deck/generate/Generate5ColorDeck.java index 4e3865ab9a9..35ac5e6b08d 100644 --- a/src/main/java/forge/deck/generate/Generate5ColorDeck.java +++ b/src/main/java/forge/deck/generate/Generate5ColorDeck.java @@ -66,7 +66,7 @@ public class Generate5ColorDeck extends GenerateColoredDeckBase { * a PlayerType * @return a {@link forge.CardList} object. */ - public final ItemPoolView get5ColorDeck(final int size, final PlayerType pt) { + public final ItemPoolView getDeck(final int size, final PlayerType pt) { addCreaturesAndSpells(size, cmcLevels, cmcAmounts, pt); // Add lands diff --git a/src/main/java/forge/deck/generate/GenerateColoredDeckBase.java b/src/main/java/forge/deck/generate/GenerateColoredDeckBase.java index 1743021a11c..0807dcb8b83 100644 --- a/src/main/java/forge/deck/generate/GenerateColoredDeckBase.java +++ b/src/main/java/forge/deck/generate/GenerateColoredDeckBase.java @@ -39,6 +39,7 @@ import forge.game.player.PlayerType; import forge.item.CardDb; import forge.item.CardPrinted; import forge.item.ItemPool; +import forge.item.ItemPoolView; import forge.properties.ForgePreferences.FPref; import forge.util.Aggregates; import forge.util.MyRandom; @@ -100,6 +101,9 @@ public abstract class GenerateColoredDeckBase { addCmcAdjusted(spells, spellCnt, cmcLevels, cmcAmounts); } + public ItemPoolView getDeck(final int size, final PlayerType pt) { + return null; // all but theme deck do override this method + } protected void addSome(int cnt, List source) { for (int i = 0; i < cnt; i++) { diff --git a/src/main/java/forge/deck/generate/GenerateMonoColorDeck.java b/src/main/java/forge/deck/generate/GenerateMonoColorDeck.java new file mode 100644 index 00000000000..29244405ef5 --- /dev/null +++ b/src/main/java/forge/deck/generate/GenerateMonoColorDeck.java @@ -0,0 +1,99 @@ +/* + * 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.deck.generate; + +import java.util.Arrays; +import java.util.List; + +import forge.card.MagicColor; +import forge.card.ColorSet; +import forge.deck.generate.GenerateDeckUtil.FilterCMC; +import forge.error.BugReporter; +import forge.game.player.PlayerType; +import forge.item.CardPrinted; +import forge.item.ItemPoolView; +import forge.properties.ForgeProps; + +/** + *

+ * Generate2ColorDeck class. + *

+ * + * @author Forge + * @version $Id: Generate2ColorDeck.java 19765 2013-02-20 03:01:37Z myk $ + */ +public class GenerateMonoColorDeck extends GenerateColoredDeckBase { + @Override protected final float getLandsPercentage() { return 0.39f; } + @Override protected final float getCreatPercentage() { return 0.36f; } + @Override protected final float getSpellPercentage() { return 0.25f; } + + final List cmcLevels = Arrays.asList( + new GenerateDeckUtil.FilterCMC(0, 2), + new GenerateDeckUtil.FilterCMC(3, 4), + new GenerateDeckUtil.FilterCMC(5, 6), + new GenerateDeckUtil.FilterCMC(7, 20)); + final int[] cmcAmounts = {10, 8, 5, 3}; + + // mana curve of the card pool + // 20x 0 - 2 + // 16x 3 - 4 + // 12x 5 - 6 + // 4x 7 - 20 + // = 52x - card pool (before further random filtering) + + /** + *

+ * Constructor for Generate2ColorDeck. + *

+ * + * @param clr1 + * a {@link java.lang.String} object. + * @param clr2 + * a {@link java.lang.String} object. + */ + public GenerateMonoColorDeck(final String clr1) { + + if (clr1.equals("AI")) { + int color1 = r.nextInt(5); + colors = ColorSet.fromMask(MagicColor.WHITE << color1); + } else { + colors = ColorSet.fromNames(clr1); + } + } + + + public final ItemPoolView getDeck(final int size, final PlayerType pt) { + addCreaturesAndSpells(size, cmcLevels, cmcAmounts, pt); + + // Add lands + int numLands = (int) (getLandsPercentage() * size); + + tmpDeck.append("numLands:").append(numLands).append("\n"); + + addBasicLand(numLands); + tmpDeck.append("DeckSize:").append(tDeck.countAll()).append("\n"); + + adjustDeckSize(size); + tmpDeck.append("DeckSize:").append(tDeck.countAll()).append("\n"); + if (ForgeProps.getProperty("showdeck/1color", "false").equals("true")) { + BugReporter.reportBug(tmpDeck.toString()); + } + + return tDeck; + } +} diff --git a/src/main/java/forge/gui/deckeditor/controllers/CDeckgen.java b/src/main/java/forge/gui/deckeditor/controllers/CDeckgen.java index 9ee2a0026de..aa7d0d5228c 100644 --- a/src/main/java/forge/gui/deckeditor/controllers/CDeckgen.java +++ b/src/main/java/forge/gui/deckeditor/controllers/CDeckgen.java @@ -106,15 +106,15 @@ public enum CDeckgen implements ICDoc { switch (colorCount0) { case 2: genConstructed.getMain().addAll( - (new Generate2ColorDeck("AI", "AI")).get2ColorDeck(60, PlayerType.HUMAN)); + (new Generate2ColorDeck("AI", "AI")).getDeck(60, PlayerType.HUMAN)); break; case 3: genConstructed.getMain().addAll( - (new Generate3ColorDeck("AI", "AI", "AI")).get3ColorDeck(60, PlayerType.HUMAN)); + (new Generate3ColorDeck("AI", "AI", "AI")).getDeck(60, PlayerType.HUMAN)); break; case 5: genConstructed.getMain().addAll( - (new Generate5ColorDeck()).get5ColorDeck(60, PlayerType.HUMAN)); + (new Generate5ColorDeck()).getDeck(60, PlayerType.HUMAN)); break; default: } diff --git a/src/test/java/forge/deck/generate/Generate2ColorDeckTest.java b/src/test/java/forge/deck/generate/Generate2ColorDeckTest.java index 713faff083c..47e5a873bf6 100644 --- a/src/test/java/forge/deck/generate/Generate2ColorDeckTest.java +++ b/src/test/java/forge/deck/generate/Generate2ColorDeckTest.java @@ -18,7 +18,7 @@ public class Generate2ColorDeckTest { @Test(enabled = false) public void generate2ColorDeckTest1() { final Generate2ColorDeck gen = new Generate2ColorDeck("white", "blue"); - final ItemPoolView cardList = gen.get2ColorDeck(60, null); + final ItemPoolView cardList = gen.getDeck(60, null); Assert.assertNotNull(cardList); } } diff --git a/src/test/java/forge/deck/generate/Generate3ColorDeckTest.java b/src/test/java/forge/deck/generate/Generate3ColorDeckTest.java index 7d33f05b731..77c70046b1e 100644 --- a/src/test/java/forge/deck/generate/Generate3ColorDeckTest.java +++ b/src/test/java/forge/deck/generate/Generate3ColorDeckTest.java @@ -18,7 +18,7 @@ public class Generate3ColorDeckTest { @Test(timeOut = 1000, enabled = false) public void generate3ColorDeckTest1() { final Generate3ColorDeck gen = new Generate3ColorDeck("white", "blue", "black"); - final ItemPoolView cardList = gen.get3ColorDeck(60, null); + final ItemPoolView cardList = gen.getDeck(60, null); Assert.assertNotNull(cardList); } } diff --git a/src/test/java/forge/deck/generate/Generate5ColorDeckTest.java b/src/test/java/forge/deck/generate/Generate5ColorDeckTest.java index 1e2a0708225..65179d3cd36 100644 --- a/src/test/java/forge/deck/generate/Generate5ColorDeckTest.java +++ b/src/test/java/forge/deck/generate/Generate5ColorDeckTest.java @@ -18,7 +18,7 @@ public class Generate5ColorDeckTest { @Test(timeOut = 1000, enabled = false) public void generate5ColorDeckTest1() { final Generate5ColorDeck gen = new Generate5ColorDeck(); - final ItemPoolView cardList = gen.get5ColorDeck(60, null); + final ItemPoolView cardList = gen.getDeck(60, null); Assert.assertNotNull(cardList); } }