Support generating proper Tiny Leaders decks

This commit is contained in:
drdev
2015-02-15 15:33:18 +00:00
parent e51a64242e
commit caf5817d0b
14 changed files with 127 additions and 55 deletions

View File

@@ -18,15 +18,18 @@
package forge.deck; package forge.deck;
import forge.StaticData; import forge.StaticData;
import forge.card.CardRules;
import forge.card.CardType; import forge.card.CardType;
import forge.card.ColorSet; import forge.card.ColorSet;
import forge.deck.generation.DeckGenPool; import forge.deck.generation.DeckGenPool;
import forge.deck.generation.DeckGeneratorBase.FilterCMC;
import forge.deck.generation.IDeckGenPool; import forge.deck.generation.IDeckGenPool;
import forge.item.IPaperCard; import forge.item.IPaperCard;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.util.Aggregates; import forge.util.Aggregates;
import org.apache.commons.lang3.Range; import org.apache.commons.lang3.Range;
import org.apache.commons.lang3.tuple.ImmutablePair;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
@@ -45,7 +48,7 @@ public enum DeckFormat {
QuestDeck ( Range.between(40, Integer.MAX_VALUE), Range.between(0, 15), 4), QuestDeck ( Range.between(40, Integer.MAX_VALUE), Range.between(0, 15), 4),
Limited ( Range.between(40, Integer.MAX_VALUE), null, Integer.MAX_VALUE), Limited ( Range.between(40, Integer.MAX_VALUE), null, Integer.MAX_VALUE),
Commander ( Range.is(99), Range.between(0, 10), 1), Commander ( Range.is(99), Range.between(0, 10), 1),
TinyLeaders ( Range.is(49), Range.between(0, 10), 1, new Predicate<PaperCard>() { TinyLeaders ( Range.is(49), Range.between(0, 10), 1, new Predicate<CardRules>() {
private final HashSet<String> bannedCards = new HashSet<String>(Arrays.asList( private final HashSet<String> bannedCards = new HashSet<String>(Arrays.asList(
"Ancestral Recall", "Balance", "Black Lotus", "Black Vise", "Channel", "Chaos Orb", "Contract From Below", "Counterbalance", "Darkpact", "Demonic Attorney", "Demonic Tutor", "Earthcraft", "Edric, Spymaster of Trest", "Falling Star", "Ancestral Recall", "Balance", "Black Lotus", "Black Vise", "Channel", "Chaos Orb", "Contract From Below", "Counterbalance", "Darkpact", "Demonic Attorney", "Demonic Tutor", "Earthcraft", "Edric, Spymaster of Trest", "Falling Star",
"Fastbond", "Flash", "Goblin Recruiter", "Hermit Druid", "Imperial Seal", "Jeweled Bird", "Karakas", "Library of Alexandria", "Mana Crypt", "Mana Drain", "Mana Vault", "Metalworker", "Mind Twist", "Mishra's Workshop", "Mox Emerald", "Fastbond", "Flash", "Goblin Recruiter", "Hermit Druid", "Imperial Seal", "Jeweled Bird", "Karakas", "Library of Alexandria", "Mana Crypt", "Mana Drain", "Mana Vault", "Metalworker", "Mind Twist", "Mishra's Workshop", "Mox Emerald",
@@ -53,16 +56,32 @@ public enum DeckFormat {
"Timmerian Fiends", "Tolarian Academy", "Umezawa's Jitte", "Vampiric Tutor", "Wheel of Fortune", "Yawgmoth's Will")); "Timmerian Fiends", "Tolarian Academy", "Umezawa's Jitte", "Vampiric Tutor", "Wheel of Fortune", "Yawgmoth's Will"));
@Override @Override
public boolean apply(PaperCard card) { public boolean apply(CardRules rules) {
if (card.getRules().getManaCost().getCMC() > 3) { if (rules.getManaCost().getCMC() > 3) {
return false; //only cards with CMC less than 3 are allowed return false; //only cards with CMC less than 3 are allowed
} }
if (bannedCards.contains(card.getName())) { if (bannedCards.contains(rules.getName())) {
return false; return false;
} }
return true; return true;
} }
}), }) {
private final HashSet<String> bannedCommanders = new HashSet<String>(Arrays.asList(
"Derevi, Empyrial Tactician", "Erayo, Soratami Ascendant", "Rofellos, Llanowar Emissary"));
@Override
public boolean isLegalCommander(CardRules rules) {
return super.isLegalCommander(rules) && !bannedCommanders.contains(rules.getName());
}
@Override
public void adjustCMCLevels(List<ImmutablePair<FilterCMC, Integer>> cmcLevels) {
cmcLevels.clear();
cmcLevels.add(ImmutablePair.of(new FilterCMC(0, 1), 3));
cmcLevels.add(ImmutablePair.of(new FilterCMC(2, 2), 3));
cmcLevels.add(ImmutablePair.of(new FilterCMC(3, 3), 3));
}
},
PlanarConquest ( Range.between(60, Integer.MAX_VALUE), Range.is(0), 1), PlanarConquest ( Range.between(60, Integer.MAX_VALUE), Range.is(0), 1),
Vanguard ( Range.between(60, Integer.MAX_VALUE), Range.is(0), 4), Vanguard ( Range.between(60, Integer.MAX_VALUE), Range.is(0), 4),
Planechase ( Range.between(60, Integer.MAX_VALUE), Range.is(0), 4), Planechase ( Range.between(60, Integer.MAX_VALUE), Range.is(0), 4),
@@ -71,12 +90,12 @@ public enum DeckFormat {
private final Range<Integer> mainRange; private final Range<Integer> mainRange;
private final Range<Integer> sideRange; // null => no check private final Range<Integer> sideRange; // null => no check
private final int maxCardCopies; private final int maxCardCopies;
private final Predicate<PaperCard> cardPoolFilter; private final Predicate<CardRules> cardPoolFilter;
private DeckFormat(Range<Integer> mainRange0, Range<Integer> sideRange0, int maxCardCopies0) { private DeckFormat(Range<Integer> mainRange0, Range<Integer> sideRange0, int maxCardCopies0) {
this(mainRange0, sideRange0, maxCardCopies0, null); this(mainRange0, sideRange0, maxCardCopies0, null);
} }
private DeckFormat(Range<Integer> mainRange0, Range<Integer> sideRange0, int maxCardCopies0, Predicate<PaperCard> cardPoolFilter0) { private DeckFormat(Range<Integer> mainRange0, Range<Integer> sideRange0, int maxCardCopies0, Predicate<CardRules> cardPoolFilter0) {
mainRange = mainRange0; mainRange = mainRange0;
sideRange = sideRange0; sideRange = sideRange0;
maxCardCopies = maxCardCopies0; maxCardCopies = maxCardCopies0;
@@ -152,9 +171,8 @@ public enum DeckFormat {
if (cmd == null || cmd.isEmpty()) { if (cmd == null || cmd.isEmpty()) {
return "is missing a commander"; return "is missing a commander";
} }
if (!cmd.get(0).getRules().getOracleText().contains("can be your commander") if (!isLegalCommander(cmd.get(0).getRules())) {
&& (!cmd.get(0).getRules().getType().isLegendary() || !cmd.get(0).getRules().getType().isCreature())) { return "has an illegal commander";
return "has a commander that is not a legendary creature";
} }
ColorSet cmdCI = cmd.get(0).getRules().getColorIdentity(); ColorSet cmdCI = cmd.get(0).getRules().getColorIdentity();
@@ -187,12 +205,12 @@ public enum DeckFormat {
if (cardPoolFilter != null) { if (cardPoolFilter != null) {
List<PaperCard> erroneousCI = new ArrayList<PaperCard>(); List<PaperCard> erroneousCI = new ArrayList<PaperCard>();
for (Entry<PaperCard, Integer> cp : deck.getAllCardsInASinglePool()) { for (Entry<PaperCard, Integer> cp : deck.getAllCardsInASinglePool()) {
if (!cardPoolFilter.apply(cp.getKey())) { if (!cardPoolFilter.apply(cp.getKey().getRules())) {
erroneousCI.add(cp.getKey()); erroneousCI.add(cp.getKey());
} }
} }
if (erroneousCI.size() > 0) { if (erroneousCI.size() > 0) {
StringBuilder sb = new StringBuilder("contains card that have CMC higher than 3:"); StringBuilder sb = new StringBuilder("contains the following illegal cards:\n");
for (PaperCard cp : erroneousCI) { for (PaperCard cp : erroneousCI) {
sb.append("\n").append(cp.getName()); sb.append("\n").append(cp.getName());
@@ -275,11 +293,37 @@ public enum DeckFormat {
return null; return null;
} }
public IDeckGenPool getCardPool() { public IDeckGenPool getCardPool(IDeckGenPool basePool) {
IDeckGenPool pool = StaticData.instance().getCommonCards(); if (cardPoolFilter == null) {
if (cardPoolFilter != null) { return basePool;
pool = new DeckGenPool(pool.getAllCards(cardPoolFilter));
} }
return pool; DeckGenPool filteredPool = new DeckGenPool();
for (PaperCard pc : basePool.getAllCards()) {
if (cardPoolFilter.apply(pc.getRules())) {
filteredPool.add(pc);
}
}
return filteredPool;
}
public void adjustCMCLevels(List<ImmutablePair<FilterCMC, Integer>> cmcLevels) {
//not needed by default
}
public boolean isLegalCard(PaperCard pc) {
if (cardPoolFilter == null) {
return true;
}
return cardPoolFilter.apply(pc.getRules());
}
public boolean isLegalCommander(CardRules rules) {
if (cardPoolFilter != null && !cardPoolFilter.apply(rules)) {
return false;
}
if (rules.getType().isLegendary() && rules.getType().isCreature()) {
return true;
}
return rules.getOracleText().contains("can be your commander");
} }
} }

View File

@@ -22,6 +22,7 @@ import com.google.common.collect.Lists;
import forge.card.ColorSet; import forge.card.ColorSet;
import forge.card.MagicColor; import forge.card.MagicColor;
import forge.deck.CardPool; import forge.deck.CardPool;
import forge.deck.DeckFormat;
import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.ImmutablePair;
@@ -42,7 +43,7 @@ public class DeckGenerator2Color extends DeckGeneratorBase {
@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>> cmcLevels = Lists.newArrayList(
ImmutablePair.of(new FilterCMC(0, 2), 6), ImmutablePair.of(new FilterCMC(0, 2), 6),
ImmutablePair.of(new FilterCMC(3, 4), 4), ImmutablePair.of(new FilterCMC(3, 4), 4),
ImmutablePair.of(new FilterCMC(5, 6), 2), ImmutablePair.of(new FilterCMC(5, 6), 2),
@@ -56,11 +57,13 @@ public class DeckGenerator2Color extends DeckGeneratorBase {
// 4x 7 - 20 // 4x 7 - 20
// = 52x - card pool (before further random filtering) // = 52x - card pool (before further random filtering)
public DeckGenerator2Color(IDeckGenPool pool, final String clr1, final String clr2) { public DeckGenerator2Color(IDeckGenPool pool0, DeckFormat format0, final String clr1, final String clr2) {
super(pool); super(pool0, format0);
int c1 = MagicColor.fromName(clr1); int c1 = MagicColor.fromName(clr1);
int c2 = MagicColor.fromName(clr2); int c2 = MagicColor.fromName(clr2);
format0.adjustCMCLevels(cmcLevels);
if( c1 == 0 && c2 == 0) { if( c1 == 0 && c2 == 0) {
int color1 = r.nextInt(5); int color1 = r.nextInt(5);
int color2 = (color1 + 1 + r.nextInt(4)) % 5; int color2 = (color1 + 1 + r.nextInt(4)) % 5;
@@ -78,7 +81,7 @@ public class DeckGenerator2Color extends DeckGeneratorBase {
@Override @Override
public final CardPool getDeck(final int size, final boolean forAi) { public final CardPool getDeck(final int size, final boolean forAi) {
addCreaturesAndSpells(size, cmcRelativeWeights, forAi); addCreaturesAndSpells(size, cmcLevels, forAi);
// Add lands // Add lands
int numLands = Math.round(size * getLandsPercentage()); int numLands = Math.round(size * getLandsPercentage());

View File

@@ -22,6 +22,7 @@ import com.google.common.collect.Lists;
import forge.card.ColorSet; import forge.card.ColorSet;
import forge.card.MagicColor; import forge.card.MagicColor;
import forge.deck.CardPool; import forge.deck.CardPool;
import forge.deck.DeckFormat;
import forge.util.MyRandom; import forge.util.MyRandom;
import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.ImmutablePair;
@@ -44,8 +45,11 @@ public class DeckGenerator3Color extends DeckGeneratorBase {
ImmutablePair.of(new FilterCMC(6, 20), 3) ImmutablePair.of(new FilterCMC(6, 20), 3)
); );
public DeckGenerator3Color(IDeckGenPool pool, final String clr1, final String clr2, final String clr3) { public DeckGenerator3Color(IDeckGenPool pool0, DeckFormat format0, final String clr1, final String clr2, final String clr3) {
super(pool); super(pool0, format0);
format0.adjustCMCLevels(cmcLevels);
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);

View File

@@ -21,6 +21,7 @@ import com.google.common.collect.Lists;
import forge.card.ColorSet; import forge.card.ColorSet;
import forge.deck.CardPool; import forge.deck.CardPool;
import forge.deck.DeckFormat;
import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.ImmutablePair;
@@ -51,8 +52,9 @@ public class DeckGenerator5Color extends DeckGeneratorBase {
/** /**
* Instantiates a new generate5 color deck. * Instantiates a new generate5 color deck.
*/ */
public DeckGenerator5Color(IDeckGenPool pool) { public DeckGenerator5Color(IDeckGenPool pool0, DeckFormat format0) {
super(pool); super(pool0, format0);
format0.adjustCMCLevels(cmcLevels);
colors = ColorSet.fromMask(0).inverse(); colors = ColorSet.fromMask(0).inverse();
} }

View File

@@ -21,13 +21,16 @@ import com.google.common.base.Predicate;
import com.google.common.base.Predicates; 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.card.*; import forge.card.*;
import forge.card.mana.ManaCost; import forge.card.mana.ManaCost;
import forge.deck.CardPool; import forge.deck.CardPool;
import forge.deck.DeckFormat;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.util.Aggregates; import forge.util.Aggregates;
import forge.util.ItemPool; import forge.util.ItemPool;
import forge.util.MyRandom; import forge.util.MyRandom;
import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.ImmutablePair;
import java.util.*; import java.util.*;
@@ -50,6 +53,7 @@ public abstract class DeckGeneratorBase {
protected ColorSet colors; protected ColorSet colors;
protected final CardPool tDeck = new CardPool(); protected final CardPool tDeck = new CardPool();
protected final IDeckGenPool pool; protected final IDeckGenPool pool;
protected final DeckFormat format;
// 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; }
@@ -58,8 +62,9 @@ public abstract class DeckGeneratorBase {
StringBuilder tmpDeck = new StringBuilder(); StringBuilder tmpDeck = new StringBuilder();
public DeckGeneratorBase(IDeckGenPool pool0) { public DeckGeneratorBase(IDeckGenPool pool0, DeckFormat format0) {
pool = pool0; pool = format0.getCardPool(pool0);
format = format0;
} }
public void setSingleton(boolean singleton){ public void setSingleton(boolean singleton){

View File

@@ -22,6 +22,7 @@ import com.google.common.collect.Lists;
import forge.card.ColorSet; import forge.card.ColorSet;
import forge.card.MagicColor; import forge.card.MagicColor;
import forge.deck.CardPool; import forge.deck.CardPool;
import forge.deck.DeckFormat;
import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.ImmutablePair;
@@ -55,8 +56,8 @@ public class DeckGeneratorMonoColor extends DeckGeneratorBase {
// 4x 7 - 20 // 4x 7 - 20
// = 52x - card pool (before further random filtering) // = 52x - card pool (before further random filtering)
public DeckGeneratorMonoColor(IDeckGenPool pool, final String clr1) { public DeckGeneratorMonoColor(IDeckGenPool pool0, DeckFormat format0, final String clr1) {
super(pool); super(pool0, format0);
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

@@ -11,6 +11,7 @@ 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.DeckFormat;
import forge.deck.generation.*; import forge.deck.generation.*;
import forge.gui.framework.ICDoc; import forge.gui.framework.ICDoc;
import forge.item.InventoryItem; import forge.item.InventoryItem;
@@ -112,10 +113,10 @@ public enum CDeckgen implements ICDoc {
CardDb cardDb = FModel.getMagicDb().getCommonCards(); CardDb cardDb = FModel.getMagicDb().getCommonCards();
DeckGeneratorBase gen = null; DeckGeneratorBase gen = null;
switch (colorCount0) { switch (colorCount0) {
case 1: gen = new DeckGeneratorMonoColor(cardDb, null); break; case 1: gen = new DeckGeneratorMonoColor(cardDb, DeckFormat.Constructed, null); break;
case 2: gen = new DeckGenerator2Color(cardDb, null, null); break; case 2: gen = new DeckGenerator2Color(cardDb, DeckFormat.Constructed, null, null); break;
case 3: gen = new DeckGenerator3Color(cardDb, null, null, null); break; case 3: gen = new DeckGenerator3Color(cardDb, DeckFormat.Constructed, null, null, null); break;
case 5: gen = new DeckGenerator5Color(cardDb); break; case 5: gen = new DeckGenerator5Color(cardDb, DeckFormat.Constructed); break;
} }
if( null != gen ) { if( null != gen ) {

View File

@@ -1,6 +1,7 @@
package forge.deck.generate; package forge.deck.generate;
import forge.card.CardDb; import forge.card.CardDb;
import forge.deck.DeckFormat;
import forge.deck.generation.DeckGenerator2Color; import forge.deck.generation.DeckGenerator2Color;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.model.FModel; import forge.model.FModel;
@@ -21,7 +22,7 @@ public class Generate2ColorDeckTest {
@Test(enabled = false) @Test(enabled = false)
public void generate2ColorDeckTest1() { public void generate2ColorDeckTest1() {
CardDb cardDb = FModel.getMagicDb().getCommonCards(); CardDb cardDb = FModel.getMagicDb().getCommonCards();
final DeckGenerator2Color gen = new DeckGenerator2Color(cardDb, "white", "blue"); final DeckGenerator2Color gen = new DeckGenerator2Color(cardDb, DeckFormat.Constructed, "white", "blue");
final ItemPool<PaperCard> cardList = gen.getDeck(60, false); final ItemPool<PaperCard> cardList = gen.getDeck(60, false);
Assert.assertNotNull(cardList); Assert.assertNotNull(cardList);
} }

View File

@@ -2,6 +2,7 @@ package forge.deck.generate;
import forge.card.CardDb; import forge.card.CardDb;
import forge.deck.CardPool; import forge.deck.CardPool;
import forge.deck.DeckFormat;
import forge.deck.generation.DeckGenerator3Color; import forge.deck.generation.DeckGenerator3Color;
import forge.model.FModel; import forge.model.FModel;
@@ -20,7 +21,7 @@ public class Generate3ColorDeckTest {
@Test(timeOut = 1000, enabled = false) @Test(timeOut = 1000, enabled = false)
public void generate3ColorDeckTest1() { public void generate3ColorDeckTest1() {
CardDb cardDb = FModel.getMagicDb().getCommonCards(); CardDb cardDb = FModel.getMagicDb().getCommonCards();
final DeckGenerator3Color gen = new DeckGenerator3Color(cardDb, "white", "blue", "black"); final DeckGenerator3Color gen = new DeckGenerator3Color(cardDb, DeckFormat.Constructed, "white", "blue", "black");
final CardPool cardList = gen.getDeck(60, false); final CardPool cardList = gen.getDeck(60, false);
Assert.assertNotNull(cardList); Assert.assertNotNull(cardList);
} }

View File

@@ -2,6 +2,7 @@ package forge.deck.generate;
import forge.card.CardDb; import forge.card.CardDb;
import forge.deck.CardPool; import forge.deck.CardPool;
import forge.deck.DeckFormat;
import forge.deck.generation.DeckGenerator5Color; import forge.deck.generation.DeckGenerator5Color;
import forge.model.FModel; import forge.model.FModel;
@@ -20,7 +21,7 @@ public class Generate5ColorDeckTest {
@Test(timeOut = 1000, enabled = false) @Test(timeOut = 1000, enabled = false)
public void generate5ColorDeckTest1() { public void generate5ColorDeckTest1() {
CardDb cardDb = FModel.getMagicDb().getCommonCards(); CardDb cardDb = FModel.getMagicDb().getCommonCards();
final DeckGenerator5Color gen = new DeckGenerator5Color(cardDb); final DeckGenerator5Color gen = new DeckGenerator5Color(cardDb, DeckFormat.Constructed);
final CardPool cardList = gen.getDeck(60, false); final CardPool cardList = gen.getDeck(60, false);
Assert.assertNotNull(cardList); Assert.assertNotNull(cardList);
} }

View File

@@ -47,8 +47,8 @@ public class DeckGeneratorTheme extends DeckGeneratorBase {
* Constructor for ThemeDeckGenerator. * Constructor for ThemeDeckGenerator.
* </p> * </p>
*/ */
public DeckGeneratorTheme(IDeckGenPool pool) { public DeckGeneratorTheme(IDeckGenPool pool0) {
super(pool); super(pool0, DeckFormat.Constructed);
this.maxDuplicates = 4; this.maxDuplicates = 4;
} }

View File

@@ -52,16 +52,16 @@ public class DeckgenUtil {
DeckGeneratorBase gen = null; DeckGeneratorBase gen = null;
CardDb cardDb = FModel.getMagicDb().getCommonCards(); CardDb cardDb = FModel.getMagicDb().getCommonCards();
if (selection.size() == 1) { if (selection.size() == 1) {
gen = new DeckGeneratorMonoColor(cardDb, selection.get(0)); gen = new DeckGeneratorMonoColor(cardDb, DeckFormat.Constructed, selection.get(0));
} }
else if (selection.size() == 2) { else if (selection.size() == 2) {
gen = new DeckGenerator2Color(cardDb, selection.get(0), selection.get(1)); gen = new DeckGenerator2Color(cardDb, DeckFormat.Constructed, selection.get(0), selection.get(1));
} }
else if (selection.size() == 3) { else if (selection.size() == 3) {
gen = new DeckGenerator3Color(cardDb, selection.get(0), selection.get(1), selection.get(2)); gen = new DeckGenerator3Color(cardDb, DeckFormat.Constructed, selection.get(0), selection.get(1), selection.get(2));
} }
else { else {
gen = new DeckGenerator5Color(cardDb); gen = new DeckGenerator5Color(cardDb, DeckFormat.Constructed);
deckName = "5 colors"; deckName = "5 colors";
} }
gen.setSingleton(FModel.getPreferences().getPrefBoolean(FPref.DECKGEN_SINGLETONS)); gen.setSingleton(FModel.getPreferences().getPrefBoolean(FPref.DECKGEN_SINGLETONS));
@@ -278,16 +278,23 @@ public class DeckgenUtil {
/** Generate a 2-color Commander deck. */ /** Generate a 2-color Commander deck. */
public static Deck generateCommanderDeck(boolean forAi, GameType gameType) { public static Deck generateCommanderDeck(boolean forAi, GameType gameType) {
final Deck deck; final Deck deck;
IDeckGenPool cardDb = gameType.getDeckFormat().getCardPool(); IDeckGenPool cardDb = FModel.getMagicDb().getCommonCards();
PaperCard commander; PaperCard commander;
ColorSet colorID; ColorSet colorID;
// Get random multicolor Legendary creature // Get random multicolor Legendary creature
final DeckFormat format = gameType.getDeckFormat();
Predicate<CardRules> canPlay = forAi ? DeckGeneratorBase.AI_CAN_PLAY : DeckGeneratorBase.HUMAN_CAN_PLAY; Predicate<CardRules> canPlay = forAi ? DeckGeneratorBase.AI_CAN_PLAY : DeckGeneratorBase.HUMAN_CAN_PLAY;
Iterable<PaperCard> legends = cardDb.getAllCards(Predicates.compose(Predicates.and @SuppressWarnings("unchecked")
(CardRulesPredicates.Presets.IS_CREATURE, CardRulesPredicates.Presets.IS_LEGENDARY), PaperCard.FN_GET_RULES)); Iterable<PaperCard> legends = cardDb.getAllCards(Predicates.compose(Predicates.and(
legends = Iterables.filter(legends, Predicates.compose(Predicates.and new Predicate<CardRules>() {
(CardRulesPredicates.Presets.IS_MULTICOLOR, canPlay), PaperCard.FN_GET_RULES)); @Override
public boolean apply(CardRules rules) {
return format.isLegalCommander(rules);
}
},
CardRulesPredicates.Presets.IS_MULTICOLOR,
canPlay), PaperCard.FN_GET_RULES));
do { do {
commander = Aggregates.random(legends); commander = Aggregates.random(legends);
@@ -302,7 +309,7 @@ public class DeckgenUtil {
if (colorID.hasGreen()) { comColors.add("Green"); } if (colorID.hasGreen()) { comColors.add("Green"); }
DeckGeneratorBase gen = null; DeckGeneratorBase gen = null;
gen = new DeckGenerator2Color(cardDb, comColors.get(0), comColors.get(1)); gen = new DeckGenerator2Color(cardDb, format, comColors.get(0), comColors.get(1));
gen.setSingleton(true); gen.setSingleton(true);
gen.setUseArtifacts(!FModel.getPreferences().getPrefBoolean(FPref.DECKGEN_ARTIFACTS)); gen.setUseArtifacts(!FModel.getPreferences().getPrefBoolean(FPref.DECKGEN_ARTIFACTS));
CardPool cards = gen == null ? null : gen.getDeck(gameType.getDeckFormat().getMainRange().getMaximum(), forAi); CardPool cards = gen == null ? null : gen.getDeck(gameType.getDeckFormat().getMainRange().getMaximum(), forAi);

View File

@@ -10,6 +10,7 @@ import forge.card.mana.ManaCost;
import forge.card.mana.ManaCostShard; import forge.card.mana.ManaCostShard;
import forge.deck.CardPool; import forge.deck.CardPool;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckFormat;
import forge.deck.DeckSection; import forge.deck.DeckSection;
import forge.deck.generation.DeckGeneratorBase; import forge.deck.generation.DeckGeneratorBase;
import forge.item.IPaperCard; import forge.item.IPaperCard;
@@ -54,7 +55,7 @@ public class LimitedDeckBuilder extends DeckGeneratorBase{
* Chosen colors. * Chosen colors.
*/ */
public LimitedDeckBuilder(List<PaperCard> dList, DeckColors pClrs) { public LimitedDeckBuilder(List<PaperCard> dList, DeckColors pClrs) {
super(FModel.getMagicDb().getCommonCards()); super(FModel.getMagicDb().getCommonCards(), DeckFormat.Limited);
this.availableList = dList; this.availableList = dList;
this.deckColors = pClrs; this.deckColors = pClrs;
this.colors = pClrs.getChosenColors(); this.colors = pClrs.getChosenColors();

View File

@@ -9,6 +9,7 @@ import forge.card.ColorSet;
import forge.card.MagicColor; import forge.card.MagicColor;
import forge.deck.CardPool; import forge.deck.CardPool;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckFormat;
import forge.deck.DeckSection; import forge.deck.DeckSection;
import forge.deck.generation.DeckGenerator2Color; import forge.deck.generation.DeckGenerator2Color;
import forge.deck.generation.DeckGenerator3Color; import forge.deck.generation.DeckGenerator3Color;
@@ -39,19 +40,19 @@ public class ConquestUtil {
DeckGeneratorBase gen; DeckGeneratorBase gen;
switch (colors.size()) { switch (colors.size()) {
case 0: case 0:
gen = new DeckGeneratorMonoColor(pool, ""); gen = new DeckGeneratorMonoColor(pool, DeckFormat.PlanarConquest, "");
break; break;
case 1: case 1:
gen = new DeckGeneratorMonoColor(pool, colors.get(0)); gen = new DeckGeneratorMonoColor(pool, DeckFormat.PlanarConquest, colors.get(0));
break; break;
case 2: case 2:
gen = new DeckGenerator2Color(pool, colors.get(0), colors.get(1)); gen = new DeckGenerator2Color(pool, DeckFormat.PlanarConquest, colors.get(0), colors.get(1));
break; break;
case 3: case 3:
gen = new DeckGenerator3Color(pool, colors.get(0), colors.get(1), colors.get(2)); gen = new DeckGenerator3Color(pool, DeckFormat.PlanarConquest, colors.get(0), colors.get(1), colors.get(2));
break; break;
case 5: case 5:
gen = new DeckGenerator5Color(pool); gen = new DeckGenerator5Color(pool, DeckFormat.PlanarConquest);
break; break;
default: default:
return null; //shouldn't happen return null; //shouldn't happen