checkstyle

This commit is contained in:
jendave
2011-10-26 20:19:27 +00:00
parent 071f3fe598
commit 7a82ed9232
13 changed files with 984 additions and 536 deletions

View File

@@ -1,5 +1,7 @@
package forge.deck; package forge.deck;
import java.io.Serializable;
import forge.PlayerType; import forge.PlayerType;
import forge.game.GameType; import forge.game.GameType;
import forge.item.CardDb; import forge.item.CardDb;
@@ -7,15 +9,16 @@ import forge.item.CardPrinted;
import forge.item.ItemPool; import forge.item.ItemPool;
import forge.item.ItemPoolView; import forge.item.ItemPoolView;
import java.io.Serializable;
/** /**
* <p>Deck class.</p> * <p>
* Deck class.
* </p>
*
* The set of MTG legal cards that become player's library when the game starts.
* Any other data is not part of a deck and should be stored elsewhere. Current
* fields allowed for deck metadata are Name, Title, Description, Difficulty,
* Icon, Deck Type.
* *
* The set of MTG legal cards that become player's library when the game starts.
* Any other data is not part of a deck and should be stored elsewhere.
* Current fields allowed for deck metadata are Name, Title, Description, Difficulty, Icon, Deck Type.
*
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
@@ -25,22 +28,23 @@ public final class Deck implements Comparable<Deck>, Serializable {
*/ */
private static final long serialVersionUID = -7478025567887481994L; private static final long serialVersionUID = -7478025567887481994L;
//gameType is from Constant.GameType, like GameType.Regular // gameType is from Constant.GameType, like GameType.Regular
private String name; private String name;
private GameType deckType; private GameType deckType;
private String comment = null; private String comment = null;
private PlayerType playerType = null; private PlayerType playerType = null;
private boolean customPool = false; private boolean customPool = false;
private ItemPool<CardPrinted> main; private ItemPool<CardPrinted> main;
private ItemPool<CardPrinted> sideboard; private ItemPool<CardPrinted> sideboard;
// gameType is from Constant.GameType, like GameType.Regular
//gameType is from Constant.GameType, like GameType.Regular
/** /**
* <p>Constructor for Deck.</p> * <p>
* Constructor for Deck.
* </p>
*/ */
public Deck() { public Deck() {
main = new ItemPool<CardPrinted>(CardPrinted.class); main = new ItemPool<CardPrinted>(CardPrinted.class);
@@ -48,9 +52,12 @@ public final class Deck implements Comparable<Deck>, Serializable {
} }
/** /**
* <p>Constructor for Deck.</p> * <p>
* * Constructor for Deck.
* @param type a {@link java.lang.String} object. * </p>
*
* @param type
* a {@link java.lang.String} object.
*/ */
public Deck(final GameType type) { public Deck(final GameType type) {
this(); this();
@@ -58,8 +65,10 @@ public final class Deck implements Comparable<Deck>, Serializable {
} }
/** /**
* <p>Getter for the field <code>main</code>.</p> * <p>
* * Getter for the field <code>main</code>.
* </p>
*
* @return a {@link java.util.List} object. * @return a {@link java.util.List} object.
*/ */
public ItemPoolView<CardPrinted> getMain() { public ItemPoolView<CardPrinted> getMain() {
@@ -67,8 +76,10 @@ public final class Deck implements Comparable<Deck>, Serializable {
} }
/** /**
* <p>Getter for the field <code>sideboard</code>.</p> * <p>
* * Getter for the field <code>sideboard</code>.
* </p>
*
* @return a {@link java.util.List} object. * @return a {@link java.util.List} object.
*/ */
public ItemPoolView<CardPrinted> getSideboard() { public ItemPoolView<CardPrinted> getSideboard() {
@@ -76,41 +87,50 @@ public final class Deck implements Comparable<Deck>, Serializable {
} }
/** /**
* <p>getDeckType.</p> * <p>
* * getDeckType.
* </p>
*
* @return a {@link java.lang.String} object. * @return a {@link java.lang.String} object.
*/ */
public GameType getDeckType() { public GameType getDeckType() {
return deckType; return deckType;
} }
//can only call this method ONCE // can only call this method ONCE
/** /**
* <p>setDeckType.</p> * <p>
* * setDeckType.
* @param deckType a {@link java.lang.String} object. * </p>
*
* @param deckType
* a {@link java.lang.String} object.
*/ */
void setDeckType(GameType deckType) { void setDeckType(final GameType deckType) {
if (this.getDeckType() != null) { if (this.getDeckType() != null) {
throw new IllegalStateException( throw new IllegalStateException("Deck : setDeckType() error, deck type has already been set");
"Deck : setDeckType() error, deck type has already been set");
} }
this.deckType = deckType; this.deckType = deckType;
} }
/** /**
* <p>setName.</p> * <p>
* * setName.
* @param s a {@link java.lang.String} object. * </p>
*
* @param s
* a {@link java.lang.String} object.
*/ */
public void setName(String s) { public void setName(final String s) {
name = s; name = s;
} }
/** /**
* <p>getName.</p> * <p>
* * getName.
* </p>
*
* @return a {@link java.lang.String} object. * @return a {@link java.lang.String} object.
*/ */
public String getName() { public String getName() {
@@ -118,17 +138,22 @@ public final class Deck implements Comparable<Deck>, Serializable {
} }
/** /**
* <p>setComment.</p> * <p>
* * setComment.
* @param comment a {@link java.lang.String} object. * </p>
*
* @param comment
* a {@link java.lang.String} object.
*/ */
public void setComment(String comment) { public void setComment(final String comment) {
this.comment = comment; this.comment = comment;
} }
/** /**
* <p>getComment.</p> * <p>
* * getComment.
* </p>
*
* @return a {@link java.lang.String} object. * @return a {@link java.lang.String} object.
*/ */
public String getComment() { public String getComment() {
@@ -136,33 +161,149 @@ public final class Deck implements Comparable<Deck>, Serializable {
} }
/** /**
* <p>addMain.</p> * <p>
* * addMain.
* @param cardName a {@link java.lang.String} object. * </p>
*
* @param cardName
* a {@link java.lang.String} object.
*/ */
public void addMain(final String cardName) { addMain(CardDb.instance().getCard(cardName)); } public void addMain(final String cardName) {
public void addMain(final CardPrinted card) { main.add(card); } addMain(CardDb.instance().getCard(cardName));
public void addMain(final CardPrinted card, final int amount) { main.add(card, amount); } }
public void addMain(final ItemPoolView<CardPrinted> list) { main.addAll(list); }
public void setMain(final Iterable<String> cards) { main = new ItemPool<CardPrinted>(cards, CardPrinted.class); }
public void removeMain(final CardPrinted card) { main.remove(card); }
public void removeMain(final CardPrinted card, final int amount) { main.remove(card, amount); }
public int countMain() { return main.countAll(); }
/** /**
* <p>addSideboard.</p> * Adds the main.
* *
* @param cardName a {@link java.lang.String} object. * @param card
* the card
*/ */
public final void addSideboard(final String cardName) { addSideboard(CardDb.instance().getCard(cardName)); } public void addMain(final CardPrinted card) {
public final void addSideboard(final CardPrinted card) { sideboard.add(card); } main.add(card);
public final void addSideboard(final CardPrinted card, final int amount) { sideboard.add(card, amount); } }
public final void addSideboard(final ItemPoolView<CardPrinted> cards) { sideboard.addAll(cards); }
public final void setSideboard(final Iterable<String> cards) { sideboard = new ItemPool<CardPrinted>(cards, CardPrinted.class); }
/** /**
* <p>countSideboard.</p> * Adds the main.
* *
* @param card
* the card
* @param amount
* the amount
*/
public void addMain(final CardPrinted card, final int amount) {
main.add(card, amount);
}
/**
* Adds the main.
*
* @param list
* the list
*/
public void addMain(final ItemPoolView<CardPrinted> list) {
main.addAll(list);
}
/**
* Sets the main.
*
* @param cards
* the new main
*/
public void setMain(final Iterable<String> cards) {
main = new ItemPool<CardPrinted>(cards, CardPrinted.class);
}
/**
* Removes the main.
*
* @param card
* the card
*/
public void removeMain(final CardPrinted card) {
main.remove(card);
}
/**
* Removes the main.
*
* @param card
* the card
* @param amount
* the amount
*/
public void removeMain(final CardPrinted card, final int amount) {
main.remove(card, amount);
}
/**
* Count main.
*
* @return the int
*/
public int countMain() {
return main.countAll();
}
/**
* <p>
* addSideboard.
* </p>
*
* @param cardName
* a {@link java.lang.String} object.
*/
public void addSideboard(final String cardName) {
addSideboard(CardDb.instance().getCard(cardName));
}
/**
* Adds the sideboard.
*
* @param card
* the card
*/
public void addSideboard(final CardPrinted card) {
sideboard.add(card);
}
/**
* Adds the sideboard.
*
* @param card
* the card
* @param amount
* the amount
*/
public void addSideboard(final CardPrinted card, final int amount) {
sideboard.add(card, amount);
}
/**
* Adds the sideboard.
*
* @param cards
* the cards
*/
public void addSideboard(final ItemPoolView<CardPrinted> cards) {
sideboard.addAll(cards);
}
/**
* Sets the sideboard.
*
* @param cards
* the new sideboard
*/
public void setSideboard(final Iterable<String> cards) {
sideboard = new ItemPool<CardPrinted>(cards, CardPrinted.class);
}
/**
* <p>
* countSideboard.
* </p>
*
* @return a int. * @return a int.
*/ */
public int countSideboard() { public int countSideboard() {
@@ -170,18 +311,23 @@ public final class Deck implements Comparable<Deck>, Serializable {
} }
/** /**
* <p>removeSideboard.</p> * <p>
* removeSideboard.
* </p>
*
* @param card
* the card
* *
* @param index a int.
* @return a {@link java.lang.String} object.
*/ */
public void removeFromSideboard(CardPrinted card) { public void removeFromSideboard(final CardPrinted card) {
sideboard.remove(card); sideboard.remove(card);
} }
/** /**
* <p>isDraft.</p> * <p>
* * isDraft.
* </p>
*
* @return a boolean. * @return a boolean.
*/ */
public boolean isDraft() { public boolean isDraft() {
@@ -189,8 +335,10 @@ public final class Deck implements Comparable<Deck>, Serializable {
} }
/** /**
* <p>isSealed.</p> * <p>
* * isSealed.
* </p>
*
* @return a boolean. * @return a boolean.
*/ */
public boolean isSealed() { public boolean isSealed() {
@@ -198,8 +346,10 @@ public final class Deck implements Comparable<Deck>, Serializable {
} }
/** /**
* <p>isRegular.</p> * <p>
* * isRegular.
* </p>
*
* @return a boolean. * @return a boolean.
*/ */
public boolean isRegular() { public boolean isRegular() {
@@ -207,8 +357,10 @@ public final class Deck implements Comparable<Deck>, Serializable {
} }
/** /**
* <p>hashCode.</p> * <p>
* * hashCode.
* </p>
*
* @return a int. * @return a int.
*/ */
public int hashCode() { public int hashCode() {
@@ -222,17 +374,20 @@ public final class Deck implements Comparable<Deck>, Serializable {
} }
/** /**
* <p>compareTo.</p> * <p>
* * compareTo.
* @param d a {@link forge.deck.Deck} object. * </p>
*
* @param d
* a {@link forge.deck.Deck} object.
* @return a int. * @return a int.
*/ */
public int compareTo(Deck d) { public int compareTo(final Deck d) {
return getName().compareTo(d.getName()); return getName().compareTo(d.getName());
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
public boolean equals(Object o) { public boolean equals(final Object o) {
if (o instanceof Deck) { if (o instanceof Deck) {
Deck d = (Deck) o; Deck d = (Deck) o;
return getName().equals(d.getName()); return getName().equals(d.getName());
@@ -240,28 +395,56 @@ public final class Deck implements Comparable<Deck>, Serializable {
return false; return false;
} }
/**
* Clear sideboard.
*/
public void clearSideboard() { public void clearSideboard() {
sideboard.clear(); sideboard.clear();
} }
/**
* Clear main.
*/
public void clearMain() { public void clearMain() {
main.clear(); main.clear();
} }
public final PlayerType getPlayerType() { /**
* Gets the player type.
*
* @return the player type
*/
public PlayerType getPlayerType() {
return playerType; return playerType;
} }
public final void setPlayerType(PlayerType recommendedPlayer0) { /**
* Sets the player type.
*
* @param recommendedPlayer0
* the new player type
*/
public void setPlayerType(final PlayerType recommendedPlayer0) {
this.playerType = recommendedPlayer0; this.playerType = recommendedPlayer0;
} }
/**
* Checks if is custom pool.
*
* @return true, if is custom pool
*/
public boolean isCustomPool() { public boolean isCustomPool() {
return customPool; return customPool;
} }
public void setCustomPool(boolean cp) { /**
* Sets the custom pool.
*
* @param cp
* the new custom pool
*/
public void setCustomPool(final boolean cp) {
customPool = cp; customPool = cp;
} }
} }

View File

@@ -16,18 +16,20 @@ import forge.deck.generate.GenerateThemeDeck;
import forge.game.GameType; import forge.game.GameType;
import forge.gui.GuiUtils; import forge.gui.GuiUtils;
/** /**
* Utility class to hold add deck generation routines, methods moved from OldGuiNewGame. * Utility class to hold add deck generation routines, methods moved from
* * OldGuiNewGame.
*
*/ */
public abstract class DeckGeneration { public abstract class DeckGeneration {
/** /**
* <p> * <p>
* genDecks. * genDecks.
* </p> * </p>
* *
* @param playerType * @param playerType
* {@link java.lang.String} object. * the player type {@link java.lang.String} object.
*/ */
public static void genDecks(final PlayerType playerType) { public static void genDecks(final PlayerType playerType) {
// TODO jendave to refactor deck generation // TODO jendave to refactor deck generation
@@ -45,7 +47,6 @@ public abstract class DeckGeneration {
String playerName = playerType.equals(PlayerType.HUMAN) ? "Human" : "Computer"; String playerName = playerType.equals(PlayerType.HUMAN) ? "Human" : "Computer";
String prompt = String.format("Generate %s Deck", playerName); String prompt = String.format("Generate %s Deck", playerName);
Object o = GuiUtils.getChoice(prompt, decks.toArray()); Object o = GuiUtils.getChoice(prompt, decks.toArray());
if (o.toString().equals(decks.get(0))) { if (o.toString().equals(decks.get(0))) {
@@ -75,7 +76,7 @@ public abstract class DeckGeneration {
* <p> * <p>
* generateConstructedDeck. * generateConstructedDeck.
* </p> * </p>
* *
* @return a {@link forge.deck.Deck} object. * @return a {@link forge.deck.Deck} object.
*/ */
private static Deck generateConstructedDeck() { private static Deck generateConstructedDeck() {
@@ -93,7 +94,7 @@ public abstract class DeckGeneration {
* <p> * <p>
* generateConstructed3ColorDeck. * generateConstructed3ColorDeck.
* </p> * </p>
* *
* @return a {@link forge.deck.Deck} object. * @return a {@link forge.deck.Deck} object.
*/ */
private static Deck generateConstructed3ColorDeck() { private static Deck generateConstructed3ColorDeck() {
@@ -111,7 +112,7 @@ public abstract class DeckGeneration {
* <p> * <p>
* generateConstructed5ColorDeck. * generateConstructed5ColorDeck.
* </p> * </p>
* *
* @return a {@link forge.deck.Deck} object. * @return a {@link forge.deck.Deck} object.
*/ */
private static Deck generateConstructed5ColorDeck() { private static Deck generateConstructed5ColorDeck() {
@@ -129,7 +130,7 @@ public abstract class DeckGeneration {
* <p> * <p>
* generateConstructedThemeDeck. * generateConstructedThemeDeck.
* </p> * </p>
* *
* @return a {@link forge.deck.Deck} object. * @return a {@link forge.deck.Deck} object.
*/ */
private static Deck generateConstructedThemeDeck() { private static Deck generateConstructedThemeDeck() {
@@ -160,7 +161,7 @@ public abstract class DeckGeneration {
* <p> * <p>
* generate2ColorDeck. * generate2ColorDeck.
* </p> * </p>
* *
* @param p * @param p
* a {@link java.lang.String} object. * a {@link java.lang.String} object.
* @return a {@link forge.deck.Deck} object. * @return a {@link forge.deck.Deck} object.
@@ -215,7 +216,7 @@ public abstract class DeckGeneration {
* <p> * <p>
* generate3ColorDeck. * generate3ColorDeck.
* </p> * </p>
* *
* @param p * @param p
* a {@link java.lang.String} object. * a {@link java.lang.String} object.
* @return a {@link forge.deck.Deck} object. * @return a {@link forge.deck.Deck} object.
@@ -281,22 +282,21 @@ public abstract class DeckGeneration {
* <p> * <p>
* generate5ColorDeck. * generate5ColorDeck.
* </p> * </p>
* *
* @param p * @param p
* a {@link java.lang.String} object. * a {@link java.lang.String} object.
* @return a {@link forge.deck.Deck} object. * @return a {@link forge.deck.Deck} object.
*/ */
private static Deck generate5ColorDeck(final PlayerType p) { private static Deck generate5ColorDeck(final PlayerType p) {
//Random r = MyRandom.random; // Random r = MyRandom.random;
//ArrayList<String> colors = new ArrayList<String>();
//colors.add("Random");
//colors.add("white");
//colors.add("blue");
//colors.add("black");
//colors.add("red");
//colors.add("green");
// ArrayList<String> colors = new ArrayList<String>();
// colors.add("Random");
// colors.add("white");
// colors.add("blue");
// colors.add("black");
// colors.add("red");
// colors.add("green");
Generate5ColorDeck gen = new Generate5ColorDeck("white", "blue", "black", "red", "green"); Generate5ColorDeck gen = new Generate5ColorDeck("white", "blue", "black", "red", "green");
CardList d = gen.get5ColorDeck(60, p); CardList d = gen.get5ColorDeck(60, p);

View File

@@ -26,11 +26,6 @@ import javax.swing.filechooser.FileFilter;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import freemarker.template.TemplateException;
import freemarker.template.Template;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import forge.Card; import forge.Card;
import forge.FileUtil; import forge.FileUtil;
import forge.PlayerType; import forge.PlayerType;
@@ -41,6 +36,10 @@ import forge.item.CardPrinted;
import forge.item.ItemPoolView; import forge.item.ItemPoolView;
import forge.properties.ForgeProps; import forge.properties.ForgeProps;
import forge.properties.NewConstants; import forge.properties.NewConstants;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
//reads and writeDeck Deck objects //reads and writeDeck Deck objects
/** /**
@@ -66,9 +65,7 @@ public class DeckManager {
} }
}; };
/** /** The Constant DCK_FILTER. */
*
*/
public static final FileFilter DCK_FILTER = new FileFilter() { public static final FileFilter DCK_FILTER = new FileFilter() {
@Override @Override
public boolean accept(final File f) { public boolean accept(final File f) {
@@ -81,9 +78,7 @@ public class DeckManager {
} }
}; };
/** /** The Constant HTML_FILTER. */
*
*/
public static final FileFilter HTML_FILTER = new FileFilter() { public static final FileFilter HTML_FILTER = new FileFilter() {
@Override @Override
public boolean accept(final File f) { public boolean accept(final File f) {
@@ -265,8 +260,7 @@ public class DeckManager {
*/ */
private void checkDraftDeck(final Deck[] deck) { private void checkDraftDeck(final Deck[] deck) {
if (deck == null || deck.length != 8 || deck[0].getName().equals("") if (deck == null || deck.length != 8 || deck[0].getName().equals("")
|| (!deck[0].getDeckType().equals(GameType.Draft))) || (!deck[0].getDeckType().equals(GameType.Draft))) {
{
throw new RuntimeException("DeckManager : checkDraftDeck() error, invalid deck"); throw new RuntimeException("DeckManager : checkDraftDeck() error, invalid deck");
} }
} }
@@ -641,37 +635,45 @@ public class DeckManager {
int height = 319; int height = 319;
int width = 222; int width = 222;
/* Create and adjust the configuration */ /* Create and adjust the configuration */
Configuration cfg = new Configuration(); Configuration cfg = new Configuration();
try { try {
cfg.setClassForTemplateLoading(d.getClass(), "/"); cfg.setClassForTemplateLoading(d.getClass(), "/");
cfg.setObjectWrapper(new DefaultObjectWrapper()); cfg.setObjectWrapper(new DefaultObjectWrapper());
/* ------------------------------------------------------------------- */ /*
/* You usually do these for many times in the application life-cycle: */ * ------------------------------------------------------------------
* -
*/
/*
* You usually do these for many times in the application
* life-cycle:
*/
/* Get or create a template */ /* Get or create a template */
temp = cfg.getTemplate("proxy-template.ftl"); temp = cfg.getTemplate("proxy-template.ftl");
/* Create a data-model */ /* Create a data-model */
Map<String, Object> root = new HashMap<String, Object>(); Map<String, Object> root = new HashMap<String, Object>();
root.put("title", d.getName()); root.put("title", d.getName());
List<String> list = new ArrayList<String>(); List<String> list = new ArrayList<String>();
for (Card card : d.getMain().toForgeCardList().toArray()) { for (Card card : d.getMain().toForgeCardList().toArray()) {
//System.out.println(card.getSets().get(card.getSets().size() - 1).URL); // System.out.println(card.getSets().get(card.getSets().size() -
// 1).URL);
list.add(card.getSets().get(card.getSets().size() - 1).URL); list.add(card.getSets().get(card.getSets().size() - 1).URL);
} }
/* List<String> nameList = new ArrayList<String>(); /*
for (Card card : d.getMain().toForgeCardList().toArray()) { * List<String> nameList = new ArrayList<String>(); for (Card card :
//System.out.println(card.getSets().get(card.getSets().size() - 1).URL); * d.getMain().toForgeCardList().toArray()) {
nameList.add(card.getName()); * //System.out.println(card.getSets().get(card.getSets().size() -
}*/ * 1).URL); nameList.add(card.getName()); }
*/
TreeMap<String, Integer> map = new TreeMap<String, Integer>(); TreeMap<String, Integer> map = new TreeMap<String, Integer>();
for (Entry<CardPrinted, Integer> entry : d.getMain().getOrderedList()) { for (Entry<CardPrinted, Integer> entry : d.getMain().getOrderedList()) {
map.put(entry.getKey().getName(), entry.getValue()); map.put(entry.getKey().getName(), entry.getValue());
//System.out.println(entry.getValue() + " " + entry.getKey().getName()); // System.out.println(entry.getValue() + " " +
// entry.getKey().getName());
} }
root.put("urls", list); root.put("urls", list);
@@ -679,11 +681,11 @@ public class DeckManager {
root.put("height", height); root.put("height", height);
root.put("width", width); root.put("width", width);
root.put("cardlistWidth", width - 11); root.put("cardlistWidth", width - 11);
//root.put("nameList", nameList); // root.put("nameList", nameList);
root.put("cardList", map); root.put("cardList", map);
/* Merge data-model with template */ /* Merge data-model with template */
//StringWriter sw = new StringWriter(); // StringWriter sw = new StringWriter();
temp.process(root, out); temp.process(root, out);
out.flush(); out.flush();
} catch (IOException e) { } catch (IOException e) {
@@ -693,8 +695,8 @@ public class DeckManager {
} }
} }
private static void writeCardPool(final ItemPoolView<CardPrinted> pool, private static void writeCardPool(final ItemPoolView<CardPrinted> pool, final BufferedWriter out)
final BufferedWriter out) throws IOException { throws IOException {
List<Entry<CardPrinted, Integer>> main2sort = pool.getOrderedList(); List<Entry<CardPrinted, Integer>> main2sort = pool.getOrderedList();
Collections.sort(main2sort, TableSorter.byNameThenSet); Collections.sort(main2sort, TableSorter.byNameThenSet);
for (Entry<CardPrinted, Integer> e : main2sort) { for (Entry<CardPrinted, Integer> e : main2sort) {

View File

@@ -4,68 +4,156 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import forge.item.CardDb; import forge.item.CardDb;
import forge.item.CardPrinted; import forge.item.CardPrinted;
/** /**
* <p>DeckRecognizer class.</p> * <p>
* * DeckRecognizer class.
* </p>
*
* @author Forge * @author Forge
* @version $Id: DeckRecognizer.java 10499 2011-09-17 15:08:47Z Max mtg $ * @version $Id: DeckRecognizer.java 10499 2011-09-17 15:08:47Z Max mtg $
* *
*/ */
public class DeckRecognizer { public class DeckRecognizer {
/**
* The Enum TokenType.
*/
public enum TokenType { public enum TokenType {
/** The Known card. */
KnownCard, KnownCard,
/** The Unknown card. */
UnknownCard, UnknownCard,
/** The Section name. */
SectionName, SectionName,
/** The Comment. */
Comment, Comment,
/** The Unknown text. */
UnknownText UnknownText
} }
/**
* The Class Token.
*/
public static class Token { public static class Token {
private final TokenType type; private final TokenType type;
private final CardPrinted card; private final CardPrinted card;
private final int number; private final int number;
private final String text; private final String text;
public static Token knownCard(CardPrinted theCard, int count) { /**
* Known card.
*
* @param theCard
* the the card
* @param count
* the count
* @return the token
*/
public static Token knownCard(final CardPrinted theCard, final int count) {
return new Token(theCard, TokenType.KnownCard, count, null); return new Token(theCard, TokenType.KnownCard, count, null);
} }
public static Token unknownCard(String cardNme, int count) {
/**
* Unknown card.
*
* @param cardNme
* the card nme
* @param count
* the count
* @return the token
*/
public static Token unknownCard(final String cardNme, final int count) {
return new Token(null, TokenType.UnknownCard, count, cardNme); return new Token(null, TokenType.UnknownCard, count, cardNme);
} }
private Token(CardPrinted knownCard, TokenType type1, int count, String message) private Token(final CardPrinted knownCard, final TokenType type1, final int count, final String message) {
{
card = knownCard; card = knownCard;
number = count; number = count;
type = type1; type = type1;
text = message; text = message;
} }
public Token(TokenType type1, int count, String message) /**
{ * Instantiates a new token.
*
* @param type1
* the type1
* @param count
* the count
* @param message
* the message
*/
public Token(final TokenType type1, final int count, final String message) {
this(null, type1, count, message); this(null, type1, count, message);
if (type1 == TokenType.KnownCard || type1 == TokenType.UnknownCard) { if (type1 == TokenType.KnownCard || type1 == TokenType.UnknownCard) {
throw new IllegalArgumentException("Use factory methods for recognized card lines"); throw new IllegalArgumentException("Use factory methods for recognized card lines");
} }
} }
public String getText() { return text; } /**
public CardPrinted getCard() { return card; } * Gets the text.
public TokenType getType() { return type; } *
public int getNumber() { return number; } * @return the text
*/
public final String getText() {
return text;
}
/**
* Gets the card.
*
* @return the card
*/
public final CardPrinted getCard() {
return card;
}
/**
* Gets the type.
*
* @return the type
*/
public final TokenType getType() {
return type;
}
/**
* Gets the number.
*
* @return the number
*/
public final int getNumber() {
return number;
}
} }
// Let's think about it numbers in the back later // Let's think about it numbers in the back later
// private static final Pattern searchNumbersInBack = Pattern.compile("(.*)[^A-Za-wyz]*\\s+([\\d]{1,2})"); // private static final Pattern searchNumbersInBack =
// Pattern.compile("(.*)[^A-Za-wyz]*\\s+([\\d]{1,2})");
private static final Pattern searchNumbersInFront = Pattern.compile("([\\d]{1,2})[^A-Za-wyz]*\\s+(.*)"); private static final Pattern searchNumbersInFront = Pattern.compile("([\\d]{1,2})[^A-Za-wyz]*\\s+(.*)");
public static Token recognizeLine(String raw_line)
{ /**
if (StringUtils.isBlank(raw_line)) { return new Token(TokenType.Comment, 0, raw_line); } * Recognize line.
*
* @param raw_line
* the raw_line
* @return the token
*/
public static Token recognizeLine(final String raw_line) {
if (StringUtils.isBlank(raw_line)) {
return new Token(TokenType.Comment, 0, raw_line);
}
String line = raw_line.trim(); String line = raw_line.trim();
Token result = null; Token result = null;
Matcher foundNumbersInFront = searchNumbersInFront.matcher(line); Matcher foundNumbersInFront = searchNumbersInFront.matcher(line);
// Matcher foundNumbersInBack = searchNumbersInBack.matcher(line); // Matcher foundNumbersInBack = searchNumbersInBack.matcher(line);
@@ -73,53 +161,67 @@ public class DeckRecognizer {
String cardName = foundNumbersInFront.group(2); String cardName = foundNumbersInFront.group(2);
int amount = Integer.parseInt(foundNumbersInFront.group(1)); int amount = Integer.parseInt(foundNumbersInFront.group(1));
result = recognizePossibleNameAndNumber(cardName, amount); result = recognizePossibleNameAndNumber(cardName, amount);
} /* else if (foundNumbersInBack.matches()) { } /*
String cardName = foundNumbersInBack.group(1); * else if (foundNumbersInBack.matches()) { String cardName =
int amount = Integer.parseInt(foundNumbersInBack.group(2)); * foundNumbersInBack.group(1); int amount =
return new Token(cardName, amount); * Integer.parseInt(foundNumbersInBack.group(2)); return new
} */else { * Token(cardName, amount); }
if ( CardDb.instance().isCardSupported(line)) { */
else {
if (CardDb.instance().isCardSupported(line)) {
return Token.knownCard(CardDb.instance().getCard(line), 1); return Token.knownCard(CardDb.instance().getCard(line), 1);
} }
result = recognizeNonCard(line, 1); result = recognizeNonCard(line, 1);
} }
return result != null ? result : new Token(TokenType.UnknownText, 0, line); return result != null ? result : new Token(TokenType.UnknownText, 0, line);
} }
private static Token recognizePossibleNameAndNumber(String name, int n) { private static Token recognizePossibleNameAndNumber(final String name, final int n) {
if ( CardDb.instance().isCardSupported(name)) if (CardDb.instance().isCardSupported(name)) {
return Token.knownCard(CardDb.instance().getCard(name), n); return Token.knownCard(CardDb.instance().getCard(name), n);
}
Token known = recognizeNonCard(name, n); Token known = recognizeNonCard(name, n);
return null == known ? Token.unknownCard(name, n) : known; return null == known ? Token.unknownCard(name, n) : known;
} }
private static Token recognizeNonCard(String text, int n) { private static Token recognizeNonCard(final String text, final int n) {
if (isDecoration(text)) { return new Token(TokenType.Comment, n, text); } if (isDecoration(text)) {
if (isSectionName(text)) { return new Token(TokenType.SectionName, n, text); } return new Token(TokenType.Comment, n, text);
}
if (isSectionName(text)) {
return new Token(TokenType.SectionName, n, text);
}
return null; return null;
} }
private final static String[] knownComments = new String[] {
"land", "lands", "creatures", "creature", "spells", "enchancements", "other spells", "artifacts" };
private final static String[] knownCommentParts = new String[] { "card" };
private static boolean isDecoration(String lineAsIs) { private static final String[] knownComments = new String[] { "land", "lands", "creatures", "creature", "spells",
"enchancements", "other spells", "artifacts" };
private static final String[] knownCommentParts = new String[] { "card" };
private static boolean isDecoration(final String lineAsIs) {
String line = lineAsIs.toLowerCase(); String line = lineAsIs.toLowerCase();
for (String s : knownCommentParts) { for (String s : knownCommentParts) {
if (line.contains(s)) { return true; } if (line.contains(s)) {
return true;
}
} }
for (String s : knownComments) { for (String s : knownComments) {
if (line.equalsIgnoreCase(s)) { return true; } if (line.equalsIgnoreCase(s)) {
return true;
}
} }
return false; return false;
} }
private static boolean isSectionName(String line) { private static boolean isSectionName(final String line) {
if (line.toLowerCase().contains("side")) { return true; } if (line.toLowerCase().contains("side")) {
if (line.toLowerCase().contains("main")) { return true; } return true;
}
if (line.toLowerCase().contains("main")) {
return true;
}
return false; return false;
} }
} }

View File

@@ -1,17 +1,26 @@
package forge.deck.generate; package forge.deck.generate;
import forge.*;
import forge.error.ErrorViewer;
import forge.properties.ForgeProps;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Random; import java.util.Random;
import forge.AllZone;
import forge.Card;
import forge.CardFilter;
import forge.CardList;
import forge.CardListFilter;
import forge.Constant;
import forge.MyRandom;
import forge.PlayerType;
import forge.error.ErrorViewer;
import forge.properties.ForgeProps;
/** /**
* <p>Generate2ColorDeck class.</p> * <p>
* * Generate2ColorDeck class.
* </p>
*
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
@@ -25,12 +34,16 @@ public class Generate2ColorDeck {
private Map<String, Integer> cardCounts = null; private Map<String, Integer> cardCounts = null;
/** /**
* <p>Constructor for Generate2ColorDeck.</p> * <p>
* * Constructor for Generate2ColorDeck.
* @param Clr1 a {@link java.lang.String} object. * </p>
* @param Clr2 a {@link java.lang.String} object. *
* @param Clr1
* a {@link java.lang.String} object.
* @param Clr2
* a {@link java.lang.String} object.
*/ */
public Generate2ColorDeck(String Clr1, String Clr2) { public Generate2ColorDeck(final String Clr1, final String Clr2) {
r = MyRandom.random; r = MyRandom.random;
cardCounts = new HashMap<String, Integer>(); cardCounts = new HashMap<String, Integer>();
@@ -55,8 +68,9 @@ public class Generate2ColorDeck {
// choose second color // choose second color
String c2 = notColors.get(r.nextInt(5)); String c2 = notColors.get(r.nextInt(5));
while (c2.equals(color1)) while (c2.equals(color1)) {
c2 = notColors.get(r.nextInt(5)); c2 = notColors.get(r.nextInt(5));
}
color2 = c2; color2 = c2;
} else { } else {
color1 = Clr1; color1 = Clr1;
@@ -67,7 +81,7 @@ public class Generate2ColorDeck {
notColors.remove(color2); notColors.remove(color2);
dL = GenerateDeckUtil.getDualLandList(clrMap.get(color1) + clrMap.get(color2)); dL = GenerateDeckUtil.getDualLandList(clrMap.get(color1) + clrMap.get(color2));
for (int i = 0; i < dL.size(); i++) { for (int i = 0; i < dL.size(); i++) {
cardCounts.put(dL.get(i), 0); cardCounts.put(dL.get(i), 0);
} }
@@ -75,12 +89,17 @@ public class Generate2ColorDeck {
} }
/** /**
* <p>get2ColorDeck.</p> * <p>
* * get2ColorDeck.
* @param Size a int. * </p>
*
* @param Size
* a int.
* @param pt
* the pt
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public CardList get2ColorDeck(int Size, final PlayerType pt) { public final CardList get2ColorDeck(final int Size, final PlayerType pt) {
int lc = 0; // loop counter to prevent infinite card selection loops int lc = 0; // loop counter to prevent infinite card selection loops
String tmpDeck = ""; String tmpDeck = "";
CardList tDeck = new CardList(); CardList tDeck = new CardList();
@@ -92,9 +111,9 @@ public class Generate2ColorDeck {
// start with all cards // start with all cards
// remove cards that generated decks don't like // remove cards that generated decks don't like
CardList AllCards = CardFilter.filter(AllZone.getCardFactory(), new CardListFilter() { CardList AllCards = CardFilter.filter(AllZone.getCardFactory(), new CardListFilter() {
public boolean addCard(Card c) { public boolean addCard(final Card c) {
if (c.getSVar("RemRandomDeck").equals("True")) { if (c.getSVar("RemRandomDeck").equals("True")) {
return false; return false;
} }
return (!c.getSVar("RemAIDeck").equals("True") || (pt != null && pt.equals(PlayerType.HUMAN))); return (!c.getSVar("RemAIDeck").equals("True") || (pt != null && pt.equals(PlayerType.HUMAN)));
} }
@@ -107,7 +126,7 @@ public class Generate2ColorDeck {
// remove multicolor cards that don't match the colors // remove multicolor cards that don't match the colors
CardListFilter clrF = new CardListFilter() { CardListFilter clrF = new CardListFilter() {
public boolean addCard(Card c) { public boolean addCard(final Card c) {
for (int i = 0; i < notColors.size(); i++) { for (int i = 0; i < notColors.size(); i++) {
if (c.getManaCost().contains(clrMap.get(notColors.get(i)))) { if (c.getManaCost().contains(clrMap.get(notColors.get(i)))) {
return false; return false;
@@ -123,7 +142,7 @@ public class Generate2ColorDeck {
CardList Cr1 = CL1.getType("Creature"); CardList Cr1 = CL1.getType("Creature");
CardList Cr2 = CL2.getType("Creature"); CardList Cr2 = CL2.getType("Creature");
String ISE[] = {"Instant", "Sorcery", "Enchantment", "Planeswalker", "Artifact.nonCreature"}; String[] ISE = { "Instant", "Sorcery", "Enchantment", "Planeswalker", "Artifact.nonCreature" };
CardList Sp1 = CL1.getValidCards(ISE, null, null); CardList Sp1 = CL1.getValidCards(ISE, null, null);
CardList Sp2 = CL2.getValidCards(ISE, null, null); CardList Sp2 = CL2.getValidCards(ISE, null, null);
@@ -132,9 +151,9 @@ public class Generate2ColorDeck {
CardList Sp12 = new CardList(); CardList Sp12 = new CardList();
// used for mana curve in the card pool // used for mana curve in the card pool
final int MinCMC[] = {1}, MaxCMC[] = {2}; final int MinCMC[] = { 1 }, MaxCMC[] = { 2 };
CardListFilter cmcF = new CardListFilter() { CardListFilter cmcF = new CardListFilter() {
public boolean addCard(Card c) { public boolean addCard(final Card c) {
int cCMC = c.getCMC(); int cCMC = c.getCMC();
return (cCMC >= MinCMC[0]) && (cCMC <= MaxCMC[0]); return (cCMC >= MinCMC[0]) && (cCMC <= MaxCMC[0]);
} }
@@ -168,11 +187,12 @@ public class Generate2ColorDeck {
MinCMC[0] += 2; MinCMC[0] += 2;
MaxCMC[0] += 2; MaxCMC[0] += 2;
// resulting mana curve of the card pool // resulting mana curve of the card pool
//16x 1 - 2 // 16x 1 - 2
//12x 3 - 4 // 12x 3 - 4
//8x 5 - 6 // 8x 5 - 6
//4x 7 - 8 // 4x 7 - 8
//=40x - card pool could support up to a 275 card deck (all 4-ofs plus basic lands) // =40x - card pool could support up to a 275 card deck (all 4-ofs
// plus basic lands)
} }
// shuffle card pools // shuffle card pools
@@ -230,7 +250,8 @@ public class Generate2ColorDeck {
if (LandsPercentage > 0) { if (LandsPercentage > 0) {
p = (float) ((float) LandsPercentage * .01); p = (float) ((float) LandsPercentage * .01);
numLands = (int) (p * (float) Size); numLands = (int) (p * (float) Size);
} else { // otherwise, just fill in the rest of the deck with basic lands } else { // otherwise, just fill in the rest of the deck with basic
// lands
numLands = Size - tDeck.size(); numLands = Size - tDeck.size();
} }
@@ -257,16 +278,14 @@ public class Generate2ColorDeck {
numLands -= nDLands; numLands -= nDLands;
if (numLands > 0) // attempt to optimize basic land counts according to color representation if (numLands > 0) // attempt to optimize basic land counts according to
// color representation
{ {
CCnt ClrCnts[] = {new CCnt("Plains", 0), CCnt[] ClrCnts = { new CCnt("Plains", 0), new CCnt("Island", 0), new CCnt("Swamp", 0),
new CCnt("Island", 0), new CCnt("Mountain", 0), new CCnt("Forest", 0) };
new CCnt("Swamp", 0),
new CCnt("Mountain", 0),
new CCnt("Forest", 0)};
// count each card color using mana costs // count each card color using mana costs
// TODO: count hybrid mana differently? // TODO count hybrid mana differently?
for (int i = 0; i < tDeck.size(); i++) { for (int i = 0; i < tDeck.size(); i++) {
String mc = tDeck.get(i).getManaCost(); String mc = tDeck.get(i).getManaCost();
@@ -276,17 +295,13 @@ public class Generate2ColorDeck {
if (c == 'W') { if (c == 'W') {
ClrCnts[0].Count++; ClrCnts[0].Count++;
} } else if (c == 'U') {
else if (c == 'U') {
ClrCnts[1].Count++; ClrCnts[1].Count++;
} } else if (c == 'B') {
else if (c == 'B') {
ClrCnts[2].Count++; ClrCnts[2].Count++;
} } else if (c == 'R') {
else if (c == 'R') {
ClrCnts[3].Count++; ClrCnts[3].Count++;
} } else if (c == 'G') {
else if (c == 'G') {
ClrCnts[4].Count++; ClrCnts[4].Count++;
} }
} }
@@ -302,12 +317,14 @@ public class Generate2ColorDeck {
tmpDeck += "totalColor:" + totalColor + "\n"; tmpDeck += "totalColor:" + totalColor + "\n";
for (int i = 0; i < 5; i++) { for (int i = 0; i < 5; i++) {
if (ClrCnts[i].Count > 0) { // calculate number of lands for each color if (ClrCnts[i].Count > 0) { // calculate number of lands for
// each color
p = (float) ClrCnts[i].Count / (float) totalColor; p = (float) ClrCnts[i].Count / (float) totalColor;
int nLand = (int) ((float) numLands * p); int nLand = (int) ((float) numLands * p);
tmpDeck += "nLand-" + ClrCnts[i].Color + ":" + nLand + "\n"; tmpDeck += "nLand-" + ClrCnts[i].Color + ":" + nLand + "\n";
// just to prevent a null exception by the deck size fixing code // just to prevent a null exception by the deck size fixing
// code
cardCounts.put(ClrCnts[i].Color, nLand); cardCounts.put(ClrCnts[i].Color, nLand);
for (int j = 0; j <= nLand; j++) { for (int j = 0; j <= nLand; j++) {
@@ -345,7 +362,7 @@ public class Generate2ColorDeck {
for (int i = 0; i < diff; i++) { for (int i = 0; i < diff; i++) {
Card c = tDeck.get(r.nextInt(tDeck.size())); Card c = tDeck.get(r.nextInt(tDeck.size()));
while (c.isBasicLand()) { // don't remove basic lands while (c.isBasicLand()) { // don't remove basic lands
c = tDeck.get(r.nextInt(tDeck.size())); c = tDeck.get(r.nextInt(tDeck.size()));
} }
@@ -366,7 +383,7 @@ public class Generate2ColorDeck {
public String Color; public String Color;
public int Count; public int Count;
public CCnt(String clr, int cnt) { public CCnt(final String clr, final int cnt) {
Color = clr; Color = clr;
Count = cnt; Count = cnt;
} }

View File

@@ -1,17 +1,26 @@
package forge.deck.generate; package forge.deck.generate;
import forge.*;
import forge.error.ErrorViewer;
import forge.properties.ForgeProps;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Random; import java.util.Random;
import forge.AllZone;
import forge.Card;
import forge.CardFilter;
import forge.CardList;
import forge.CardListFilter;
import forge.Constant;
import forge.MyRandom;
import forge.PlayerType;
import forge.error.ErrorViewer;
import forge.properties.ForgeProps;
/** /**
* <p>Generate3ColorDeck class.</p> * <p>
* * Generate3ColorDeck class.
* </p>
*
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
@@ -26,13 +35,18 @@ public class Generate3ColorDeck {
private Map<String, Integer> cardCounts = null; private Map<String, Integer> cardCounts = null;
/** /**
* <p>Constructor for Generate3ColorDeck.</p> * <p>
* * Constructor for Generate3ColorDeck.
* @param Clr1 a {@link java.lang.String} object. * </p>
* @param Clr2 a {@link java.lang.String} object. *
* @param Clr3 a {@link java.lang.String} object. * @param Clr1
* a {@link java.lang.String} object.
* @param Clr2
* a {@link java.lang.String} object.
* @param Clr3
* a {@link java.lang.String} object.
*/ */
public Generate3ColorDeck(String Clr1, String Clr2, String Clr3) { public Generate3ColorDeck(final String Clr1, final String Clr2, final String Clr3) {
r = MyRandom.random; r = MyRandom.random;
cardCounts = new HashMap<String, Integer>(); cardCounts = new HashMap<String, Integer>();
@@ -57,13 +71,15 @@ public class Generate3ColorDeck {
// choose second color // choose second color
String c2 = notColors.get(r.nextInt(5)); String c2 = notColors.get(r.nextInt(5));
while (c2.equals(color1)) while (c2.equals(color1)) {
c2 = notColors.get(r.nextInt(5)); c2 = notColors.get(r.nextInt(5));
}
color2 = c2; color2 = c2;
String c3 = notColors.get(r.nextInt(5)); String c3 = notColors.get(r.nextInt(5));
while (c3.equals(color1) || c3.equals(color2)) while (c3.equals(color1) || c3.equals(color2)) {
c3 = notColors.get(r.nextInt(5)); c3 = notColors.get(r.nextInt(5));
}
color3 = c3; color3 = c3;
} else { } else {
color1 = Clr1; color1 = Clr1;
@@ -76,7 +92,7 @@ public class Generate3ColorDeck {
notColors.remove(color3); notColors.remove(color3);
dL = GenerateDeckUtil.getDualLandList(crMap.get(color1) + crMap.get(color2) + crMap.get(color3)); dL = GenerateDeckUtil.getDualLandList(crMap.get(color1) + crMap.get(color2) + crMap.get(color3));
for (int i = 0; i < dL.size(); i++) { for (int i = 0; i < dL.size(); i++) {
cardCounts.put(dL.get(i), 0); cardCounts.put(dL.get(i), 0);
} }
@@ -84,12 +100,17 @@ public class Generate3ColorDeck {
} }
/** /**
* <p>get3ColorDeck.</p> * <p>
* * get3ColorDeck.
* @param Size a int. * </p>
*
* @param Size
* a int.
* @param pt
* the pt
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public CardList get3ColorDeck(int Size, final PlayerType pt) { public final CardList get3ColorDeck(final int Size, final PlayerType pt) {
int lc = 0; // loop counter to prevent infinite card selection loops int lc = 0; // loop counter to prevent infinite card selection loops
String tmpDeck = ""; String tmpDeck = "";
CardList tDeck = new CardList(); CardList tDeck = new CardList();
@@ -101,11 +122,11 @@ public class Generate3ColorDeck {
// start with all cards // start with all cards
// remove cards that generated decks don't like // remove cards that generated decks don't like
CardList AllCards = CardFilter.filter(AllZone.getCardFactory(), new CardListFilter() { CardList AllCards = CardFilter.filter(AllZone.getCardFactory(), new CardListFilter() {
public boolean addCard(Card c) { public boolean addCard(final Card c) {
if (c.getSVar("RemRandomDeck").equals("True")) { if (c.getSVar("RemRandomDeck").equals("True")) {
return false; return false;
} }
return (!c.getSVar("RemAIDeck").equals("True") || (pt != null && pt.equals(PlayerType.HUMAN))); return (!c.getSVar("RemAIDeck").equals("True") || (pt != null && pt.equals(PlayerType.HUMAN)));
} }
}); });
@@ -117,10 +138,11 @@ public class Generate3ColorDeck {
// remove multicolor cards that don't match the colors // remove multicolor cards that don't match the colors
CardListFilter clrF = new CardListFilter() { CardListFilter clrF = new CardListFilter() {
public boolean addCard(Card c) { public boolean addCard(final Card c) {
for (int i = 0; i < notColors.size(); i++) { for (int i = 0; i < notColors.size(); i++) {
if (c.getManaCost().contains(crMap.get(notColors.get(i)))) if (c.getManaCost().contains(crMap.get(notColors.get(i)))) {
return false; return false;
}
} }
return true; return true;
} }
@@ -134,7 +156,7 @@ public class Generate3ColorDeck {
CardList Cr2 = CL2.getType("Creature"); CardList Cr2 = CL2.getType("Creature");
CardList Cr3 = CL3.getType("Creature"); CardList Cr3 = CL3.getType("Creature");
String ISE[] = {"Instant", "Sorcery", "Enchantment", "Planeswalker", "Artifact.nonCreature"}; String[] ISE = { "Instant", "Sorcery", "Enchantment", "Planeswalker", "Artifact.nonCreature" };
CardList Sp1 = CL1.getValidCards(ISE, null, null); CardList Sp1 = CL1.getValidCards(ISE, null, null);
CardList Sp2 = CL2.getValidCards(ISE, null, null); CardList Sp2 = CL2.getValidCards(ISE, null, null);
CardList Sp3 = CL3.getValidCards(ISE, null, null); CardList Sp3 = CL3.getValidCards(ISE, null, null);
@@ -144,9 +166,9 @@ public class Generate3ColorDeck {
CardList Sp123 = new CardList(); CardList Sp123 = new CardList();
// used for mana curve in the card pool // used for mana curve in the card pool
final int MinCMC[] = {1}, MaxCMC[] = {3}; final int MinCMC[] = { 1 }, MaxCMC[] = { 3 };
CardListFilter cmcF = new CardListFilter() { CardListFilter cmcF = new CardListFilter() {
public boolean addCard(Card c) { public boolean addCard(final Card c) {
int cCMC = c.getCMC(); int cCMC = c.getCMC();
return (cCMC >= MinCMC[0]) && (cCMC <= MaxCMC[0]); return (cCMC >= MinCMC[0]) && (cCMC <= MaxCMC[0]);
} }
@@ -191,10 +213,11 @@ public class Generate3ColorDeck {
MinCMC[0] += 2; MinCMC[0] += 2;
MaxCMC[0] += 2; MaxCMC[0] += 2;
// resulting mana curve of the card pool // resulting mana curve of the card pool
//18x 1 - 3 // 18x 1 - 3
//12x 3 - 5 // 12x 3 - 5
//6x 5 - 7 // 6x 5 - 7
//=36x - card pool could support up to a 257 card deck (all 4-ofs plus basic lands) // =36x - card pool could support up to a 257 card deck (all 4-ofs
// plus basic lands)
} }
// shuffle card pools // shuffle card pools
@@ -219,8 +242,9 @@ public class Generate3ColorDeck {
c = Cr123.get(r.nextInt(Cr123.size())); c = Cr123.get(r.nextInt(Cr123.size()));
lc++; lc++;
} }
if (lc > 100) if (lc > 100) {
throw new RuntimeException("Generate3ColorDeck : get3ColorDeck -- looped too much -- Cr123"); throw new RuntimeException("Generate3ColorDeck : get3ColorDeck -- looped too much -- Cr123");
}
tDeck.add(AllZone.getCardFactory().getCard(c.getName(), AllZone.getComputerPlayer())); tDeck.add(AllZone.getCardFactory().getCard(c.getName(), AllZone.getComputerPlayer()));
int n = cardCounts.get(c.getName()); int n = cardCounts.get(c.getName());
@@ -236,8 +260,9 @@ public class Generate3ColorDeck {
c = Sp123.get(r.nextInt(Sp123.size())); c = Sp123.get(r.nextInt(Sp123.size()));
lc++; lc++;
} }
if (lc > 100) if (lc > 100) {
throw new RuntimeException("Generate3ColorDeck : get3ColorDeck -- looped too much -- Sp123"); throw new RuntimeException("Generate3ColorDeck : get3ColorDeck -- looped too much -- Sp123");
}
tDeck.add(AllZone.getCardFactory().getCard(c.getName(), AllZone.getComputerPlayer())); tDeck.add(AllZone.getCardFactory().getCard(c.getName(), AllZone.getComputerPlayer()));
int n = cardCounts.get(c.getName()); int n = cardCounts.get(c.getName());
@@ -250,8 +275,10 @@ public class Generate3ColorDeck {
if (LandsPercentage > 0) { if (LandsPercentage > 0) {
p = (float) ((float) LandsPercentage * .01); p = (float) ((float) LandsPercentage * .01);
numLands = (int) (p * (float) Size); numLands = (int) (p * (float) Size);
} else // otherwise, just fill in the rest of the deck with basic lands } else {
// otherwise, just fill in the rest of the deck with basic lands
numLands = Size - tDeck.size(); numLands = Size - tDeck.size();
}
tmpDeck += "numLands:" + numLands + "\n"; tmpDeck += "numLands:" + numLands + "\n";
@@ -264,8 +291,9 @@ public class Generate3ColorDeck {
s = dL.get(r.nextInt(dL.size())); s = dL.get(r.nextInt(dL.size()));
lc++; lc++;
} }
if (lc > 20) if (lc > 20) {
throw new RuntimeException("Generate3ColorDeck : get3ColorDeck -- looped too much -- dL"); throw new RuntimeException("Generate3ColorDeck : get3ColorDeck -- looped too much -- dL");
}
tDeck.add(AllZone.getCardFactory().getCard(s, AllZone.getHumanPlayer())); tDeck.add(AllZone.getCardFactory().getCard(s, AllZone.getHumanPlayer()));
int n = cardCounts.get(s); int n = cardCounts.get(s);
@@ -275,16 +303,14 @@ public class Generate3ColorDeck {
numLands -= ndLands; numLands -= ndLands;
if (numLands > 0) // attempt to optimize basic land counts according to color representation if (numLands > 0) // attempt to optimize basic land counts according to
// color representation
{ {
CCnt ClrCnts[] = {new CCnt("Plains", 0), CCnt[] ClrCnts = { new CCnt("Plains", 0), new CCnt("Island", 0), new CCnt("Swamp", 0),
new CCnt("Island", 0), new CCnt("Mountain", 0), new CCnt("Forest", 0) };
new CCnt("Swamp", 0),
new CCnt("Mountain", 0),
new CCnt("Forest", 0)};
// count each card color using mana costs // count each card color using mana costs
// TODO: count hybrid mana differently? // TODO count hybrid mana differently?
for (int i = 0; i < tDeck.size(); i++) { for (int i = 0; i < tDeck.size(); i++) {
String mc = tDeck.get(i).getManaCost(); String mc = tDeck.get(i).getManaCost();
@@ -292,16 +318,17 @@ public class Generate3ColorDeck {
for (int j = 0; j < mc.length(); j++) { for (int j = 0; j < mc.length(); j++) {
char c = mc.charAt(j); char c = mc.charAt(j);
if (c == 'W') if (c == 'W') {
ClrCnts[0].Count++; ClrCnts[0].Count++;
else if (c == 'U') } else if (c == 'U') {
ClrCnts[1].Count++; ClrCnts[1].Count++;
else if (c == 'B') } else if (c == 'B') {
ClrCnts[2].Count++; ClrCnts[2].Count++;
else if (c == 'R') } else if (c == 'R') {
ClrCnts[3].Count++; ClrCnts[3].Count++;
else if (c == 'G') } else if (c == 'G') {
ClrCnts[4].Count++; ClrCnts[4].Count++;
}
} }
} }
@@ -315,16 +342,19 @@ public class Generate3ColorDeck {
tmpDeck += "totalColor:" + totalColor + "\n"; tmpDeck += "totalColor:" + totalColor + "\n";
for (int i = 0; i < 5; i++) { for (int i = 0; i < 5; i++) {
if (ClrCnts[i].Count > 0) { // calculate number of lands for each color if (ClrCnts[i].Count > 0) { // calculate number of lands for
// each color
p = (float) ClrCnts[i].Count / (float) totalColor; p = (float) ClrCnts[i].Count / (float) totalColor;
int nLand = (int) ((float) numLands * p); int nLand = (int) ((float) numLands * p);
tmpDeck += "nLand-" + ClrCnts[i].Color + ":" + nLand + "\n"; tmpDeck += "nLand-" + ClrCnts[i].Color + ":" + nLand + "\n";
// just to prevent a null exception by the deck size fixing code // just to prevent a null exception by the deck size fixing
// code
cardCounts.put(ClrCnts[i].Color, nLand); cardCounts.put(ClrCnts[i].Color, nLand);
for (int j = 0; j <= nLand; j++) for (int j = 0; j <= nLand; j++) {
tDeck.add(AllZone.getCardFactory().getCard(ClrCnts[i].Color, AllZone.getComputerPlayer())); tDeck.add(AllZone.getCardFactory().getCard(ClrCnts[i].Color, AllZone.getComputerPlayer()));
}
} }
} }
} }
@@ -342,8 +372,9 @@ public class Generate3ColorDeck {
c = tDeck.get(r.nextInt(tDeck.size())); c = tDeck.get(r.nextInt(tDeck.size()));
lc++; lc++;
} }
if (lc > Size) if (lc > Size) {
throw new RuntimeException("Generate3ColorDeck : get3ColorDeck -- looped too much -- undersize"); throw new RuntimeException("Generate3ColorDeck : get3ColorDeck -- looped too much -- undersize");
}
int n = cardCounts.get(c.getName()); int n = cardCounts.get(c.getName());
tDeck.add(AllZone.getCardFactory().getCard(c.getName(), AllZone.getComputerPlayer())); tDeck.add(AllZone.getCardFactory().getCard(c.getName(), AllZone.getComputerPlayer()));
@@ -356,8 +387,10 @@ public class Generate3ColorDeck {
for (int i = 0; i < diff; i++) { for (int i = 0; i < diff; i++) {
Card c = tDeck.get(r.nextInt(tDeck.size())); Card c = tDeck.get(r.nextInt(tDeck.size()));
while (c.isBasicLand()) // don't remove basic lands while (c.isBasicLand()) {
// don't remove basic lands
c = tDeck.get(r.nextInt(tDeck.size())); c = tDeck.get(r.nextInt(tDeck.size()));
}
tDeck.remove(c); tDeck.remove(c);
tmpDeck += "Removed:" + c.getName() + "\n"; tmpDeck += "Removed:" + c.getName() + "\n";
@@ -365,8 +398,9 @@ public class Generate3ColorDeck {
} }
tmpDeck += "DeckSize:" + tDeck.size() + "\n"; tmpDeck += "DeckSize:" + tDeck.size() + "\n";
if (ForgeProps.getProperty("showdeck/3color", "false").equals("true")) if (ForgeProps.getProperty("showdeck/3color", "false").equals("true")) {
ErrorViewer.showError(tmpDeck); ErrorViewer.showError(tmpDeck);
}
return tDeck; return tDeck;
} }
@@ -375,7 +409,7 @@ public class Generate3ColorDeck {
public String Color; public String Color;
public int Count; public int Count;
public CCnt(String clr, int cnt) { public CCnt(final String clr, final int cnt) {
Color = clr; Color = clr;
Count = cnt; Count = cnt;
} }

View File

@@ -17,8 +17,10 @@ import forge.error.ErrorViewer;
import forge.properties.ForgeProps; import forge.properties.ForgeProps;
/** /**
* <p>Generate5ColorDeck class.</p> * <p>
* * Generate5ColorDeck class.
* </p>
*
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
@@ -35,24 +37,30 @@ public class Generate5ColorDeck {
private Map<String, Integer> cardCounts = null; private Map<String, Integer> cardCounts = null;
/** /**
* * Instantiates a new generate5 color deck.
*/ */
public Generate5ColorDeck() { public Generate5ColorDeck() {
this("white", "blue", "black", "red", "green"); this("white", "blue", "black", "red", "green");
} }
/** /**
* <p>Constructor for Generate5ColorDeck.</p> * <p>
* * Constructor for Generate5ColorDeck.
* @param clr1 a {@link java.lang.String} object. * </p>
* @param clr2 a {@link java.lang.String} object. *
* @param clr3 a {@link java.lang.String} object. * @param clr1
* @param clr4 a {@link java.lang.String} object. * a {@link java.lang.String} object.
* @param clr5 a {@link java.lang.String} object. * @param clr2
* a {@link java.lang.String} object.
* @param clr3
* a {@link java.lang.String} object.
* @param clr4
* a {@link java.lang.String} object.
* @param clr5
* a {@link java.lang.String} object.
*/ */
public Generate5ColorDeck(final String clr1, final String clr2, public Generate5ColorDeck(final String clr1, final String clr2, final String clr3, final String clr4,
final String clr3, final String clr4, final String clr5) final String clr5) {
{
r = MyRandom.random; r = MyRandom.random;
cardCounts = new HashMap<String, Integer>(); cardCounts = new HashMap<String, Integer>();
@@ -91,10 +99,14 @@ public class Generate5ColorDeck {
} }
/** /**
* <p>get3ColorDeck.</p> * <p>
* * get3ColorDeck.
* @param size a int. * </p>
* @param pt a PlayerType *
* @param size
* a int.
* @param pt
* a PlayerType
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList get5ColorDeck(final int size, final PlayerType pt) { public final CardList get5ColorDeck(final int size, final PlayerType pt) {
@@ -112,8 +124,8 @@ public class Generate5ColorDeck {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
if (c.getSVar("RemRandomDeck").equals("True")) { if (c.getSVar("RemRandomDeck").equals("True")) {
return false; return false;
} }
return (!c.getSVar("RemAIDeck").equals("True") || (pt != null && pt.equals(PlayerType.HUMAN))); return (!c.getSVar("RemAIDeck").equals("True") || (pt != null && pt.equals(PlayerType.HUMAN)));
} }
}); });
@@ -149,7 +161,7 @@ public class Generate5ColorDeck {
CardList cr4 = cL4.getType("Creature"); CardList cr4 = cL4.getType("Creature");
CardList cr5 = cL5.getType("Creature"); CardList cr5 = cL5.getType("Creature");
String[] ise = {"Instant", "Sorcery", "Enchantment", "Planeswalker", "Artifact.nonCreature"}; String[] ise = { "Instant", "Sorcery", "Enchantment", "Planeswalker", "Artifact.nonCreature" };
CardList sp1 = cL1.getValidCards(ise, null, null); CardList sp1 = cL1.getValidCards(ise, null, null);
CardList sp2 = cL2.getValidCards(ise, null, null); CardList sp2 = cL2.getValidCards(ise, null, null);
CardList sp3 = cL3.getValidCards(ise, null, null); CardList sp3 = cL3.getValidCards(ise, null, null);
@@ -161,8 +173,8 @@ public class Generate5ColorDeck {
CardList sp12345 = new CardList(); CardList sp12345 = new CardList();
// used for mana curve in the card pool // used for mana curve in the card pool
final int[] minCMC = {1}; final int[] minCMC = { 1 };
final int[] maxCMC = {3}; final int[] maxCMC = { 3 };
CardListFilter cmcF = new CardListFilter() { CardListFilter cmcF = new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
int cCMC = c.getCMC(); int cCMC = c.getCMC();
@@ -229,10 +241,11 @@ public class Generate5ColorDeck {
minCMC[0] += 2; minCMC[0] += 2;
maxCMC[0] += 2; maxCMC[0] += 2;
// resulting mana curve of the card pool // resulting mana curve of the card pool
//18x 1 - 3 // 18x 1 - 3
//12x 3 - 5 // 12x 3 - 5
//6x 5 - 7 // 6x 5 - 7
//=36x - card pool could support up to a 257 card deck (all 4-ofs plus basic lands) // =36x - card pool could support up to a 257 card deck (all 4-ofs
// plus basic lands)
} }
// shuffle card pools // shuffle card pools
@@ -290,7 +303,8 @@ public class Generate5ColorDeck {
if (landsPercentage > 0) { if (landsPercentage > 0) {
p = (float) ((float) landsPercentage * .01); p = (float) ((float) landsPercentage * .01);
numLands = (int) (p * (float) size); numLands = (int) (p * (float) size);
} else { // otherwise, just fill in the rest of the deck with basic lands } else { // otherwise, just fill in the rest of the deck with basic
// lands
numLands = size - tDeck.size(); numLands = size - tDeck.size();
} }
@@ -317,13 +331,11 @@ public class Generate5ColorDeck {
numLands -= nDLands; numLands -= nDLands;
if (numLands > 0) // attempt to optimize basic land counts according to color representation if (numLands > 0) // attempt to optimize basic land counts according to
// color representation
{ {
CCnt[] clrCnts = {new CCnt("Plains", 0), CCnt[] clrCnts = { new CCnt("Plains", 0), new CCnt("Island", 0), new CCnt("Swamp", 0),
new CCnt("Island", 0), new CCnt("Mountain", 0), new CCnt("Forest", 0) };
new CCnt("Swamp", 0),
new CCnt("Mountain", 0),
new CCnt("Forest", 0)};
// count each card color using mana costs // count each card color using mana costs
// TODO: count hybrid mana differently? // TODO: count hybrid mana differently?
@@ -336,17 +348,13 @@ public class Generate5ColorDeck {
if (c == 'W') { if (c == 'W') {
clrCnts[0].setCount(clrCnts[0].getCount() + 1); clrCnts[0].setCount(clrCnts[0].getCount() + 1);
} } else if (c == 'U') {
else if (c == 'U') {
clrCnts[1].setCount(clrCnts[1].getCount() + 1); clrCnts[1].setCount(clrCnts[1].getCount() + 1);
} } else if (c == 'B') {
else if (c == 'B') {
clrCnts[2].setCount(clrCnts[2].getCount() + 1); clrCnts[2].setCount(clrCnts[2].getCount() + 1);
} } else if (c == 'R') {
else if (c == 'R') {
clrCnts[3].setCount(clrCnts[3].getCount() + 1); clrCnts[3].setCount(clrCnts[3].getCount() + 1);
} } else if (c == 'G') {
else if (c == 'G') {
clrCnts[4].setCount(clrCnts[4].getCount() + 1); clrCnts[4].setCount(clrCnts[4].getCount() + 1);
} }
} }
@@ -362,12 +370,14 @@ public class Generate5ColorDeck {
tmpDeck += "totalColor:" + totalColor + "\n"; tmpDeck += "totalColor:" + totalColor + "\n";
for (int i = 0; i < 5; i++) { for (int i = 0; i < 5; i++) {
if (clrCnts[i].getCount() > 0) { // calculate number of lands for each color if (clrCnts[i].getCount() > 0) { // calculate number of lands
// for each color
p = (float) clrCnts[i].getCount() / (float) totalColor; p = (float) clrCnts[i].getCount() / (float) totalColor;
int nLand = (int) ((float) numLands * p); int nLand = (int) ((float) numLands * p);
tmpDeck += "nLand-" + clrCnts[i].getColor() + ":" + nLand + "\n"; tmpDeck += "nLand-" + clrCnts[i].getColor() + ":" + nLand + "\n";
// just to prevent a null exception by the deck size fixing code // just to prevent a null exception by the deck size fixing
// code
cardCounts.put(clrCnts[i].getColor(), nLand); cardCounts.put(clrCnts[i].getColor(), nLand);
for (int j = 0; j <= nLand; j++) { for (int j = 0; j <= nLand; j++) {
@@ -405,7 +415,7 @@ public class Generate5ColorDeck {
for (int i = 0; i < diff; i++) { for (int i = 0; i < diff; i++) {
Card c = tDeck.get(r.nextInt(tDeck.size())); Card c = tDeck.get(r.nextInt(tDeck.size()));
while (c.isBasicLand()) { // don't remove basic lands while (c.isBasicLand()) { // don't remove basic lands
c = tDeck.get(r.nextInt(tDeck.size())); c = tDeck.get(r.nextInt(tDeck.size()));
} }

View File

@@ -1,5 +1,9 @@
package forge.deck.generate; package forge.deck.generate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import forge.AllZone; import forge.AllZone;
import forge.Card; import forge.Card;
import forge.CardFilter; import forge.CardFilter;
@@ -9,13 +13,12 @@ import forge.CardListUtil;
import forge.CardUtil; import forge.CardUtil;
import forge.Constant; import forge.Constant;
import forge.Singletons; import forge.Singletons;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/** /**
* <p>GenerateConstructedDeck class.</p> * <p>
* * GenerateConstructedDeck class.
* </p>
*
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
@@ -26,14 +29,18 @@ public class GenerateConstructedDeck {
private Map<String, String> map = new HashMap<String, String>(); private Map<String, String> map = new HashMap<String, String>();
/** /**
* <p>Constructor for GenerateConstructedDeck.</p> * <p>
* Constructor for GenerateConstructedDeck.
* </p>
*/ */
public GenerateConstructedDeck() { public GenerateConstructedDeck() {
setupMap(); setupMap();
} }
/** /**
* <p>setupMap.</p> * <p>
* setupMap.
* </p>
*/ */
private void setupMap() { private void setupMap() {
map.put(Constant.Color.Black, "Swamp"); map.put(Constant.Color.Black, "Swamp");
@@ -44,8 +51,10 @@ public class GenerateConstructedDeck {
} }
/** /**
* <p>generateDeck.</p> * <p>
* * generateDeck.
* </p>
*
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public final CardList generateDeck() { public final CardList generateDeck() {
@@ -62,16 +71,21 @@ public class GenerateConstructedDeck {
addLand(deck); addLand(deck);
if (deck.size() != 60) { if (deck.size() != 60) {
throw new RuntimeException("GenerateConstructedDeck() : generateDeck() error, deck size it not 60, deck size is " + deck.size()); throw new RuntimeException(
"GenerateConstructedDeck() : generateDeck() error, deck size it not 60, deck size is "
+ deck.size());
} }
return deck; return deck;
} }
//25 lands // 25 lands
/** /**
* <p>addLand.</p> * <p>
* * addLand.
* @param list a {@link forge.CardList} object. * </p>
*
* @param list
* a {@link forge.CardList} object.
*/ */
private void addLand(final CardList list) { private void addLand(final CardList list) {
Card land; Card land;
@@ -82,25 +96,27 @@ public class GenerateConstructedDeck {
land = AllZone.getCardFactory().getCard(map.get(color2).toString(), AllZone.getComputerPlayer()); land = AllZone.getCardFactory().getCard(map.get(color2).toString(), AllZone.getComputerPlayer());
list.add(land); list.add(land);
} }
} //addLand() } // addLand()
/** /**
* Creates a CardList from the set of all cards that meets the criteria * Creates a CardList from the set of all cards that meets the criteria for
* for color(s), type, whether the card is suitable for * color(s), type, whether the card is suitable for placement in random
* placement in random decks and in AI decks, etc. * decks and in AI decks, etc.
* *
* @see #filterBadCards(Iterable) * @see #filterBadCards(Iterable)
* *
* @return a subset of cards <= the set of all cards; might be empty, but * @return a subset of cards <= the set of all cards; might be empty, but
* never null * never null
*/ */
private CardList getCards() { private CardList getCards() {
return filterBadCards(AllZone.getCardFactory()); return filterBadCards(AllZone.getCardFactory());
} //getCards() } // getCards()
/** /**
* <p>get2ColorDeck.</p> * <p>
* * get2ColorDeck.
* </p>
*
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
private CardList get2ColorDeck() { private CardList get2ColorDeck() {
@@ -109,7 +125,8 @@ public class GenerateConstructedDeck {
CardList out = new CardList(); CardList out = new CardList();
deck.shuffle(); deck.shuffle();
//trim deck size down to 34 cards, presumes 26 land, for a total of 60 cards // trim deck size down to 34 cards, presumes 26 land, for a total of 60
// cards
for (int i = 0; i < 34 && i < deck.size(); i++) { for (int i = 0; i < 34 && i < deck.size(); i++) {
out.add(deck.get(i)); out.add(deck.get(i));
} }
@@ -117,9 +134,12 @@ public class GenerateConstructedDeck {
} }
/** /**
* <p>get2Colors.</p> * <p>
* * get2Colors.
* @param in a {@link forge.CardList} object. * </p>
*
* @param in
* a {@link forge.CardList} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
private CardList get2Colors(final CardList in) { private CardList get2Colors(final CardList in) {
@@ -129,7 +149,7 @@ public class GenerateConstructedDeck {
do { do {
a = CardUtil.getRandomIndex(Constant.Color.onlyColors); a = CardUtil.getRandomIndex(Constant.Color.onlyColors);
b = CardUtil.getRandomIndex(Constant.Color.onlyColors); b = CardUtil.getRandomIndex(Constant.Color.onlyColors);
} while (a == b); //do not want to get the same color twice } while (a == b); // do not want to get the same color twice
color1 = Constant.Color.onlyColors[a]; color1 = Constant.Color.onlyColors[a];
color2 = Constant.Color.onlyColors[b]; color2 = Constant.Color.onlyColors[b];
@@ -141,8 +161,8 @@ public class GenerateConstructedDeck {
CardList artifact = in.filter(new CardListFilter() { CardList artifact = in.filter(new CardListFilter() {
public boolean addCard(final Card c) { public boolean addCard(final Card c) {
//is this really a colorless artifact and not something // is this really a colorless artifact and not something
//weird like Sarcomite Myr which is a colored artifact // weird like Sarcomite Myr which is a colored artifact
return c.isArtifact() && CardUtil.getColors(c).contains(Constant.Color.Colorless) return c.isArtifact() && CardUtil.getColors(c).contains(Constant.Color.Colorless)
&& !Singletons.getModel().getPreferences().deckGenRmvArtifacts; && !Singletons.getModel().getPreferences().deckGenRmvArtifacts;
} }
@@ -164,14 +184,14 @@ public class GenerateConstructedDeck {
} }
/** /**
* Creates a CardList from the given sequence that meets the criteria * Creates a CardList from the given sequence that meets the criteria for
* for color(s), type, whether the card is suitable for * color(s), type, whether the card is suitable for placement in random
* placement in random decks and in AI decks, etc. * decks and in AI decks, etc.
*
* @param sequence an iterable over Card instances
* *
* @return a subset of sequence <= sequence; might be empty, but never * @param sequence
* null * an iterable over Card instances
*
* @return a subset of sequence <= sequence; might be empty, but never null
*/ */
private CardList filterBadCards(final Iterable<Card> sequence) { private CardList filterBadCards(final Iterable<Card> sequence) {
@@ -185,14 +205,15 @@ public class GenerateConstructedDeck {
return false; return false;
} }
} }
return CardUtil.getColors(c).size() <= 2 //only dual colored gold cards return CardUtil.getColors(c).size() <= 2 // only dual colored
&& !c.isLand() //no land // gold cards
&& !c.getSVar("RemRandomDeck").equals("True") && !c.isLand() // no land
&& !c.getSVar("RemAIDeck").equals("True") //OR very important && !c.getSVar("RemRandomDeck").equals("True") && !c.getSVar("RemAIDeck").equals("True")
// OR very important
|| goodLand.contains(c.getName()); || goodLand.contains(c.getName());
} }
}); });
return out; return out;
} //filterBadCards() } // filterBadCards()
} }

View File

@@ -1,13 +1,24 @@
package forge.deck.generate; package forge.deck.generate;
import forge.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import forge.AllZone;
import forge.Card;
import forge.CardFilter;
import forge.CardList;
import forge.CardListFilter;
import forge.CardListUtil;
import forge.CardUtil;
import forge.Constant;
import forge.Singletons;
/** /**
* <p>GenerateConstructedMultiColorDeck class.</p> * <p>
* * GenerateConstructedMultiColorDeck class.
* </p>
*
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
@@ -22,7 +33,9 @@ public class GenerateConstructedMultiColorDeck {
private Map<String, String[]> multiMap = new HashMap<String, String[]>(); private Map<String, String[]> multiMap = new HashMap<String, String[]>();
/** /**
* <p>Constructor for GenerateConstructedMultiColorDeck.</p> * <p>
* Constructor for GenerateConstructedMultiColorDeck.
* </p>
*/ */
public GenerateConstructedMultiColorDeck() { public GenerateConstructedMultiColorDeck() {
setupBasicLandMap(); setupBasicLandMap();
@@ -30,7 +43,9 @@ public class GenerateConstructedMultiColorDeck {
} }
/** /**
* <p>setupBasicLandMap.</p> * <p>
* setupBasicLandMap.
* </p>
*/ */
private void setupBasicLandMap() { private void setupBasicLandMap() {
map.put(Constant.Color.Black, "Swamp"); map.put(Constant.Color.Black, "Swamp");
@@ -41,38 +56,41 @@ public class GenerateConstructedMultiColorDeck {
} }
/** /**
* <p>setupMultiMap.</p> * <p>
* setupMultiMap.
* </p>
*/ */
private void setupMultiMap() { private void setupMultiMap() {
multiMap.put(Constant.Color.Black + Constant.Color.Blue, new String[]{"Underground Sea", "Watery Grave"}); multiMap.put(Constant.Color.Black + Constant.Color.Blue, new String[] { "Underground Sea", "Watery Grave" });
multiMap.put(Constant.Color.Black + Constant.Color.Green, new String[]{"Bayou", "Overgrown Tomb"}); multiMap.put(Constant.Color.Black + Constant.Color.Green, new String[] { "Bayou", "Overgrown Tomb" });
multiMap.put(Constant.Color.Black + Constant.Color.Red, new String[]{"Badlands", "Blood Crypt"}); multiMap.put(Constant.Color.Black + Constant.Color.Red, new String[] { "Badlands", "Blood Crypt" });
multiMap.put(Constant.Color.Black + Constant.Color.White, new String[]{"Scrubland", "Godless Shrine"}); multiMap.put(Constant.Color.Black + Constant.Color.White, new String[] { "Scrubland", "Godless Shrine" });
multiMap.put(Constant.Color.Blue + Constant.Color.Black, new String[]{"Underground Sea", "Watery Grave"}); multiMap.put(Constant.Color.Blue + Constant.Color.Black, new String[] { "Underground Sea", "Watery Grave" });
multiMap.put(Constant.Color.Blue + Constant.Color.Green, new String[]{"Tropical Island", "Breeding Pool"}); multiMap.put(Constant.Color.Blue + Constant.Color.Green, new String[] { "Tropical Island", "Breeding Pool" });
multiMap.put(Constant.Color.Blue + Constant.Color.Red, new String[]{"Volcanic Island", "Steam Vents"}); multiMap.put(Constant.Color.Blue + Constant.Color.Red, new String[] { "Volcanic Island", "Steam Vents" });
multiMap.put(Constant.Color.Blue + Constant.Color.White, new String[]{"Tundra", "Hallowed Fountain"}); multiMap.put(Constant.Color.Blue + Constant.Color.White, new String[] { "Tundra", "Hallowed Fountain" });
multiMap.put(Constant.Color.Green + Constant.Color.Black, new String[]{"Bayou", "Overgrown Tomb"}); multiMap.put(Constant.Color.Green + Constant.Color.Black, new String[] { "Bayou", "Overgrown Tomb" });
multiMap.put(Constant.Color.Green + Constant.Color.Blue, new String[]{"Tropical Island", "Breeding Pool"}); multiMap.put(Constant.Color.Green + Constant.Color.Blue, new String[] { "Tropical Island", "Breeding Pool" });
multiMap.put(Constant.Color.Green + Constant.Color.Red, new String[]{"Taiga", "Stomping Ground"}); multiMap.put(Constant.Color.Green + Constant.Color.Red, new String[] { "Taiga", "Stomping Ground" });
multiMap.put(Constant.Color.Green + Constant.Color.White, new String[]{"Savannah", "Temple Garden"}); multiMap.put(Constant.Color.Green + Constant.Color.White, new String[] { "Savannah", "Temple Garden" });
multiMap.put(Constant.Color.Red + Constant.Color.Black, new String[]{"Badlands", "Blood Crypt"}); multiMap.put(Constant.Color.Red + Constant.Color.Black, new String[] { "Badlands", "Blood Crypt" });
multiMap.put(Constant.Color.Red + Constant.Color.Blue, new String[]{"Volcanic Island", "Steam Vents"}); multiMap.put(Constant.Color.Red + Constant.Color.Blue, new String[] { "Volcanic Island", "Steam Vents" });
multiMap.put(Constant.Color.Red + Constant.Color.Green, new String[]{"Taiga", "Stomping Ground"}); multiMap.put(Constant.Color.Red + Constant.Color.Green, new String[] { "Taiga", "Stomping Ground" });
multiMap.put(Constant.Color.Red + Constant.Color.White, new String[]{"Plateau", "Sacred Foundry"}); multiMap.put(Constant.Color.Red + Constant.Color.White, new String[] { "Plateau", "Sacred Foundry" });
multiMap.put(Constant.Color.White + Constant.Color.Black, new String[]{"Scrubland", "Godless Shrine"}); multiMap.put(Constant.Color.White + Constant.Color.Black, new String[] { "Scrubland", "Godless Shrine" });
multiMap.put(Constant.Color.White + Constant.Color.Blue, new String[]{"Tundra", "Hallowed Fountain"}); multiMap.put(Constant.Color.White + Constant.Color.Blue, new String[] { "Tundra", "Hallowed Fountain" });
multiMap.put(Constant.Color.White + Constant.Color.Green, new String[]{"Savannah", "Temple Garden"}); multiMap.put(Constant.Color.White + Constant.Color.Green, new String[] { "Savannah", "Temple Garden" });
multiMap.put(Constant.Color.White + Constant.Color.Red, new String[]{"Plateau", "Sacred Foundry"}); multiMap.put(Constant.Color.White + Constant.Color.Red, new String[] { "Plateau", "Sacred Foundry" });
} }
/** /**
* <p>generate3ColorDeck.</p> * <p>
* * generate3ColorDeck.
* </p>
*
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public CardList generate3ColorDeck() { public final CardList generate3ColorDeck() {
CardList deck; CardList deck;
int check; int check;
@@ -85,37 +103,49 @@ public class GenerateConstructedMultiColorDeck {
addLand(deck, 3); addLand(deck, 3);
if (deck.size() != 60) if (deck.size() != 60) {
throw new RuntimeException("GenerateConstructedDeck() : generateDeck() error, deck size it not 60, deck size is " + deck.size()); throw new RuntimeException(
"GenerateConstructedDeck() : generateDeck() error, deck size it not 60, deck size is "
+ deck.size());
}
return deck; return deck;
} }
/** /**
* <p>generate5ColorDeck.</p> * <p>
* * generate5ColorDeck.
* </p>
*
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public CardList generate5ColorDeck() { public final CardList generate5ColorDeck() {
CardList deck; CardList deck;
deck = get5ColorDeck(); deck = get5ColorDeck();
addLand(deck, 5); addLand(deck, 5);
if (deck.size() != 60) if (deck.size() != 60) {
throw new RuntimeException("GenerateConstructedDeck() : generateDeck() error, deck size it not 60, deck size is " + deck.size()); throw new RuntimeException(
"GenerateConstructedDeck() : generateDeck() error, deck size it not 60, deck size is "
+ deck.size());
}
return deck; return deck;
} }
/** /**
* <p>addLand.</p> * <p>
* * addLand.
* @param list a {@link forge.CardList} object. * </p>
* @param colors a int. *
* @param list
* a {@link forge.CardList} object.
* @param colors
* a int.
*/ */
private void addLand(CardList list, int colors) { private void addLand(final CardList list, final int colors) {
if (colors == 3) { if (colors == 3) {
int numberBasic = 2; int numberBasic = 2;
Card land; Card land;
@@ -173,7 +203,6 @@ public class GenerateConstructedMultiColorDeck {
list.add(land); list.add(land);
} }
int numberDual = 2; int numberDual = 2;
for (int i = 0; i < numberDual; i++) { for (int i = 0; i < numberDual; i++) {
land = AllZone.getCardFactory().getCard(multiMap.get(color1 + color2)[0], AllZone.getComputerPlayer()); land = AllZone.getCardFactory().getCard(multiMap.get(color1 + color2)[0], AllZone.getComputerPlayer());
@@ -208,25 +237,28 @@ public class GenerateConstructedMultiColorDeck {
} }
} }
}//addLand() } // addLand()
/** /**
* Filters out cards by color and their suitability for being placed in * Filters out cards by color and their suitability for being placed in a
* a randomly created deck. * randomly created deck.
*
* @param colors the number of different colors the deck should have;
* if this is a number other than 3 or 5, we return an empty list.
* *
* @return a subset of all cards in the CardFactory database * @param colors
* which might be empty, but never null * the number of different colors the deck should have; if this
* is a number other than 3 or 5, we return an empty list.
*
* @return a subset of all cards in the CardFactory database which might be
* empty, but never null
*/ */
private CardList getCards(int colors) { private CardList getCards(final int colors) {
return filterBadCards(AllZone.getCardFactory(), colors); return filterBadCards(AllZone.getCardFactory(), colors);
}//getCards() } // getCards()
/** /**
* <p>get3ColorDeck.</p> * <p>
* * get3ColorDeck.
* </p>
*
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
private CardList get3ColorDeck() { private CardList get3ColorDeck() {
@@ -235,16 +267,20 @@ public class GenerateConstructedMultiColorDeck {
CardList out = new CardList(); CardList out = new CardList();
deck.shuffle(); deck.shuffle();
//trim deck size down to 36 cards, presumes 24 land, for a total of 60 cards // trim deck size down to 36 cards, presumes 24 land, for a total of 60
for (int i = 0; i < 36 && i < deck.size(); i++) // cards
for (int i = 0; i < 36 && i < deck.size(); i++) {
out.add(deck.get(i)); out.add(deck.get(i));
}
return out; return out;
} }
/** /**
* <p>get5ColorDeck.</p> * <p>
* * get5ColorDeck.
* </p>
*
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
private CardList get5ColorDeck() { private CardList get5ColorDeck() {
@@ -253,20 +289,25 @@ public class GenerateConstructedMultiColorDeck {
CardList out = new CardList(); CardList out = new CardList();
deck.shuffle(); deck.shuffle();
//trim deck size down to 36 cards, presumes 24 land, for a total of 60 cards // trim deck size down to 36 cards, presumes 24 land, for a total of 60
for (int i = 0; i < 36 && i < deck.size(); i++) // cards
for (int i = 0; i < 36 && i < deck.size(); i++) {
out.add(deck.get(i)); out.add(deck.get(i));
}
return out; return out;
} }
/** /**
* <p>get3Colors.</p> * <p>
* * get3Colors.
* @param in a {@link forge.CardList} object. * </p>
*
* @param in
* a {@link forge.CardList} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
private CardList get3Colors(CardList in) { private CardList get3Colors(final CardList in) {
int a; int a;
int b; int b;
int c; int c;
@@ -275,7 +316,8 @@ public class GenerateConstructedMultiColorDeck {
do { do {
b = CardUtil.getRandomIndex(Constant.Color.onlyColors); b = CardUtil.getRandomIndex(Constant.Color.onlyColors);
c = CardUtil.getRandomIndex(Constant.Color.onlyColors); c = CardUtil.getRandomIndex(Constant.Color.onlyColors);
} while (a == b || a == c || b == c);//do not want to get the same color thrice } while (a == b || a == c || b == c); // do not want to get the same
// color thrice
color1 = Constant.Color.onlyColors[a]; color1 = Constant.Color.onlyColors[a];
color2 = Constant.Color.onlyColors[b]; color2 = Constant.Color.onlyColors[b];
@@ -288,21 +330,18 @@ public class GenerateConstructedMultiColorDeck {
out.shuffle(); out.shuffle();
CardList artifact = in.filter(new CardListFilter() { CardList artifact = in.filter(new CardListFilter() {
public boolean addCard(Card c) { public boolean addCard(final Card c) {
//is this really a colorless artifact and not something // is this really a colorless artifact and not something
//wierd like Sarcomite Myr which is a colored artifact // wierd like Sarcomite Myr which is a colored artifact
return c.isArtifact() && return c.isArtifact() && CardUtil.getColors(c).contains(Constant.Color.Colorless)
CardUtil.getColors(c).contains(Constant.Color.Colorless) && && !Singletons.getModel().getPreferences().deckGenRmvArtifacts;
!Singletons.getModel().getPreferences().deckGenRmvArtifacts;
} }
}); });
out.addAll(artifact); out.addAll(artifact);
out = out.filter(new CardListFilter() { out = out.filter(new CardListFilter() {
public boolean addCard(Card c) { public boolean addCard(final Card c) {
if (c.isCreature() && if (c.isCreature() && c.getNetAttack() <= 1 && Singletons.getModel().getPreferences().deckGenRmvSmall) {
c.getNetAttack() <= 1 &&
Singletons.getModel().getPreferences().deckGenRmvSmall) {
return false; return false;
} }
@@ -315,12 +354,15 @@ public class GenerateConstructedMultiColorDeck {
} }
/** /**
* <p>get5Colors.</p> * <p>
* * get5Colors.
* @param in a {@link forge.CardList} object. * </p>
*
* @param in
* a {@link forge.CardList} object.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
private CardList get5Colors(CardList in) { private CardList get5Colors(final CardList in) {
color1 = Constant.Color.Black; color1 = Constant.Color.Black;
color2 = Constant.Color.Blue; color2 = Constant.Color.Blue;
@@ -330,31 +372,28 @@ public class GenerateConstructedMultiColorDeck {
CardList out = new CardList(); CardList out = new CardList();
/* /*
out.addAll(CardListUtil.getColor(in, color1)); * out.addAll(CardListUtil.getColor(in, color1));
out.addAll(CardListUtil.getColor(in, color2)); * out.addAll(CardListUtil.getColor(in, color2));
out.addAll(CardListUtil.getColor(in, color3)); * out.addAll(CardListUtil.getColor(in, color3));
out.addAll(CardListUtil.getColor(in, color4)); * out.addAll(CardListUtil.getColor(in, color4));
out.addAll(CardListUtil.getColor(in, color5)); * out.addAll(CardListUtil.getColor(in, color5));
*/ */
out.addAll(CardListUtil.getGoldCards(in)); out.addAll(CardListUtil.getGoldCards(in));
out.shuffle(); out.shuffle();
CardList artifact = in.filter(new CardListFilter() { CardList artifact = in.filter(new CardListFilter() {
public boolean addCard(Card c) { public boolean addCard(final Card c) {
//is this really a colorless artifact and not something // is this really a colorless artifact and not something
//wierd like Sarcomite Myr which is a colored artifact // wierd like Sarcomite Myr which is a colored artifact
return c.isArtifact() && return c.isArtifact() && CardUtil.getColors(c).contains(Constant.Color.Colorless)
CardUtil.getColors(c).contains(Constant.Color.Colorless) && && !Singletons.getModel().getPreferences().deckGenRmvArtifacts;
!Singletons.getModel().getPreferences().deckGenRmvArtifacts;
} }
}); });
out.addAll(artifact); out.addAll(artifact);
out = out.filter(new CardListFilter() { out = out.filter(new CardListFilter() {
public boolean addCard(Card c) { public boolean addCard(final Card c) {
if (c.isCreature() && if (c.isCreature() && c.getNetAttack() <= 1 && Singletons.getModel().getPreferences().deckGenRmvSmall) {
c.getNetAttack() <= 1 &&
Singletons.getModel().getPreferences().deckGenRmvSmall) {
return false; return false;
} }
@@ -366,56 +405,61 @@ public class GenerateConstructedMultiColorDeck {
return out; return out;
} }
/** /**
* Filters out cards by color and their suitability for being placed in * Filters out cards by color and their suitability for being placed in a
* a randomly created deck. * randomly created deck.
*
* @param sequence an Iterable of Card instances
* *
* @param colors the number of different colors the deck should have; * @param sequence
* if this is a number other than 3 or 5, we return an empty list. * an Iterable of Card instances
* *
* @return a subset of sequence <= sequence which might be empty, but * @param colors
* never null * the number of different colors the deck should have; if this
* is a number other than 3 or 5, we return an empty list.
*
* @return a subset of sequence <= sequence which might be empty, but never
* null
*/ */
private CardList filterBadCards(Iterable<Card> sequence, int colors) { private CardList filterBadCards(final Iterable<Card> sequence, final int colors) {
final ArrayList<Card> goodLand = new ArrayList<Card>(); final ArrayList<Card> goodLand = new ArrayList<Card>();
//goodLand.add("Faerie Conclave"); // goodLand.add("Faerie Conclave");
//goodLand.add("Forbidding Watchtower"); // goodLand.add("Forbidding Watchtower");
//goodLand.add("Treetop Village"); // goodLand.add("Treetop Village");
CardList out = new CardList(); CardList out = new CardList();
if (colors == 3) { if (colors == 3) {
out = CardFilter.filter(sequence, new CardListFilter() { out = CardFilter.filter(sequence, new CardListFilter() {
public boolean addCard(Card c) { public boolean addCard(final Card c) {
ArrayList<String> list = CardUtil.getColors(c); ArrayList<String> list = CardUtil.getColors(c);
if (list.size() == 3) { if (list.size() == 3) {
if (!list.contains(color1) || !list.contains(color2) || !list.contains(color3)) if (!list.contains(color1) || !list.contains(color2) || !list.contains(color3)) {
return false; return false;
}
} else if (list.size() == 2) { } else if (list.size() == 2) {
if (!(list.contains(color1) && list.contains(color2)) && if (!(list.contains(color1) && list.contains(color2))
!(list.contains(color1) && list.contains(color3)) && && !(list.contains(color1) && list.contains(color3))
!(list.contains(color2) && list.contains(color3))) && !(list.contains(color2) && list.contains(color3))) {
return false; return false;
}
} }
return CardUtil.getColors(c).size() <= 3 && return CardUtil.getColors(c).size() <= 3 && !c.isLand() && // no
!c.isLand() && //no land // land
!c.getSVar("RemRandomDeck").equals("True") && !c.getSVar("RemRandomDeck").equals("True") && !c.getSVar("RemAIDeck").equals("True") ||
!c.getSVar("RemAIDeck").equals("True") || //OR very important // OR very important
goodLand.contains(c.getName()); goodLand.contains(c.getName());
} }
}); });
} else if (colors == 5) { } else if (colors == 5) {
out = CardFilter.filter(sequence, new CardListFilter() { out = CardFilter.filter(sequence, new CardListFilter() {
public boolean addCard(Card c) { public boolean addCard(final Card c) {
return CardUtil.getColors(c).size() >= 2 && //only get multicolored cards return CardUtil.getColors(c).size() >= 2 && // only get
!c.isLand() && //no land // multicolored
!c.getSVar("RemRandomDeck").equals("True") && // cards
!c.getSVar("RemAIDeck").equals("True") || //OR very important !c.isLand() && // no land
!c.getSVar("RemRandomDeck").equals("True") && !c.getSVar("RemAIDeck").equals("True") ||
// OR very important
goodLand.contains(c.getName()); goodLand.contains(c.getName());
} }
}); });
@@ -423,5 +467,5 @@ public class GenerateConstructedMultiColorDeck {
} }
return out; return out;
}//filterBadCards() } // filterBadCards()
} }

View File

@@ -3,8 +3,10 @@ package forge.deck.generate;
import java.util.ArrayList; import java.util.ArrayList;
/** /**
* <p>GenerateDeckUtil class.</p> * <p>
* * GenerateDeckUtil class.
* </p>
*
* @author Forge * @author Forge
* @version $Id: GenerateDeckUtil.java 10011 2011-08-28 12:20:52Z Sloth $ * @version $Id: GenerateDeckUtil.java 10011 2011-08-28 12:20:52Z Sloth $
*/ */
@@ -13,7 +15,9 @@ public class GenerateDeckUtil {
/** /**
* *
* Arrays of dual and tri-land cards. * Arrays of dual and tri-land cards.
* @param colors a String *
* @param colors
* a String
* @return ArrayList<String> * @return ArrayList<String>
*/ */
public static ArrayList<String> getDualLandList(final String colors) { public static ArrayList<String> getDualLandList(final String colors) {

View File

@@ -1,11 +1,5 @@
package forge.deck.generate; package forge.deck.generate;
import forge.AllZone;
import forge.Card;
import forge.CardList;
import forge.MyRandom;
import forge.error.ErrorViewer;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileReader; import java.io.FileReader;
@@ -15,9 +9,17 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Random; import java.util.Random;
import forge.AllZone;
import forge.Card;
import forge.CardList;
import forge.MyRandom;
import forge.error.ErrorViewer;
/** /**
* <p>GenerateThemeDeck class.</p> * <p>
* * GenerateThemeDeck class.
* </p>
*
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
@@ -25,15 +27,19 @@ public class GenerateThemeDeck {
private BufferedReader in = null; private BufferedReader in = null;
/** /**
* <p>Constructor for GenerateThemeDeck.</p> * <p>
* Constructor for GenerateThemeDeck.
* </p>
*/ */
public GenerateThemeDeck() { public GenerateThemeDeck() {
} }
/** /**
* <p>getThemeNames.</p> * <p>
* * getThemeNames.
* </p>
*
* @return a {@link java.util.ArrayList} object. * @return a {@link java.util.ArrayList} object.
*/ */
public final ArrayList<String> getThemeNames() { public final ArrayList<String> getThemeNames() {
@@ -62,13 +68,17 @@ public class GenerateThemeDeck {
} }
/** /**
* <p>getThemeDeck.</p> * <p>
* * getThemeDeck.
* @param themeName a {@link java.lang.String} object. * </p>
* @param size a int. *
* @param themeName
* a {@link java.lang.String} object.
* @param size
* a int.
* @return a {@link forge.CardList} object. * @return a {@link forge.CardList} object.
*/ */
public CardList getThemeDeck(final String themeName, final int size) { public final CardList getThemeDeck(final String themeName, final int size) {
CardList tDeck = new CardList(); CardList tDeck = new CardList();
ArrayList<Grp> groups = new ArrayList<Grp>(); ArrayList<Grp> groups = new ArrayList<Grp>();
@@ -158,7 +168,9 @@ public class GenerateThemeDeck {
s = g.Cardnames.get(r.nextInt(cnSize)); s = g.Cardnames.get(r.nextInt(cnSize));
int lc = 0; int lc = 0;
while (cardCounts.get(s) >= g.MaxCnt || lc > size) // don't keep looping forever while (cardCounts.get(s) >= g.MaxCnt || lc > size) // don't keep
// looping
// forever
{ {
s = g.Cardnames.get(r.nextInt(cnSize)); s = g.Cardnames.get(r.nextInt(cnSize));
lc++; lc++;
@@ -177,22 +189,21 @@ public class GenerateThemeDeck {
} }
int numBLands = 0; int numBLands = 0;
if (bLandPercentage > 0) { // if theme explicitly defines this if (bLandPercentage > 0) { // if theme explicitly defines this
float p = (float) ((float) bLandPercentage * .01); float p = (float) ((float) bLandPercentage * .01);
numBLands = (int) (p * (float) size); numBLands = (int) (p * (float) size);
} else { // otherwise, just fill in the rest of the deck with basic lands } else { // otherwise, just fill in the rest of the deck with basic
// lands
numBLands = size - tDeck.size(); numBLands = size - tDeck.size();
} }
tmpDeck += "numBLands:" + numBLands + "\n"; tmpDeck += "numBLands:" + numBLands + "\n";
if (numBLands > 0) // attempt to optimize basic land counts according to color representation if (numBLands > 0) // attempt to optimize basic land counts according to
// color representation
{ {
CCnt[] clrCnts = {new CCnt("Plains", 0), CCnt[] clrCnts = { new CCnt("Plains", 0), new CCnt("Island", 0), new CCnt("Swamp", 0),
new CCnt("Island", 0), new CCnt("Mountain", 0), new CCnt("Forest", 0) };
new CCnt("Swamp", 0),
new CCnt("Mountain", 0),
new CCnt("Forest", 0)};
// count each instance of a color in mana costs // count each instance of a color in mana costs
// TODO count hybrid mana differently? // TODO count hybrid mana differently?
@@ -225,7 +236,8 @@ public class GenerateThemeDeck {
tmpDeck += "totalColor:" + totalColor + "\n"; tmpDeck += "totalColor:" + totalColor + "\n";
for (int i = 0; i < 5; i++) { for (int i = 0; i < 5; i++) {
if (clrCnts[i].Count > 0) { // calculate number of lands for each color if (clrCnts[i].Count > 0) { // calculate number of lands for
// each color
float p = (float) clrCnts[i].Count / (float) totalColor; float p = (float) clrCnts[i].Count / (float) totalColor;
int nLand = (int) ((float) numBLands * p); int nLand = (int) ((float) numBLands * p);
tmpDeck += "numLand-" + clrCnts[i].Color + ":" + nLand + "\n"; tmpDeck += "numLand-" + clrCnts[i].Color + ":" + nLand + "\n";
@@ -278,12 +290,14 @@ public class GenerateThemeDeck {
} }
/** /**
* <p>readLine.</p> * <p>
* * readLine.
* </p>
*
* @return a {@link java.lang.String} object. * @return a {@link java.lang.String} object.
*/ */
private String readLine() { private String readLine() {
//makes the checked exception, into an unchecked runtime exception // makes the checked exception, into an unchecked runtime exception
try { try {
String s = in.readLine(); String s = in.readLine();
if (s != null) { if (s != null) {
@@ -294,18 +308,30 @@ public class GenerateThemeDeck {
ErrorViewer.showError(ex); ErrorViewer.showError(ex);
throw new RuntimeException("GenerateThemeDeck : readLine error"); throw new RuntimeException("GenerateThemeDeck : readLine error");
} }
} //readLine(Card) } // readLine(Card)
/** /**
* *
* TODO Write javadoc for this type. * TODO Write javadoc for this type.
* *
*/ */
class CCnt { class CCnt {
/** The Color. */
public String Color; public String Color;
/** The Count. */
public int Count; public int Count;
public CCnt(String clr, int cnt) { /**
* Instantiates a new c cnt.
*
* @param clr
* the clr
* @param cnt
* the cnt
*/
public CCnt(final String clr, final int cnt) {
Color = clr; Color = clr;
Count = cnt; Count = cnt;
} }
@@ -314,12 +340,17 @@ public class GenerateThemeDeck {
/** /**
* *
* TODO Write javadoc for this type. * TODO Write javadoc for this type.
* *
*/ */
class Grp { class Grp {
/** The Cardnames. */
public ArrayList<String> Cardnames = new ArrayList<String>(); public ArrayList<String> Cardnames = new ArrayList<String>();
/** The Max cnt. */
public int MaxCnt; public int MaxCnt;
/** The Percentage. */
public int Percentage; public int Percentage;
} }
} }

View File

@@ -1,2 +1,2 @@
/** Forge Card Game */ /** Forge Card Game. */
package forge.deck.generate; package forge.deck.generate;

View File

@@ -1,2 +1,2 @@
/** Forge Card Game */ /** Forge Card Game. */
package forge.deck; package forge.deck;