- Vanguard matches now launched via constructed match screen

This commit is contained in:
moomarc
2014-01-26 15:51:43 +00:00
parent 5bd88d468e
commit 32bf18781a
6 changed files with 201 additions and 625 deletions

2
.gitattributes vendored
View File

@@ -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

View File

@@ -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);

View File

@@ -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<GameType> 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<PaperCard> 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<Deck> 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));
}

View File

@@ -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<CSubmenuConstructed> {
private final List<FLabel> plnDeckSelectorBtns = new ArrayList<FLabel>(8);
private final List<FLabel> plnEditors = new ArrayList<FLabel>(8);
private final List<FList<Object>> vgdAvatarLists = new ArrayList<FList<Object>>();
private final List<FPanel> vgdPanels = new ArrayList<FPanel>(8);
private final List<FLabel> vgdSelectorBtns = new ArrayList<FLabel>(8);
private final List<CardDetailPanel> vgdAvatarDetails = new ArrayList<CardDetailPanel>();
private final List<PaperCard> vgdAllAvatars = new ArrayList<PaperCard>();
private final List<PaperCard> vgdAllAiAvatars = new ArrayList<PaperCard>();
private final List<PaperCard> nonRandomHumanAvatars = new ArrayList<PaperCard>();
private final List<PaperCard> nonRandomAiAvatars = new ArrayList<PaperCard>();
private Vector<Object> humanListData = new Vector<Object>();
private Vector<Object> aiListData = new Vector<Object>();
// CTR
private VSubmenuConstructed() {
lblTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2));
@@ -381,6 +398,20 @@ public enum VSubmenuConstructed implements IVSubmenu<CSubmenuConstructed> {
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);
return playerPanel;
@@ -446,6 +477,7 @@ public enum VSubmenuConstructed implements IVSubmenu<CSubmenuConstructed> {
@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<CSubmenuConstructed> {
// 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<Object> planarDeckList = new FList<Object>();
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<Object> vgdAvatarList = new FList<Object>();
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<DeckProxy> selectedDecks) {
@@ -490,8 +543,11 @@ public enum VSubmenuConstructed implements IVSubmenu<CSubmenuConstructed> {
}
} 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<CSubmenuConstructed> {
});
}
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<CSubmenuConstructed> {
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<CSubmenuConstructed> {
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<CSubmenuConstructed> {
}
/////////////////////////////////////
//========== STUFF FOR VARIANTS
//========== METHODS FOR VARIANTS
public Set<GameType> getAppliedVariants() {
return appliedVariants;
@@ -937,4 +1018,74 @@ public enum VSubmenuConstructed implements IVSubmenu<CSubmenuConstructed> {
public List<FList<Object>> getPlanarDeckLists() {
return planarDeckLists;
}
/** Gets the list of Vanguard avatar lists. */
public List<FList<Object>> getVanguardLists() {
return vgdAvatarLists;
}
/** Return all the Vanguard avatars. */
public Iterable<PaperCard> 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<PaperCard> getAllAiAvatars() {
return vgdAllAiAvatars;
}
/** Return the Vanguard avatars not flagged RemRandomDeck. */
public List<PaperCard> getNonRandomHumanAvatars() {
return nonRandomHumanAvatars;
}
/** Return the Vanguard avatars not flagged RemAIDeck or RemRandomDeck. */
public List<PaperCard> 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<Object> vgdList = getVanguardLists().get(playerIndex);
Vector<Object> listData = new Vector<Object>();
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);
}
}
}

View File

@@ -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.
*
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
*
*/
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 &emsp; {@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<Deck> playerDecks = new ArrayList<Deck>();
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<PaperCard> playerAvatars = new ArrayList<PaperCard>();
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<RegisteredPlayer> helper = new ArrayList<RegisteredPlayer>();
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;
}
}

View File

@@ -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.
*
* <br><br><i>(V at beginning of class name denotes a view class.)</i>
*
*/
public enum VSubmenuVanguard implements IVSubmenu<CSubmenuVanguard> {
/** */
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<PaperCard> allAvatars = new ArrayList<PaperCard>();
private final List<PaperCard> allAiAvatars = new ArrayList<PaperCard>();
private final List<PaperCard> nonRandomHumanAvatars = new ArrayList<PaperCard>();
private final List<PaperCard> nonRandomAiAvatars = new ArrayList<PaperCard>();
//////////////////////////////
private final FTabbedPane tabPane = new FTabbedPane();
private final List<FPanel> playerPanels = new ArrayList<FPanel>();
private final List<FDeckChooser> deckChoosers = new ArrayList<FDeckChooser>();
private final List<FList<Object>> avatarLists = new ArrayList<FList<Object>>();
private final List<JRadioButton> fieldRadios = new ArrayList<JRadioButton>();
private final List<JRadioButton> playerIsAIRadios = new ArrayList<JRadioButton>();
private final ButtonGroup grpFields = new ButtonGroup();
private final FCheckBox cbDefaultAvatars = new FCheckBox("Use deck-default avatars if possible.");
private final List<CardDetailPanel> cdpAvatarDetails = new ArrayList<CardDetailPanel>();
private int currentNumTabsShown = 8;
//////////////////////////////
private VSubmenuVanguard() {
lblTitle.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2));
Vector<Object> humanListData = new Vector<Object>();
Vector<Object> aiListData = new Vector<Object>();
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<Object> 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<Object>();
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<FDeckChooser> getDeckChoosers() {
return deckChoosers;
}
/**
* @return the avatarLists
*/
public List<FList<Object>> getAvatarLists() {
return avatarLists;
}
/**
* @return the currentNumTabsShown
*/
public int getNumPlayers() {
return currentNumTabsShown;
}
/**
* @return the allAvatars
*/
public Iterable<PaperCard> 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<PaperCard> getAllAiAvatars() {
return allAiAvatars;
}
/**
* @return the non-random human Avatars
*/
public List<PaperCard> getNonRandomHumanAvatars() {
return nonRandomHumanAvatars;
}
/**
* @return the non-random AI Avatars
*/
public List<PaperCard> getNonRandomAiAvatars() {
return nonRandomAiAvatars;
}
/**
* @return the cbDefaultAvatars
*/
public FCheckBox getCbDefaultAvatars() {
return cbDefaultAvatars;
}
}