diff --git a/forge-game/src/main/java/forge/game/GameType.java b/forge-game/src/main/java/forge/game/GameType.java index fa57097b8a8..ae5ffd31327 100644 --- a/forge-game/src/main/java/forge/game/GameType.java +++ b/forge-game/src/main/java/forge/game/GameType.java @@ -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."), diff --git a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java index fdad238c675..822aaa41c59 100644 --- a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java +++ b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java @@ -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 decks = new ArrayList(); - 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"); diff --git a/forge-gui-mobile/src/forge/deck/FDeckChooser.java b/forge-gui-mobile/src/forge/deck/FDeckChooser.java index 197acb5d013..00501f12339 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckChooser.java +++ b/forge-gui-mobile/src/forge/deck/FDeckChooser.java @@ -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 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 decks = new ArrayList(); - 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() { diff --git a/forge-gui/src/main/java/forge/deck/ColorDeckGenerator.java b/forge-gui/src/main/java/forge/deck/ColorDeckGenerator.java index 23a27a30a2f..e13ce03a2b5 100644 --- a/forge-gui/src/main/java/forge/deck/ColorDeckGenerator.java +++ b/forge-gui/src/main/java/forge/deck/ColorDeckGenerator.java @@ -7,12 +7,22 @@ import forge.itemmanager.IItemManager; public class ColorDeckGenerator extends DeckProxy implements Comparable { + public static List getColorDecks(IItemManager lstDecks0, boolean isAi0) { + String[] colors = new String[] { "Random 1", "Random 2", "Random 3", + "White", "Blue", "Black", "Red", "Green" }; + ArrayList decks = new ArrayList(); + 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 lstDecks; private final boolean isAi; - public ColorDeckGenerator(String name0, int index0, IItemManager lstDecks0, boolean isAi0) { + private ColorDeckGenerator(String name0, int index0, IItemManager lstDecks0, boolean isAi0) { super(); name = name0; index = index0; diff --git a/forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java b/forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java index 0a89d49be6d..c45e456bbc1 100644 --- a/forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java +++ b/forge-gui/src/main/java/forge/deck/RandomDeckGenerator.java @@ -34,7 +34,7 @@ public class RandomDeckGenerator extends DeckProxy implements Comparable