package forge; import forge.deck.Deck; import forge.deck.DeckManager; import forge.error.ErrorViewer; import forge.gui.game.CardDetailPanel; import forge.gui.game.CardPicturePanel; import forge.properties.ForgeProps; import forge.properties.NewConstants; import javax.swing.*; import javax.swing.border.Border; import javax.swing.border.TitledBorder; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import java.awt.Color; import java.awt.*; import java.awt.event.*; import java.util.ArrayList; import java.util.Random; /** * <p>Gui_BoosterDraft class.</p> * * @author Forge * @version $Id: $ */ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConstants, NewConstants.LANG.Gui_BoosterDraft { /** * Constant <code>serialVersionUID=-6055633915602448260L</code> */ private static final long serialVersionUID = -6055633915602448260L; private BoosterDraft boosterDraft; /** * Constant <code>limitedDeckEditor=true</code> */ private static final boolean limitedDeckEditor = true; private TableModel allCardModel; private TableModel deckModel; private JScrollPane jScrollPane1 = new JScrollPane(); private JScrollPane jScrollPane2 = new JScrollPane(); private TitledBorder titledBorder1; private TitledBorder titledBorder2; private Border border3; private TitledBorder titledBorder3; private JLabel statsLabel = new JLabel(); private JTable allCardTable = new JTable(); private JTable deckTable = new JTable(); private JScrollPane jScrollPane3 = new JScrollPane(); private JPanel jPanel3 = new JPanel(); private GridLayout gridLayout1 = new GridLayout(); private JLabel statsLabel2 = new JLabel(); private JButton jButton1 = new JButton(); private CardDetailPanel detail = new CardDetailPanel(null); private CardPicturePanel picture = new CardPicturePanel(null); /** * <p>showGui.</p> * * @param in_boosterDraft a {@link forge.BoosterDraft} object. */ public void showGui(BoosterDraft in_boosterDraft) { boosterDraft = in_boosterDraft; setup(); showChoices(boosterDraft.nextChoice()); allCardModel.sort(1, true); deckModel.sort(1, true); setVisible(true); } /** * <p>addListeners.</p> */ private void addListeners() { this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent ev) { int n = JOptionPane.showConfirmDialog(null, ForgeProps.getLocalized(CLOSE_MESSAGE), "", JOptionPane.YES_NO_OPTION); if (n == JOptionPane.YES_OPTION) { dispose(); new Gui_NewGame(); } }//windowClosing() }); }//addListeners() /** * <p>setup.</p> */ private void setup() { addListeners(); // setupMenu(); //construct allCardTable, get all cards allCardModel = new TableModel(new CardList(), this); allCardModel.addListeners(allCardTable); allCardTable.setModel(allCardModel); allCardModel.resizeCols(allCardTable); //construct deckModel deckModel = new TableModel(this); deckModel.addListeners(deckTable); deckTable.setModel(deckModel); deckModel.resizeCols(deckTable); //add cards to GUI from deck // refreshGui(); allCardTable.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { if ((e.getModifiers() & InputEvent.BUTTON3_MASK) != 0) jButton1_actionPerformed(null); } });//MouseListener //get stats from deck deckModel.addTableModelListener(new TableModelListener() { public void tableChanged(TableModelEvent ev) { CardList deck = deckModel.getCards(); statsLabel.setText(getStats(deck)); } }); //get stats from all cards allCardModel.addTableModelListener(new TableModelListener() { public void tableChanged(TableModelEvent ev) { CardList deck = allCardModel.getCards(); statsLabel2.setText(getStats(deck)); } }); //Use both so that when "un"maximizing, the frame isn't tiny setSize(1024, 740); setExtendedState(Frame.MAXIMIZED_BOTH); }//setupAndDisplay() /** * <p>getStats.</p> * * @param deck a {@link forge.CardList} object. * @return a {@link java.lang.String} object. */ private String getStats(CardList deck) { int total = deck.size(); int creature = deck.getType("Creature").size(); int land = deck.getType("Land").size(); StringBuffer show = new StringBuffer(); show.append("Total - ").append(total).append(", Creatures - ").append(creature).append(", Land - ").append(land); String[] color = Constant.Color.Colors; for (int i = 0; i < 5; i++) show.append(", ").append(color[i]).append(" - ").append(CardListUtil.getColor(deck, color[i]).size()); return show.toString(); }//getStats() /** * <p>Constructor for Gui_BoosterDraft.</p> */ public Gui_BoosterDraft() { try { jbInit(); } catch (Exception ex) { ErrorViewer.showError(ex); } } /** * <p>getCard.</p> * * @return a {@link forge.Card} object. */ public Card getCard() { return detail.getCard(); } /** {@inheritDoc} */ public void setCard(Card card) { detail.setCard(card); picture.setCard(card); } /** * <p>jbInit.</p> * * @throws java.lang.Exception if any. */ private void jbInit() throws Exception { titledBorder1 = new TitledBorder(BorderFactory.createEtchedBorder(Color.white, new Color(148, 145, 140)), "Previously Picked Cards"); titledBorder2 = new TitledBorder(BorderFactory.createEtchedBorder(Color.white, new Color(148, 145, 140)), "Choose one card"); border3 = BorderFactory.createEtchedBorder(Color.white, new Color(148, 145, 140)); titledBorder3 = new TitledBorder(border3, "Card Detail"); this.getContentPane().setLayout(null); jScrollPane1.setBorder(titledBorder2); jScrollPane1.setBounds(new Rectangle(19, 28, 661, 344)); jScrollPane2.setBorder(titledBorder1); jScrollPane2.setBounds(new Rectangle(19, 478, 661, 184)); detail.setBorder(titledBorder3); detail.setBounds(new Rectangle(693, 23, 239, 323)); picture.setBounds(new Rectangle(693, 348, 240, 340)); statsLabel.setFont(new java.awt.Font("Dialog", 0, 16)); statsLabel.setText("Total - 0, Creatures - 0 Land - 0"); statsLabel.setBounds(new Rectangle(19, 665, 665, 31)); this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); this.setTitle("Booster Draft"); jScrollPane3.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); jScrollPane3.setBounds(new Rectangle(6, 168, 225, 143)); jPanel3.setBounds(new Rectangle(7, 21, 224, 141)); jPanel3.setLayout(gridLayout1); gridLayout1.setColumns(1); gridLayout1.setRows(0); statsLabel2.setBounds(new Rectangle(19, 378, 665, 31)); statsLabel2.setText("Total - 0, Creatures - 0 Land - 0"); statsLabel2.setFont(new java.awt.Font("Dialog", 0, 16)); jButton1.setBounds(new Rectangle(238, 418, 147, 44)); jButton1.setFont(new java.awt.Font("Dialog", 0, 16)); jButton1.setText("Choose Card"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { jButton1_actionPerformed(e); } }); this.getContentPane().add(detail, null); this.getContentPane().add(picture, null); this.getContentPane().add(jScrollPane1, null); this.getContentPane().add(statsLabel2, null); this.getContentPane().add(statsLabel, null); this.getContentPane().add(jScrollPane2, null); this.getContentPane().add(jButton1, null); jScrollPane2.getViewport().add(deckTable, null); jScrollPane1.getViewport().add(allCardTable, null); } /** * <p>addButton_actionPerformed.</p> * * @param e a {@link java.awt.event.ActionEvent} object. */ void addButton_actionPerformed(ActionEvent e) { int n = allCardTable.getSelectedRow(); if (n != -1) { setTitle("Deck Editor - " + Constant.Runtime.HumanDeck[0].getName() + " - changed"); Card c = allCardModel.rowToCard(n); deckModel.addCard(c); deckModel.resort(); if (limitedDeckEditor) { allCardModel.removeCard(c); } //3 conditions" 0 cards left, select the same row, select next row int size = allCardModel.getRowCount(); if (size != 0) { if (size == n) n--; allCardTable.addRowSelectionInterval(n, n); } }//if(valid row) }//addButton_actionPerformed /** * <p>removeButton_actionPerformed.</p> * * @param e a {@link java.awt.event.ActionEvent} object. */ void removeButton_actionPerformed(ActionEvent e) { int n = deckTable.getSelectedRow(); if (n != -1) { setTitle("Deck Editor - " + Constant.Runtime.HumanDeck[0].getName() + " - changed"); Card c = deckModel.rowToCard(n); deckModel.removeCard(c); if (limitedDeckEditor) { allCardModel.addCard(c); allCardModel.resort(); } //3 conditions" 0 cards left, select the same row, select next row int size = deckModel.getRowCount(); if (size != 0) { if (size == n) n--; deckTable.addRowSelectionInterval(n, n); } }//if(valid row) }//removeButton_actionPerformed //if true, don't do anything else /** * <p>checkSaveDeck.</p> * * @return a boolean. */ private boolean checkSaveDeck() { //a crappy way of checking if the deck has been saved if (getTitle().endsWith("changed")) { int n = JOptionPane.showConfirmDialog(null, ForgeProps.getLocalized(SAVE_MESSAGE), ForgeProps.getLocalized(SAVE_TITLE), JOptionPane.YES_NO_CANCEL_OPTION); if (n == JOptionPane.CANCEL_OPTION) return true; else if (n == JOptionPane.YES_OPTION) saveItem_actionPerformed(); } return false; }//checkSaveDeck() /** * <p>newItem_actionPerformed.</p> */ private void newItem_actionPerformed() { if (checkSaveDeck()) return; setTitle("Deck Editor"); Deck deck = Constant.Runtime.HumanDeck[0]; while (deck.countMain() != 0) deck.addSideboard(deck.removeMain(0)); //refreshGui(); }//newItem_actionPerformed /** * <p>closeItem_actionPerformed.</p> */ private void closeItem_actionPerformed() { //check if saved, show dialog "yes, "no" checkSaveDeck(); dispose(); } /** * <p>stats_actionPerformed.</p> * * @param list a {@link forge.CardList} object. */ private void stats_actionPerformed(CardList list) { } /** * <p>saveAsItem_actionPerformed.</p> */ private void saveAsItem_actionPerformed() { }//saveItem_actionPerformed() /** * <p>saveItem_actionPerformed.</p> */ private void saveItem_actionPerformed() { } /** * <p>openItem_actionPerformed.</p> */ private void openItem_actionPerformed() { }//openItem_actionPerformed() /** * <p>deleteItem_actionPerformed.</p> */ public void deleteItem_actionPerformed() { } /** * <p>renameItem_actionPerformed.</p> */ public void renameItem_actionPerformed() { String newName = ""; while (newName.equals("")) { newName = JOptionPane.showInputDialog(null, ForgeProps.getLocalized(RENAME_MESSAGE), ForgeProps.getLocalized(RENAME_TITLE), JOptionPane.QUESTION_MESSAGE); if (newName == null) break; } //when the user selects "Cancel" if (newName != null) { //String oldName = Constant.Runtime.HumanDeck[0].getName(); //unused Constant.Runtime.HumanDeck[0].setName(newName); setTitle("Deck Editor - " + newName + " - changed"); } } /** * <p>setupMenu.</p> */ @SuppressWarnings("unused") // setupMenu private void setupMenu() { //final boolean[] isSaved = new boolean[1]; // unused JMenuItem newItem = new JMenuItem("New"); JMenuItem openItem = new JMenuItem("Open"); JMenuItem saveItem = new JMenuItem("Save"); JMenuItem saveAsItem = new JMenuItem("Save As"); JMenuItem renameItem = new JMenuItem("Rename"); JMenuItem deleteItem = new JMenuItem("Delete"); JMenuItem statsPoolItem = new JMenuItem("Statistics - Card Pool"); JMenuItem statsDeckItem = new JMenuItem("Statistics - Deck"); JMenuItem closeItem = new JMenuItem("Close"); newItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { newItem_actionPerformed(); } }); openItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { openItem_actionPerformed(); } }); saveItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { saveItem_actionPerformed(); } }); saveAsItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { saveAsItem_actionPerformed(); } }); renameItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { renameItem_actionPerformed(); } }); deleteItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { deleteItem_actionPerformed(); } }); statsPoolItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { stats_actionPerformed(allCardModel.getCards()); } }); statsDeckItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { stats_actionPerformed(deckModel.getCards()); } }); closeItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { closeItem_actionPerformed(); } }); JMenu fileMenu = new JMenu("Deck Actions"); fileMenu.add(newItem); fileMenu.add(openItem); fileMenu.add(saveItem); fileMenu.add(saveAsItem); fileMenu.addSeparator(); fileMenu.add(renameItem); fileMenu.add(deleteItem); // fileMenu.add(statsPoolItem); // fileMenu.add(statsDeckItem); fileMenu.addSeparator(); fileMenu.add(closeItem); JMenuBar menuBar = new JMenuBar(); menuBar.add(fileMenu); this.setJMenuBar(menuBar); }/*setupMenu(); */ //refresh Gui from deck, Gui shows the cards in the deck // /** // * <p>refreshGui.</p> // */ /* private void refreshGui() { Deck deck = Constant.Runtime.HumanDeck[0]; if (deck == null) //this is just a patch, i know deck = new Deck(Constant.Runtime.GameType[0]); allCardModel.clear(); deckModel.clear(); Card c; //ReadDraftBoosterPack pack = new ReadDraftBoosterPack(); for (int i = 0; i < deck.countMain(); i++) { c = AllZone.getCardFactory().getCard(deck.getMain(i), AllZone.getHumanPlayer()); //add rarity to card if this is a sealed card pool //if (!Constant.Runtime.GameType[0].equals(Constant.GameType.Constructed)) // c.setRarity(pack.getRarity(c.getName())); //; deckModel.addCard(c); }//for if (deck.isSealed() || deck.isRegular()) { //add sideboard to GUI for (int i = 0; i < deck.countSideboard(); i++) { c = AllZone.getCardFactory().getCard(deck.getSideboard(i), AllZone.getHumanPlayer()); //c.setRarity(pack.getRarity(c.getName())); allCardModel.addCard(c); } } else { * Braids: "getAllCards copies the entire array, but that does not * seem to be needed here. Significant performance improvement is * possible if this code used getCards instead (along with a for each * loop instead of using get(i), if applicable)." // CardList all = AllZone.getCardFactory().getAllCards(); // for (int i = 0; i < all.size(); i++) // allCardModel.addCard(all.get(i)); } allCardModel.resort(); deckModel.resort(); }//refreshGui() */ //updates Constant.Runtime.HumanDeck[0] from the cards shown in the GUI /** * <p>refreshDeck.</p> */ @SuppressWarnings("unused") // refreshDeck private void refreshDeck() { //make new Deck Deck deck = new Deck(Constant.Runtime.GameType[0]); deck.setName(Constant.Runtime.HumanDeck[0].getName()); Constant.Runtime.HumanDeck[0] = deck; //update Deck with cards shown in GUI CardList list = deckModel.getCards(); for (int i = 0; i < list.size(); i++) deck.addMain(list.get(i).getName()); if (deck.isSealed()) { //add sideboard to deck list = allCardModel.getCards(); for (int i = 0; i < list.size(); i++) deck.addSideboard(list.get(i).getName()); } }/* refreshDeck() */ /** * <p>jButton1_actionPerformed.</p> * * @param e a {@link java.awt.event.ActionEvent} object. */ void jButton1_actionPerformed(ActionEvent e) { //pick card int n = allCardTable.getSelectedRow(); if (n == -1) //is valid selection? return; Card c = allCardModel.rowToCard(n); deckModel.addCard(c); deckModel.resort(); //get next booster pack boosterDraft.setChoice(c); if (boosterDraft.hasNextChoice()) { showChoices(boosterDraft.nextChoice()); } else { if (Constant.Runtime.UpldDrft[0]) { if (BoosterDraft.draftPicks.size() > 1) { ArrayList<String> outDraftData = new ArrayList<String>(); String keys[] = {""}; keys = BoosterDraft.draftPicks.keySet().toArray(keys); for (int i = 0; i < keys.length; i++) { outDraftData.add(keys[i] + "|" + BoosterDraft.draftPicks.get(keys[i])); } FileUtil.writeFile("res/draft/tmpDraftData.txt", outDraftData); HttpUtil poster = new HttpUtil(); poster.upload("http://cardforge.org/draftAI/submitDraftData.php?fmt=" + BoosterDraft.draftFormat[0], "res/draft/tmpDraftData.txt"); } } //quit saveDraft(); dispose(); } }/*OK Button*/ /** * <p>showChoices.</p> * * @param list a {@link forge.CardList} object. */ private void showChoices(CardList list) { allCardModel.clear(); //ReadDraftBoosterPack pack = new ReadDraftBoosterPack(); Card c; for (int i = 0; i < list.size(); i++) { c = list.get(i); //c.setRarity(pack.getRarity(c.getName())); //String PC = c.getSVar("PicCount"); Random r = MyRandom.random; //int n = 0; //if (PC.matches("[0-9][0-9]?")) // n = Integer.parseInt(PC); //if (n > 1) // c.setRandomPicture(r.nextInt(n)); if (c.getCurSetCode().equals("")) c.setCurSetCode(c.getMostRecentSet()); if (!c.getCurSetCode().equals("")) { int n = SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode()).PicCount; if (n > 1) c.setRandomPicture(r.nextInt(n - 1) + 1); c.setImageFilename(CardUtil.buildFilename(c)); c.setRarity(SetInfoUtil.getSetInfo_Code(c.getSets(), c.getCurSetCode()).Rarity); } allCardModel.addCard(c); } allCardModel.resort(); allCardTable.setRowSelectionInterval(0, 0); }//showChoices() /** * <p>getPlayersDeck.</p> * * @return a {@link forge.deck.Deck} object. */ private Deck getPlayersDeck() { Deck deck = new Deck(Constant.GameType.Draft); Constant.Runtime.HumanDeck[0] = deck; //add sideboard to deck CardList list = deckModel.getCards(); for (int i = 0; i < list.size(); i++) deck.addSideboard(list.get(i).getName() + "|" + list.get(i).getCurSetCode()); for (int i = 0; i < 20; i++) { deck.addSideboard("Forest|" + BoosterDraft.LandSetCode[0]); deck.addSideboard("Mountain|" + BoosterDraft.LandSetCode[0]); deck.addSideboard("Swamp|" + BoosterDraft.LandSetCode[0]); deck.addSideboard("Island|" + BoosterDraft.LandSetCode[0]); deck.addSideboard("Plains|" + BoosterDraft.LandSetCode[0]); } return deck; }//getPlayersDeck() /** * <p>saveDraft.</p> */ private void saveDraft() { String s = ""; while (s == null || s.length() == 0) { s = JOptionPane.showInputDialog(null, ForgeProps.getLocalized(SAVE_DRAFT_MESSAGE), ForgeProps.getLocalized(SAVE_DRAFT_TITLE), JOptionPane.QUESTION_MESSAGE); } //TODO: check if overwriting the same name, and let the user delete old drafts //construct computer's decks //save draft Deck[] computer = boosterDraft.getDecks(); Deck human = getPlayersDeck(); human.setName(s); Deck[] all = { human, computer[0], computer[1], computer[2], computer[3], computer[4], computer[5], computer[6]}; //DeckManager deckManager = new DeckManager(ForgeProps.getFile(NEW_DECKS)); DeckManager deckManager = AllZone.getDeckManager(); deckManager.addDraftDeck(all); //write file deckManager.close(); //close and open next screen dispose(); new Gui_NewGame(); }/*saveDraft()*/ }