deck generation moved to core

This commit is contained in:
Maxmtg
2013-11-21 20:59:18 +00:00
parent 2f85d50778
commit 482af12b67
24 changed files with 303 additions and 318 deletions

21
.gitattributes vendored
View File

@@ -60,7 +60,15 @@ forge-core/src/main/java/forge/deck/CardPool.java -text
forge-core/src/main/java/forge/deck/Deck.java svneol=native#text/plain forge-core/src/main/java/forge/deck/Deck.java svneol=native#text/plain
forge-core/src/main/java/forge/deck/DeckBase.java -text forge-core/src/main/java/forge/deck/DeckBase.java -text
forge-core/src/main/java/forge/deck/DeckFormat.java -text forge-core/src/main/java/forge/deck/DeckFormat.java -text
forge-core/src/main/java/forge/deck/DeckGroup.java -text
forge-core/src/main/java/forge/deck/DeckRecognizer.java -text
forge-core/src/main/java/forge/deck/DeckSection.java -text forge-core/src/main/java/forge/deck/DeckSection.java -text
forge-core/src/main/java/forge/deck/generation/DeckGenerator2Color.java svneol=native#text/plain
forge-core/src/main/java/forge/deck/generation/DeckGenerator3Color.java svneol=native#text/plain
forge-core/src/main/java/forge/deck/generation/DeckGenerator5Color.java svneol=native#text/plain
forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java -text
forge-core/src/main/java/forge/deck/generation/DeckGeneratorMonoColor.java -text
forge-core/src/main/java/forge/deck/generation/package-info.java svneol=native#text/plain
forge-core/src/main/java/forge/deck/io/DeckFileHeader.java -text forge-core/src/main/java/forge/deck/io/DeckFileHeader.java -text
forge-core/src/main/java/forge/deck/io/DeckSerializer.java -text forge-core/src/main/java/forge/deck/io/DeckSerializer.java -text
forge-core/src/main/java/forge/deck/io/OldDeckFileFormatException.java -text forge-core/src/main/java/forge/deck/io/OldDeckFileFormatException.java -text
@@ -15084,17 +15092,6 @@ forge-gui/src/main/java/forge/control/KeyboardShortcuts.java -text
forge-gui/src/main/java/forge/control/RestartUtil.java -text forge-gui/src/main/java/forge/control/RestartUtil.java -text
forge-gui/src/main/java/forge/control/package-info.java -text forge-gui/src/main/java/forge/control/package-info.java -text
forge-gui/src/main/java/forge/deck/CardCollections.java -text forge-gui/src/main/java/forge/deck/CardCollections.java -text
forge-gui/src/main/java/forge/deck/DeckGroup.java -text
forge-gui/src/main/java/forge/deck/DeckRecognizer.java -text
forge-gui/src/main/java/forge/deck/DeckgenUtil.java -text
forge-gui/src/main/java/forge/deck/generate/Generate2ColorDeck.java svneol=native#text/plain
forge-gui/src/main/java/forge/deck/generate/Generate3ColorDeck.java svneol=native#text/plain
forge-gui/src/main/java/forge/deck/generate/Generate5ColorDeck.java svneol=native#text/plain
forge-gui/src/main/java/forge/deck/generate/GenerateColoredDeckBase.java -text
forge-gui/src/main/java/forge/deck/generate/GenerateDeckUtil.java -text
forge-gui/src/main/java/forge/deck/generate/GenerateMonoColorDeck.java -text
forge-gui/src/main/java/forge/deck/generate/GenerateThemeDeck.java svneol=native#text/plain
forge-gui/src/main/java/forge/deck/generate/package-info.java svneol=native#text/plain
forge-gui/src/main/java/forge/deck/io/DeckGroupSerializer.java -text forge-gui/src/main/java/forge/deck/io/DeckGroupSerializer.java -text
forge-gui/src/main/java/forge/deck/io/DeckHtmlSerializer.java -text forge-gui/src/main/java/forge/deck/io/DeckHtmlSerializer.java -text
forge-gui/src/main/java/forge/deck/io/OldDeckParser.java -text forge-gui/src/main/java/forge/deck/io/OldDeckParser.java -text
@@ -15237,9 +15234,11 @@ forge-gui/src/main/java/forge/gui/UnsortedListModel.java -text
forge-gui/src/main/java/forge/gui/WrapLayout.java -text forge-gui/src/main/java/forge/gui/WrapLayout.java -text
forge-gui/src/main/java/forge/gui/bazaar/CBazaarUI.java -text forge-gui/src/main/java/forge/gui/bazaar/CBazaarUI.java -text
forge-gui/src/main/java/forge/gui/bazaar/VBazaarUI.java -text forge-gui/src/main/java/forge/gui/bazaar/VBazaarUI.java -text
forge-gui/src/main/java/forge/gui/deckchooser/DeckgenUtil.java -text
forge-gui/src/main/java/forge/gui/deckchooser/DecksComboBox.java -text forge-gui/src/main/java/forge/gui/deckchooser/DecksComboBox.java -text
forge-gui/src/main/java/forge/gui/deckchooser/DecksComboBoxEvent.java -text forge-gui/src/main/java/forge/gui/deckchooser/DecksComboBoxEvent.java -text
forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java -text forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java -text
forge-gui/src/main/java/forge/gui/deckchooser/GenerateThemeDeck.java svneol=native#text/plain
forge-gui/src/main/java/forge/gui/deckchooser/IDecksComboBoxListener.java -text forge-gui/src/main/java/forge/gui/deckchooser/IDecksComboBoxListener.java -text
forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java -text forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java -text
forge-gui/src/main/java/forge/gui/deckeditor/DeckImport.java -text forge-gui/src/main/java/forge/gui/deckeditor/DeckImport.java -text

View File

