Support opening Deck Editor from home screen directly

Cleanup logic that builds deck lists
This commit is contained in:
drdev
2015-04-19 17:06:18 +00:00
parent da73cae604
commit f46214c4e0
5 changed files with 168 additions and 244 deletions

View File

@@ -17,6 +17,7 @@ public enum GameType {
QuestDraft (DeckFormat.Limited, true, true, true, "Quest Draft", ""),
PlanarConquest (DeckFormat.PlanarConquest, true, false, false, "Planar Conquest", ""),
Constructed (DeckFormat.Constructed, false, true, true, "Constructed", ""),
DeckEditor (DeckFormat.Constructed, false, true, true, "Deck Editor", ""),
Vanguard (DeckFormat.Vanguard, true, true, true, "Vanguard", "Each player has a special \"Avatar\" card that affects the game."),
Commander (DeckFormat.Commander, false, false, false, "Commander", "Each player has a legendary \"General\" card which can be cast at any time and determines deck colors."),
TinyLeaders (DeckFormat.TinyLeaders, false, false, false, "Tiny Leaders", "Each player has a legendary \"General\" card which can be cast at any time and determines deck colors. Each card must have CMC less than 4."),

View File

@@ -131,14 +131,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener {
private void updateColors() {
lstDecks.setAllowMultipleSelections(true);
String[] colors = new String[] { "Random 1", "Random 2", "Random 3",
"White", "Blue", "Black", "Red", "Green" };
ArrayList<DeckProxy> decks = new ArrayList<DeckProxy>();
for (int i = 0; i < colors.length; i++) {
decks.add(new ColorDeckGenerator(colors[i], i, lstDecks, isAi));
}
lstDecks.setPool(decks);
lstDecks.setPool(ColorDeckGenerator.getColorDecks(lstDecks, isAi));
lstDecks.setup(ItemManagerConfig.STRING_ONLY);
btnRandom.setText("Random Colors");

View File

@@ -5,6 +5,7 @@ import forge.Forge;
import forge.deck.Deck;
import forge.deck.FDeckEditor.EditorType;
import forge.deck.io.DeckPreferences;
import forge.error.BugReporter;
import forge.game.GameType;
import forge.game.player.RegisteredPlayer;
import forge.itemmanager.DeckManager;
@@ -79,6 +80,11 @@ public class FDeckChooser extends FScreen {
lstDecks.setItemActivateHandler(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
if (lstDecks.getGameType() == GameType.DeckEditor) {
//for Deck Editor, edit deck instead of accepting
editSelectedDeck();
return;
}
accept();
}
});
@@ -149,11 +155,29 @@ public class FDeckChooser extends FScreen {
}
}
});
btnRandom.setCommand(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
if (lstDecks.getGameType() == GameType.DeckEditor) {
//for Deck Editor, play deck instead of randomly selecting deck
editSelectedDeck();
return;
}
if (selectedDeckType == DeckType.COLOR_DECK) {
DeckgenUtil.randomSelectColors(lstDecks);
}
else {
DeckgenUtil.randomSelect(lstDecks);
}
accept();
}
});
switch (lstDecks.getGameType()) {
case Constructed:
break; //delay initialize for constructed until saved decks can be reloaded
case Commander:
case Gauntlet:
case DeckEditor:
initialize(null, DeckType.CUSTOM_DECK);
break;
default:
@@ -174,7 +198,7 @@ public class FDeckChooser extends FScreen {
public void onActivate() {
if (needRefreshOnActivate) {
needRefreshOnActivate = false;
updateCustom();
refreshDecksList(DeckType.CUSTOM_DECK, true, null);
switch (lstDecks.getGameType()) {
case Commander:
lstDecks.setSelectedString(DeckPreferences.getCommanderDeck());
@@ -271,6 +295,12 @@ public class FDeckChooser extends FScreen {
cmbDeckTypes.addItem(DeckType.RANDOM_DECK);
cmbDeckTypes.addItem(DeckType.NET_DECK);
break;
case DeckEditor:
cmbDeckTypes.addItem(DeckType.CUSTOM_DECK);
cmbDeckTypes.addItem(DeckType.PRECONSTRUCTED_DECK);
cmbDeckTypes.addItem(DeckType.QUEST_OPPONENT_DECK);
cmbDeckTypes.addItem(DeckType.NET_DECK);
break;
default:
cmbDeckTypes.addItem(DeckType.CUSTOM_DECK);
cmbDeckTypes.addItem(DeckType.RANDOM_DECK);
@@ -321,6 +351,129 @@ public class FDeckChooser extends FScreen {
}
}
private void refreshDecksList(DeckType deckType, boolean forceRefresh, FEvent e) {
if (selectedDeckType == deckType && !forceRefresh) { return; }
selectedDeckType = deckType;
if (e == null) {
refreshingDeckType = true;
cmbDeckTypes.setSelectedItem(deckType);
refreshingDeckType = false;
}
if (deckType == null) { return; }
int maxSelections = 1;
Iterable<DeckProxy> pool;
ItemManagerConfig config;
switch (deckType) {
case CUSTOM_DECK:
switch (lstDecks.getGameType()) {
case Commander:
pool = DeckProxy.getAllCommanderDecks();
config = ItemManagerConfig.COMMANDER_DECKS;
break;
case Archenemy:
pool = DeckProxy.getAllSchemeDecks();
config = ItemManagerConfig.SCHEME_DECKS;
break;
case Planechase:
pool = DeckProxy.getAllPlanarDecks();
config = ItemManagerConfig.PLANAR_DECKS;
break;
default:
pool = DeckProxy.getAllConstructedDecks();
config = ItemManagerConfig.CONSTRUCTED_DECKS;
break;
}
break;
case COLOR_DECK:
maxSelections = 3;
pool = ColorDeckGenerator.getColorDecks(lstDecks, isAi);
config = ItemManagerConfig.STRING_ONLY;
break;
case THEME_DECK:
pool = DeckProxy.getAllThemeDecks();
config = ItemManagerConfig.STRING_ONLY;
break;
case QUEST_OPPONENT_DECK:
pool = DeckProxy.getAllQuestEventAndChallenges();
config = ItemManagerConfig.QUEST_EVENT_DECKS;
break;
case PRECONSTRUCTED_DECK:
pool = DeckProxy.getAllPreconstructedDecks(QuestController.getPrecons());
config = ItemManagerConfig.PRECON_DECKS;
break;
case RANDOM_DECK:
pool = RandomDeckGenerator.getRandomDecks(lstDecks, isAi);
config = ItemManagerConfig.STRING_ONLY;
break;
case NET_DECK:
if (netDeckCategory != null) {
cmbDeckTypes.setText(netDeckCategory.getDeckType());
}
pool = DeckProxy.getNetDecks(netDeckCategory);
config = ItemManagerConfig.NET_DECKS;
break;
default:
BugReporter.reportBug("Unsupported deck type: " + deckType);
return;
}
lstDecks.setSelectionSupport(1, maxSelections);
lstDecks.setPool(pool);
lstDecks.setup(config);
if (config == ItemManagerConfig.STRING_ONLY) {
//hide edit/view buttons for string-only lists
btnNewDeck.setWidth(getWidth() - 2 * PADDING);
btnEditDeck.setVisible(false);
btnViewDeck.setVisible(false);
btnRandom.setWidth(btnNewDeck.getWidth());
btnNewDeck.setText("Generate New Deck");
switch (deckType) {
case COLOR_DECK:
btnRandom.setText("Random Colors");
break;
case THEME_DECK:
btnRandom.setText("Random Theme");
break;
default:
btnRandom.setText("Random Deck");
break;
}
}
else {
btnNewDeck.setWidth(btnEditDeck.getWidth());
btnEditDeck.setVisible(true);
btnViewDeck.setVisible(true);
btnRandom.setWidth(btnNewDeck.getWidth());
btnNewDeck.setText("New Deck");
if (lstDecks.getGameType() == GameType.DeckEditor) {
//handle special case of Deck Editor screen where this button will start a game with the deck
btnRandom.setText("Test Deck");
}
else {
btnRandom.setText("Random Deck");
}
}
btnRandom.setLeft(getWidth() - PADDING - btnRandom.getWidth());
if (e != null) { //set default list selection if from combo box change event
if (deckType == DeckType.COLOR_DECK) {
// default selection = basic two color deck
lstDecks.setSelectedIndices(new Integer[]{0, 1});
}
else {
lstDecks.setSelectedIndex(0);
}
}
}
@Override
protected void doLayout(float startY, float width, float height) {
float x = PADDING;
@@ -362,193 +515,6 @@ public class FDeckChooser extends FScreen {
public DeckManager getLstDecks() { return lstDecks; }
private void updateCustom() {
lstDecks.setSelectionSupport(1, 1);
switch (lstDecks.getGameType()) {
case Commander:
lstDecks.setPool(DeckProxy.getAllCommanderDecks());
lstDecks.setup(ItemManagerConfig.COMMANDER_DECKS);
break;
case Archenemy:
lstDecks.setPool(DeckProxy.getAllSchemeDecks());
lstDecks.setup(ItemManagerConfig.SCHEME_DECKS);
break;
case Planechase:
lstDecks.setPool(DeckProxy.getAllPlanarDecks());
lstDecks.setup(ItemManagerConfig.PLANAR_DECKS);
break;
default:
lstDecks.setPool(DeckProxy.getAllConstructedDecks());
lstDecks.setup(ItemManagerConfig.CONSTRUCTED_DECKS);
break;
}
btnNewDeck.setText("New Deck");
btnNewDeck.setWidth(btnEditDeck.getWidth());
btnEditDeck.setVisible(true);
btnViewDeck.setVisible(true);
btnRandom.setText("Random Deck");
btnRandom.setWidth(btnNewDeck.getWidth());
btnRandom.setLeft(getWidth() - PADDING - btnRandom.getWidth());
btnRandom.setCommand(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
DeckgenUtil.randomSelect(lstDecks);
accept();
}
});
}
private void updateColors() {
lstDecks.setSelectionSupport(1, 3); //TODO: Consider supporting more than 3 color random decks
String[] colors = new String[] { "Random 1", "Random 2", "Random 3",
"White", "Blue", "Black", "Red", "Green" };
ArrayList<DeckProxy> decks = new ArrayList<DeckProxy>();
for (int i = 0; i < colors.length; i++) {
decks.add(new ColorDeckGenerator(colors[i], i, lstDecks, isAi));
}
lstDecks.setPool(decks);
lstDecks.setup(ItemManagerConfig.STRING_ONLY);
btnNewDeck.setText("Generate New Deck");
btnNewDeck.setWidth(getWidth() - 2 * PADDING);
btnEditDeck.setVisible(false);
btnViewDeck.setVisible(false);
btnRandom.setText("Random Colors");
btnRandom.setWidth(btnNewDeck.getWidth());
btnRandom.setLeft(getWidth() - PADDING - btnRandom.getWidth());
btnRandom.setCommand(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
DeckgenUtil.randomSelectColors(lstDecks);
accept();
}
});
}
private void updateThemes() {
lstDecks.setSelectionSupport(1, 1);
lstDecks.setPool(DeckProxy.getAllThemeDecks());
lstDecks.setup(ItemManagerConfig.STRING_ONLY);
btnNewDeck.setText("Generate New Deck");
btnNewDeck.setWidth(getWidth() - 2 * PADDING);
btnEditDeck.setVisible(false);
btnViewDeck.setVisible(false);
btnRandom.setText("Random Theme");
btnRandom.setWidth(btnNewDeck.getWidth());
btnRandom.setLeft(getWidth() - PADDING - btnRandom.getWidth());
btnRandom.setCommand(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
DeckgenUtil.randomSelect(lstDecks);
accept();
}
});
}
private void updateRandom() {
lstDecks.setSelectionSupport(1, 1);
lstDecks.setPool(RandomDeckGenerator.getRandomDecks(lstDecks, isAi));
lstDecks.setup(ItemManagerConfig.STRING_ONLY);
btnNewDeck.setText("Generate New Deck");
btnNewDeck.setWidth(getWidth() - 2 * PADDING);
btnEditDeck.setVisible(false);
btnViewDeck.setVisible(false);
btnRandom.setText("Random Deck");
btnRandom.setWidth(btnNewDeck.getWidth());
btnRandom.setLeft(getWidth() - PADDING - btnRandom.getWidth());
btnRandom.setCommand(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
DeckgenUtil.randomSelect(lstDecks);
accept();
}
});
}
private void updatePrecons() {
lstDecks.setSelectionSupport(1, 1);
lstDecks.setPool(DeckProxy.getAllPreconstructedDecks(QuestController.getPrecons()));
lstDecks.setup(ItemManagerConfig.PRECON_DECKS);
btnNewDeck.setText("New Deck");
btnNewDeck.setWidth(btnEditDeck.getWidth());
btnEditDeck.setVisible(true);
btnViewDeck.setVisible(true);
btnRandom.setText("Random Deck");
btnRandom.setWidth(btnNewDeck.getWidth());
btnRandom.setLeft(getWidth() - PADDING - btnRandom.getWidth());
btnRandom.setCommand(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
DeckgenUtil.randomSelect(lstDecks);
accept();
}
});
}
private void updateQuestEvents() {
lstDecks.setSelectionSupport(1, 1);
lstDecks.setPool(DeckProxy.getAllQuestEventAndChallenges());
lstDecks.setup(ItemManagerConfig.QUEST_EVENT_DECKS);
btnNewDeck.setText("New Deck");
btnNewDeck.setWidth(btnEditDeck.getWidth());
btnEditDeck.setVisible(true);
btnViewDeck.setVisible(true);
btnRandom.setText("Random Deck");
btnRandom.setWidth(btnNewDeck.getWidth());
btnRandom.setLeft(getWidth() - PADDING - btnRandom.getWidth());
btnRandom.setCommand(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
DeckgenUtil.randomSelect(lstDecks);
accept();
}
});
}
private void updateNetDecks() {
if (netDeckCategory != null) {
cmbDeckTypes.setText(netDeckCategory.getDeckType());
}
lstDecks.setSelectionSupport(1, 1);
lstDecks.setPool(DeckProxy.getNetDecks(netDeckCategory));
lstDecks.setup(ItemManagerConfig.NET_DECKS);
btnNewDeck.setText("New Deck");
btnNewDeck.setWidth(btnEditDeck.getWidth());
btnEditDeck.setVisible(true);
btnViewDeck.setVisible(true);
btnRandom.setText("Random Deck");
btnRandom.setWidth(btnNewDeck.getWidth());
btnRandom.setLeft(getWidth() - PADDING - btnRandom.getWidth());
btnRandom.setCommand(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
DeckgenUtil.randomSelect(lstDecks);
accept();
}
});
}
public Deck getDeck() {
DeckProxy proxy = lstDecks.getSelectedItem();
if (proxy == null) { return null; }
@@ -587,52 +553,6 @@ public class FDeckChooser extends FScreen {
isAi = isAiDeck;
}
private void refreshDecksList(DeckType deckType, boolean forceRefresh, FEvent e) {
if (selectedDeckType == deckType && !forceRefresh) { return; }
selectedDeckType = deckType;
if (e == null) {
refreshingDeckType = true;
cmbDeckTypes.setSelectedItem(deckType);
refreshingDeckType = false;
}
if (deckType == null) { return; }
switch (deckType) {
case CUSTOM_DECK:
updateCustom();
break;
case COLOR_DECK:
updateColors();
break;
case THEME_DECK:
updateThemes();
break;
case QUEST_OPPONENT_DECK:
updateQuestEvents();
break;
case PRECONSTRUCTED_DECK:
updatePrecons();
break;
case RANDOM_DECK:
updateRandom();
break;
case NET_DECK:
updateNetDecks();
break;
}
if (e != null) { //set default list selection if from combo box change event
if (deckType == DeckType.COLOR_DECK) {
// default selection = basic two color deck
lstDecks.setSelectedIndices(new Integer[]{0, 1});
}
else {
lstDecks.setSelectedIndex(0);
}
}
}
private final String SELECTED_DECK_DELIMITER = "::";
public void saveState() {

View File

@@ -7,12 +7,22 @@ import forge.itemmanager.IItemManager;
public class ColorDeckGenerator extends DeckProxy implements Comparable<ColorDeckGenerator> {
public static List<DeckProxy> getColorDecks(IItemManager<DeckProxy> lstDecks0, boolean isAi0) {
String[] colors = new String[] { "Random 1", "Random 2", "Random 3",
"White", "Blue", "Black", "Red", "Green" };
ArrayList<DeckProxy> decks = new ArrayList<DeckProxy>();
for (int i = 0; i < colors.length; i++) {
decks.add(new ColorDeckGenerator(colors[i], i, lstDecks0, isAi0));
}
return decks;
}
private String name;
private int index;
private final IItemManager<DeckProxy> lstDecks;
private final boolean isAi;
public ColorDeckGenerator(String name0, int index0, IItemManager<DeckProxy> lstDecks0, boolean isAi0) {
private ColorDeckGenerator(String name0, int index0, IItemManager<DeckProxy> lstDecks0, boolean isAi0) {
super();
name = name0;
index = index0;

View File

@@ -34,7 +34,7 @@ public class RandomDeckGenerator extends DeckProxy implements Comparable<RandomD
private final IHasGameType lstDecks;
private final boolean isAi;
public RandomDeckGenerator(String name0, RandomDeckType type0, IHasGameType lstDecks0, boolean isAi0) {
private RandomDeckGenerator(String name0, RandomDeckType type0, IHasGameType lstDecks0, boolean isAi0) {
super();
name = name0;
type = type0;