diff --git a/.gitattributes b/.gitattributes index 203498507ca..81bcb26b896 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15390,10 +15390,8 @@ forge-gui/src/main/java/forge/gui/home/settings/VSubmenuReleaseNotes.java -text forge-gui/src/main/java/forge/gui/home/settings/package-info.java svneol=native#text/plain forge-gui/src/main/java/forge/gui/home/variant/CSubmenuArchenemy.java -text forge-gui/src/main/java/forge/gui/home/variant/CSubmenuCommander.java -text -forge-gui/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java -text forge-gui/src/main/java/forge/gui/home/variant/VSubmenuArchenemy.java -text forge-gui/src/main/java/forge/gui/home/variant/VSubmenuCommander.java -text -forge-gui/src/main/java/forge/gui/home/variant/VSubmenuVanguard.java -text forge-gui/src/main/java/forge/gui/input/Input.java -text forge-gui/src/main/java/forge/gui/input/InputAttack.java svneol=native#text/plain forge-gui/src/main/java/forge/gui/input/InputBase.java svneol=native#text/plain diff --git a/forge-gui/src/main/java/forge/gui/home/VHomeUI.java b/forge-gui/src/main/java/forge/gui/home/VHomeUI.java index 7ce83634c3c..8b6ea85aaa4 100644 --- a/forge-gui/src/main/java/forge/gui/home/VHomeUI.java +++ b/forge-gui/src/main/java/forge/gui/home/VHomeUI.java @@ -58,7 +58,7 @@ import forge.gui.home.settings.VSubmenuReleaseNotes; import forge.gui.home.variant.VSubmenuArchenemy; import forge.gui.home.variant.VSubmenuCommander; //import forge.gui.home.variant.VSubmenuPlanechase; -import forge.gui.home.variant.VSubmenuVanguard; +//import forge.gui.home.variant.VSubmenuVanguard; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FScrollPanel; import forge.gui.toolbox.FSkin; @@ -152,7 +152,7 @@ public enum VHomeUI implements IVTopLevelUI { allSubmenus.add(VSubmenuReleaseNotes.SINGLETON_INSTANCE); allSubmenus.add(VSubmenuArchenemy.SINGLETON_INSTANCE); - allSubmenus.add(VSubmenuVanguard.SINGLETON_INSTANCE); + //allSubmenus.add(VSubmenuVanguard.SINGLETON_INSTANCE); //allSubmenus.add(VSubmenuPlanechase.SINGLETON_INSTANCE); allSubmenus.add(VSubmenuCommander.SINGLETON_INSTANCE); diff --git a/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java b/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java index 32657098de0..31e742d965c 100644 --- a/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java +++ b/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuConstructed.java @@ -4,11 +4,14 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; +import java.util.Random; import java.util.Vector; import javax.swing.JMenu; import javax.swing.SwingUtilities; +import com.google.common.collect.Iterables; + import forge.Command; import forge.Singletons; import forge.deck.CardPool; @@ -17,9 +20,11 @@ import forge.deck.DeckSection; import forge.game.GameType; import forge.game.player.LobbyPlayer; import forge.game.player.RegisteredPlayer; +import forge.gui.GuiDialog; import forge.gui.deckchooser.DeckgenUtil; import forge.gui.deckchooser.DecksComboBox.DeckType; import forge.gui.framework.ICDoc; +import forge.gui.home.variant.VSubmenuVanguard; import forge.gui.menus.IMenuProvider; import forge.gui.menus.MenuUtil; import forge.gui.toolbox.FList; @@ -78,6 +83,10 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider { } } // End Planechase + for (int i = 0; i < 8; i++) { + view.updateVanguardList(i); + } + // General updates when switching back to this view view.updatePlayersFromPrefs(); view.getBtnStart().requestFocusInWindow(); @@ -135,9 +144,9 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider { /** Starts a match with the applied variants. */ private void startGame(final List variantTypes) { if (variantTypes.contains(GameType.Archenemy) || variantTypes.contains(GameType.ArchenemyRumble) - || variantTypes.contains(GameType.Commander)|| variantTypes.contains(GameType.Vanguard)) { - FOptionPane.showMessageDialog("Archenemy, Commander and Vanguard matches cannot currently be started via " - + "the Constructed match setup screen. Please disable any of those variants then restart the match"); + || variantTypes.contains(GameType.Commander)) { + FOptionPane.showMessageDialog("Archenemy and Commander matches cannot currently be started via the " + + "Constructed match setup screen. Please disable any of those variants then restart the match"); return; } @@ -177,11 +186,12 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider { boolean isPlayerArchenemy = false; Iterable planes = null; PaperCard vanguardAvatar = null; + Random randomSeed = new Random(); //Planechase if (variantTypes.contains(GameType.Planechase)) { Object selected = view.getPlanarDeckLists().get(i).getSelectedValue(); - CardPool planePool; + CardPool planePool = null; if (selected instanceof String) { String sel = (String) selected; if (sel.contains("Use deck's planes section")) { @@ -194,12 +204,17 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider { IStorage pDecks = Singletons.getModel().getDecks().getPlane(); if (sel.equals("Random") && pDecks.size() != 0) { planePool = Aggregates.random(pDecks).get(DeckSection.Planes); - } else { //Generate + } else if (planePool == null) { planePool = DeckgenUtil.generatePlanarDeck(); } } else { planePool = ((Deck) selected).get(DeckSection.Planes); } + if (planePool == null) { //ERROR! Can be null if player deselects the list selection + GuiDialog.message("No Planar deck selected for " + name + + ". Please choose one or disable the Planechase variant"); + return; + } if (checkLegality) { String errMsg = GameType.Planechase.getDecksFormat().getPlaneSectionConformanceProblem(planePool); if (null != errMsg) { @@ -210,6 +225,30 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider { planes = planePool.toFlatList(); } + //Vanguard + if (variantTypes.contains(GameType.Vanguard)) { + Object selected = view.getVanguardLists().get(i).getSelectedValue(); + if (selected instanceof String) { + String sel = (String) selected; + if (sel.contains("Use deck's default Vanguard") && deck.has(DeckSection.Avatar)) { + vanguardAvatar = deck.get(DeckSection.Avatar).get(0); + } else { //Only other string is "Random" + if (!view.isPlayerAI(i)) { //Human + vanguardAvatar = Iterables.get(view.getAllAvatars(), randomSeed.nextInt(Iterables.size(view.getNonRandomHumanAvatars()))); + } else { //AI + vanguardAvatar = Iterables.get(view.getAllAiAvatars(), randomSeed.nextInt(Iterables.size(view.getNonRandomAiAvatars()))); + } + } + } else { + vanguardAvatar = (PaperCard)selected; + } + if (vanguardAvatar == null) { //ERROR! + GuiDialog.message("No Vanguard avatar selected for " + name + + ". Please choose one or disable the Vanguard variant"); + return; + } + } + players.add(RegisteredPlayer.forVariants(variantTypes, rp.getDeck(), view.getTeam(i), schemes, isPlayerArchenemy, planes, vanguardAvatar).setPlayer(lobbyPlayer)); } diff --git a/forge-gui/src/main/java/forge/gui/home/sanctioned/VSubmenuConstructed.java b/forge-gui/src/main/java/forge/gui/home/sanctioned/VSubmenuConstructed.java index 0c93326b412..1fc1c5154a8 100644 --- a/forge-gui/src/main/java/forge/gui/home/sanctioned/VSubmenuConstructed.java +++ b/forge-gui/src/main/java/forge/gui/home/sanctioned/VSubmenuConstructed.java @@ -15,11 +15,14 @@ import java.util.List; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; +import java.util.Vector; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.ScrollPaneConstants; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; import net.miginfocom.swing.MigLayout; @@ -31,6 +34,8 @@ import forge.Command; import forge.Singletons; import forge.deck.DeckSection; import forge.game.GameType; +import forge.game.card.Card; +import forge.gui.CardDetailPanel; import forge.gui.deckchooser.DecksComboBox.DeckType; import forge.gui.deckchooser.DecksComboBoxEvent; import forge.gui.deckchooser.FDeckChooser; @@ -62,6 +67,7 @@ import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin.SkinColor; import forge.gui.toolbox.FSkin.SkinImage; import forge.gui.toolbox.FTextField; +import forge.item.IPaperCard; import forge.item.PaperCard; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; @@ -136,6 +142,17 @@ public enum VSubmenuConstructed implements IVSubmenu { private final List plnDeckSelectorBtns = new ArrayList(8); private final List plnEditors = new ArrayList(8); + private final List> vgdAvatarLists = new ArrayList>(); + private final List vgdPanels = new ArrayList(8); + private final List vgdSelectorBtns = new ArrayList(8); + private final List vgdAvatarDetails = new ArrayList(); + 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 Vector humanListData = new Vector(); + private Vector aiListData = new Vector(); + // CTR private VSubmenuConstructed() { lblTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); @@ -380,6 +397,20 @@ public enum VSubmenuConstructed implements IVSubmenu { playerPanel.add(plnDeckEditor, variantBtnConstraints + ", width 150px, wrap"); plnDeckSelectorBtns.add(plnDeckSelectorBtn); plnEditors.add(plnDeckEditor); + + // Vanguard buttons + final FLabel vgdSelectorBtn = new FLabel.ButtonBuilder().text("Select a Vanguard avatar").build(); + vgdSelectorBtn.setVisible(appliedVariants.contains(GameType.Vanguard)); + vgdSelectorBtn.setCommand(new Runnable() { + @Override + public void run() { + currentGameMode = GameType.Vanguard; + vgdSelectorBtn.requestFocusInWindow(); + changePlayerFocus(vgdSelectorBtns.indexOf(vgdSelectorBtn), GameType.Vanguard); + } + }); + playerPanel.add(vgdSelectorBtn, variantBtnConstraints + ", spanx, growx, pushx, wrap"); + vgdSelectorBtns.add(vgdSelectorBtn); playerPanelList.add(playerPanel); @@ -446,6 +477,7 @@ public enum VSubmenuConstructed implements IVSubmenu { @SuppressWarnings("serial") private void buildDeckPanel(final int playerIndex) { String sectionConstraints = "insets 8"; + String componentConstraints = "gap 0px 0px 10px 10px, wrap"; // Main deck final FDeckChooser mainChooser = new FDeckChooser(isPlayerAI(playerIndex)); @@ -461,15 +493,36 @@ public enum VSubmenuConstructed implements IVSubmenu { // Planar deck list FPanel planarDeckPanel = new FPanel(); planarDeckPanel.setLayout(new MigLayout(sectionConstraints)); - planarDeckPanel.add(new FLabel.Builder().text("Select Planar deck:").build(), "gap 0px 0px 10px 10px, wrap"); + planarDeckPanel.add(new FLabel.Builder().text("Select Planar deck:").build(), componentConstraints); FList planarDeckList = new FList(); planarDeckList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); FScrollPane scrPlanes = new FScrollPane(planarDeckList, false, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - planarDeckPanel.add(scrPlanes, "h 95%, gap 0px 10px 0px 10px, grow, push, wrap"); + planarDeckPanel.add(scrPlanes, componentConstraints + ", h 95%, grow, push"); planarDeckLists.add(planarDeckList); planarDeckPanels.add(planarDeckPanel); + + // Vanguard avatar list + FPanel vgdDeckPanel = new FPanel(); + + FList vgdAvatarList = new FList(); + vgdAvatarList.setListData(isPlayerAI(playerIndex) ? aiListData : humanListData); + vgdAvatarList.setSelectedIndex(0); + vgdAvatarList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); + vgdAvatarList.addListSelectionListener(vgdLSListener); + FScrollPane scrAvatars = new FScrollPane(vgdAvatarList, false, + ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + + CardDetailPanel vgdDetail = new CardDetailPanel(null); + vgdAvatarDetails.add(vgdDetail); + + vgdDeckPanel.setLayout(new MigLayout(sectionConstraints)); + vgdDeckPanel.add(new FLabel.Builder().text("Select a Vanguard avatar:").build(), componentConstraints); + vgdDeckPanel.add(scrAvatars, componentConstraints + ", grow, push"); + vgdDeckPanel.add(vgdDetail, componentConstraints + ", growx, pushx"); + vgdAvatarLists.add(vgdAvatarList); + vgdPanels.add(vgdDeckPanel); } protected void onDeckClicked(int iPlayer, DeckType type, Collection selectedDecks) { @@ -490,8 +543,11 @@ public enum VSubmenuConstructed implements IVSubmenu { } } else if (GameType.Planechase == forGameType) { decksFrame.add(planarDeckPanels.get(playerWithFocus), "grow, push"); - refreshPanels(false, true); + } else if (GameType.Vanguard == forGameType) { + updateVanguardList(playerWithFocus); + decksFrame.add(vgdPanels.get(playerWithFocus), "grow, push"); } + refreshPanels(false, true); } /* (non-Javadoc) @@ -544,6 +600,7 @@ public enum VSubmenuConstructed implements IVSubmenu { }); } populateDeckPanel(GameType.Constructed); + populateVanguardLists(); VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(constructedFrame, "gap 20px 20px 20px 0px, push, grow"); VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(pnlStart, "gap 0 0 3.5%! 3.5%!, ax center"); @@ -722,8 +779,16 @@ public enum VSubmenuConstructed implements IVSubmenu { variantType = GameType.Vanguard; if (arg0.getStateChange() == ItemEvent.SELECTED) { appliedVariants.add(variantType); + for (int i = 0; i < 8; i++) { + vgdSelectorBtns.get(i).setVisible(true); + changePlayerFocus(playerWithFocus, variantType); + } } else { appliedVariants.remove(variantType); + for (int i = 0; i < 8; i++) { + vgdSelectorBtns.get(i).setVisible(false); + changePlayerFocus(playerWithFocus, GameType.Constructed); + } } } else if (cb == vntCommander) { @@ -876,6 +941,22 @@ public enum VSubmenuConstructed implements IVSubmenu { int radioID = playerTypeRadios.indexOf((FRadioButton)e.getSource()); int radioOwnerID = (int) Math.floor(radioID / 2); avatarList.get(radioOwnerID).requestFocusInWindow(); + updateVanguardList(radioOwnerID); + } + }; + + /** This listener will look for a vanguard avatar being selected in the lists + / and update the corresponding detail panel. */ + private ListSelectionListener vgdLSListener = new ListSelectionListener() { + + @Override + public void valueChanged(ListSelectionEvent e) { + int index = vgdAvatarLists.indexOf(e.getSource()); + Object obj = vgdAvatarLists.get(index).getSelectedValue(); + + if (obj instanceof PaperCard) { + vgdAvatarDetails.get(index).setCard(Card.getCardForUi((IPaperCard) obj)); + } } }; @@ -923,7 +1004,7 @@ public enum VSubmenuConstructed implements IVSubmenu { } ///////////////////////////////////// - //========== STUFF FOR VARIANTS + //========== METHODS FOR VARIANTS public Set getAppliedVariants() { return appliedVariants; @@ -937,4 +1018,74 @@ public enum VSubmenuConstructed implements IVSubmenu { public List> getPlanarDeckLists() { return planarDeckLists; } + + /** Gets the list of Vanguard avatar lists. */ + public List> getVanguardLists() { + return vgdAvatarLists; + } + + /** Return all the Vanguard avatars. */ + public Iterable getAllAvatars() { + if (vgdAllAvatars.isEmpty()) { + for (PaperCard c : Singletons.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("Random"); + 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); + } + } + } + } + + /** update vanguard list. */ + public void updateVanguardList(int playerIndex) { + FList vgdList = getVanguardLists().get(playerIndex); + Vector listData = new Vector(); + + listData.add("Use deck's default avatar (random if unavailable)"); + listData.add("Random"); + + Object lastSelection = vgdList.getSelectedValue(); + vgdList.setListData(isPlayerAI(playerIndex) ? aiListData : humanListData); + if (null != lastSelection) { + vgdList.setSelectedValue(lastSelection, true); + } + + if (-1 == vgdList.getSelectedIndex()) { + vgdList.setSelectedIndex(0); + } + } } diff --git a/forge-gui/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java b/forge-gui/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java deleted file mode 100644 index 2d20214757f..00000000000 --- a/forge-gui/src/main/java/forge/gui/home/variant/CSubmenuVanguard.java +++ /dev/null @@ -1,190 +0,0 @@ -package forge.gui.home.variant; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import javax.swing.SwingUtilities; - -import com.google.common.collect.Iterables; - -import forge.Command; -import forge.Singletons; -import forge.deck.Deck; -import forge.deck.DeckSection; -import forge.game.GameType; -import forge.game.player.LobbyPlayer; -import forge.game.player.RegisteredPlayer; -import forge.gui.GuiDialog; -import forge.gui.SOverlayUtils; -import forge.gui.deckchooser.FDeckChooser; -import forge.gui.framework.ICDoc; -import forge.item.PaperCard; -import forge.net.FServer; -import forge.net.Lobby; -import forge.properties.ForgePreferences; -import forge.properties.ForgePreferences.FPref; - -/** - * Controls the constructed submenu in the home UI. - * - *

