mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-15 18:28:00 +00:00
deck generation moved to core
This commit is contained in:
21
.gitattributes
vendored
21
.gitattributes
vendored
@@ -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/DeckBase.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/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/DeckSerializer.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/package-info.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/DeckHtmlSerializer.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/bazaar/CBazaarUI.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/DecksComboBoxEvent.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/deckeditor/CDeckEditorUI.java -text
|
||||
forge-gui/src/main/java/forge/gui/deckeditor/DeckImport.java -text
|
||||
|
||||
@@ -24,7 +24,7 @@ import java.util.regex.Pattern;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.card.CardDb;
|
||||
import forge.card.ICardDatabase;
|
||||
import forge.item.PaperCard;
|
||||
|
||||
@@ -167,9 +167,9 @@ public class DeckRecognizer {
|
||||
private final ICardDatabase db;
|
||||
private Date recognizeCardsPrintedBefore = null;
|
||||
|
||||
public DeckRecognizer(boolean fromLatestSet) {
|
||||
public DeckRecognizer(boolean fromLatestSet, CardDb db) {
|
||||
useLastSet = fromLatestSet;
|
||||
db = Singletons.getMagicDb().getCommonCards();
|
||||
this.db = db;
|
||||
}
|
||||
|
||||
public Token recognizeLine(final String rawLine) {
|
||||
@@ -15,7 +15,7 @@
|
||||
* 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;
|
||||
package forge.deck.generation;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
@@ -24,8 +24,8 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import forge.card.ColorSet;
|
||||
import forge.card.ICardDatabase;
|
||||
import forge.card.MagicColor;
|
||||
import forge.deck.generate.GenerateDeckUtil.FilterCMC;
|
||||
import forge.item.PaperCard;
|
||||
import forge.util.ItemPoolView;
|
||||
|
||||
@@ -37,17 +37,17 @@ import forge.util.ItemPoolView;
|
||||
* @author Forge
|
||||
* @version $Id$
|
||||
*/
|
||||
public class Generate2ColorDeck extends GenerateColoredDeckBase {
|
||||
public class DeckGenerator2Color extends DeckGeneratorBase {
|
||||
@Override protected final float getLandsPercentage() { return 0.39f; }
|
||||
@Override protected final float getCreatPercentage() { return 0.36f; }
|
||||
@Override protected final float getSpellPercentage() { return 0.25f; }
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
final List<ImmutablePair<FilterCMC, Integer>> cmcRelativeWeights = Lists.newArrayList(
|
||||
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(0, 2), 6),
|
||||
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(3, 4), 4),
|
||||
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(5, 6), 2),
|
||||
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(7, 20), 1)
|
||||
ImmutablePair.of(new FilterCMC(0, 2), 6),
|
||||
ImmutablePair.of(new FilterCMC(3, 4), 4),
|
||||
ImmutablePair.of(new FilterCMC(5, 6), 2),
|
||||
ImmutablePair.of(new FilterCMC(7, 20), 1)
|
||||
);
|
||||
|
||||
// mana curve of the card pool
|
||||
@@ -67,7 +67,8 @@ public class Generate2ColorDeck extends GenerateColoredDeckBase {
|
||||
* @param clr2
|
||||
* 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 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));
|
||||
|
||||
// Add dual lands
|
||||
List<String> duals = GenerateDeckUtil.getDualLandList(colors);
|
||||
List<String> duals = getDualLandList();
|
||||
for (String s : duals) {
|
||||
this.cardCounts.put(s, 0);
|
||||
}
|
||||
@@ -15,7 +15,7 @@
|
||||
* 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;
|
||||
package forge.deck.generation;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -24,8 +24,8 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import forge.card.ColorSet;
|
||||
import forge.card.ICardDatabase;
|
||||
import forge.card.MagicColor;
|
||||
import forge.deck.generate.GenerateDeckUtil.FilterCMC;
|
||||
import forge.item.PaperCard;
|
||||
import forge.util.ItemPoolView;
|
||||
import forge.util.MyRandom;
|
||||
@@ -38,12 +38,12 @@ import forge.util.MyRandom;
|
||||
* @author Forge
|
||||
* @version $Id$
|
||||
*/
|
||||
public class Generate3ColorDeck extends GenerateColoredDeckBase {
|
||||
public class DeckGenerator3Color extends DeckGeneratorBase {
|
||||
@SuppressWarnings("unchecked")
|
||||
final List<ImmutablePair<FilterCMC, Integer>> cmcLevels = Lists.newArrayList(
|
||||
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(0, 2), 12),
|
||||
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(3, 5), 9),
|
||||
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(6, 20), 3)
|
||||
ImmutablePair.of(new FilterCMC(0, 2), 12),
|
||||
ImmutablePair.of(new FilterCMC(3, 5), 9),
|
||||
ImmutablePair.of(new FilterCMC(6, 20), 3)
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -58,7 +58,8 @@ public class Generate3ColorDeck extends GenerateColoredDeckBase {
|
||||
* @param clr3
|
||||
* 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 c2 = MagicColor.fromName(clr2);
|
||||
int c3 = MagicColor.fromName(clr3);
|
||||
@@ -105,7 +106,7 @@ public class Generate3ColorDeck extends GenerateColoredDeckBase {
|
||||
tmpDeck.append("numLands:").append(numLands).append("\n");
|
||||
|
||||
// Add dual lands
|
||||
List<String> duals = GenerateDeckUtil.getDualLandList(colors);
|
||||
List<String> duals = getDualLandList();
|
||||
for (String s : duals) {
|
||||
this.cardCounts.put(s, 0);
|
||||
}
|
||||
@@ -15,7 +15,7 @@
|
||||
* 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;
|
||||
package forge.deck.generation;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -24,7 +24,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import forge.card.ColorSet;
|
||||
import forge.deck.generate.GenerateDeckUtil.FilterCMC;
|
||||
import forge.card.ICardDatabase;
|
||||
import forge.item.PaperCard;
|
||||
import forge.util.ItemPoolView;
|
||||
|
||||
@@ -36,12 +36,12 @@ import forge.util.ItemPoolView;
|
||||
* @author Forge
|
||||
* @version $Id$
|
||||
*/
|
||||
public class Generate5ColorDeck extends GenerateColoredDeckBase {
|
||||
public class DeckGenerator5Color extends DeckGeneratorBase {
|
||||
@SuppressWarnings("unchecked")
|
||||
final List<ImmutablePair<FilterCMC, Integer>> cmcLevels = Lists.newArrayList(
|
||||
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(0, 2), 3),
|
||||
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(3, 5), 2),
|
||||
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(6, 20), 1)
|
||||
ImmutablePair.of(new FilterCMC(0, 2), 3),
|
||||
ImmutablePair.of(new FilterCMC(3, 5), 2),
|
||||
ImmutablePair.of(new FilterCMC(6, 20), 1)
|
||||
);
|
||||
|
||||
// resulting mana curve of the card pool
|
||||
@@ -53,7 +53,8 @@ public class Generate5ColorDeck extends GenerateColoredDeckBase {
|
||||
/**
|
||||
* Instantiates a new generate5 color deck.
|
||||
*/
|
||||
public Generate5ColorDeck() {
|
||||
public DeckGenerator5Color(ICardDatabase cardDb) {
|
||||
super(cardDb);
|
||||
colors = ColorSet.fromMask(0).inverse();
|
||||
}
|
||||
|
||||
@@ -68,7 +69,7 @@ public class Generate5ColorDeck extends GenerateColoredDeckBase {
|
||||
tmpDeck.append("numLands:").append(numLands).append("\n");
|
||||
|
||||
// Add dual lands
|
||||
List<String> duals = GenerateDeckUtil.getDualLandList(colors);
|
||||
List<String> duals = getDualLandList();
|
||||
for (String s : duals) {
|
||||
this.cardCounts.put(s, 0);
|
||||
}
|
||||
@@ -15,8 +15,9 @@
|
||||
* 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;
|
||||
package forge.deck.generation;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
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.Lists;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.card.CardRules;
|
||||
import forge.card.CardRulesPredicates;
|
||||
import forge.card.ColorSet;
|
||||
import forge.card.ICardDatabase;
|
||||
import forge.card.MagicColor;
|
||||
import forge.deck.generate.GenerateDeckUtil.FilterCMC;
|
||||
import forge.card.mana.ManaCost;
|
||||
import forge.item.PaperCard;
|
||||
import forge.properties.ForgePreferences.FPref;
|
||||
import forge.util.Aggregates;
|
||||
import forge.util.ItemPool;
|
||||
import forge.util.ItemPoolView;
|
||||
@@ -52,13 +52,15 @@ import forge.util.MyRandom;
|
||||
* @author Forge
|
||||
* @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 Map<String, Integer> cardCounts = new HashMap<String, Integer>();
|
||||
protected int maxDuplicates;
|
||||
protected int maxDuplicates = 4;
|
||||
protected boolean useArtifacts = true;
|
||||
|
||||
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
|
||||
protected float getLandsPercentage() { return 0.44f; }
|
||||
@@ -67,9 +69,15 @@ public abstract class GenerateColoredDeckBase {
|
||||
|
||||
StringBuilder tmpDeck = new StringBuilder();
|
||||
|
||||
public GenerateColoredDeckBase() {
|
||||
this.maxDuplicates = Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_SINGLETONS) ? 1 : 4;
|
||||
tDeck = new ItemPool<PaperCard>(PaperCard.class);
|
||||
public DeckGeneratorBase(ICardDatabase cardDb) {
|
||||
this.cardDb = cardDb;
|
||||
}
|
||||
|
||||
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) {
|
||||
@@ -130,8 +138,7 @@ public abstract class GenerateColoredDeckBase {
|
||||
} 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.
|
||||
|
||||
PaperCard cp = Singletons.getMagicDb().getCommonCards().getCard(s);
|
||||
tDeck.add(Singletons.getMagicDb().getCommonCards().getCard(cp.getName(), false));
|
||||
tDeck.add(cardDb.getCard(s, false));
|
||||
|
||||
final int n = this.cardCounts.get(s);
|
||||
this.cardCounts.put(s, n + 1);
|
||||
@@ -157,20 +164,20 @@ public abstract class GenerateColoredDeckBase {
|
||||
|
||||
int landsLeft = cnt;
|
||||
for (Entry<String, Integer> c : clrCnts.entrySet()) {
|
||||
String color = c.getKey();
|
||||
String basicLandName = c.getKey();
|
||||
|
||||
|
||||
// calculate number of lands for each color
|
||||
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
|
||||
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();
|
||||
|
||||
tDeck.add(Singletons.getMagicDb().getCommonCards().getCard(cp.getName(), basicLandSet), nLand);
|
||||
tDeck.add(cardDb.getCard(cp.getName(), basicLandSet), nLand);
|
||||
landsLeft -= nLand;
|
||||
}
|
||||
}
|
||||
@@ -220,7 +227,7 @@ public abstract class GenerateColoredDeckBase {
|
||||
final List<PaperCard> curvedRandomized = Lists.newArrayList();
|
||||
for (PaperCard c : curved) {
|
||||
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);
|
||||
@@ -231,13 +238,13 @@ public abstract class GenerateColoredDeckBase {
|
||||
|
||||
// start with all cards
|
||||
// remove cards that generated decks don't like
|
||||
Predicate<CardRules> canPlay = forAi ? GenerateDeckUtil.AI_CAN_PLAY : GenerateDeckUtil.HUMAN_CAN_PLAY;
|
||||
Predicate<CardRules> hasColor = new GenerateDeckUtil.MatchColorIdentity(colors);
|
||||
Predicate<CardRules> canPlay = forAi ? AI_CAN_PLAY : HUMAN_CAN_PLAY;
|
||||
Predicate<CardRules> hasColor = new MatchColorIdentity(colors);
|
||||
|
||||
if (!Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_ARTIFACTS)) {
|
||||
hasColor = Predicates.or(hasColor, GenerateDeckUtil.COLORLESS_CARDS);
|
||||
if (useArtifacts) {
|
||||
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) {
|
||||
@@ -272,4 +279,127 @@ public abstract class GenerateColoredDeckBase {
|
||||
final Integer boxed = map.get(key);
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,7 @@
|
||||
* 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;
|
||||
package forge.deck.generation;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -24,8 +24,8 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import forge.card.ColorSet;
|
||||
import forge.card.ICardDatabase;
|
||||
import forge.card.MagicColor;
|
||||
import forge.deck.generate.GenerateDeckUtil.FilterCMC;
|
||||
import forge.item.PaperCard;
|
||||
import forge.util.ItemPoolView;
|
||||
|
||||
@@ -37,17 +37,17 @@ import forge.util.ItemPoolView;
|
||||
* @author Forge
|
||||
* @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 getCreatPercentage() { return 0.36f; }
|
||||
@Override protected final float getSpellPercentage() { return 0.25f; }
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
final List<ImmutablePair<FilterCMC, Integer>> cmcLevels = Lists.newArrayList(
|
||||
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(0, 2), 10),
|
||||
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(3, 4), 8),
|
||||
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(5, 6), 5),
|
||||
ImmutablePair.of(new GenerateDeckUtil.FilterCMC(7, 20), 3)
|
||||
ImmutablePair.of(new FilterCMC(0, 2), 10),
|
||||
ImmutablePair.of(new FilterCMC(3, 4), 8),
|
||||
ImmutablePair.of(new FilterCMC(5, 6), 5),
|
||||
ImmutablePair.of(new FilterCMC(7, 20), 3)
|
||||
);
|
||||
|
||||
// mana curve of the card pool
|
||||
@@ -67,7 +67,8 @@ public class GenerateMonoColorDeck extends GenerateColoredDeckBase {
|
||||
* @param clr2
|
||||
* 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) {
|
||||
int color1 = r.nextInt(5);
|
||||
colors = ColorSet.fromMask(MagicColor.WHITE << color1);
|
||||
@@ -0,0 +1,3 @@
|
||||
/** Forge Card Game. */
|
||||
package forge.deck.generation;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
/** Forge Card Game. */
|
||||
package forge.deck.generate;
|
||||
|
||||
@@ -17,7 +17,7 @@ import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.Constant.Preferences;
|
||||
|
||||
import forge.card.CardAiHints;
|
||||
import forge.card.CardEdition;
|
||||
import forge.card.CardEditionPredicates;
|
||||
@@ -31,20 +31,21 @@ import forge.card.mana.ManaCostShard;
|
||||
import forge.deck.CardPool;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckSection;
|
||||
import forge.deck.generate.GenerateDeckUtil;
|
||||
import forge.deck.generation.DeckGeneratorBase;
|
||||
import forge.item.PaperCard;
|
||||
import forge.item.IPaperCard;
|
||||
import forge.util.ItemPoolView;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
/**
|
||||
* Limited format deck.
|
||||
*
|
||||
*/
|
||||
public class LimitedDeckBuilder {
|
||||
public class LimitedDeckBuilder extends DeckGeneratorBase{
|
||||
|
||||
private int numSpellsNeeded = 22;
|
||||
private int landsNeeded = 18;
|
||||
private ColorSet colors;
|
||||
|
||||
private final DeckColors deckColors;
|
||||
private Predicate<CardRules> hasColor;
|
||||
private final List<PaperCard> availableList;
|
||||
@@ -59,6 +60,8 @@ public class LimitedDeckBuilder {
|
||||
|
||||
private static ReadDraftRankings draftRankings = new ReadDraftRankings();
|
||||
|
||||
private static final boolean logToConsole = false;
|
||||
|
||||
/**
|
||||
*
|
||||
* Constructor.
|
||||
@@ -69,6 +72,7 @@ public class LimitedDeckBuilder {
|
||||
* Chosen colors.
|
||||
*/
|
||||
public LimitedDeckBuilder(List<PaperCard> dList, DeckColors pClrs) {
|
||||
super(Singletons.getMagicDb().getCommonCards());
|
||||
this.availableList = dList;
|
||||
this.deckColors = pClrs;
|
||||
this.colors = pClrs.getChosenColors();
|
||||
@@ -93,6 +97,11 @@ public class LimitedDeckBuilder {
|
||||
this(list, new DeckColors());
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemPoolView<PaperCard> getDeck(int size, boolean forAi) {
|
||||
return buildDeck().getMain();
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* buildDeck.
|
||||
@@ -102,7 +111,7 @@ public class LimitedDeckBuilder {
|
||||
*/
|
||||
public Deck buildDeck() {
|
||||
// 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));
|
||||
onColorCreatures = Iterables.filter(colorList,
|
||||
Predicates.compose(CardRulesPredicates.Presets.IS_CREATURE, PaperCard.FN_GET_RULES));
|
||||
@@ -144,7 +153,7 @@ public class LimitedDeckBuilder {
|
||||
deckList.add(c);
|
||||
getAiPlayables().remove(c);
|
||||
landsNeeded--;
|
||||
if (Preferences.DEV_MODE) {
|
||||
if (logToConsole) {
|
||||
System.out.println("Low CMC: " + c.getName());
|
||||
}
|
||||
}
|
||||
@@ -178,7 +187,7 @@ public class LimitedDeckBuilder {
|
||||
CardPool cp = result.getOrCreate(DeckSection.Sideboard);
|
||||
cp.add(aiPlayables);
|
||||
cp.add(availableList);
|
||||
if (Preferences.DEV_MODE) {
|
||||
if (logToConsole) {
|
||||
debugFinalDeck();
|
||||
}
|
||||
return result;
|
||||
@@ -301,7 +310,7 @@ public class LimitedDeckBuilder {
|
||||
// calculate number of lands for each color
|
||||
final float p = (float) clrCnts[i] / (float) totalColor;
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -359,7 +368,7 @@ public class LimitedDeckBuilder {
|
||||
* Add non-basic lands to the deck.
|
||||
*/
|
||||
private void addNonBasicLands() {
|
||||
List<String> inverseDuals = GenerateDeckUtil.getInverseDualLandList(colors);
|
||||
List<String> inverseDuals = getInverseDualLandList();
|
||||
Iterable<PaperCard> lands = Iterables.filter(aiPlayables,
|
||||
Predicates.compose(CardRulesPredicates.Presets.IS_NONBASIC_LAND, PaperCard.FN_GET_RULES));
|
||||
List<Pair<Double, PaperCard>> ranked = rankCards(lands);
|
||||
@@ -374,7 +383,7 @@ public class LimitedDeckBuilder {
|
||||
deckList.add(bean.getValue());
|
||||
aiPlayables.remove(bean.getValue());
|
||||
landsNeeded--;
|
||||
if (Preferences.DEV_MODE) {
|
||||
if (logToConsole) {
|
||||
System.out.println("NonBasicLand[" + landsNeeded + "]:" + bean.getValue().getName());
|
||||
}
|
||||
}
|
||||
@@ -401,8 +410,8 @@ public class LimitedDeckBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
hasColor = Predicates.or(new GenerateDeckUtil.MatchColorIdentity(colors),
|
||||
GenerateDeckUtil.COLORLESS_CARDS);
|
||||
hasColor = Predicates.or(new DeckGeneratorBase.MatchColorIdentity(colors),
|
||||
DeckGeneratorBase.COLORLESS_CARDS);
|
||||
Iterable<PaperCard> threeColorList = Iterables.filter(aiPlayables,
|
||||
Predicates.compose(hasColor, PaperCard.FN_GET_RULES));
|
||||
ranked = rankCards(threeColorList);
|
||||
@@ -411,7 +420,7 @@ public class LimitedDeckBuilder {
|
||||
deckList.add(bean.getValue());
|
||||
aiPlayables.remove(bean.getValue());
|
||||
nCards--;
|
||||
if (Preferences.DEV_MODE) {
|
||||
if (logToConsole) {
|
||||
System.out.println("Third Color[" + nCards + "]:" + bean.getValue().getName() + "("
|
||||
+ bean.getValue().getRules().getManaCost() + ")");
|
||||
}
|
||||
@@ -436,7 +445,7 @@ public class LimitedDeckBuilder {
|
||||
deckList.add(bean.getValue());
|
||||
aiPlayables.remove(bean.getValue());
|
||||
nCards--;
|
||||
if (Preferences.DEV_MODE) {
|
||||
if (logToConsole) {
|
||||
System.out.println("Random[" + nCards + "]:" + bean.getValue().getName() + "("
|
||||
+ bean.getValue().getRules().getManaCost() + ")");
|
||||
}
|
||||
@@ -460,7 +469,7 @@ public class LimitedDeckBuilder {
|
||||
deckList.add(cardToAdd);
|
||||
num--;
|
||||
getAiPlayables().remove(cardToAdd);
|
||||
if (Preferences.DEV_MODE) {
|
||||
if (logToConsole) {
|
||||
System.out.println("Others[" + num + "]:" + cardToAdd.getName() + " ("
|
||||
+ cardToAdd.getRules().getManaCost() + ")");
|
||||
}
|
||||
@@ -486,7 +495,7 @@ public class LimitedDeckBuilder {
|
||||
if (hints != null && hints.getType() != DeckHints.Type.NONE) {
|
||||
Iterable<PaperCard> onColor = Iterables.filter(aiPlayables, Predicates.compose(hasColor, PaperCard.FN_GET_RULES));
|
||||
List<PaperCard> comboCards = hints.filter(onColor);
|
||||
if (Preferences.DEV_MODE) {
|
||||
if (logToConsole) {
|
||||
System.out.println("Found " + comboCards.size() + " cards for " + cardToAdd.getName());
|
||||
}
|
||||
for (Pair<Double, PaperCard> comboBean : rankCards(comboCards)) {
|
||||
@@ -535,7 +544,7 @@ public class LimitedDeckBuilder {
|
||||
comboCards.addAll(hints.filter(deckList));
|
||||
}
|
||||
if (comboCards.isEmpty()) {
|
||||
if (Preferences.DEV_MODE) {
|
||||
if (logToConsole) {
|
||||
System.out.println("No combo cards found for " + card.getName() + ", removing it.");
|
||||
}
|
||||
it.remove();
|
||||
@@ -546,7 +555,7 @@ public class LimitedDeckBuilder {
|
||||
numOthers++;
|
||||
}
|
||||
} else {
|
||||
if (Preferences.DEV_MODE) {
|
||||
if (logToConsole) {
|
||||
System.out.println("Found " + comboCards.size() + " cards for " + card.getName());
|
||||
}
|
||||
}
|
||||
@@ -580,7 +589,7 @@ public class LimitedDeckBuilder {
|
||||
deckList.add(c);
|
||||
num--;
|
||||
getAiPlayables().remove(c);
|
||||
if (Preferences.DEV_MODE) {
|
||||
if (logToConsole) {
|
||||
System.out.println("Creature[" + num + "]:" + c.getName() + " (" + c.getRules().getManaCost() + ")");
|
||||
}
|
||||
num = addDeckHintsCards(c, num);
|
||||
@@ -645,12 +654,12 @@ public class LimitedDeckBuilder {
|
||||
num--;
|
||||
getAiPlayables().remove(c);
|
||||
creatureCosts.put(cmc, creatureCosts.get(cmc) + 1);
|
||||
if (Preferences.DEV_MODE) {
|
||||
if (logToConsole) {
|
||||
System.out.println("Creature[" + num + "]:" + c.getName() + " (" + c.getRules().getManaCost() + ")");
|
||||
}
|
||||
num = addDeckHintsCards(c, num);
|
||||
} else {
|
||||
if (Preferences.DEV_MODE) {
|
||||
if (logToConsole) {
|
||||
System.out.println(c.getName() + " not added because CMC " + c.getRules().getManaCost().getCMC()
|
||||
+ " has " + currentAtCmc + " already.");
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package forge.deck;
|
||||
package forge.gui.deckchooser;
|
||||
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.datatransfer.StringSelection;
|
||||
@@ -15,14 +15,17 @@ import com.google.common.base.Predicate;
|
||||
import com.google.common.collect.Iterables;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.deck.generate.Generate2ColorDeck;
|
||||
import forge.deck.generate.Generate3ColorDeck;
|
||||
import forge.deck.generate.Generate5ColorDeck;
|
||||
import forge.deck.generate.GenerateColoredDeckBase;
|
||||
import forge.deck.generate.GenerateMonoColorDeck;
|
||||
import forge.deck.generate.GenerateThemeDeck;
|
||||
import forge.card.CardDb;
|
||||
import forge.deck.CardPool;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckSection;
|
||||
import forge.deck.generation.DeckGenerator2Color;
|
||||
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.PreconDeck;
|
||||
import forge.properties.ForgePreferences.FPref;
|
||||
import forge.quest.QuestController;
|
||||
import forge.quest.QuestEvent;
|
||||
import forge.quest.QuestEventChallenge;
|
||||
@@ -60,19 +63,20 @@ public class DeckgenUtil {
|
||||
final Deck deck;
|
||||
String deckName = null;
|
||||
|
||||
GenerateColoredDeckBase gen = null;
|
||||
|
||||
DeckGeneratorBase gen = null;
|
||||
CardDb cardDb = Singletons.getMagicDb().getCommonCards();
|
||||
if (selection.size() == 1) {
|
||||
gen = new GenerateMonoColorDeck(selection.get(0));
|
||||
gen = new DeckGeneratorMonoColor(cardDb, selection.get(0));
|
||||
} 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) {
|
||||
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 {
|
||||
gen = new Generate5ColorDeck();
|
||||
gen = new DeckGenerator5Color(cardDb);
|
||||
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);
|
||||
|
||||
if(null == deckName)
|
||||
@@ -92,6 +96,8 @@ public class DeckgenUtil {
|
||||
public static Deck buildThemeDeck(final String selection) {
|
||||
final GenerateThemeDeck gen = new GenerateThemeDeck();
|
||||
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));
|
||||
|
||||
return deck;
|
||||
@@ -162,13 +168,6 @@ public class DeckgenUtil {
|
||||
final String name = allDecks.getItemNames().toArray(new String[0])[rand];
|
||||
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} */
|
||||
public static Deck getRandomQuestDeck() {
|
||||
@@ -22,8 +22,6 @@ import org.apache.commons.lang3.ArrayUtils;
|
||||
import forge.Command;
|
||||
import forge.Singletons;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckgenUtil;
|
||||
import forge.deck.generate.GenerateThemeDeck;
|
||||
import forge.game.RegisteredPlayer;
|
||||
import forge.gui.MouseUtil;
|
||||
import forge.gui.MouseUtil.MouseCursor;
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* 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;
|
||||
package forge.gui.deckchooser;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
@@ -23,6 +23,7 @@ import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.deck.generation.DeckGeneratorBase;
|
||||
import forge.error.BugReporter;
|
||||
import forge.item.PaperCard;
|
||||
import forge.util.FileUtil;
|
||||
@@ -37,7 +38,7 @@ import forge.util.MyRandom;
|
||||
* @author Forge
|
||||
* @version $Id$
|
||||
*/
|
||||
public class GenerateThemeDeck extends GenerateColoredDeckBase {
|
||||
public class GenerateThemeDeck extends DeckGeneratorBase {
|
||||
private int basicLandPercentage = 0;
|
||||
private boolean testing = false;
|
||||
|
||||
@@ -47,6 +48,7 @@ public class GenerateThemeDeck extends GenerateColoredDeckBase {
|
||||
* </p>
|
||||
*/
|
||||
public GenerateThemeDeck() {
|
||||
super(Singletons.getMagicDb().getCommonCards());
|
||||
this.maxDuplicates = 4;
|
||||
}
|
||||
|
||||
@@ -38,6 +38,7 @@ import javax.swing.text.ElementIterator;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import forge.Singletons;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckBase;
|
||||
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());
|
||||
Element e;
|
||||
|
||||
DeckRecognizer recognizer = new DeckRecognizer(newEditionCheck.isSelected());
|
||||
DeckRecognizer recognizer = new DeckRecognizer(newEditionCheck.isSelected(), Singletons.getMagicDb().getCommonCards());
|
||||
if(dateTimeCheck.isSelected())
|
||||
recognizer.setDateConstraint(monthDropdown.getSelectedIndex(), yearDropdown.getSelectedItem());
|
||||
|
||||
|
||||
@@ -6,13 +6,16 @@ import com.google.common.collect.Iterables;
|
||||
|
||||
import forge.Command;
|
||||
import forge.Singletons;
|
||||
import forge.card.CardDb;
|
||||
import forge.card.CardRulesPredicates;
|
||||
import forge.card.MagicColor;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckBase;
|
||||
import forge.deck.generate.Generate2ColorDeck;
|
||||
import forge.deck.generate.Generate3ColorDeck;
|
||||
import forge.deck.generate.Generate5ColorDeck;
|
||||
import forge.deck.generation.DeckGenerator2Color;
|
||||
import forge.deck.generation.DeckGenerator3Color;
|
||||
import forge.deck.generation.DeckGenerator5Color;
|
||||
import forge.deck.generation.DeckGeneratorBase;
|
||||
import forge.deck.generation.DeckGeneratorMonoColor;
|
||||
import forge.gui.deckeditor.CDeckEditorUI;
|
||||
import forge.gui.deckeditor.SEditorIO;
|
||||
import forge.gui.deckeditor.views.VDeckgen;
|
||||
@@ -20,6 +23,7 @@ import forge.gui.framework.ICDoc;
|
||||
import forge.gui.toolbox.FLabel;
|
||||
import forge.item.PaperCard;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.properties.ForgePreferences.FPref;
|
||||
import forge.util.Aggregates;
|
||||
|
||||
|
||||
@@ -100,22 +104,22 @@ public enum CDeckgen implements ICDoc {
|
||||
if (!SEditorIO.confirmSaveChanges(Singletons.getControl().getCurrentScreen())) { return; }
|
||||
|
||||
final Deck genConstructed = new Deck();
|
||||
|
||||
CardDb cardDb = Singletons.getMagicDb().getCommonCards();
|
||||
DeckGeneratorBase gen = null;
|
||||
switch (colorCount0) {
|
||||
case 2:
|
||||
genConstructed.getMain().addAll((new Generate2ColorDeck(null, null)).getDeck(60, false));
|
||||
break;
|
||||
case 3:
|
||||
genConstructed.getMain().addAll((new Generate3ColorDeck(null, null, null)).getDeck(60, false));
|
||||
break;
|
||||
case 5:
|
||||
genConstructed.getMain().addAll((new Generate5ColorDeck()).getDeck(60, false));
|
||||
break;
|
||||
default:
|
||||
case 1: gen = new DeckGeneratorMonoColor(cardDb, null); break;
|
||||
case 2: gen = new DeckGenerator2Color(cardDb, null, null); break;
|
||||
case 3: gen = new DeckGenerator3Color(cardDb, null, null, null); break;
|
||||
case 5: gen = new DeckGenerator5Color(cardDb); break;
|
||||
}
|
||||
|
||||
if( null != gen ) {
|
||||
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();
|
||||
final ACEditorBase<TItem, TModel> ed = (ACEditorBase<TItem, TModel>) CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController();
|
||||
|
||||
ed.getDeckController().setModel((TModel) genConstructed);
|
||||
}
|
||||
|
||||
@@ -15,13 +15,13 @@ import forge.Command;
|
||||
import forge.FThreads;
|
||||
import forge.Singletons;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckgenUtil;
|
||||
import forge.game.GameType;
|
||||
import forge.game.Match;
|
||||
import forge.game.RegisteredPlayer;
|
||||
import forge.gauntlet.GauntletData;
|
||||
import forge.gauntlet.GauntletIO;
|
||||
import forge.gui.SOverlayUtils;
|
||||
import forge.gui.deckchooser.DeckgenUtil;
|
||||
import forge.gui.framework.ICDoc;
|
||||
import forge.net.FServer;
|
||||
import forge.net.Lobby;
|
||||
|
||||
@@ -14,14 +14,14 @@ import forge.Command;
|
||||
import forge.FThreads;
|
||||
import forge.Singletons;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckgenUtil;
|
||||
import forge.deck.DeckgenUtil.DeckTypes;
|
||||
import forge.game.GameType;
|
||||
import forge.game.Match;
|
||||
import forge.game.RegisteredPlayer;
|
||||
import forge.gauntlet.GauntletData;
|
||||
import forge.gauntlet.GauntletIO;
|
||||
import forge.gui.SOverlayUtils;
|
||||
import forge.gui.deckchooser.DeckgenUtil;
|
||||
import forge.gui.deckchooser.DeckgenUtil.DeckTypes;
|
||||
import forge.gui.framework.ICDoc;
|
||||
import forge.net.FServer;
|
||||
import forge.net.Lobby;
|
||||
|
||||
@@ -15,12 +15,12 @@ import forge.FThreads;
|
||||
import forge.Singletons;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckSection;
|
||||
import forge.deck.DeckgenUtil;
|
||||
import forge.game.GameType;
|
||||
import forge.game.Match;
|
||||
import forge.game.RegisteredPlayer;
|
||||
import forge.gui.GuiDialog;
|
||||
import forge.gui.SOverlayUtils;
|
||||
import forge.gui.deckchooser.DeckgenUtil;
|
||||
import forge.gui.deckchooser.FDeckChooser;
|
||||
import forge.gui.deckeditor.CDeckEditorUI;
|
||||
import forge.gui.deckeditor.controllers.CEditorVariant;
|
||||
|
||||
@@ -15,13 +15,13 @@ import forge.FThreads;
|
||||
import forge.Singletons;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckSection;
|
||||
import forge.deck.DeckgenUtil;
|
||||
import forge.game.GameType;
|
||||
import forge.game.Match;
|
||||
import forge.game.RegisteredPlayer;
|
||||
import forge.game.player.LobbyPlayer;
|
||||
import forge.gui.GuiDialog;
|
||||
import forge.gui.SOverlayUtils;
|
||||
import forge.gui.deckchooser.DeckgenUtil;
|
||||
import forge.gui.deckchooser.FDeckChooser;
|
||||
import forge.gui.deckeditor.CDeckEditorUI;
|
||||
import forge.gui.deckeditor.controllers.CEditorVariant;
|
||||
|
||||
@@ -3,6 +3,9 @@ package forge.deck.generate;
|
||||
import org.testng.Assert;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.card.CardDb;
|
||||
import forge.deck.generation.DeckGenerator2Color;
|
||||
import forge.item.PaperCard;
|
||||
import forge.util.ItemPoolView;
|
||||
|
||||
@@ -17,7 +20,8 @@ public class Generate2ColorDeckTest {
|
||||
*/
|
||||
@Test(enabled = false)
|
||||
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);
|
||||
Assert.assertNotNull(cardList);
|
||||
}
|
||||
|
||||
@@ -3,6 +3,9 @@ package forge.deck.generate;
|
||||
import org.testng.Assert;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.card.CardDb;
|
||||
import forge.deck.generation.DeckGenerator3Color;
|
||||
import forge.item.PaperCard;
|
||||
import forge.util.ItemPoolView;
|
||||
|
||||
@@ -17,7 +20,8 @@ public class Generate3ColorDeckTest {
|
||||
*/
|
||||
@Test(timeOut = 1000, enabled = false)
|
||||
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);
|
||||
Assert.assertNotNull(cardList);
|
||||
}
|
||||
|
||||
@@ -3,6 +3,9 @@ package forge.deck.generate;
|
||||
import org.testng.Assert;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.card.CardDb;
|
||||
import forge.deck.generation.DeckGenerator5Color;
|
||||
import forge.item.PaperCard;
|
||||
import forge.util.ItemPoolView;
|
||||
|
||||
@@ -17,7 +20,8 @@ public class Generate5ColorDeckTest {
|
||||
*/
|
||||
@Test(timeOut = 1000, enabled = false)
|
||||
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);
|
||||
Assert.assertNotNull(cardList);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user