Add 2 new random deck types - standard and modern legal random color decks. Also improved dual/tri land selection with oracle parsing. Generated decks now choose basic lands that match a card from the deck.

This commit is contained in:
austinio7116
2017-05-03 10:49:53 +00:00
parent ffe6518f32
commit 7a355a84a1
18 changed files with 366 additions and 76 deletions

View File

@@ -3,15 +3,19 @@ package forge.deck;
import java.util.ArrayList;
import java.util.List;
import com.google.common.base.Predicate;
import forge.item.IPaperCard;
import forge.item.PaperCard;
import forge.itemmanager.IItemManager;
import forge.model.FModel;
public class ColorDeckGenerator extends DeckProxy implements Comparable<ColorDeckGenerator> {
public static List<DeckProxy> getColorDecks(final IItemManager<DeckProxy> lstDecks0, final boolean isAi0) {
public static List<DeckProxy> getColorDecks(final IItemManager<DeckProxy> lstDecks0, final Predicate<PaperCard> formatFilter0, final boolean isAi0) {
final String[] colors = new String[] { "Random 1", "Random 2", "Random 3",
"White", "Blue", "Black", "Red", "Green" };
final List<DeckProxy> decks = new ArrayList<DeckProxy>();
for (int i = 0; i < colors.length; i++) {
decks.add(new ColorDeckGenerator(colors[i], i, lstDecks0, isAi0));
decks.add(new ColorDeckGenerator(colors[i], i, lstDecks0, formatFilter0, isAi0));
}
return decks;
}
@@ -20,13 +24,15 @@ public class ColorDeckGenerator extends DeckProxy implements Comparable<ColorDec
private final int index;
private final IItemManager<DeckProxy> lstDecks;
private final boolean isAi;
private final Predicate<PaperCard> formatFilter;
private ColorDeckGenerator(final String name0, final int index0, final IItemManager<DeckProxy> lstDecks0, final boolean isAi0) {
private ColorDeckGenerator(final String name0, final int index0, final IItemManager<DeckProxy> lstDecks0,final Predicate<PaperCard> formatFilter0, final boolean isAi0) {
super();
name = name0;
index = index0;
lstDecks = lstDecks0;
isAi = isAi0;
formatFilter = formatFilter0;
}
@Override
@@ -51,7 +57,7 @@ public class ColorDeckGenerator extends DeckProxy implements Comparable<ColorDec
selection.add(deck.getName());
}
if (DeckgenUtil.colorCheck(selection)) {
return DeckgenUtil.buildColorDeck(selection, isAi);
return DeckgenUtil.buildColorDeck(selection, formatFilter, isAi);
}
return null;
}

View File

@@ -12,6 +12,8 @@ public enum DeckType {
PRECONSTRUCTED_DECK("Preconstructed Decks"),
QUEST_OPPONENT_DECK ("Quest Opponent Decks"),
COLOR_DECK ("Random Color Decks"),
STANDARD_COLOR_DECK ("Random Standard Color Decks"),
MODERN_COLOR_DECK ("Random Modern Color Decks"),
THEME_DECK ("Random Theme Decks"),
RANDOM_DECK ("Random Decks"),
NET_DECK ("Net Decks"),
@@ -22,6 +24,8 @@ public enum DeckType {
DeckType.PRECONSTRUCTED_DECK,
DeckType.QUEST_OPPONENT_DECK,
DeckType.COLOR_DECK,
DeckType.STANDARD_COLOR_DECK,
DeckType.MODERN_COLOR_DECK,
DeckType.THEME_DECK,
DeckType.RANDOM_DECK,
DeckType.NET_DECK

View File

@@ -13,6 +13,7 @@ import forge.deck.Deck;
import forge.deck.DeckSection;
import forge.deck.generation.*;
import forge.game.GameType;
import forge.item.IPaperCard;
import forge.item.PaperCard;
import forge.itemmanager.IItemManager;
import forge.model.FModel;
@@ -44,34 +45,48 @@ public class DeckgenUtil {
* @param selection {@link java.lang.String} array
* @return {@link forge.deck.Deck}
*/
public static Deck buildColorDeck(List<String> selection, boolean forAi) {
public static Deck buildColorDeck(List<String> selection, Predicate<PaperCard> formatFilter, boolean forAi) {
try {
final Deck deck;
String deckName = null;
DeckGeneratorBase gen = null;
CardDb cardDb = FModel.getMagicDb().getCommonCards();
if (selection.size() == 1) {
gen = new DeckGeneratorMonoColor(cardDb, DeckFormat.Constructed, selection.get(0));
}
else if (selection.size() == 2) {
gen = new DeckGenerator2Color(cardDb, DeckFormat.Constructed, selection.get(0), selection.get(1));
}
else if (selection.size() == 3) {
gen = new DeckGenerator3Color(cardDb, DeckFormat.Constructed, selection.get(0), selection.get(1), selection.get(2));
}
else {
gen = new DeckGenerator5Color(cardDb, DeckFormat.Constructed);
deckName = "5 colors";
if (formatFilter == null){
if (selection.size() == 1) {
gen = new DeckGeneratorMonoColor(cardDb, DeckFormat.Constructed,selection.get(0));
}
else if (selection.size() == 2) {
gen = new DeckGenerator2Color(cardDb, DeckFormat.Constructed,selection.get(0), selection.get(1));
}
else if (selection.size() == 3) {
gen = new DeckGenerator3Color(cardDb, DeckFormat.Constructed,selection.get(0), selection.get(1), selection.get(2));
}
else {
gen = new DeckGenerator5Color(cardDb, DeckFormat.Constructed);
deckName = "5 colors";
}
}else {
if (selection.size() == 1) {
gen = new DeckGeneratorMonoColor(cardDb, DeckFormat.Constructed, formatFilter, selection.get(0));
} else if (selection.size() == 2) {
gen = new DeckGenerator2Color(cardDb, DeckFormat.Constructed, formatFilter, selection.get(0), selection.get(1));
} else if (selection.size() == 3) {
gen = new DeckGenerator3Color(cardDb, DeckFormat.Constructed, formatFilter, selection.get(0), selection.get(1), selection.get(2));
} else {
gen = new DeckGenerator5Color(cardDb, DeckFormat.Constructed, formatFilter);
deckName = "5 colors";
}
}
gen.setSingleton(FModel.getPreferences().getPrefBoolean(FPref.DECKGEN_SINGLETONS));
gen.setUseArtifacts(!FModel.getPreferences().getPrefBoolean(FPref.DECKGEN_ARTIFACTS));
final CardPool cards = gen.getDeck(60, forAi);
if (null == deckName) {
deckName = Lang.joinHomogenous(Arrays.asList(selection));
}
// After generating card lists, build deck.
deck = new Deck("Random deck : " + deckName);
deck.setDirectory("generated/color");
@@ -81,7 +96,7 @@ public class DeckgenUtil {
catch (Exception e) {
e.printStackTrace();
}
return buildColorDeck(selection, forAi); //try again if previous color deck couldn't be generated
return buildColorDeck(selection, formatFilter, forAi); //try again if previous color deck couldn't be generated
}
public static QuestEvent getQuestEvent(final String name) {
@@ -98,6 +113,17 @@ public class DeckgenUtil {
return duel;
}
/** @return {@link forge.deck.Deck} */
public static Deck getRandomColorDeck(Predicate<PaperCard> formatFilter, boolean forAi) {
final int[] colorCount = new int[] {1, 2, 3};
final int count = colorCount[MyRandom.getRandom().nextInt(colorCount.length)];
final List<String> selection = new ArrayList<String>();
// A simulated selection of "random 1" will trigger the AI selection process.
for (int i = 0; i < count; i++) { selection.add("Random"); }
return DeckgenUtil.buildColorDeck(selection, formatFilter, forAi);
}
/** @return {@link forge.deck.Deck} */
public static Deck getRandomColorDeck(boolean forAi) {
final int[] colorCount = new int[] {1, 2, 3, 5};
@@ -106,8 +132,7 @@ public class DeckgenUtil {
// A simulated selection of "random 1" will trigger the AI selection process.
for (int i = 0; i < count; i++) { selection.add("Random"); }
return DeckgenUtil.buildColorDeck(selection, forAi);
return DeckgenUtil.buildColorDeck(selection, null, forAi);
}
/** @return {@link forge.deck.Deck} */

View File

@@ -8,6 +8,7 @@ import com.google.common.collect.Iterables;
import forge.game.GameType;
import forge.game.IHasGameType;
import forge.model.FModel;
import forge.quest.QuestController;
import forge.util.Aggregates;
@@ -91,12 +92,26 @@ public class RandomDeckGenerator extends DeckProxy implements Comparable<RandomD
case QUEST_OPPONENT_DECK:
return Aggregates.random(DeckProxy.getAllQuestEventAndChallenges()).getDeck();
case COLOR_DECK:
final List<String> colors = new ArrayList<String>();
final int count = Aggregates.randomInt(1, 3);
List<String> colors = new ArrayList<String>();
int count = Aggregates.randomInt(1, 3);
for (int i = 1; i <= count; i++) {
colors.add("Random " + i);
}
return DeckgenUtil.buildColorDeck(colors, isAi);
return DeckgenUtil.buildColorDeck(colors, null, isAi);
case STANDARD_COLOR_DECK:
colors = new ArrayList<String>();
count = Aggregates.randomInt(1, 3);
for (int i = 1; i <= count; i++) {
colors.add("Random " + i);
}
return DeckgenUtil.buildColorDeck(colors, FModel.getFormats().getStandard().getFilterPrinted(), isAi);
case MODERN_COLOR_DECK:
colors = new ArrayList<String>();
count = Aggregates.randomInt(1, 3);
for (int i = 1; i <= count; i++) {
colors.add("Random " + i);
}
return DeckgenUtil.buildColorDeck(colors, FModel.getFormats().getModern().getFilterPrinted(), isAi);
case THEME_DECK:
return Aggregates.random(DeckProxy.getAllThemeDecks()).getDeck();
default:

View File

@@ -29,6 +29,12 @@ public class GauntletUtil {
deck = DeckgenUtil.getRandomColorDeck(true);
eventNames.add("Random colors deck");
break;
case STANDARD_COLOR_DECK:
deck = DeckgenUtil.getRandomColorDeck(FModel.getFormats().getStandard().getFilterPrinted(),true);
break;
case MODERN_COLOR_DECK:
deck = DeckgenUtil.getRandomColorDeck(FModel.getFormats().getModern().getFilterPrinted(),true);
break;
case CUSTOM_DECK:
deck = DeckgenUtil.getRandomCustomDeck();
eventNames.add(deck.getName());

View File

@@ -29,6 +29,12 @@ public class TournamentUtil {
deck = DeckgenUtil.getRandomColorDeck(true);
eventNames.add("Random colors deck");
break;
case STANDARD_COLOR_DECK:
deck = DeckgenUtil.getRandomColorDeck(FModel.getFormats().getStandard().getFilterPrinted(),true);
break;
case MODERN_COLOR_DECK:
deck = DeckgenUtil.getRandomColorDeck(FModel.getFormats().getModern().getFilterPrinted(),true);
break;
case CUSTOM_DECK:
deck = DeckgenUtil.getRandomCustomDeck();
eventNames.add(deck.getName());