(C at beginning of class name denotes a control class.) - * - */ -public enum CSubmenuVanguard implements ICDoc { - /** */ - SINGLETON_INSTANCE; - private final VSubmenuVanguard view = VSubmenuVanguard.SINGLETON_INSTANCE; - - - /* (non-Javadoc) - * @see forge.gui.home.ICSubmenu#initialize() - */ - @Override - public void update() { - SwingUtilities.invokeLater(new Runnable() { - @Override public void run() { view.getBtnStart().requestFocusInWindow(); } - }); - } - - /* (non-Javadoc) - * @see forge.gui.home.ICSubmenu#initialize() - */ - @Override - public void initialize() { - final ForgePreferences prefs = Singletons.getModel().getPreferences(); - for (FDeckChooser fdc : view.getDeckChoosers()) { - fdc.initialize(); - } - - // Checkbox event handling - view.getBtnStart().addActionListener(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent arg0) { - startGame(); - } - }); - - // Checkbox event handling - view.getCbSingletons().addActionListener(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent arg0) { - prefs.setPref(FPref.DECKGEN_SINGLETONS, - String.valueOf(view.getCbSingletons().isSelected())); - prefs.save(); - } - }); - - view.getCbArtifacts().addActionListener(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent arg0) { - prefs.setPref( - FPref.DECKGEN_ARTIFACTS, String.valueOf(view.getCbArtifacts().isSelected())); - prefs.save(); - } - }); - - view.getCbRemoveSmall().addActionListener(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent arg0) { - prefs.setPref( - FPref.DECKGEN_NOSMALL, String.valueOf(view.getCbRemoveSmall().isSelected())); - prefs.save(); - } - }); - - // Pre-select checkboxes - view.getCbSingletons().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_SINGLETONS)); - view.getCbArtifacts().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_ARTIFACTS)); - view.getCbRemoveSmall().setSelected(prefs.getPrefBoolean(FPref.DECKGEN_NOSMALL)); - } - - - /** @param lists0   {@link java.util.List}<{@link javax.swing.JList}> */ - private void startGame() { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - SOverlayUtils.startGameOverlay(); - SOverlayUtils.showOverlay(); - } - }); - - - Random rnd = new Random(); - String nl = System.getProperty("line.separator"); - boolean usedDefaults = false; - StringBuilder defaultAvatarInfo = new StringBuilder("The following decks will use a default avatar:" + nl); - - List playerDecks = new ArrayList(); - for (int i = 0; i < view.getNumPlayers(); i++) { - RegisteredPlayer d = view.getDeckChoosers().get(i).getPlayer(); - - if (d == null) { - //ERROR! - GuiDialog.message("No deck selected for player " + (i + 1)); - return; - } - playerDecks.add(d.getDeck()); - } - - List playerAvatars = new ArrayList(); - for (int i = 0; i < view.getNumPlayers(); i++) { - PaperCard avatar = null; - Object obj = view.getAvatarLists().get(i).getSelectedValue(); - - boolean useDefault = VSubmenuVanguard.SINGLETON_INSTANCE.getCbDefaultAvatars().isSelected(); - useDefault &= playerDecks.get(i).get(DeckSection.Avatar) != null; - - if (useDefault) { - avatar = playerDecks.get(i).get(DeckSection.Avatar).get(0); - defaultAvatarInfo.append("Player " + (i + 1) + ": "); - defaultAvatarInfo.append(avatar.getName() + nl); - usedDefaults = true; - } else { - - if (obj instanceof String) { - //Random is the only string in the list so grab a random avatar. - if (i == 0) { - //HUMAN - avatar = Iterables.get(view.getAllAvatars(), rnd.nextInt(Iterables.size(view.getNonRandomHumanAvatars()))); - } else { - //AI - avatar = Iterables.get(view.getAllAiAvatars(), rnd.nextInt(Iterables.size(view.getNonRandomAiAvatars()))); - } - } else { - avatar = (PaperCard) obj; - } - } - if (avatar == null) { - //ERROR! - GuiDialog.message("No avatar selected for player " + (i + 1)); - return; - } - playerAvatars.add(avatar); - } - - if (usedDefaults) { - GuiDialog.message(defaultAvatarInfo.toString()); - } - - Lobby lobby = FServer.instance.getLobby(); - List helper = new ArrayList(); - for (int i = 0; i < view.getNumPlayers(); i++) { - LobbyPlayer player = view.isPlayerAI(i) ? lobby.getAiPlayer() : lobby.getGuiPlayer(); - helper.add(RegisteredPlayer.forVanguard(playerDecks.get(i), playerAvatars.get(i)).setPlayer(player)); - } - Singletons.getControl().startMatch(GameType.Vanguard, helper); - } - - - /* (non-Javadoc) - * @see forge.gui.framework.ICDoc#getCommandOnSelect() - */ - @Override - public Command getCommandOnSelect() { - return null; - } -} diff --git a/forge-gui/src/main/java/forge/gui/home/variant/VSubmenuVanguard.java b/forge-gui/src/main/java/forge/gui/home/variant/VSubmenuVanguard.java deleted file mode 100644 index db9b5d81cb3..00000000000 --- a/forge-gui/src/main/java/forge/gui/home/variant/VSubmenuVanguard.java +++ /dev/null @@ -1,422 +0,0 @@ -package forge.gui.home.variant; - -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import java.util.ArrayList; -import java.util.List; -import java.util.Vector; - -import javax.swing.ButtonGroup; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JPanel; -import javax.swing.JRadioButton; -import javax.swing.ScrollPaneConstants; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; - -import net.miginfocom.swing.MigLayout; -import forge.Singletons; -import forge.game.card.Card; -import forge.gui.CardDetailPanel; -import forge.gui.deckchooser.FDeckChooser; -import forge.gui.framework.DragCell; -import forge.gui.framework.DragTab; -import forge.gui.framework.EDocID; -import forge.gui.home.EMenuGroup; -import forge.gui.home.IVSubmenu; -import forge.gui.home.LblHeader; -import forge.gui.home.StartButton; -import forge.gui.home.VHomeUI; -import forge.gui.toolbox.FCheckBox; -import forge.gui.toolbox.FLabel; -import forge.gui.toolbox.FList; -import forge.gui.toolbox.FPanel; -import forge.gui.toolbox.FRadioButton; -import forge.gui.toolbox.FScrollPane; -import forge.gui.toolbox.FSkin; -import forge.gui.toolbox.FTabbedPane; -import forge.item.PaperCard; -import forge.item.IPaperCard; - -/** - * Assembles Swing components of constructed submenu singleton. - * - *

(V at beginning of class name denotes a view class.) - * - */ -public enum VSubmenuVanguard implements IVSubmenu { - /** */ - SINGLETON_INSTANCE; - - // Fields used with interface IVDoc - private DragCell parentCell; - private final DragTab tab = new DragTab("Vanguard Mode"); - - /** */ - private final LblHeader lblTitle = new LblHeader("Variant: Vanguard"); - - private final JPanel pnlStart = new JPanel(new MigLayout("insets 0, gap 0, wrap 2")); - - private final StartButton btnStart = new StartButton(); - - private final JCheckBox cbSingletons = new FCheckBox("Singleton Mode"); - private final JCheckBox cbArtifacts = new FCheckBox("Remove Artifacts"); - private final JCheckBox cbRemoveSmall = new FCheckBox("Remove Small Creatures"); - - private final List allAvatars = new ArrayList(); - - private final List allAiAvatars = new ArrayList(); - private final List nonRandomHumanAvatars = new ArrayList(); - private final List nonRandomAiAvatars = new ArrayList(); - - ////////////////////////////// - - private final FTabbedPane tabPane = new FTabbedPane(); - private final List playerPanels = new ArrayList(); - private final List deckChoosers = new ArrayList(); - private final List> avatarLists = new ArrayList>(); - - private final List fieldRadios = new ArrayList(); - private final List playerIsAIRadios = new ArrayList(); - private final ButtonGroup grpFields = new ButtonGroup(); - private final FCheckBox cbDefaultAvatars = new FCheckBox("Use deck-default avatars if possible."); - private final List cdpAvatarDetails = new ArrayList(); - private int currentNumTabsShown = 8; - - ////////////////////////////// - - private VSubmenuVanguard() { - - lblTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); - - Vector humanListData = new Vector(); - Vector aiListData = new Vector(); - humanListData.add("Random"); - 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); - allAiAvatars.add(cp); - if (!cp.getRules().getAiHints().getRemRandomDecks()) { - nonRandomAiAvatars.add(cp); - } - } - } - - //This listener will look for any of the radio buttons being selected - //and call the method that shows/hides tabs appropriately. - ItemListener iListener = new ItemListener() { - - @Override - public void itemStateChanged(ItemEvent arg0) { - FRadioButton aButton = (FRadioButton) arg0.getSource(); - - if (arg0.getStateChange() == ItemEvent.SELECTED) { - changeTabs(Integer.parseInt(aButton.getText())); - } - } - - }; - - //This listener will look for an avatar being selected in the lists and update - //the corresponding detail panel. - ListSelectionListener lsListener = new ListSelectionListener() { - - @Override - public void valueChanged(ListSelectionEvent arg0) { - int index = avatarLists.indexOf(arg0.getSource()); - Object obj = avatarLists.get(index).getSelectedValue(); - - if (obj instanceof PaperCard) { - cdpAvatarDetails.get(index).setCard(Card.getCardForUi((IPaperCard) obj)); - } - } - - }; - - //Create all 8 player settings panel - FRadioButton tempRadio = null; - FPanel tempPanel; - FDeckChooser tempChooser; - FList tempList; - CardDetailPanel tempDetail; - - //Settings panel - FPanel settingsPanel = new FPanel(); - settingsPanel.setLayout(new MigLayout("wrap 2, ax center")); - FPanel radioPane = new FPanel(); - radioPane.setLayout(new MigLayout("wrap 1")); - radioPane.setOpaque(false); - radioPane.add(new FLabel.Builder().text("Set number of opponents").build(), "wrap"); - for (int i = 1; i < 8; i++) { - tempRadio = new FRadioButton(); - tempRadio.setText(String.valueOf(i)); - fieldRadios.add(tempRadio); - grpFields.add(tempRadio); - tempRadio.setSelected(true); - tempRadio.addItemListener(iListener); - radioPane.add(tempRadio, "wrap,align 50% 50%"); - } - settingsPanel.add(radioPane, "span 1 2"); - settingsPanel.add(cbDefaultAvatars); - tabPane.add("Settings", settingsPanel); - - //Player panels (Human + 7 AIs) - for (int i = 0; i < 8; i++) { - tempPanel = new FPanel(); - tempPanel.setLayout(new MigLayout("insets 0, gap 0 , wrap 2, flowy, ax center")); - - tempChooser = new FDeckChooser(i != 0); - tempChooser.initialize(); - - tempList = new FList(); - - tempList.setListData(i == 0 ? humanListData : aiListData); - tempList.setSelectedIndex(0); - tempList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); - tempList.addListSelectionListener(lsListener); - - deckChoosers.add(tempChooser); - avatarLists.add(tempList); - - ButtonGroup tempBtnGroup = new ButtonGroup(); - FRadioButton tmpAI = new FRadioButton(); - tmpAI.setText("AI"); - tmpAI.setSelected(i != 0); - FRadioButton tmpHuman = new FRadioButton(); - tmpHuman.setText("Human"); - tmpHuman.setSelected(i == 0); - - FPanel typeBtnPanel = new FPanel(); - typeBtnPanel.add(tmpAI); - typeBtnPanel.add(tmpHuman,"wrap"); - tempPanel.add(typeBtnPanel); - - tempBtnGroup.add(tmpAI); - tempBtnGroup.add(tmpHuman); - playerIsAIRadios.add(tmpAI); - - tempPanel.add(tempChooser, "span 1 2, w 33%, gap 10px 10px 0px 10px, growy, pushy, wrap"); - - tempPanel.add(new FLabel.Builder().text("Select Avatar:").build(), "gap 0px 0px 10px 10px, flowy"); - - FScrollPane scrAvatar = new FScrollPane(tempList, true, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - tempPanel.add(scrAvatar, "h 90%, w 33%, gap 0px 10px 0px 10px, growy, pushy, wrap"); - - tempDetail = new CardDetailPanel(null); - cdpAvatarDetails.add(tempDetail); - - tempPanel.add(tempDetail, "span 1 2, w 33%, gap 0px 10px 10px 10px, growy, pushy, growx"); - - playerPanels.add(tempPanel); - - tabPane.add("Player " + (i+1), tempPanel); - } - - final String strCheckboxConstraints = "h 30px!, gap 0 20px 0 0"; - pnlStart.setOpaque(false); - pnlStart.add(cbSingletons, strCheckboxConstraints); - pnlStart.add(btnStart, "span 1 3, growx, pushx, align center"); - pnlStart.add(cbArtifacts, strCheckboxConstraints); - pnlStart.add(cbRemoveSmall, strCheckboxConstraints); - } - - public boolean isPlayerAI(int playernum) { - return playerIsAIRadios.get(playernum).isSelected(); - } - - private void changeTabs(int toShow) { - if (toShow < currentNumTabsShown) { - for (int i = currentNumTabsShown; i > toShow + 1; i--) { - tabPane.remove(i); - } - currentNumTabsShown = tabPane.getComponentCount() - 1; - } - else { - for (int i = currentNumTabsShown; i <= toShow; i++) { - tabPane.add("Player " + i, playerPanels.get(i)); - } - currentNumTabsShown = tabPane.getComponentCount() - 1; - } - } - - /* (non-Javadoc) - * @see forge.gui.home.IVSubmenu#getGroupEnum() - */ - @Override - public EMenuGroup getGroupEnum() { - return EMenuGroup.VARIANT; - } - - /* (non-Javadoc) - * @see forge.gui.home.IVSubmenu#getMenuTitle() - */ - @Override - public String getMenuTitle() { - return "Vanguard"; - } - - /* (non-Javadoc) - * @see forge.gui.home.IVSubmenu#getItemEnum() - */ - @Override - public EDocID getItemEnum() { - return EDocID.HOME_VANGUARD; - } - - /* (non-Javadoc) - * @see forge.gui.home.IVSubmenu#populate() - */ - @Override - public void populate() { - VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().removeAll(); - VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().setLayout(new MigLayout("insets 0, gap 0, wrap 1, ax right")); - - VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(lblTitle, "w 80%!, h 40px!, gap 0 0 15px 15px, ax right"); - - for (FDeckChooser fdc : deckChoosers) { - fdc.populate(); - } - - VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(tabPane, "gap 20px 20px 20px 0px, pushx, pushy, growx, growy"); - - VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().add(pnlStart, "gap 0 0 3.5%! 3.5%!, ax center"); - - VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().revalidate(); - VHomeUI.SINGLETON_INSTANCE.getPnlDisplay().repaintSelf(); - - } - - - /** @return {@link javax.swing.JButton} */ - public JButton getBtnStart() { - return this.btnStart; - } - - - /** @return {@link javax.swing.JCheckBox} */ - public JCheckBox getCbSingletons() { - return cbSingletons; - } - - /** @return {@link javax.swing.JCheckBox} */ - public JCheckBox getCbArtifacts() { - return cbArtifacts; - } - - /** @return {@link javax.swing.JCheckBox} */ - public JCheckBox getCbRemoveSmall() { - return cbRemoveSmall; - } - - //========== Overridden from IVDoc - - /* (non-Javadoc) - * @see forge.gui.framework.IVDoc#getDocumentID() - */ - @Override - public EDocID getDocumentID() { - return EDocID.HOME_VANGUARD; - } - - /* (non-Javadoc) - * @see forge.gui.framework.IVDoc#getTabLabel() - */ - @Override - public DragTab getTabLabel() { - return tab; - } - - /* (non-Javadoc) - * @see forge.gui.framework.IVDoc#getLayoutControl() - */ - @Override - public CSubmenuVanguard getLayoutControl() { - return CSubmenuVanguard.SINGLETON_INSTANCE; - } - - /* (non-Javadoc) - * @see forge.gui.framework.IVDoc#setParentCell(forge.gui.framework.DragCell) - */ - @Override - public void setParentCell(DragCell cell0) { - this.parentCell = cell0; - } - - /* (non-Javadoc) - * @see forge.gui.framework.IVDoc#getParentCell() - */ - @Override - public DragCell getParentCell() { - return parentCell; - } - - /** - * - * @return a deckchooser for every player - */ - public List getDeckChoosers() { - return deckChoosers; - } - - /** - * @return the avatarLists - */ - public List> getAvatarLists() { - return avatarLists; - } - - /** - * @return the currentNumTabsShown - */ - public int getNumPlayers() { - return currentNumTabsShown; - } - - /** - * @return the allAvatars - */ - public Iterable getAllAvatars() { - if (allAvatars.isEmpty()) { - for (PaperCard c : Singletons.getMagicDb().getVariantCards().getAllCards()) { - if (c.getRules().getType().isVanguard()) { - allAvatars.add(c); - } - } - } - return allAvatars; - } - - /** - * @return the allAiAvatars - */ - public List getAllAiAvatars() { - return allAiAvatars; - } - - /** - * @return the non-random human Avatars - */ - public List getNonRandomHumanAvatars() { - return nonRandomHumanAvatars; - } - - /** - * @return the non-random AI Avatars - */ - public List getNonRandomAiAvatars() { - return nonRandomAiAvatars; - } - - /** - * @return the cbDefaultAvatars - */ - public FCheckBox getCbDefaultAvatars() { - return cbDefaultAvatars; - } -}