@@ -24,7 +24,7 @@ import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import forge.Singletons; import forge.card.CardDb;
import forge.card.ICardDatabase; import forge.card.ICardDatabase;
import forge.item.PaperCard; import forge.item.PaperCard;
@@ -167,9 +167,9 @@ public class DeckRecognizer {
private final ICardDatabase db; private final ICardDatabase db;
private Date recognizeCardsPrintedBefore = null; private Date recognizeCardsPrintedBefore = null;
public DeckRecognizer(boolean fromLatestSet) { public DeckRecognizer(boolean fromLatestSet, CardDb db) {
useLastSet = fromLatestSet; useLastSet = fromLatestSet;
db = Singletons.getMagicDb().getCommonCards(); this.db = db;
} }
public Token recognizeLine(final String rawLine) { public Token recognizeLine(final String rawLine) {

View File

@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package forge.deck.generate; package forge.deck.generation;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@@ -24,8 +24,8 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import forge.card.ColorSet; import forge.card.ColorSet;
import forge.card.ICardDatabase;
import forge.card.MagicColor; import forge.card.MagicColor;
import forge.deck.generate.GenerateDeckUtil.FilterCMC;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.util.ItemPoolView; import forge.util.ItemPoolView;
@@ -37,17 +37,17 @@ import forge.util.ItemPoolView;
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
public class Generate2ColorDeck extends GenerateColoredDeckBase { public class DeckGenerator2Color extends DeckGeneratorBase {
@Override protected final float getLandsPercentage() { return 0.39f; } @Override protected final float getLandsPercentage() { return 0.39f; }
@Override protected final float getCreatPercentage() { return 0.36f; } @Override protected final float getCreatPercentage() { return 0.36f; }
@Override protected final float getSpellPercentage() { return 0.25f; } @Override protected final float getSpellPercentage() { return 0.25f; }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final List<ImmutablePair<FilterCMC, Integer>> cmcRelativeWeights = Lists.newArrayList( final List<ImmutablePair<FilterCMC, Integer>> cmcRelativeWeights = Lists.newArrayList(
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(0, 2), 6), ImmutablePair.of(new FilterCMC(0, 2), 6),
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(3, 4), 4), ImmutablePair.of(new FilterCMC(3, 4), 4),
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(5, 6), 2), ImmutablePair.of(new FilterCMC(5, 6), 2),
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(7, 20), 1) ImmutablePair.of(new FilterCMC(7, 20), 1)
); );
// mana curve of the card pool // mana curve of the card pool
@@ -67,7 +67,8 @@ public class Generate2ColorDeck extends GenerateColoredDeckBase {
* @param clr2 * @param clr2
* a {@link java.lang.String} object. * a {@link java.lang.String} object.
*/ */
public Generate2ColorDeck(final String clr1, final String clr2) { public DeckGenerator2Color(ICardDatabase cardDb, final String clr1, final String clr2) {
super(cardDb);
int c1 = MagicColor.fromName(clr1); int c1 = MagicColor.fromName(clr1);
int c2 = MagicColor.fromName(clr2); int c2 = MagicColor.fromName(clr2);
@@ -96,7 +97,7 @@ public class Generate2ColorDeck extends GenerateColoredDeckBase {
tmpDeck.append(String.format("Adjusted deck size to: %d, should add %d land(s)%n", size - numLands, numLands)); tmpDeck.append(String.format("Adjusted deck size to: %d, should add %d land(s)%n", size - numLands, numLands));
// Add dual lands // Add dual lands
List<String> duals = GenerateDeckUtil.getDualLandList(colors); List<String> duals = getDualLandList();
for (String s : duals) { for (String s : duals) {
this.cardCounts.put(s, 0); this.cardCounts.put(s, 0);
} }

View File

@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package forge.deck.generate; package forge.deck.generation;
import java.util.List; import java.util.List;
@@ -24,8 +24,8 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import forge.card.ColorSet; import forge.card.ColorSet;
import forge.card.ICardDatabase;
import forge.card.MagicColor; import forge.card.MagicColor;
import forge.deck.generate.GenerateDeckUtil.FilterCMC;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.util.ItemPoolView; import forge.util.ItemPoolView;
import forge.util.MyRandom; import forge.util.MyRandom;
@@ -38,12 +38,12 @@ import forge.util.MyRandom;
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
public class Generate3ColorDeck extends GenerateColoredDeckBase { public class DeckGenerator3Color extends DeckGeneratorBase {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final List<ImmutablePair<FilterCMC, Integer>> cmcLevels = Lists.newArrayList( final List<ImmutablePair<FilterCMC, Integer>> cmcLevels = Lists.newArrayList(
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(0, 2), 12), ImmutablePair.of(new FilterCMC(0, 2), 12),
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(3, 5), 9), ImmutablePair.of(new FilterCMC(3, 5), 9),
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(6, 20), 3) ImmutablePair.of(new FilterCMC(6, 20), 3)
); );
/** /**
@@ -58,7 +58,8 @@ public class Generate3ColorDeck extends GenerateColoredDeckBase {
* @param clr3 * @param clr3
* a {@link java.lang.String} object. * a {@link java.lang.String} object.
*/ */
public Generate3ColorDeck(final String clr1, final String clr2, final String clr3) { public DeckGenerator3Color(ICardDatabase cardDb, final String clr1, final String clr2, final String clr3) {
super(cardDb);
int c1 = MagicColor.fromName(clr1); int c1 = MagicColor.fromName(clr1);
int c2 = MagicColor.fromName(clr2); int c2 = MagicColor.fromName(clr2);
int c3 = MagicColor.fromName(clr3); int c3 = MagicColor.fromName(clr3);
@@ -105,7 +106,7 @@ public class Generate3ColorDeck extends GenerateColoredDeckBase {
tmpDeck.append("numLands:").append(numLands).append("\n"); tmpDeck.append("numLands:").append(numLands).append("\n");
// Add dual lands // Add dual lands
List<String> duals = GenerateDeckUtil.getDualLandList(colors); List<String> duals = getDualLandList();
for (String s : duals) { for (String s : duals) {
this.cardCounts.put(s, 0); this.cardCounts.put(s, 0);
} }

View File

@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package forge.deck.generate; package forge.deck.generation;
import java.util.List; import java.util.List;
@@ -24,7 +24,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import forge.card.ColorSet; import forge.card.ColorSet;
import forge.deck.generate.GenerateDeckUtil.FilterCMC; import forge.card.ICardDatabase;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.util.ItemPoolView; import forge.util.ItemPoolView;
@@ -36,12 +36,12 @@ import forge.util.ItemPoolView;
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
public class Generate5ColorDeck extends GenerateColoredDeckBase { public class DeckGenerator5Color extends DeckGeneratorBase {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final List<ImmutablePair<FilterCMC, Integer>> cmcLevels = Lists.newArrayList( final List<ImmutablePair<FilterCMC, Integer>> cmcLevels = Lists.newArrayList(
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(0, 2), 3), ImmutablePair.of(new FilterCMC(0, 2), 3),
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(3, 5), 2), ImmutablePair.of(new FilterCMC(3, 5), 2),
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(6, 20), 1) ImmutablePair.of(new FilterCMC(6, 20), 1)
); );
// resulting mana curve of the card pool // resulting mana curve of the card pool
@@ -53,7 +53,8 @@ public class Generate5ColorDeck extends GenerateColoredDeckBase {
/** /**
* Instantiates a new generate5 color deck. * Instantiates a new generate5 color deck.
*/ */
public Generate5ColorDeck() { public DeckGenerator5Color(ICardDatabase cardDb) {
super(cardDb);
colors = ColorSet.fromMask(0).inverse(); colors = ColorSet.fromMask(0).inverse();
} }
@@ -68,7 +69,7 @@ public class Generate5ColorDeck extends GenerateColoredDeckBase {
tmpDeck.append("numLands:").append(numLands).append("\n"); tmpDeck.append("numLands:").append(numLands).append("\n");
// Add dual lands // Add dual lands
List<String> duals = GenerateDeckUtil.getDualLandList(colors); List<String> duals = getDualLandList();
for (String s : duals) { for (String s : duals) {
this.cardCounts.put(s, 0); this.cardCounts.put(s, 0);
} }

View File

@@ -15,8 +15,9 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package forge.deck.generate; package forge.deck.generation;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -31,14 +32,13 @@ import com.google.common.base.Predicates;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import forge.Singletons;
import forge.card.CardRules; import forge.card.CardRules;
import forge.card.CardRulesPredicates; import forge.card.CardRulesPredicates;
import forge.card.ColorSet; import forge.card.ColorSet;
import forge.card.ICardDatabase;
import forge.card.MagicColor; import forge.card.MagicColor;
import forge.deck.generate.GenerateDeckUtil.FilterCMC; import forge.card.mana.ManaCost;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.properties.ForgePreferences.FPref;
import forge.util.Aggregates; import forge.util.Aggregates;
import forge.util.ItemPool; import forge.util.ItemPool;
import forge.util.ItemPoolView; import forge.util.ItemPoolView;
@@ -52,13 +52,15 @@ import forge.util.MyRandom;
* @author Forge * @author Forge
* @version $Id: Generate2ColorDeck.java 14959 2012-03-28 14:03:43Z Chris H. $ * @version $Id: Generate2ColorDeck.java 14959 2012-03-28 14:03:43Z Chris H. $
*/ */
public abstract class GenerateColoredDeckBase { public abstract class DeckGeneratorBase {
protected final Random r = MyRandom.getRandom(); protected final Random r = MyRandom.getRandom();
protected final Map<String, Integer> cardCounts = new HashMap<String, Integer>(); protected final Map<String, Integer> cardCounts = new HashMap<String, Integer>();
protected int maxDuplicates; protected int maxDuplicates = 4;
protected boolean useArtifacts = true;
protected ColorSet colors; protected ColorSet colors;
protected final ItemPool<PaperCard> tDeck; protected final ItemPool<PaperCard> tDeck = new ItemPool<PaperCard>(PaperCard.class);
protected final ICardDatabase cardDb;
// 2-colored deck generator has its own constants. The rest works fine with these ones // 2-colored deck generator has its own constants. The rest works fine with these ones
protected float getLandsPercentage() { return 0.44f; } protected float getLandsPercentage() { return 0.44f; }
@@ -67,9 +69,15 @@ public abstract class GenerateColoredDeckBase {
StringBuilder tmpDeck = new StringBuilder(); StringBuilder tmpDeck = new StringBuilder();
public GenerateColoredDeckBase() { public DeckGeneratorBase(ICardDatabase cardDb) {
this.maxDuplicates = Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_SINGLETONS) ? 1 : 4; this.cardDb = cardDb;
tDeck = new ItemPool<PaperCard>(PaperCard.class); }
public void setSingleton(boolean singleton){
this.maxDuplicates = singleton ? 1 : 4;
}
public void setUseArtifacts(boolean value) {
this.useArtifacts = value;
} }
protected void addCreaturesAndSpells(int size, List<ImmutablePair<FilterCMC, Integer>> cmcLevels, boolean forAi) { protected void addCreaturesAndSpells(int size, List<ImmutablePair<FilterCMC, Integer>> cmcLevels, boolean forAi) {
@@ -130,8 +138,7 @@ public abstract class GenerateColoredDeckBase {
} while ((this.cardCounts.get(s) > 3) && (lc <= 20)); } while ((this.cardCounts.get(s) > 3) && (lc <= 20));
// not an error if looped too much - could play singleton mode, with 6 slots for 3 non-basic lands. // not an error if looped too much - could play singleton mode, with 6 slots for 3 non-basic lands.
PaperCard cp = Singletons.getMagicDb().getCommonCards().getCard(s); tDeck.add(cardDb.getCard(s, false));
tDeck.add(Singletons.getMagicDb().getCommonCards().getCard(cp.getName(), false));
final int n = this.cardCounts.get(s); final int n = this.cardCounts.get(s);
this.cardCounts.put(s, n + 1); this.cardCounts.put(s, n + 1);
@@ -157,20 +164,20 @@ public abstract class GenerateColoredDeckBase {
int landsLeft = cnt; int landsLeft = cnt;
for (Entry<String, Integer> c : clrCnts.entrySet()) { for (Entry<String, Integer> c : clrCnts.entrySet()) {
String color = c.getKey(); String basicLandName = c.getKey();
// calculate number of lands for each color // calculate number of lands for each color
final int nLand = Math.min(landsLeft, Math.round(cnt * c.getValue() / totalColor)); final int nLand = Math.min(landsLeft, Math.round(cnt * c.getValue() / totalColor));
tmpDeck.append("nLand-").append(color).append(":").append(nLand).append("\n"); tmpDeck.append("nLand-").append(basicLandName).append(":").append(nLand).append("\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
this.cardCounts.put(color, nLand); this.cardCounts.put(basicLandName, nLand);
PaperCard cp = Singletons.getMagicDb().getCommonCards().getCard(color); PaperCard cp = cardDb.getCard(basicLandName);
String basicLandSet = cp.getEdition(); String basicLandSet = cp.getEdition();
tDeck.add(Singletons.getMagicDb().getCommonCards().getCard(cp.getName(), basicLandSet), nLand); tDeck.add(cardDb.getCard(cp.getName(), basicLandSet), nLand);
landsLeft -= nLand; landsLeft -= nLand;
} }
} }
@@ -220,7 +227,7 @@ public abstract class GenerateColoredDeckBase {
final List<PaperCard> curvedRandomized = Lists.newArrayList(); final List<PaperCard> curvedRandomized = Lists.newArrayList();
for (PaperCard c : curved) { for (PaperCard c : curved) {
this.cardCounts.put(c.getName(), 0); this.cardCounts.put(c.getName(), 0);
curvedRandomized.add(Singletons.getMagicDb().getCommonCards().getCard(c.getName(), false)); curvedRandomized.add(cardDb.getCard(c.getName(), false));
} }
addSome(addOfThisCmc, curvedRandomized); addSome(addOfThisCmc, curvedRandomized);
@@ -231,13 +238,13 @@ public abstract class GenerateColoredDeckBase {
// start with all cards // start with all cards
// remove cards that generated decks don't like // remove cards that generated decks don't like
Predicate<CardRules> canPlay = forAi ? GenerateDeckUtil.AI_CAN_PLAY : GenerateDeckUtil.HUMAN_CAN_PLAY; Predicate<CardRules> canPlay = forAi ? AI_CAN_PLAY : HUMAN_CAN_PLAY;
Predicate<CardRules> hasColor = new GenerateDeckUtil.MatchColorIdentity(colors); Predicate<CardRules> hasColor = new MatchColorIdentity(colors);
if (!Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_ARTIFACTS)) { if (useArtifacts) {
hasColor = Predicates.or(hasColor, GenerateDeckUtil.COLORLESS_CARDS); hasColor = Predicates.or(hasColor, COLORLESS_CARDS);
} }
return Iterables.filter(Singletons.getMagicDb().getCommonCards().getAllCards(), Predicates.compose(Predicates.and(canPlay, hasColor), PaperCard.FN_GET_RULES)); return Iterables.filter(cardDb.getAllCards(), Predicates.compose(Predicates.and(canPlay, hasColor), PaperCard.FN_GET_RULES));
} }
protected static Map<String, Integer> countLands(ItemPool<PaperCard> outList) { protected static Map<String, Integer> countLands(ItemPool<PaperCard> outList) {
@@ -272,4 +279,127 @@ public abstract class GenerateColoredDeckBase {
final Integer boxed = map.get(key); final Integer boxed = map.get(key);
map.put(key, boxed == null ? delta : boxed.intValue() + delta); map.put(key, boxed == null ? delta : boxed.intValue() + delta);
} }
public static final Predicate<CardRules> AI_CAN_PLAY = new Predicate<CardRules>() {
@Override
public boolean apply(CardRules c) {
return !c.getAiHints().getRemAIDecks() && !c.getAiHints().getRemRandomDecks();
}
};
public static final Predicate<CardRules> HUMAN_CAN_PLAY = new Predicate<CardRules>() {
@Override
public boolean apply(CardRules c) {
return !c.getAiHints().getRemRandomDecks();
}
};
public static final Predicate<CardRules> COLORLESS_CARDS = new Predicate<CardRules>() {
@Override
public boolean apply(CardRules c) {
ManaCost mc = c.getManaCost();
return c.getColorIdentity().isColorless() && !mc.isNoCost();
}
};
public static class MatchColorIdentity implements Predicate<CardRules> {
private final ColorSet allowedColor;
public MatchColorIdentity(ColorSet color) {
allowedColor = color;
}
@Override
public boolean apply(CardRules subject) {
ManaCost mc = subject.getManaCost();
return !mc.isPureGeneric() && allowedColor.containsAllColorsFrom(subject.getColorIdentity().getColor());
//return mc.canBePaidWithAvaliable(allowedColor);
// return allowedColor.containsAllColorsFrom(mc.getColorProfile());
}
}
public static class FilterCMC implements Predicate<CardRules> {
private final int min;
private final int max;
public FilterCMC(int from, int to) {
min = from;
max = to;
}
@Override
public boolean apply(CardRules c) {
ManaCost mc = c.getManaCost();
int cmc = mc.getCMC();
return cmc >= min && cmc <= max && !mc.isNoCost();
}
}
private static Map<Integer, String[]> dualLands = new HashMap<Integer, String[]>();
static {
dualLands.put(MagicColor.WHITE | MagicColor.BLUE, new String[] { "Tundra", "Hallowed Fountain", "Flooded Strand" });
dualLands.put(MagicColor.BLACK | MagicColor.BLUE, new String[] { "Underground Sea", "Watery Grave", "Polluted Delta" });
dualLands.put(MagicColor.BLACK | MagicColor.RED, new String[] { "Badlands", "Blood Crypt", "Bloodstained Mire" });
dualLands.put(MagicColor.GREEN | MagicColor.RED, new String[] { "Taiga", "Stomping Ground", "Wooded Foothills" });
dualLands.put(MagicColor.GREEN | MagicColor.WHITE, new String[] { "Savannah", "Temple Garden", "Windswept Heath" });
dualLands.put(MagicColor.WHITE | MagicColor.BLACK, new String[] { "Scrubland", "Godless Shrine", "Marsh Flats" });
dualLands.put(MagicColor.BLUE | MagicColor.RED, new String[] { "Volcanic Island", "Steam Vents", "Scalding Tarn" });
dualLands.put(MagicColor.BLACK | MagicColor.GREEN, new String[] { "Bayou", "Overgrown Tomb", "Verdant Catacombs" });
dualLands.put(MagicColor.WHITE | MagicColor.RED, new String[] { "Plateau", "Sacred Foundry", "Arid Mesa" });
dualLands.put(MagicColor.GREEN | MagicColor.BLUE, new String[] { "Tropical Island", "Breeding Pool", "Misty Rainforest" });
}
/**
* Get list of dual lands for this color combo.
*
* @param color
* the color
* @return dual land names
*/
protected List<String> getDualLandList() {
final List<String> dLands = new ArrayList<String>();
if (colors.countColors() > 3) {
dLands.add("Rupture Spire");
dLands.add("Undiscovered Paradise");
}
if (colors.countColors() > 2) {
dLands.add("Evolving Wilds");
dLands.add("Terramorphic Expanse");
}
for (Entry<Integer, String[]> dual : dualLands.entrySet()) {
if (colors.hasAllColors(dual.getKey())) {
for (String s : dual.getValue()) {
dLands.add(s);
}
}
}
return dLands;
}
/**
* Get all dual lands that do not match this color combo.
*
* @param color
* the color
* @return dual land names
*/
protected List<String> getInverseDualLandList() {
final List<String> dLands = new ArrayList<String>();
for (Entry<Integer, String[]> dual : dualLands.entrySet()) {
if (!colors.hasAllColors(dual.getKey())) {
for (String s : dual.getValue()) {
dLands.add(s);
}
}
}
return dLands;
}
} }

View File

@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package forge.deck.generate; package forge.deck.generation;
import java.util.List; import java.util.List;
@@ -24,8 +24,8 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import forge.card.ColorSet; import forge.card.ColorSet;
import forge.card.ICardDatabase;
import forge.card.MagicColor; import forge.card.MagicColor;
import forge.deck.generate.GenerateDeckUtil.FilterCMC;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.util.ItemPoolView; import forge.util.ItemPoolView;
@@ -37,17 +37,17 @@ import forge.util.ItemPoolView;
* @author Forge * @author Forge
* @version $Id: Generate2ColorDeck.java 19765 2013-02-20 03:01:37Z myk $ * @version $Id: Generate2ColorDeck.java 19765 2013-02-20 03:01:37Z myk $
*/ */
public class GenerateMonoColorDeck extends GenerateColoredDeckBase { public class DeckGeneratorMonoColor extends DeckGeneratorBase {
@Override protected final float getLandsPercentage() { return 0.39f; } @Override protected final float getLandsPercentage() { return 0.39f; }
@Override protected final float getCreatPercentage() { return 0.36f; } @Override protected final float getCreatPercentage() { return 0.36f; }
@Override protected final float getSpellPercentage() { return 0.25f; } @Override protected final float getSpellPercentage() { return 0.25f; }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final List<ImmutablePair<FilterCMC, Integer>> cmcLevels = Lists.newArrayList( final List<ImmutablePair<FilterCMC, Integer>> cmcLevels = Lists.newArrayList(
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(0, 2), 10), ImmutablePair.of(new FilterCMC(0, 2), 10),
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(3, 4), 8), ImmutablePair.of(new FilterCMC(3, 4), 8),
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(5, 6), 5), ImmutablePair.of(new FilterCMC(5, 6), 5),
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(7, 20), 3) ImmutablePair.of(new FilterCMC(7, 20), 3)
); );
// mana curve of the card pool // mana curve of the card pool
@@ -67,7 +67,8 @@ public class GenerateMonoColorDeck extends GenerateColoredDeckBase {
* @param clr2 * @param clr2
* a {@link java.lang.String} object. * a {@link java.lang.String} object.
*/ */
public GenerateMonoColorDeck(final String clr1) { public DeckGeneratorMonoColor(ICardDatabase cardDb, final String clr1) {
super(cardDb);
if (MagicColor.fromName(clr1) == 0) { if (MagicColor.fromName(clr1) == 0) {
int color1 = r.nextInt(5); int color1 = r.nextInt(5);
colors = ColorSet.fromMask(MagicColor.WHITE << color1); colors = ColorSet.fromMask(MagicColor.WHITE << color1);

View File

@@ -0,0 +1,3 @@
/** Forge Card Game. */
package forge.deck.generation;

View File

@@ -1,173 +0,0 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.deck.generate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.google.common.base.Predicate;
import forge.card.CardRules;
import forge.card.ColorSet;
import forge.card.MagicColor;
import forge.card.mana.ManaCost;
/**
* <p>
* GenerateDeckUtil class.
* </p>
*
* @author Forge
* @version $Id: GenerateDeckUtil.java 10011 2011-08-28 12:20:52Z Sloth $
*/
public class GenerateDeckUtil {
public static final Predicate<CardRules> AI_CAN_PLAY = new Predicate<CardRules>() {
@Override
public boolean apply(CardRules c) {
return !c.getAiHints().getRemAIDecks() && !c.getAiHints().getRemRandomDecks();
}
};
public static final Predicate<CardRules> HUMAN_CAN_PLAY = new Predicate<CardRules>() {
@Override
public boolean apply(CardRules c) {
return !c.getAiHints().getRemRandomDecks();
}
};
public static final Predicate<CardRules> COLORLESS_CARDS = new Predicate<CardRules>() {
@Override
public boolean apply(CardRules c) {
ManaCost mc = c.getManaCost();
return c.getColorIdentity().isColorless() && !mc.isNoCost();
}
};
public static class MatchColorIdentity implements Predicate<CardRules> {
private final ColorSet allowedColor;
public MatchColorIdentity(ColorSet color) {
allowedColor = color;
}
@Override
public boolean apply(CardRules subject) {
ManaCost mc = subject.getManaCost();
return !mc.isPureGeneric() && allowedColor.containsAllColorsFrom(subject.getColorIdentity().getColor());
//return mc.canBePaidWithAvaliable(allowedColor);
// return allowedColor.containsAllColorsFrom(mc.getColorProfile());
}
}
public static class FilterCMC implements Predicate<CardRules> {
private final int min;
private final int max;
public FilterCMC(int from, int to) {
min = from;
max = to;
}
@Override
public boolean apply(CardRules c) {
ManaCost mc = c.getManaCost();
int cmc = mc.getCMC();
return cmc >= min && cmc <= max && !mc.isNoCost();
}
}
private static Map<Integer, String[]> dualLands = new HashMap<Integer, String[]>();
static {
dualLands.put(MagicColor.WHITE | MagicColor.BLUE, new String[] { "Tundra", "Hallowed Fountain", "Flooded Strand",
"Azorius Guildgate" });
dualLands.put(MagicColor.BLACK | MagicColor.BLUE, new String[] { "Underground Sea", "Watery Grave",
"Polluted Delta" });
dualLands.put(MagicColor.BLACK | MagicColor.RED, new String[] { "Badlands", "Blood Crypt", "Bloodstained Mire",
"Rakdos Guildgate" });
dualLands.put(MagicColor.GREEN | MagicColor.RED, new String[] { "Taiga", "Stomping Ground", "Wooded Foothills" });
dualLands.put(MagicColor.GREEN | MagicColor.WHITE, new String[] { "Savannah", "Temple Garden", "Windswept Heath",
"Selesnya Guildgate" });
dualLands.put(MagicColor.WHITE | MagicColor.BLACK, new String[] { "Scrubland", "Godless Shrine", "Marsh Flats" });
dualLands.put(MagicColor.BLUE | MagicColor.RED, new String[] { "Volcanic Island", "Steam Vents", "Scalding Tarn",
"Izzet Guildgate" });
dualLands.put(MagicColor.BLACK | MagicColor.GREEN, new String[] { "Bayou", "Overgrown Tomb", "Verdant Catacombs",
"Golgari Guildgate" });
dualLands.put(MagicColor.WHITE | MagicColor.RED, new String[] { "Plateau", "Sacred Foundry", "Arid Mesa" });
dualLands.put(MagicColor.GREEN | MagicColor.BLUE, new String[] { "Tropical Island", "Breeding Pool",
"Misty Rainforest" });
}
/**
* Get list of dual lands for this color combo.
*
* @param color
* the color
* @return dual land names
*/
public static List<String> getDualLandList(final ColorSet color) {
final List<String> dLands = new ArrayList<String>();
if (color.countColors() > 3) {
dLands.add("Rupture Spire");
dLands.add("Undiscovered Paradise");
}
if (color.countColors() > 2) {
dLands.add("Evolving Wilds");
dLands.add("Terramorphic Expanse");
}
for (Entry<Integer, String[]> dual : dualLands.entrySet()) {
if (color.hasAllColors(dual.getKey())) {
for (String s : dual.getValue()) {
dLands.add(s);
}
}
}
return dLands;
}
/**
* Get all dual lands that do not match this color combo.
*
* @param color
* the color
* @return dual land names
*/
public static List<String> getInverseDualLandList(final ColorSet color) {
final List<String> dLands = new ArrayList<String>();
for (Entry<Integer, String[]> dual : dualLands.entrySet()) {
if (!color.hasAllColors(dual.getKey())) {
for (String s : dual.getValue()) {
dLands.add(s);
}
}
}
return dLands;
}
}

View File

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

View File

@@ -17,7 +17,7 @@ import com.google.common.collect.Iterables;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import forge.Singletons; import forge.Singletons;
import forge.Constant.Preferences;
import forge.card.CardAiHints; import forge.card.CardAiHints;
import forge.card.CardEdition; import forge.card.CardEdition;
import forge.card.CardEditionPredicates; import forge.card.CardEditionPredicates;
@@ -31,20 +31,21 @@ import forge.card.mana.ManaCostShard;
import forge.deck.CardPool; import forge.deck.CardPool;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckSection; import forge.deck.DeckSection;
import forge.deck.generate.GenerateDeckUtil; import forge.deck.generation.DeckGeneratorBase;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.item.IPaperCard; import forge.item.IPaperCard;
import forge.util.ItemPoolView;
import forge.util.MyRandom; import forge.util.MyRandom;
/** /**
* Limited format deck. * Limited format deck.
* *
*/ */
public class LimitedDeckBuilder { public class LimitedDeckBuilder extends DeckGeneratorBase{
private int numSpellsNeeded = 22; private int numSpellsNeeded = 22;
private int landsNeeded = 18; private int landsNeeded = 18;
private ColorSet colors;
private final DeckColors deckColors; private final DeckColors deckColors;
private Predicate<CardRules> hasColor; private Predicate<CardRules> hasColor;
private final List<PaperCard> availableList; private final List<PaperCard> availableList;
@@ -59,6 +60,8 @@ public class LimitedDeckBuilder {
private static ReadDraftRankings draftRankings = new ReadDraftRankings(); private static ReadDraftRankings draftRankings = new ReadDraftRankings();
private static final boolean logToConsole = false;
/** /**
* *
* Constructor. * Constructor.
@@ -69,6 +72,7 @@ public class LimitedDeckBuilder {
* Chosen colors. * Chosen colors.
*/ */
public LimitedDeckBuilder(List<PaperCard> dList, DeckColors pClrs) { public LimitedDeckBuilder(List<PaperCard> dList, DeckColors pClrs) {
super(Singletons.getMagicDb().getCommonCards());
this.availableList = dList; this.availableList = dList;
this.deckColors = pClrs; this.deckColors = pClrs;
this.colors = pClrs.getChosenColors(); this.colors = pClrs.getChosenColors();
@@ -93,6 +97,11 @@ public class LimitedDeckBuilder {
this(list, new DeckColors()); this(list, new DeckColors());
} }
@Override
public ItemPoolView<PaperCard> getDeck(int size, boolean forAi) {
return buildDeck().getMain();
}
/** /**
* <p> * <p>
* buildDeck. * buildDeck.
@@ -102,7 +111,7 @@ public class LimitedDeckBuilder {
*/ */
public Deck buildDeck() { public Deck buildDeck() {
// 1. Prepare // 1. Prepare
hasColor = Predicates.or(new GenerateDeckUtil.MatchColorIdentity(colors), GenerateDeckUtil.COLORLESS_CARDS); hasColor = Predicates.or(new MatchColorIdentity(colors), COLORLESS_CARDS);
colorList = Iterables.filter(aiPlayables, Predicates.compose(hasColor, PaperCard.FN_GET_RULES)); colorList = Iterables.filter(aiPlayables, Predicates.compose(hasColor, PaperCard.FN_GET_RULES));
onColorCreatures = Iterables.filter(colorList, onColorCreatures = Iterables.filter(colorList,
Predicates.compose(CardRulesPredicates.Presets.IS_CREATURE, PaperCard.FN_GET_RULES)); Predicates.compose(CardRulesPredicates.Presets.IS_CREATURE, PaperCard.FN_GET_RULES));
@@ -144,7 +153,7 @@ public class LimitedDeckBuilder {
deckList.add(c); deckList.add(c);
getAiPlayables().remove(c); getAiPlayables().remove(c);
landsNeeded--; landsNeeded--;
if (Preferences.DEV_MODE) { if (logToConsole) {
System.out.println("Low CMC: " + c.getName()); System.out.println("Low CMC: " + c.getName());
} }
} }
@@ -178,7 +187,7 @@ public class LimitedDeckBuilder {
CardPool cp = result.getOrCreate(DeckSection.Sideboard); CardPool cp = result.getOrCreate(DeckSection.Sideboard);
cp.add(aiPlayables); cp.add(aiPlayables);
cp.add(availableList); cp.add(availableList);
if (Preferences.DEV_MODE) { if (logToConsole) {
debugFinalDeck(); debugFinalDeck();
} }
return result; return result;
@@ -301,7 +310,7 @@ public class LimitedDeckBuilder {
// calculate number of lands for each color // calculate number of lands for each color
final float p = (float) clrCnts[i] / (float) totalColor; final float p = (float) clrCnts[i] / (float) totalColor;
final int nLand = Math.round(landsNeeded * p); // desired truncation to int final int nLand = Math.round(landsNeeded * p); // desired truncation to int
if (Preferences.DEV_MODE) { if (logToConsole) {
System.out.printf("Basics[%s]: %d/%d = %f%% = %d cards%n", MagicColor.Constant.BASIC_LANDS.get(i), clrCnts[i], totalColor, 100*p, nLand); System.out.printf("Basics[%s]: %d/%d = %f%% = %d cards%n", MagicColor.Constant.BASIC_LANDS.get(i), clrCnts[i], totalColor, 100*p, nLand);
} }
@@ -359,7 +368,7 @@ public class LimitedDeckBuilder {
* Add non-basic lands to the deck. * Add non-basic lands to the deck.
*/ */
private void addNonBasicLands() { private void addNonBasicLands() {
List<String> inverseDuals = GenerateDeckUtil.getInverseDualLandList(colors); List<String> inverseDuals = getInverseDualLandList();
Iterable<PaperCard> lands = Iterables.filter(aiPlayables, Iterable<PaperCard> lands = Iterables.filter(aiPlayables,
Predicates.compose(CardRulesPredicates.Presets.IS_NONBASIC_LAND, PaperCard.FN_GET_RULES)); Predicates.compose(CardRulesPredicates.Presets.IS_NONBASIC_LAND, PaperCard.FN_GET_RULES));
List<Pair<Double, PaperCard>> ranked = rankCards(lands); List<Pair<Double, PaperCard>> ranked = rankCards(lands);
@@ -374,7 +383,7 @@ public class LimitedDeckBuilder {
deckList.add(bean.getValue()); deckList.add(bean.getValue());
aiPlayables.remove(bean.getValue()); aiPlayables.remove(bean.getValue());
landsNeeded--; landsNeeded--;
if (Preferences.DEV_MODE) { if (logToConsole) {
System.out.println("NonBasicLand[" + landsNeeded + "]:" + bean.getValue().getName()); System.out.println("NonBasicLand[" + landsNeeded + "]:" + bean.getValue().getName());
} }
} }
@@ -401,8 +410,8 @@ public class LimitedDeckBuilder {
} }
} }
hasColor = Predicates.or(new GenerateDeckUtil.MatchColorIdentity(colors), hasColor = Predicates.or(new DeckGeneratorBase.MatchColorIdentity(colors),
GenerateDeckUtil.COLORLESS_CARDS); DeckGeneratorBase.COLORLESS_CARDS);
Iterable<PaperCard> threeColorList = Iterables.filter(aiPlayables, Iterable<PaperCard> threeColorList = Iterables.filter(aiPlayables,
Predicates.compose(hasColor, PaperCard.FN_GET_RULES)); Predicates.compose(hasColor, PaperCard.FN_GET_RULES));
ranked = rankCards(threeColorList); ranked = rankCards(threeColorList);
@@ -411,7 +420,7 @@ public class LimitedDeckBuilder {
deckList.add(bean.getValue()); deckList.add(bean.getValue());
aiPlayables.remove(bean.getValue()); aiPlayables.remove(bean.getValue());
nCards--; nCards--;
if (Preferences.DEV_MODE) { if (logToConsole) {
System.out.println("Third Color[" + nCards + "]:" + bean.getValue().getName() + "(" System.out.println("Third Color[" + nCards + "]:" + bean.getValue().getName() + "("
+ bean.getValue().getRules().getManaCost() + ")"); + bean.getValue().getRules().getManaCost() + ")");
} }
@@ -436,7 +445,7 @@ public class LimitedDeckBuilder {
deckList.add(bean.getValue()); deckList.add(bean.getValue());
aiPlayables.remove(bean.getValue()); aiPlayables.remove(bean.getValue());
nCards--; nCards--;
if (Preferences.DEV_MODE) { if (logToConsole) {
System.out.println("Random[" + nCards + "]:" + bean.getValue().getName() + "(" System.out.println("Random[" + nCards + "]:" + bean.getValue().getName() + "("
+ bean.getValue().getRules().getManaCost() + ")"); + bean.getValue().getRules().getManaCost() + ")");
} }
@@ -460,7 +469,7 @@ public class LimitedDeckBuilder {
deckList.add(cardToAdd); deckList.add(cardToAdd);
num--; num--;
getAiPlayables().remove(cardToAdd); getAiPlayables().remove(cardToAdd);
if (Preferences.DEV_MODE) { if (logToConsole) {
System.out.println("Others[" + num + "]:" + cardToAdd.getName() + " (" System.out.println("Others[" + num + "]:" + cardToAdd.getName() + " ("
+ cardToAdd.getRules().getManaCost() + ")"); + cardToAdd.getRules().getManaCost() + ")");
} }
@@ -486,7 +495,7 @@ public class LimitedDeckBuilder {
if (hints != null && hints.getType() != DeckHints.Type.NONE) { if (hints != null && hints.getType() != DeckHints.Type.NONE) {
Iterable<PaperCard> onColor = Iterables.filter(aiPlayables, Predicates.compose(hasColor, PaperCard.FN_GET_RULES)); Iterable<PaperCard> onColor = Iterables.filter(aiPlayables, Predicates.compose(hasColor, PaperCard.FN_GET_RULES));
List<PaperCard> comboCards = hints.filter(onColor); List<PaperCard> comboCards = hints.filter(onColor);
if (Preferences.DEV_MODE) { if (logToConsole) {
System.out.println("Found " + comboCards.size() + " cards for " + cardToAdd.getName()); System.out.println("Found " + comboCards.size() + " cards for " + cardToAdd.getName());
} }
for (Pair<Double, PaperCard> comboBean : rankCards(comboCards)) { for (Pair<Double, PaperCard> comboBean : rankCards(comboCards)) {
@@ -535,7 +544,7 @@ public class LimitedDeckBuilder {
comboCards.addAll(hints.filter(deckList)); comboCards.addAll(hints.filter(deckList));
} }
if (comboCards.isEmpty()) { if (comboCards.isEmpty()) {
if (Preferences.DEV_MODE) { if (logToConsole) {
System.out.println("No combo cards found for " + card.getName() + ", removing it."); System.out.println("No combo cards found for " + card.getName() + ", removing it.");
} }
it.remove(); it.remove();
@@ -546,7 +555,7 @@ public class LimitedDeckBuilder {
numOthers++; numOthers++;
} }
} else { } else {
if (Preferences.DEV_MODE) { if (logToConsole) {
System.out.println("Found " + comboCards.size() + " cards for " + card.getName()); System.out.println("Found " + comboCards.size() + " cards for " + card.getName());
} }
} }
@@ -580,7 +589,7 @@ public class LimitedDeckBuilder {
deckList.add(c); deckList.add(c);
num--; num--;
getAiPlayables().remove(c); getAiPlayables().remove(c);
if (Preferences.DEV_MODE) { if (logToConsole) {
System.out.println("Creature[" + num + "]:" + c.getName() + " (" + c.getRules().getManaCost() + ")"); System.out.println("Creature[" + num + "]:" + c.getName() + " (" + c.getRules().getManaCost() + ")");
} }
num = addDeckHintsCards(c, num); num = addDeckHintsCards(c, num);
@@ -645,12 +654,12 @@ public class LimitedDeckBuilder {
num--; num--;
getAiPlayables().remove(c); getAiPlayables().remove(c);
creatureCosts.put(cmc, creatureCosts.get(cmc) + 1); creatureCosts.put(cmc, creatureCosts.get(cmc) + 1);
if (Preferences.DEV_MODE) { if (logToConsole) {
System.out.println("Creature[" + num + "]:" + c.getName() + " (" + c.getRules().getManaCost() + ")"); System.out.println("Creature[" + num + "]:" + c.getName() + " (" + c.getRules().getManaCost() + ")");
} }
num = addDeckHintsCards(c, num); num = addDeckHintsCards(c, num);
} else { } else {
if (Preferences.DEV_MODE) { if (logToConsole) {
System.out.println(c.getName() + " not added because CMC " + c.getRules().getManaCost().getCMC() System.out.println(c.getName() + " not added because CMC " + c.getRules().getManaCost().getCMC()
+ " has " + currentAtCmc + " already."); + " has " + currentAtCmc + " already.");
} }

View File

@@ -1,4 +1,4 @@
package forge.deck; package forge.gui.deckchooser;
import java.awt.Toolkit; import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.StringSelection;
@@ -15,14 +15,17 @@ import com.google.common.base.Predicate;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import forge.Singletons; import forge.Singletons;
import forge.deck.generate.Generate2ColorDeck; import forge.card.CardDb;
import forge.deck.generate.Generate3ColorDeck; import forge.deck.CardPool;
import forge.deck.generate.Generate5ColorDeck; import forge.deck.Deck;
import forge.deck.generate.GenerateColoredDeckBase; import forge.deck.DeckSection;
import forge.deck.generate.GenerateMonoColorDeck; import forge.deck.generation.DeckGenerator2Color;
import forge.deck.generate.GenerateThemeDeck; import forge.deck.generation.DeckGenerator3Color;
import forge.deck.generation.DeckGenerator5Color;
import forge.deck.generation.DeckGeneratorBase;
import forge.deck.generation.DeckGeneratorMonoColor;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.item.PreconDeck; import forge.properties.ForgePreferences.FPref;
import forge.quest.QuestController; import forge.quest.QuestController;
import forge.quest.QuestEvent; import forge.quest.QuestEvent;
import forge.quest.QuestEventChallenge; import forge.quest.QuestEventChallenge;
@@ -60,19 +63,20 @@ public class DeckgenUtil {
final Deck deck; final Deck deck;
String deckName = null; String deckName = null;
GenerateColoredDeckBase gen = null; DeckGeneratorBase gen = null;
CardDb cardDb = Singletons.getMagicDb().getCommonCards();
if (selection.size() == 1) { if (selection.size() == 1) {
gen = new GenerateMonoColorDeck(selection.get(0)); gen = new DeckGeneratorMonoColor(cardDb, selection.get(0));
} else if (selection.size() == 2) { } else if (selection.size() == 2) {
gen = new Generate2ColorDeck(selection.get(0), selection.get(1)); gen = new DeckGenerator2Color(cardDb, selection.get(0), selection.get(1));
} else if (selection.size() == 3) { } else if (selection.size() == 3) {
gen = new Generate3ColorDeck(selection.get(0), selection.get(1), selection.get(2)); gen = new DeckGenerator3Color(cardDb, selection.get(0), selection.get(1), selection.get(2));
} else { } else {
gen = new Generate5ColorDeck(); gen = new DeckGenerator5Color(cardDb);
deckName = "5 colors"; deckName = "5 colors";
} }
gen.setSingleton(Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_SINGLETONS));
gen.setUseArtifacts(Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_ARTIFACTS));
ItemPoolView<PaperCard> cards = gen == null ? null : gen.getDeck(60, forAi); ItemPoolView<PaperCard> cards = gen == null ? null : gen.getDeck(60, forAi);
if(null == deckName) if(null == deckName)
@@ -92,6 +96,8 @@ public class DeckgenUtil {
public static Deck buildThemeDeck(final String selection) { public static Deck buildThemeDeck(final String selection) {
final GenerateThemeDeck gen = new GenerateThemeDeck(); final GenerateThemeDeck gen = new GenerateThemeDeck();
final Deck deck = new Deck(); final Deck deck = new Deck();
gen.setSingleton(Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_SINGLETONS));
gen.setUseArtifacts(Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_ARTIFACTS));
deck.getMain().addAll(gen.getThemeDeck(selection, 60)); deck.getMain().addAll(gen.getThemeDeck(selection, 60));
return deck; return deck;
@@ -163,13 +169,6 @@ public class DeckgenUtil {
return allDecks.get(name); return allDecks.get(name);
} }
public static Deck getRandomPreconDeck() {
final IStorage<PreconDeck> allDecks = QuestController.getPrecons();
final int rand = (int) (Math.floor(Math.random() * allDecks.size()));
final String name = allDecks.getItemNames().toArray(new String[0])[rand];
return allDecks.get(name).getDeck();
}
/** @return {@link forge.deck.Deck} */ /** @return {@link forge.deck.Deck} */
public static Deck getRandomQuestDeck() { public static Deck getRandomQuestDeck() {
final List<Deck> allQuestDecks = new ArrayList<Deck>(); final List<Deck> allQuestDecks = new ArrayList<Deck>();

View File

@@ -22,8 +22,6 @@ import org.apache.commons.lang3.ArrayUtils;
import forge.Command; import forge.Command;
import forge.Singletons; import forge.Singletons;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckgenUtil;
import forge.deck.generate.GenerateThemeDeck;
import forge.game.RegisteredPlayer; import forge.game.RegisteredPlayer;
import forge.gui.MouseUtil; import forge.gui.MouseUtil;
import forge.gui.MouseUtil.MouseCursor; import forge.gui.MouseUtil.MouseCursor;

View File

@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package forge.deck.generate; package forge.gui.deckchooser;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
@@ -23,6 +23,7 @@ import java.util.List;
import java.util.Random; import java.util.Random;
import forge.Singletons; import forge.Singletons;
import forge.deck.generation.DeckGeneratorBase;
import forge.error.BugReporter; import forge.error.BugReporter;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.util.FileUtil; import forge.util.FileUtil;
@@ -37,7 +38,7 @@ import forge.util.MyRandom;
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
public class GenerateThemeDeck extends GenerateColoredDeckBase { public class GenerateThemeDeck extends DeckGeneratorBase {
private int basicLandPercentage = 0; private int basicLandPercentage = 0;
private boolean testing = false; private boolean testing = false;
@@ -47,6 +48,7 @@ public class GenerateThemeDeck extends GenerateColoredDeckBase {
* </p> * </p>
*/ */
public GenerateThemeDeck() { public GenerateThemeDeck() {
super(Singletons.getMagicDb().getCommonCards());
this.maxDuplicates = 4; this.maxDuplicates = 4;
} }

View File

@@ -38,6 +38,7 @@ import javax.swing.text.ElementIterator;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.Singletons;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckBase; import forge.deck.DeckBase;
import forge.deck.DeckRecognizer; import forge.deck.DeckRecognizer;
@@ -221,7 +222,7 @@ public class DeckImport<TItem extends InventoryItem, TModel extends DeckBase> ex
final ElementIterator it = new ElementIterator(this.txtInput.getDocument().getDefaultRootElement()); final ElementIterator it = new ElementIterator(this.txtInput.getDocument().getDefaultRootElement());
Element e; Element e;
DeckRecognizer recognizer = new DeckRecognizer(newEditionCheck.isSelected()); DeckRecognizer recognizer = new DeckRecognizer(newEditionCheck.isSelected(), Singletons.getMagicDb().getCommonCards());
if(dateTimeCheck.isSelected()) if(dateTimeCheck.isSelected())
recognizer.setDateConstraint(monthDropdown.getSelectedIndex(), yearDropdown.getSelectedItem()); recognizer.setDateConstraint(monthDropdown.getSelectedIndex(), yearDropdown.getSelectedItem());

View File

@@ -6,13 +6,16 @@ import com.google.common.collect.Iterables;
import forge.Command; import forge.Command;
import forge.Singletons; import forge.Singletons;
import forge.card.CardDb;
import forge.card.CardRulesPredicates; import forge.card.CardRulesPredicates;
import forge.card.MagicColor; import forge.card.MagicColor;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckBase; import forge.deck.DeckBase;
import forge.deck.generate.Generate2ColorDeck; import forge.deck.generation.DeckGenerator2Color;
import forge.deck.generate.Generate3ColorDeck; import forge.deck.generation.DeckGenerator3Color;
import forge.deck.generate.Generate5ColorDeck; import forge.deck.generation.DeckGenerator5Color;
import forge.deck.generation.DeckGeneratorBase;
import forge.deck.generation.DeckGeneratorMonoColor;
import forge.gui.deckeditor.CDeckEditorUI; import forge.gui.deckeditor.CDeckEditorUI;
import forge.gui.deckeditor.SEditorIO; import forge.gui.deckeditor.SEditorIO;
import forge.gui.deckeditor.views.VDeckgen; import forge.gui.deckeditor.views.VDeckgen;
@@ -20,6 +23,7 @@ import forge.gui.framework.ICDoc;
import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FLabel;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.item.InventoryItem; import forge.item.InventoryItem;
import forge.properties.ForgePreferences.FPref;
import forge.util.Aggregates; import forge.util.Aggregates;
@@ -100,22 +104,22 @@ public enum CDeckgen implements ICDoc {
if (!SEditorIO.confirmSaveChanges(Singletons.getControl().getCurrentScreen())) { return; } if (!SEditorIO.confirmSaveChanges(Singletons.getControl().getCurrentScreen())) { return; }
final Deck genConstructed = new Deck(); final Deck genConstructed = new Deck();
CardDb cardDb = Singletons.getMagicDb().getCommonCards();
DeckGeneratorBase gen = null;
switch (colorCount0) { switch (colorCount0) {
case 2: case 1: gen = new DeckGeneratorMonoColor(cardDb, null); break;
genConstructed.getMain().addAll((new Generate2ColorDeck(null, null)).getDeck(60, false)); case 2: gen = new DeckGenerator2Color(cardDb, null, null); break;
break; case 3: gen = new DeckGenerator3Color(cardDb, null, null, null); break;
case 3: case 5: gen = new DeckGenerator5Color(cardDb); break;
genConstructed.getMain().addAll((new Generate3ColorDeck(null, null, null)).getDeck(60, false));
break;
case 5:
genConstructed.getMain().addAll((new Generate5ColorDeck()).getDeck(60, false));
break;
default:
} }
final ACEditorBase<TItem, TModel> ed = (ACEditorBase<TItem, TModel>) if( null != gen ) {
CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController(); gen.setSingleton(Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_SINGLETONS));
gen.setUseArtifacts(Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_ARTIFACTS));
genConstructed.getMain().addAll(gen.getDeck(60, false));
}
final ACEditorBase<TItem, TModel> ed = (ACEditorBase<TItem, TModel>) CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController();
ed.getDeckController().setModel((TModel) genConstructed); ed.getDeckController().setModel((TModel) genConstructed);
} }

View File

@@ -15,13 +15,13 @@ import forge.Command;
import forge.FThreads; import forge.FThreads;
import forge.Singletons; import forge.Singletons;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckgenUtil;
import forge.game.GameType; import forge.game.GameType;
import forge.game.Match; import forge.game.Match;
import forge.game.RegisteredPlayer; import forge.game.RegisteredPlayer;
import forge.gauntlet.GauntletData; import forge.gauntlet.GauntletData;
import forge.gauntlet.GauntletIO; import forge.gauntlet.GauntletIO;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
import forge.gui.deckchooser.DeckgenUtil;
import forge.gui.framework.ICDoc; import forge.gui.framework.ICDoc;
import forge.net.FServer; import forge.net.FServer;
import forge.net.Lobby; import forge.net.Lobby;

View File

@@ -14,14 +14,14 @@ import forge.Command;
import forge.FThreads; import forge.FThreads;
import forge.Singletons; import forge.Singletons;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckgenUtil;
import forge.deck.DeckgenUtil.DeckTypes;
import forge.game.GameType; import forge.game.GameType;
import forge.game.Match; import forge.game.Match;
import forge.game.RegisteredPlayer; import forge.game.RegisteredPlayer;
import forge.gauntlet.GauntletData; import forge.gauntlet.GauntletData;
import forge.gauntlet.GauntletIO; import forge.gauntlet.GauntletIO;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
import forge.gui.deckchooser.DeckgenUtil;
import forge.gui.deckchooser.DeckgenUtil.DeckTypes;
import forge.gui.framework.ICDoc; import forge.gui.framework.ICDoc;
import forge.net.FServer; import forge.net.FServer;
import forge.net.Lobby; import forge.net.Lobby;

View File

@@ -15,12 +15,12 @@ import forge.FThreads;
import forge.Singletons; import forge.Singletons;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckSection; import forge.deck.DeckSection;
import forge.deck.DeckgenUtil;
import forge.game.GameType; import forge.game.GameType;
import forge.game.Match; import forge.game.Match;
import forge.game.RegisteredPlayer; import forge.game.RegisteredPlayer;
import forge.gui.GuiDialog; import forge.gui.GuiDialog;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
import forge.gui.deckchooser.DeckgenUtil;
import forge.gui.deckchooser.FDeckChooser; import forge.gui.deckchooser.FDeckChooser;
import forge.gui.deckeditor.CDeckEditorUI; import forge.gui.deckeditor.CDeckEditorUI;
import forge.gui.deckeditor.controllers.CEditorVariant; import forge.gui.deckeditor.controllers.CEditorVariant;

View File

@@ -15,13 +15,13 @@ import forge.FThreads;
import forge.Singletons; import forge.Singletons;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckSection; import forge.deck.DeckSection;
import forge.deck.DeckgenUtil;
import forge.game.GameType; import forge.game.GameType;
import forge.game.Match; import forge.game.Match;
import forge.game.RegisteredPlayer; import forge.game.RegisteredPlayer;
import forge.game.player.LobbyPlayer; import forge.game.player.LobbyPlayer;
import forge.gui.GuiDialog; import forge.gui.GuiDialog;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
import forge.gui.deckchooser.DeckgenUtil;
import forge.gui.deckchooser.FDeckChooser; import forge.gui.deckchooser.FDeckChooser;
import forge.gui.deckeditor.CDeckEditorUI; import forge.gui.deckeditor.CDeckEditorUI;
import forge.gui.deckeditor.controllers.CEditorVariant; import forge.gui.deckeditor.controllers.CEditorVariant;

View File

@@ -3,6 +3,9 @@ package forge.deck.generate;
import org.testng.Assert; import org.testng.Assert;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import forge.Singletons;
import forge.card.CardDb;
import forge.deck.generation.DeckGenerator2Color;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.util.ItemPoolView; import forge.util.ItemPoolView;
@@ -17,7 +20,8 @@ public class Generate2ColorDeckTest {
*/ */
@Test(enabled = false) @Test(enabled = false)
public void generate2ColorDeckTest1() { public void generate2ColorDeckTest1() {
final Generate2ColorDeck gen = new Generate2ColorDeck("white", "blue"); CardDb cardDb = Singletons.getMagicDb().getCommonCards();
final DeckGenerator2Color gen = new DeckGenerator2Color(cardDb, "white", "blue");
final ItemPoolView<PaperCard> cardList = gen.getDeck(60, false); final ItemPoolView<PaperCard> cardList = gen.getDeck(60, false);
Assert.assertNotNull(cardList); Assert.assertNotNull(cardList);
} }

View File

@@ -3,6 +3,9 @@ package forge.deck.generate;
import org.testng.Assert; import org.testng.Assert;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import forge.Singletons;
import forge.card.CardDb;
import forge.deck.generation.DeckGenerator3Color;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.util.ItemPoolView; import forge.util.ItemPoolView;
@@ -17,7 +20,8 @@ public class Generate3ColorDeckTest {
*/ */
@Test(timeOut = 1000, enabled = false) @Test(timeOut = 1000, enabled = false)
public void generate3ColorDeckTest1() { public void generate3ColorDeckTest1() {
final Generate3ColorDeck gen = new Generate3ColorDeck("white", "blue", "black"); CardDb cardDb = Singletons.getMagicDb().getCommonCards();
final DeckGenerator3Color gen = new DeckGenerator3Color(cardDb, "white", "blue", "black");
final ItemPoolView<PaperCard> cardList = gen.getDeck(60, false); final ItemPoolView<PaperCard> cardList = gen.getDeck(60, false);
Assert.assertNotNull(cardList); Assert.assertNotNull(cardList);
} }

View File

@@ -3,6 +3,9 @@ package forge.deck.generate;
import org.testng.Assert; import org.testng.Assert;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import forge.Singletons;
import forge.card.CardDb;
import forge.deck.generation.DeckGenerator5Color;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.util.ItemPoolView; import forge.util.ItemPoolView;
@@ -17,7 +20,8 @@ public class Generate5ColorDeckTest {
*/ */
@Test(timeOut = 1000, enabled = false) @Test(timeOut = 1000, enabled = false)
public void generate5ColorDeckTest1() { public void generate5ColorDeckTest1() {
final Generate5ColorDeck gen = new Generate5ColorDeck(); CardDb cardDb = Singletons.getMagicDb().getCommonCards();
final DeckGenerator5Color gen = new DeckGenerator5Color(cardDb);
final ItemPoolView<PaperCard> cardList = gen.getDeck(60, false); final ItemPoolView<PaperCard> cardList = gen.getDeck(60, false);
Assert.assertNotNull(cardList); Assert.assertNotNull(cardList);
} }