mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 03:38:01 +00:00
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:
@@ -8,6 +8,8 @@ import java.util.List;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JPanel;
|
||||
|
||||
import com.google.common.base.Predicate;
|
||||
import forge.item.PaperCard;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
@@ -135,10 +137,10 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
||||
updateDecks(DeckProxy.getAllConstructedDecks(), ItemManagerConfig.CONSTRUCTED_DECKS);
|
||||
}
|
||||
|
||||
private void updateColors() {
|
||||
private void updateColors(Predicate<PaperCard> formatFilter) {
|
||||
lstDecks.setAllowMultipleSelections(true);
|
||||
|
||||
lstDecks.setPool(ColorDeckGenerator.getColorDecks(lstDecks, isAi));
|
||||
lstDecks.setPool(ColorDeckGenerator.getColorDecks(lstDecks, formatFilter, isAi));
|
||||
lstDecks.setup(ItemManagerConfig.STRING_ONLY);
|
||||
|
||||
btnRandom.setText("Random Colors");
|
||||
@@ -277,7 +279,13 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
|
||||
updateCustom();
|
||||
break;
|
||||
case COLOR_DECK:
|
||||
updateColors();
|
||||
updateColors(null);
|
||||
break;
|
||||
case STANDARD_COLOR_DECK:
|
||||
updateColors(FModel.getFormats().getStandard().getFilterPrinted());
|
||||
break;
|
||||
case MODERN_COLOR_DECK:
|
||||
updateColors(FModel.getFormats().getModern().getFilterPrinted());
|
||||
break;
|
||||
case THEME_DECK:
|
||||
updateThemes();
|
||||
|
||||
@@ -70,6 +70,8 @@ public enum CSubmenuGauntletQuick implements ICDoc {
|
||||
// Find appropriate filename for new save, create and set new save file.
|
||||
final List<DeckType> allowedDeckTypes = new ArrayList<DeckType>();
|
||||
if (view.getBoxColorDecks().isSelected()) { allowedDeckTypes.add(DeckType.COLOR_DECK); }
|
||||
if (view.getBoxStandardColorDecks().isSelected()) { allowedDeckTypes.add(DeckType.STANDARD_COLOR_DECK); }
|
||||
if (view.getBoxModernColorDecks().isSelected()) { allowedDeckTypes.add(DeckType.MODERN_COLOR_DECK); }
|
||||
if (view.getBoxThemeDecks().isSelected()) { allowedDeckTypes.add(DeckType.THEME_DECK); }
|
||||
if (view.getBoxUserDecks().isSelected()) { allowedDeckTypes.add(DeckType.CUSTOM_DECK); }
|
||||
if (view.getBoxQuestDecks().isSelected()) { allowedDeckTypes.add(DeckType.QUEST_OPPONENT_DECK); }
|
||||
|
||||
@@ -51,6 +51,8 @@ public enum VSubmenuGauntletQuick implements IVSubmenu<CSubmenuGauntletQuick> {
|
||||
private final JCheckBox boxPreconDecks = new FCheckBox(DeckType.PRECONSTRUCTED_DECK.toString());
|
||||
private final JCheckBox boxQuestDecks = new FCheckBox(DeckType.QUEST_OPPONENT_DECK.toString());
|
||||
private final JCheckBox boxColorDecks = new FCheckBox(DeckType.COLOR_DECK.toString());
|
||||
private final JCheckBox boxStandardColorDecks = new FCheckBox(DeckType.STANDARD_COLOR_DECK.toString());
|
||||
private final JCheckBox boxModernColorDecks = new FCheckBox(DeckType.MODERN_COLOR_DECK.toString());
|
||||
private final JCheckBox boxThemeDecks = new FCheckBox(DeckType.THEME_DECK.toString());
|
||||
|
||||
private final FDeckChooser lstDecks = new FDeckChooser(null, false);
|
||||
@@ -78,6 +80,8 @@ public enum VSubmenuGauntletQuick implements IVSubmenu<CSubmenuGauntletQuick> {
|
||||
boxQuestDecks.setSelected(true);
|
||||
boxThemeDecks.setSelected(true);
|
||||
boxColorDecks.setSelected(true);
|
||||
boxStandardColorDecks.setSelected(true);
|
||||
boxModernColorDecks.setSelected(true);
|
||||
|
||||
sliOpponents.setMajorTickSpacing(5);
|
||||
sliOpponents.setMinorTickSpacing(0);
|
||||
@@ -98,7 +102,9 @@ public enum VSubmenuGauntletQuick implements IVSubmenu<CSubmenuGauntletQuick> {
|
||||
pnlOptions.add(boxPreconDecks, "w 96%!, h 30px!, gap 2% 0 0 5px");
|
||||
pnlOptions.add(boxQuestDecks, "w 96%!, h 30px!, gap 2% 0 0 5px");
|
||||
pnlOptions.add(boxThemeDecks, "w 96%!, h 30px!, gap 2% 0 0 5px");
|
||||
pnlOptions.add(boxColorDecks, "w 96%!, h 30px!, gap 2% 0 0 0");
|
||||
pnlOptions.add(boxColorDecks, "w 96%!, h 30px!, gap 2% 0 0 5px");
|
||||
pnlOptions.add(boxStandardColorDecks, "w 96%!, h 30px!, gap 2% 0 0 5px");
|
||||
pnlOptions.add(boxModernColorDecks, "w 96%!, h 30px!, gap 2% 0 0 0");
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
@@ -171,6 +177,16 @@ public enum VSubmenuGauntletQuick implements IVSubmenu<CSubmenuGauntletQuick> {
|
||||
return boxColorDecks;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public JCheckBox getBoxStandardColorDecks() {
|
||||
return boxStandardColorDecks;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public JCheckBox getBoxModernColorDecks() {
|
||||
return boxModernColorDecks;
|
||||
}
|
||||
|
||||
/** @return {@link javax.swing.JCheckBox} */
|
||||
public JCheckBox getBoxThemeDecks() {
|
||||
return boxThemeDecks;
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
package forge.item;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import com.google.common.collect.Iterables;
|
||||
import forge.card.ColorSet;
|
||||
import junit.framework.Assert;
|
||||
|
||||
import org.testng.annotations.BeforeTest;
|
||||
@@ -155,6 +156,57 @@ public class DeckHintsTest {
|
||||
Assert.assertEquals(1, hints.filter(list).size());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for finding dual lands for deck generation.
|
||||
*/
|
||||
@Test(timeOut = 1000, enabled = true)
|
||||
void testFindDualLands() {
|
||||
List<String> cardNames= Arrays.asList("tundra.txt", "hallowed_fountain.txt", "flooded_strand.txt", "prairie_stream.txt", "sunken_hollow.txt", "smoldering_marsh.txt");
|
||||
List<PaperCard> cards = new ArrayList<>();
|
||||
for (String name:cardNames){
|
||||
cards.add(readCard(name));
|
||||
}
|
||||
final String pattern="Add \\{([WUBRG])\\} or \\{([WUBRG])\\} to your mana pool";
|
||||
Pattern p = Pattern.compile(pattern);
|
||||
for (PaperCard card:cards){
|
||||
System.out.println(card.getRules().getOracleText());
|
||||
Matcher matcher = p.matcher(card.getRules().getOracleText());
|
||||
while (matcher.find()) {
|
||||
System.out.println("Full match: " + matcher.group(0));
|
||||
for (int i = 1; i <= matcher.groupCount(); i++) {
|
||||
System.out.println("Group " + i + ": " + matcher.group(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final String fetchPattern="Search your library for a ([^\\s]*) or ([^\\s]*) card";
|
||||
final List<String> dLands = new ArrayList<String>();
|
||||
Map<String,String> colorLookup= new HashMap<>();
|
||||
colorLookup.put("Plains","W");
|
||||
colorLookup.put("Forest","G");
|
||||
colorLookup.put("Mountain","R");
|
||||
colorLookup.put("Island","U");
|
||||
colorLookup.put("Swamp","B");
|
||||
Pattern p2 = Pattern.compile(fetchPattern);
|
||||
for (PaperCard card:cards){
|
||||
System.out.println(card.getName());
|
||||
Matcher matcher = p2.matcher(card.getRules().getOracleText());
|
||||
while (matcher.find()) {
|
||||
List<String> manaColorNames = new ArrayList<>();
|
||||
System.out.println(card.getName());
|
||||
for (int i = 1; i <= matcher.groupCount(); i++) {
|
||||
manaColorNames.add(colorLookup.get(matcher.group(i)));
|
||||
}
|
||||
System.out.println(manaColorNames.toString());
|
||||
ColorSet manaColorSet = ColorSet.fromNames(manaColorNames);
|
||||
}
|
||||
}
|
||||
System.out.println(dLands.toString());
|
||||
return;
|
||||
|
||||
//Assert.assertNotNull(has);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a CardPrinted from the given filename.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user