diff --git a/.gitattributes b/.gitattributes index dbb8b69dcd1..3e5308b063d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1124,6 +1124,7 @@ forge-gui-mobile/src/forge/deck/AddBasicLandsDialog.java -text forge-gui-mobile/src/forge/deck/FDeckChooser.java -text forge-gui-mobile/src/forge/deck/FDeckEditor.java -text forge-gui-mobile/src/forge/deck/FDeckViewer.java -text +forge-gui-mobile/src/forge/deck/FVanguardChooser.java -text forge-gui-mobile/src/forge/error/BugReportDialog.java -text forge-gui-mobile/src/forge/itemmanager/CardManager.java -text forge-gui-mobile/src/forge/itemmanager/DeckManager.java -text 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 a42e4ec5910..6de44384bfe 100644 --- a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java +++ b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java @@ -79,7 +79,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { private void updateCustom() { lstDecks.setAllowMultipleSelections(false); - lstDecks.setPool(DeckProxy.getAllConstructedDecks(FModel.getDecks().getConstructed())); + lstDecks.setPool(DeckProxy.getAllConstructedDecks()); lstDecks.setup(ItemManagerConfig.CONSTRUCTED_DECKS); btnRandom.setText("Random Deck"); @@ -300,6 +300,8 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { case PRECONSTRUCTED_DECK: updatePrecons(); break; + default: + break; } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CAllDecks.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CAllDecks.java index 1377cc64a3e..c2ce29f711c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CAllDecks.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CAllDecks.java @@ -4,7 +4,6 @@ import forge.UiCommand; import forge.deck.DeckProxy; import forge.gui.framework.ICDoc; import forge.itemmanager.ItemManagerConfig; -import forge.model.FModel; import forge.screens.deckeditor.views.VAllDecks; /** @@ -36,7 +35,7 @@ public enum CAllDecks implements ICDoc { } public void refresh() { - VAllDecks.SINGLETON_INSTANCE.getLstDecks().setPool(DeckProxy.getAllConstructedDecks(FModel.getDecks().getConstructed())); + VAllDecks.SINGLETON_INSTANCE.getLstDecks().setPool(DeckProxy.getAllConstructedDecks()); } /* (non-Javadoc) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java index e9a89812295..77f053bb0f0 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java @@ -275,7 +275,7 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider { schemePool = ((Deck) selected).get(DeckSection.Schemes); } if (schemePool == null) { //Can be null if player deselects the list selection or chose Generate - schemePool = DeckgenUtil.generateSchemeDeck(); + schemePool = DeckgenUtil.generateSchemePool(); } if (checkLegality) { String errMsg = GameType.Archenemy.getDecksFormat().getSchemeSectionConformanceProblem(schemePool); @@ -308,7 +308,7 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider { planePool = ((Deck) selected).get(DeckSection.Planes); } if (planePool == null) { //Can be null if player deselects the list selection or chose Generate - planePool = DeckgenUtil.generatePlanarDeck(); + planePool = DeckgenUtil.generatePlanarPool(); } if (checkLegality) { String errMsg = GameType.Planechase.getDecksFormat().getPlaneSectionConformanceProblem(planePool); diff --git a/forge-gui-mobile/src/forge/deck/FDeckChooser.java b/forge-gui-mobile/src/forge/deck/FDeckChooser.java index 6672034783c..011a787d8e8 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckChooser.java +++ b/forge-gui-mobile/src/forge/deck/FDeckChooser.java @@ -21,6 +21,7 @@ import forge.toolbox.FComboBox; import forge.toolbox.FEvent; import forge.toolbox.FEvent.FEventHandler; import forge.toolbox.FOptionPane; +import forge.util.Aggregates; import forge.util.Callback; import forge.util.Utils; import forge.util.storage.IStorage; @@ -40,7 +41,7 @@ public class FDeckChooser extends FScreen { private DeckType selectedDeckType; private boolean needRefreshOnActivate; - private final DeckManager lstDecks = new DeckManager(GameType.Constructed); + private final DeckManager lstDecks; private final FButton btnNewDeck = new FButton("New Deck"); private final FButton btnEditDeck = new FButton("Edit Deck"); private final FButton btnViewDeck = new FButton("View Deck"); @@ -51,8 +52,9 @@ public class FDeckChooser extends FScreen { private final ForgePreferences prefs = FModel.getPreferences(); private FPref stateSetting = null; - public FDeckChooser(boolean isAi0) { + public FDeckChooser(GameType gameType0, boolean isAi0) { super(""); + lstDecks = new DeckManager(gameType0); isAi = isAi0; lstDecks.setItemActivateHandler(new FEventHandler() { @@ -82,7 +84,22 @@ public class FDeckChooser extends FScreen { } break; default: - editor = new FDeckEditor(EditorType.Constructed, "", false); + switch (lstDecks.getGameType()) { + case Constructed: + editor = new FDeckEditor(EditorType.Constructed, "", false); + break; + case Commander: + editor = new FDeckEditor(EditorType.Commander, "", false); + break; + case Archenemy: + editor = new FDeckEditor(EditorType.Archenemy, "", false); + break; + case Planechase: + editor = new FDeckEditor(EditorType.Planechase, "", false); + break; + default: + return; + } break; } editor.setSaveHandler(new FEventHandler() { @@ -120,6 +137,9 @@ public class FDeckChooser extends FScreen { } } }); + if (gameType0 != GameType.Constructed) { //delay initialize for constructed until saved decks can be reloaded + initialize(null, DeckType.RANDOM_DECK); + } } @Override @@ -145,7 +165,7 @@ public class FDeckChooser extends FScreen { Deck existingDeck = decks.get(deck.getName()); if (existingDeck != null) { setSelectedDeckType(DeckType.CUSTOM_DECK); - editDeck(new DeckProxy(existingDeck, "Constructed", GameType.Constructed, decks)); + editDeck(new DeckProxy(existingDeck, "Constructed", lstDecks.getGameType(), decks)); return; } @@ -175,7 +195,18 @@ public class FDeckChooser extends FScreen { selectedDeckType = defaultDeckType; if (cmbDeckTypes == null) { //initialize components with delayed initialization the first time this is populated - cmbDeckTypes = new FComboBox(DeckType.values()); + cmbDeckTypes = new FComboBox(); + if (lstDecks.getGameType() == GameType.Constructed) { + cmbDeckTypes.addItem(DeckType.CUSTOM_DECK); + cmbDeckTypes.addItem(DeckType.PRECONSTRUCTED_DECK); + cmbDeckTypes.addItem(DeckType.QUEST_OPPONENT_DECK); + cmbDeckTypes.addItem(DeckType.COLOR_DECK); + cmbDeckTypes.addItem(DeckType.THEME_DECK); + } + else { + cmbDeckTypes.addItem(DeckType.CUSTOM_DECK); + cmbDeckTypes.addItem(DeckType.RANDOM_DECK); + } cmbDeckTypes.setAlignment(HAlignment.CENTER); restoreSavedState(); cmbDeckTypes.setChangedHandler(new FEventHandler() { @@ -240,8 +271,26 @@ public class FDeckChooser extends FScreen { private void updateCustom() { lstDecks.setSelectionSupport(1, 1); - lstDecks.setPool(DeckProxy.getAllConstructedDecks(FModel.getDecks().getConstructed())); - lstDecks.setup(ItemManagerConfig.CONSTRUCTED_DECKS); + switch (lstDecks.getGameType()) { + case Constructed: + lstDecks.setPool(DeckProxy.getAllConstructedDecks()); + lstDecks.setup(ItemManagerConfig.CONSTRUCTED_DECKS); + break; + 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: + break; + } btnNewDeck.setText("New Deck"); btnNewDeck.setWidth(btnEditDeck.getWidth()); @@ -266,7 +315,7 @@ public class FDeckChooser extends FScreen { public ColorDeckGenerator(String name0, int index0) { super(); name = name0; - this.index = index0; + index = index0; } @Override @@ -281,7 +330,7 @@ public class FDeckChooser extends FScreen { @Override public int compareTo(final ColorDeckGenerator d) { - return d instanceof ColorDeckGenerator ? Integer.compare(this.index, ((ColorDeckGenerator)d).index) : 1; + return d instanceof ColorDeckGenerator ? Integer.compare(index, ((ColorDeckGenerator)d).index) : 1; } @Override @@ -353,6 +402,97 @@ public class FDeckChooser extends FScreen { }); } + private class RandomDeckGenerator extends DeckProxy implements Comparable { + private String name; + private int index; + + public RandomDeckGenerator(String name0, int index0) { + super(); + name = name0; + index = index0; + } + + @Override + public String getName() { + return name; + } + + @Override + public String toString() { + return name; + } + + @Override + public int compareTo(final RandomDeckGenerator d) { + return d instanceof RandomDeckGenerator ? Integer.compare(index, ((RandomDeckGenerator)d).index) : 1; + } + + @Override + public Deck getDeck() { + String sel = lstDecks.getSelectedItem().getName(); + switch (lstDecks.getGameType()) { + case Commander: + if (sel.equals("Random")) { + IStorage decks = FModel.getDecks().getCommander(); + if (decks.size() > 0) { + return Aggregates.random(decks); + } + } + return DeckgenUtil.generateCommanderDeck(isAi); + case Archenemy: + if (sel.equals("Random")) { + IStorage decks = FModel.getDecks().getScheme(); + if (decks.size() > 0) { + return Aggregates.random(decks); + } + } + return DeckgenUtil.generateSchemeDeck(); + case Planechase: + if (sel.equals("Random")) { + IStorage decks = FModel.getDecks().getPlane(); + if (decks.size() > 0) { + return Aggregates.random(decks); + } + } + return DeckgenUtil.generatePlanarDeck(); + default: + break; + } + return null; + } + + @Override + public boolean isGeneratedDeck() { + return true; + } + } + + private void updateRandom() { + lstDecks.setSelectionSupport(1, 1); + + ArrayList decks = new ArrayList(); + decks.add(new RandomDeckGenerator("Random Generated Deck", 0)); + decks.add(new RandomDeckGenerator("Random User Deck", 1)); + + 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 Deck"); + btnRandom.setWidth(btnNewDeck.getWidth()); + btnRandom.setLeft(getWidth() - PADDING - btnRandom.getWidth()); + btnRandom.setCommand(new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + DeckgenUtil.randomSelect(lstDecks); + } + }); + } + private void updatePrecons() { lstDecks.setSelectionSupport(1, 1); @@ -399,6 +539,7 @@ public class FDeckChooser extends FScreen { public Deck getDeck() { DeckProxy proxy = lstDecks.getSelectedItem(); + if (proxy == null) { return null; } return proxy.getDeck(); } @@ -425,7 +566,7 @@ public class FDeckChooser extends FScreen { } public void setIsAi(boolean isAiDeck) { - this.isAi = isAiDeck; + isAi = isAiDeck; } private void refreshDecksList(DeckType deckType, boolean forceRefresh, FEvent e) { @@ -453,6 +594,9 @@ public class FDeckChooser extends FScreen { case PRECONSTRUCTED_DECK: updatePrecons(); break; + case RANDOM_DECK: + updateRandom(); + break; } if (e != null) { //set default list selection if from combo box change event diff --git a/forge-gui-mobile/src/forge/deck/FVanguardChooser.java b/forge-gui-mobile/src/forge/deck/FVanguardChooser.java new file mode 100644 index 00000000000..c6bb4c1f5ff --- /dev/null +++ b/forge-gui-mobile/src/forge/deck/FVanguardChooser.java @@ -0,0 +1,106 @@ +package forge.deck; + +import java.util.ArrayList; +import java.util.List; + +import forge.Forge; +import forge.item.PaperCard; +import forge.itemmanager.CardManager; +import forge.itemmanager.ItemManagerConfig; +import forge.model.FModel; +import forge.screens.FScreen; +import forge.toolbox.FButton; +import forge.toolbox.FEvent; +import forge.toolbox.FEvent.FEventHandler; +import forge.util.Aggregates; +import forge.util.Utils; + +public class FVanguardChooser extends FScreen { + public static final float PADDING = Utils.scaleMin(5); + + private static final List allHumanAvatars = new ArrayList(); + private static final List allAiAvatars = new ArrayList(); + private static final List nonRandomHumanAvatars = new ArrayList(); + private static final List nonRandomAiAvatars = new ArrayList(); + + static { + for (PaperCard c : FModel.getMagicDb().getVariantCards().getAllCards()) { + if (c.getRules().getType().isVanguard()) { + allHumanAvatars.add(c); + if (!c.getRules().getAiHints().getRemRandomDecks()) { + nonRandomHumanAvatars.add(c); + } + if (!c.getRules().getAiHints().getRemAIDecks()) { + allAiAvatars.add(c); + if (!c.getRules().getAiHints().getRemRandomDecks()) { + nonRandomAiAvatars.add(c); + } + } + } + } + } + + private final CardManager lstVanguards = new CardManager(true); + private final FButton btnRandom = new FButton("Random Avatar"); + private boolean isAi; + + public FVanguardChooser(boolean isAi0) { + super(""); + isAi = isAi0; + lstVanguards.setItemActivateHandler(new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + Forge.back(); + } + }); + btnRandom.setCommand(new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + if (isAi) { + lstVanguards.setSelectedItem(Aggregates.random(nonRandomAiAvatars)); + } + else { + lstVanguards.setSelectedItem(Aggregates.random(nonRandomHumanAvatars)); + } + } + }); + lstVanguards.setup(ItemManagerConfig.VANGUARDS); + lstVanguards.setPool(isAi ? allAiAvatars : allHumanAvatars); + if (lstVanguards.getItemCount() > 0) { + lstVanguards.setSelectedIndex(0); + } + } + + public void setIsAi(boolean isAi0) { + if (isAi == isAi0) { return; } + isAi = isAi0; + + PaperCard lastSelection = lstVanguards.getSelectedItem(); + + lstVanguards.setPool(isAi ? allAiAvatars : allHumanAvatars); + + if (lastSelection != null) { + lstVanguards.setSelectedItem(lastSelection); + } + if (lstVanguards.getSelectedIndex() == -1 && lstVanguards.getItemCount() > 0) { + lstVanguards.setSelectedIndex(0); + } + } + + public PaperCard getVanguard() { + return lstVanguards.getSelectedItem(); + } + + @Override + protected void doLayout(float startY, float width, float height) { + float x = PADDING; + float y = startY + PADDING; + width -= 2 * x; + + float buttonHeight = Utils.AVG_FINGER_HEIGHT; + lstVanguards.setBounds(x, y, width, height - y - buttonHeight - PADDING); //leave room for buttons at bottom + + y += lstVanguards.getHeight() + PADDING; + btnRandom.setBounds(x, y, width, buttonHeight); + } +} diff --git a/forge-gui-mobile/src/forge/itemmanager/DeckManager.java b/forge-gui-mobile/src/forge/itemmanager/DeckManager.java index 13aa57c530b..782b24e454c 100644 --- a/forge-gui-mobile/src/forge/itemmanager/DeckManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/DeckManager.java @@ -42,7 +42,7 @@ import java.util.Set; * */ public final class DeckManager extends ItemManager { - private final GameType gametype; + private final GameType gameType; private FEventHandler cmdDelete; /** @@ -53,7 +53,7 @@ public final class DeckManager extends ItemManager { */ public DeckManager(final GameType gt) { super(DeckProxy.class, true); - gametype = gt; + gameType = gt; setItemActivateHandler(new FEventHandler() { @Override @@ -65,6 +65,10 @@ public final class DeckManager extends ItemManager { setCaption("Decks"); } + public GameType getGameType() { + return gameType; + } + @Override public void setup(ItemManagerConfig config0) { boolean wasStringOnly = (getConfig() == ItemManagerConfig.STRING_ONLY); @@ -224,7 +228,7 @@ public final class DeckManager extends ItemManager { if (!result) { return; } // consider using deck proxy's method to delete deck - switch(gametype) { + switch(gameType) { case Constructed: case Draft: case Sealed: @@ -235,7 +239,7 @@ public final class DeckManager extends ItemManager { //FModel.getQuest().save(); break; default: - throw new UnsupportedOperationException("Delete not implemneted for game type = " + gametype.toString()); + throw new UnsupportedOperationException("Delete not implemneted for game type = " + gameType.toString()); } removeItem(deck, 1); diff --git a/forge-gui-mobile/src/forge/screens/constructed/ConstructedScreen.java b/forge-gui-mobile/src/forge/screens/constructed/ConstructedScreen.java index 177c41e5ca6..1c060b54546 100644 --- a/forge-gui-mobile/src/forge/screens/constructed/ConstructedScreen.java +++ b/forge-gui-mobile/src/forge/screens/constructed/ConstructedScreen.java @@ -22,12 +22,11 @@ import forge.deck.Deck; import forge.deck.DeckProxy; import forge.deck.DeckSection; import forge.deck.DeckType; -import forge.deck.DeckgenUtil; import forge.deck.FDeckChooser; +import forge.deck.FVanguardChooser; import forge.game.GameType; import forge.game.player.RegisteredPlayer; import forge.item.PaperCard; -import forge.model.CardCollections; import forge.model.FModel; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; @@ -44,12 +43,10 @@ import forge.toolbox.FLabel; import forge.toolbox.FOptionPane; import forge.toolbox.FScrollPane; import forge.toolbox.FTextField; -import forge.util.Aggregates; import forge.util.Callback; import forge.util.Lang; import forge.util.NameGenerator; import forge.util.Utils; -import forge.util.storage.IStorage; public class ConstructedScreen extends LaunchScreen { private static final FSkinColor PLAYER_BORDER_COLOR = FSkinColor.get(Colors.CLR_BORDERS).alphaColor(0.8f); @@ -91,13 +88,7 @@ public class ConstructedScreen extends LaunchScreen { }; // Variants - private final List vgdAllAvatars = new ArrayList(); - private final List vgdAllAiAvatars = new ArrayList(); - private final List nonRandomHumanAvatars = new ArrayList(); - private final List nonRandomAiAvatars = new ArrayList(); private int lastArchenemy = 0; - private Vector humanListData = new Vector(); - private Vector aiListData = new Vector(); public ConstructedScreen() { super("Constructed"); @@ -294,20 +285,7 @@ public class ConstructedScreen extends LaunchScreen { Deck deck = null; boolean isCommanderMatch = appliedVariants.contains(GameType.Commander); if (isCommanderMatch) { - Object selected = playerPanel.lstCommanderDecks.getSelectedValue(); - if (selected instanceof String) { - String sel = (String) selected; - IStorage comDecks = FModel.getDecks().getCommander(); - if (sel.equals("Random") && comDecks.size() > 0) { - deck = Aggregates.random(comDecks); - } - } - else { - deck = (Deck) selected; - } - if (deck == null) { //Can be null if player deselects the list selection or chose Generate - deck = DeckgenUtil.generateCommanderDeck(isPlayerAI(i)); - } + deck = playerPanel.lstCommanderDecks.getDeck(); if (checkLegality) { String errMsg = GameType.Commander.getDecksFormat().getDeckConformanceProblem(deck); if (errMsg != null) { @@ -327,29 +305,8 @@ public class ConstructedScreen extends LaunchScreen { //Archenemy if (appliedVariants.contains(GameType.ArchenemyRumble) || (appliedVariants.contains(GameType.Archenemy) && playerIsArchenemy)) { - Object selected = playerPanel.lstSchemeDecks.getSelectedValue(); - CardPool schemePool = null; - if (selected instanceof String) { - String sel = (String) selected; - if (sel.contains("Use deck's scheme section")) { - if (deck.has(DeckSection.Schemes)) { - schemePool = deck.get(DeckSection.Schemes); - } - else { - sel = "Random"; - } - } - IStorage sDecks = FModel.getDecks().getScheme(); - if (sel.equals("Random") && sDecks.size() != 0) { - schemePool = Aggregates.random(sDecks).get(DeckSection.Schemes); - } - } - else { - schemePool = ((Deck) selected).get(DeckSection.Schemes); - } - if (schemePool == null) { //Can be null if player deselects the list selection or chose Generate - schemePool = DeckgenUtil.generateSchemeDeck(); - } + Deck schemeDeck = playerPanel.lstSchemeDecks.getDeck(); + CardPool schemePool = schemeDeck.get(DeckSection.Schemes); if (checkLegality) { String errMsg = GameType.Archenemy.getDecksFormat().getSchemeSectionConformanceProblem(schemePool); if (errMsg != null) { @@ -362,28 +319,8 @@ public class ConstructedScreen extends LaunchScreen { //Planechase if (appliedVariants.contains(GameType.Planechase)) { - Object selected = playerPanel.lstPlanarDecks.getSelectedValue(); - CardPool planePool = null; - if (selected instanceof String) { - String sel = (String) selected; - if (sel.contains("Use deck's planes section")) { - if (deck.has(DeckSection.Planes)) { - planePool = deck.get(DeckSection.Planes); - } else { - sel = "Random"; - } - } - IStorage pDecks = FModel.getDecks().getPlane(); - if (sel.equals("Random") && pDecks.size() != 0) { - planePool = Aggregates.random(pDecks).get(DeckSection.Planes); - } - } - else { - planePool = ((Deck) selected).get(DeckSection.Planes); - } - if (planePool == null) { //Can be null if player deselects the list selection or chose Generate - planePool = DeckgenUtil.generatePlanarDeck(); - } + Deck planarDeck = playerPanel.lstPlanarDecks.getDeck(); + CardPool planePool = planarDeck.get(DeckSection.Planes); if (checkLegality) { String errMsg = GameType.Planechase.getDecksFormat().getPlaneSectionConformanceProblem(planePool); if (null != errMsg) { @@ -396,24 +333,7 @@ public class ConstructedScreen extends LaunchScreen { //Vanguard if (appliedVariants.contains(GameType.Vanguard)) { - Object selected = playerPanel.lstVanguardAvatars.getSelectedValue(); - if (selected instanceof String) { - String sel = (String) selected; - if (sel.contains("Use deck's default avatar") && deck.has(DeckSection.Avatar)) { - vanguardAvatar = deck.get(DeckSection.Avatar).get(0); - } - else { //Only other string is "Random" - if (!isPlayerAI(i)) { //Human - vanguardAvatar = Aggregates.random(getNonRandomHumanAvatars()); - } - else { //AI - vanguardAvatar = Aggregates.random(getNonRandomAiAvatars()); - } - } - } - else { - vanguardAvatar = (PaperCard)selected; - } + vanguardAvatar = playerPanel.lstVanguardAvatars.getVanguard(); if (vanguardAvatar == null) { FOptionPane.showErrorDialog("No Vanguard avatar selected for " + name + ". Please choose one or disable the Vanguard variant"); @@ -446,20 +366,21 @@ public class ConstructedScreen extends LaunchScreen { private FComboBox cbArchenemyTeam = new FComboBox(); private final FLabel btnDeck = new FLabel.ButtonBuilder().text("Loading Deck...").build(); - private final FLabel btnSchemeDeck = new FLabel.ButtonBuilder().text("Scheme Deck: (None)").build(); - private final FLabel btnCommanderDeck = new FLabel.ButtonBuilder().text("Commander Deck: (None)").build(); - private final FLabel btnPlanarDeck = new FLabel.ButtonBuilder().text("Planar Deck: (None)").build(); - private final FLabel btnVanguardAvatar = new FLabel.ButtonBuilder().text("Vanguard Avatar: (None)").build(); + private final FLabel btnSchemeDeck = new FLabel.ButtonBuilder().text("Scheme Deck: Random").build(); + private final FLabel btnCommanderDeck = new FLabel.ButtonBuilder().text("Commander Deck: Random").build(); + private final FLabel btnPlanarDeck = new FLabel.ButtonBuilder().text("Planar Deck: Random").build(); + private final FLabel btnVanguardAvatar = new FLabel.ButtonBuilder().text("Vanguard Avatar: Random").build(); - private final FDeckChooser deckChooser; - private final DeckList lstSchemeDecks, lstCommanderDecks, lstPlanarDecks, lstVanguardAvatars; + private final FDeckChooser deckChooser, lstSchemeDecks, lstCommanderDecks, lstPlanarDecks; + private final FVanguardChooser lstVanguardAvatars; public PlayerPanel(final int index0) { super(); index = index0; playerIsArchenemy = index == 0; btnDeck.setEnabled(false); //disable deck button until done loading decks - deckChooser = new FDeckChooser(isPlayerAI()); + boolean isAi = isPlayerAI(); + deckChooser = new FDeckChooser(GameType.Constructed, isAi); deckChooser.getLstDecks().setSelectionChangedHandler(new FEventHandler() { @Override public void handleEvent(FEvent e) { @@ -468,10 +389,10 @@ public class ConstructedScreen extends LaunchScreen { Lang.joinHomogenous(deckChooser.getLstDecks().getSelectedItems(), DeckProxy.FN_GET_NAME)); } }); - lstSchemeDecks = new DeckList(); - lstCommanderDecks = new DeckList(); - lstPlanarDecks = new DeckList(); - lstVanguardAvatars = new DeckList(); + lstSchemeDecks = new FDeckChooser(GameType.Archenemy, isAi); + lstCommanderDecks = new FDeckChooser(GameType.Commander, isAi); + lstPlanarDecks = new FDeckChooser(GameType.Planechase, isAi); + lstVanguardAvatars = new FVanguardChooser(isAi); createAvatar(); add(avatarLabel); @@ -506,70 +427,37 @@ public class ConstructedScreen extends LaunchScreen { btnCommanderDeck.setCommand(new FEventHandler() { @Override public void handleEvent(FEvent e) { - deckChooser.setHeaderCaption("Select Commander Deck for " + txtPlayerName.getText()); - Forge.openScreen(deckChooser); + lstCommanderDecks.setHeaderCaption("Select Commander Deck for " + txtPlayerName.getText()); + Forge.openScreen(lstCommanderDecks); } }); add(btnSchemeDeck); btnSchemeDeck.setCommand(new FEventHandler() { @Override public void handleEvent(FEvent e) { - deckChooser.setHeaderCaption("Select Scheme Deck for " + txtPlayerName.getText()); - Forge.openScreen(deckChooser); + lstSchemeDecks.setHeaderCaption("Select Scheme Deck for " + txtPlayerName.getText()); + Forge.openScreen(lstSchemeDecks); } }); add(btnPlanarDeck); btnPlanarDeck.setCommand(new FEventHandler() { @Override public void handleEvent(FEvent e) { - deckChooser.setHeaderCaption("Select Planar Deck for " + txtPlayerName.getText()); - Forge.openScreen(deckChooser); + lstPlanarDecks.setHeaderCaption("Select Planar Deck for " + txtPlayerName.getText()); + Forge.openScreen(lstPlanarDecks); } }); add(btnVanguardAvatar); btnVanguardAvatar.setCommand(new FEventHandler() { @Override public void handleEvent(FEvent e) { - deckChooser.setHeaderCaption("Select Vanguard Avatar for " + txtPlayerName.getText()); - Forge.openScreen(deckChooser); + lstVanguardAvatars.setHeaderCaption("Select Vanguard Avatar for " + txtPlayerName.getText()); + Forge.openScreen(lstVanguardAvatars); } }); updateVariantControlsVisibility(); - final CardCollections decks = FModel.getDecks(); - - lstCommanderDecks.list.addItem("Generate"); - if (decks.getCommander().size() > 0) { - lstCommanderDecks.list.addItem("Random"); - for (Deck comDeck : decks.getCommander()) { - lstCommanderDecks.list.addItem(comDeck); - } - } - lstCommanderDecks.setSelectedIndex(0); - - lstSchemeDecks.list.addItem("Use deck's scheme section (random if unavailable)"); - lstSchemeDecks.list.addItem("Generate"); - if (decks.getScheme().size() > 0) { - lstSchemeDecks.list.addItem("Random"); - for (Deck schemeDeck : decks.getScheme()) { - lstSchemeDecks.list.addItem(schemeDeck); - } - } - lstSchemeDecks.setSelectedIndex(0); - - lstPlanarDecks.list.addItem("Use deck's planes section (random if unavailable)"); - lstPlanarDecks.list.addItem("Generate"); - if (decks.getPlane().size() > 0) { - lstPlanarDecks.list.addItem("Random"); - for (Deck planarDeck : decks.getPlane()) { - lstPlanarDecks.list.addItem(planarDeck); - } - } - lstPlanarDecks.setSelectedIndex(0); - - updateVanguardList(); - //disable team combo boxes for now cbTeam.setEnabled(false); } @@ -650,7 +538,7 @@ public class ConstructedScreen extends LaunchScreen { private final FEventHandler humanAiSwitched = new FEventHandler() { @Override public void handleEvent(FEvent e) { - updateVanguardList(); + lstVanguardAvatars.setIsAi(isPlayerAI()); } }; @@ -710,10 +598,6 @@ public class ConstructedScreen extends LaunchScreen { return humanAiSwitch.isToggled(); } - public void setVanguardButtonText(String text) { - btnVanguardAvatar.setText(text); - } - private void populateTeamsComboBoxes() { cbArchenemyTeam.addItem("Archenemy"); cbArchenemyTeam.addItem("Heroes"); @@ -831,50 +715,6 @@ public class ConstructedScreen extends LaunchScreen { public String getPlayerName() { return txtPlayerName.getText(); } - - /** update vanguard list. */ - public void updateVanguardList() { - Object lastSelection = lstVanguardAvatars.getSelectedValue(); - lstVanguardAvatars.setSelectedIndex(-1); - lstVanguardAvatars.list.setListData(isPlayerAI() ? aiListData : humanListData); - if (lastSelection != null) { - lstVanguardAvatars.setSelectedValue(lastSelection); - } - if (lstVanguardAvatars.getSelectedIndex() == -1) { - lstVanguardAvatars.setSelectedIndex(0); - } - } - - private class DeckList extends FScreen { - private final FList list; - private int selectedIndex; - - private DeckList() { - super(""); - list = new FList(); - } - - public int getSelectedIndex() { - return selectedIndex; - } - - public void setSelectedIndex(int index) { - selectedIndex = index; - } - - public Object getSelectedValue() { - return list.getItemAt(selectedIndex); - } - - public void setSelectedValue(Object value) { - selectedIndex = list.getIndexOf(value); - } - - @Override - protected void doLayout(float startY, float width, float height) { - list.setBounds(0, startY, width, height - startY); - } - } } /** Saves avatar prefs for players one and two. */ @@ -1199,52 +1039,4 @@ public class ConstructedScreen extends LaunchScreen { public boolean isPlayerArchenemy(final int playernum) { return playerPanels.get(playernum).playerIsArchenemy; } - - /** Return all the Vanguard avatars. */ - public Iterable getAllAvatars() { - if (vgdAllAvatars.isEmpty()) { - for (PaperCard c : FModel.getMagicDb().getVariantCards().getAllCards()) { - if (c.getRules().getType().isVanguard()) { - vgdAllAvatars.add(c); - } - } - } - return vgdAllAvatars; - } - - /** Return the Vanguard avatars not flagged RemAIDeck. */ - public List getAllAiAvatars() { - return vgdAllAiAvatars; - } - - /** Return the Vanguard avatars not flagged RemRandomDeck. */ - public List getNonRandomHumanAvatars() { - return nonRandomHumanAvatars; - } - - /** Return the Vanguard avatars not flagged RemAIDeck or RemRandomDeck. */ - public List getNonRandomAiAvatars() { - return nonRandomAiAvatars; - } - - /** Populate vanguard lists. */ - private void populateVanguardLists() { - humanListData.add("Use deck's default avatar (random if unavailable)"); - humanListData.add("Random"); - aiListData.add("Use deck's default avatar (random if unavailable)"); - aiListData.add("Random"); - for (PaperCard cp : getAllAvatars()) { - humanListData.add(cp); - if (!cp.getRules().getAiHints().getRemRandomDecks()) { - nonRandomHumanAvatars.add(cp); - } - if (!cp.getRules().getAiHints().getRemAIDecks()) { - aiListData.add(cp); - vgdAllAiAvatars.add(cp); - if (!cp.getRules().getAiHints().getRemRandomDecks()) { - nonRandomAiAvatars.add(cp); - } - } - } - } } diff --git a/forge-gui/src/main/java/forge/deck/DeckProxy.java b/forge-gui/src/main/java/forge/deck/DeckProxy.java index 43f1e4c1186..a9526edbdc8 100644 --- a/forge-gui/src/main/java/forge/deck/DeckProxy.java +++ b/forge-gui/src/main/java/forge/deck/DeckProxy.java @@ -258,9 +258,27 @@ public class DeckProxy implements InventoryItem { } // TODO: The methods below should not take the decks collections from singletons, instead they are supposed to use data passed in parameters - public static Iterable getAllConstructedDecks(IStorage storageRoot) { + public static Iterable getAllConstructedDecks() { List result = new ArrayList(); - addDecksRecursivelly("Constructed", GameType.Constructed, result, "", storageRoot); + addDecksRecursivelly("Constructed", GameType.Constructed, result, "", FModel.getDecks().getConstructed()); + return result; + } + + public static Iterable getAllCommanderDecks() { + List result = new ArrayList(); + addDecksRecursivelly("Commander", GameType.Commander, result, "", FModel.getDecks().getCommander()); + return result; + } + + public static Iterable getAllSchemeDecks() { + List result = new ArrayList(); + addDecksRecursivelly("Scheme", GameType.Archenemy, result, "", FModel.getDecks().getScheme()); + return result; + } + + public static Iterable getAllPlanarDecks() { + List result = new ArrayList(); + addDecksRecursivelly("Plane", GameType.Planechase, result, "", FModel.getDecks().getPlane()); return result; } diff --git a/forge-gui/src/main/java/forge/deck/DeckType.java b/forge-gui/src/main/java/forge/deck/DeckType.java index 461be48643e..a1c9d8e7853 100644 --- a/forge-gui/src/main/java/forge/deck/DeckType.java +++ b/forge-gui/src/main/java/forge/deck/DeckType.java @@ -5,7 +5,8 @@ public enum DeckType { PRECONSTRUCTED_DECK("Preconstructed Decks"), QUEST_OPPONENT_DECK ("Quest Opponent Decks"), COLOR_DECK ("Random Color Decks"), - THEME_DECK ("Random Theme Decks"); + THEME_DECK ("Random Theme Decks"), + RANDOM_DECK ("Random Decks"); private String value; private DeckType(String value) { diff --git a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java index 3b913f85a77..f519160c9a2 100644 --- a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java +++ b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java @@ -195,7 +195,13 @@ public class DeckgenUtil { return result; } - public static CardPool generateSchemeDeck() { + public static Deck generateSchemeDeck() { + Deck deck = new Deck(""); + deck.putSection(DeckSection.Schemes, generateSchemePool()); + return deck; + } + + public static CardPool generateSchemePool() { CardPool schemes = new CardPool(); List allSchemes = new ArrayList(); for (PaperCard c : FModel.getMagicDb().getVariantCards().getAllCards()) { @@ -221,7 +227,13 @@ public class DeckgenUtil { return schemes; } - public static CardPool generatePlanarDeck() { + public static Deck generatePlanarDeck() { + Deck deck = new Deck(""); + deck.putSection(DeckSection.Planes, generatePlanarPool()); + return deck; + } + + public static CardPool generatePlanarPool() { CardPool res = new CardPool(); List allPlanars = new ArrayList(); for (PaperCard c : FModel.getMagicDb().getVariantCards().getAllCards()) { diff --git a/forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java b/forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java index 5540a3c8780..4e3818d974e 100644 --- a/forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java +++ b/forge-gui/src/main/java/forge/itemmanager/ItemManagerConfig.java @@ -54,6 +54,14 @@ public enum ItemManagerConfig { GroupDef.DEFAULT, ColumnDef.CMC, 4, 1), CONSTRUCTED_DECKS(SColumnUtil.getDecksDefaultColumns(true, true), false, false, false, null, null, 3, 0), + COMMANDER_DECKS(SColumnUtil.getDecksDefaultColumns(true, false), false, false, false, + null, null, 3, 0), + PLANAR_DECKS(SColumnUtil.getDecksDefaultColumns(true, false), false, false, false, + null, null, 3, 0), + SCHEME_DECKS(SColumnUtil.getDecksDefaultColumns(true, false), false, false, false, + null, null, 3, 0), + VANGUARDS(SColumnUtil.getDecksDefaultColumns(true, false), false, false, false, + null, null, 3, 0), DRAFT_DECKS(SColumnUtil.getDecksDefaultColumns(true, false), false, false, false, null, null, 3, 0), SEALED_DECKS(SColumnUtil.getDecksDefaultColumns(true, false), false, false, false,