diff --git a/.gitattributes b/.gitattributes index 33b15715bf6..49cee07227d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -10061,6 +10061,8 @@ res/pics/icons/Mage01.jpg -text res/pics/icons/Mage02.jpg -text res/pics/icons/MapIcon.png -text svneol=unset#image/png res/pics/icons/MapIconLarge.png -text svneol=unset#image/png +res/pics/icons/PetIcon.png -text +res/pics/icons/PlantIcon.png -text res/pics/icons/Unknown.jpg -text res/pics/icons/ZeppelinIcon.png -text svneol=unset#image/png res/pics/icons/notesIcon.png -text svneol=unset#image/png @@ -10748,8 +10750,6 @@ src/main/java/forge/card/trigger/TriggerUnequip.java svneol=native#text/plain src/main/java/forge/card/trigger/TriggerUntaps.java svneol=native#text/plain src/main/java/forge/card/trigger/package-info.java svneol=native#text/plain src/main/java/forge/control/ControlAllUI.java -text -src/main/java/forge/control/ControlEditorUI.java -text -src/main/java/forge/control/ControlHomeUI.java -text src/main/java/forge/control/ControlMatchUI.java -text src/main/java/forge/control/ControlWinLose.java -text src/main/java/forge/control/home/ControlConstructed.java -text diff --git a/res/pics/icons/PetIcon.png b/res/pics/icons/PetIcon.png new file mode 100644 index 00000000000..21b9dc15597 Binary files /dev/null and b/res/pics/icons/PetIcon.png differ diff --git a/res/pics/icons/PlantIcon.png b/res/pics/icons/PlantIcon.png new file mode 100644 index 00000000000..e2e243848fd Binary files /dev/null and b/res/pics/icons/PlantIcon.png differ diff --git a/src/main/java/forge/control/ControlAllUI.java b/src/main/java/forge/control/ControlAllUI.java index d115101222b..ad7b233cd36 100644 --- a/src/main/java/forge/control/ControlAllUI.java +++ b/src/main/java/forge/control/ControlAllUI.java @@ -26,6 +26,7 @@ import java.awt.event.WindowEvent; import javax.swing.JLayeredPane; import forge.AllZone; +import forge.quest.gui.bazaar.QuestBazaarPanel; import forge.view.GuiTopLevel; import forge.view.editor.EditorTopLevel; import forge.view.home.HomeTopLevel; @@ -45,7 +46,17 @@ public class ControlAllUI { private HomeTopLevel home = null; private ViewTopLevel match = null; private EditorTopLevel editor = null; - private WindowAdapter actConcede; + private WindowAdapter waConcede; + private QuestBazaarPanel bazaar; + + /** */ + public static final int HOME_SCREEN = 0; + /** */ + public static final int MATCH_SCREEN = 1; + /** */ + public static final int DEFAULT_EDITOR = 2; + /** */ + public static final int QUEST_BAZAAR = 3; /** *

@@ -62,7 +73,7 @@ public class ControlAllUI { this.display = (JLayeredPane) this.view.getContentPane(); - this.actConcede = new WindowAdapter() { + this.waConcede = new WindowAdapter() { @Override public void windowClosing(final WindowEvent evt) { ViewTopLevel t = ((GuiTopLevel) AllZone.getDisplay()).getController().getMatchController().getView(); @@ -86,6 +97,7 @@ public class ControlAllUI { this.editor = null; this.display.removeAll(); + this.view.removeWindowListener(waConcede); this.view.addOverlay(); view.addComponentListener(new ComponentAdapter() { @@ -101,14 +113,13 @@ public class ControlAllUI { this.home = new HomeTopLevel(); this.display.add(this.home, JLayeredPane.DEFAULT_LAYER); sizeChildren(); - view.removeWindowListener(actConcede); break; case 1: // Match screen this.match = new ViewTopLevel(); this.display.add(this.match, JLayeredPane.DEFAULT_LAYER); sizeChildren(); - view.addWindowListener(actConcede); + view.addWindowListener(waConcede); break; case 2: // Deck editor screen @@ -116,6 +127,12 @@ public class ControlAllUI { this.display.add(this.editor); break; + case 3: // Quest Bazaar screen + this.bazaar = new QuestBazaarPanel(null); + this.display.add(bazaar, JLayeredPane.DEFAULT_LAYER); + sizeChildren(); + break; + default: break; } @@ -139,6 +156,20 @@ public class ControlAllUI { return this.match.getController(); } + /** @return HomeTopLevel */ + public HomeTopLevel getHomeView() { + return this.home; + } + + /** + * Gets the match view. + * + * @return ViewTopLevel + */ + public QuestBazaarPanel getBazaarView() { + return this.bazaar; + } + /** Sizes children of JLayeredPane to fully fit their layers. */ private void sizeChildren() { Component[] children; diff --git a/src/main/java/forge/control/ControlEditorUI.java b/src/main/java/forge/control/ControlEditorUI.java deleted file mode 100644 index d7a8c556de2..00000000000 --- a/src/main/java/forge/control/ControlEditorUI.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Forge: Play Magic: the Gathering. - * Copyright (C) 2011 Forge Team - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package forge.control; - -import javax.swing.JPanel; - -/** - *

- * ControlEditorUI - *

- * Top-level controller for deck editor. - * - */ -@SuppressWarnings("serial") -public class ControlEditorUI extends JPanel { - /** - *

- * ControlEditorUI - *

- * Top-level controller for deck editor. - * - */ - public ControlEditorUI() { - } -} diff --git a/src/main/java/forge/control/ControlHomeUI.java b/src/main/java/forge/control/ControlHomeUI.java deleted file mode 100644 index ae0de420e80..00000000000 --- a/src/main/java/forge/control/ControlHomeUI.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Forge: Play Magic: the Gathering. - * Copyright (C) 2011 Forge Team - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package forge.control; - -/** - * TODO: Write javadoc for this type. - * - */ -public class ControlHomeUI { - -} diff --git a/src/main/java/forge/control/home/ControlQuest.java b/src/main/java/forge/control/home/ControlQuest.java index a0e85f9976f..ec30644b9ce 100644 --- a/src/main/java/forge/control/home/ControlQuest.java +++ b/src/main/java/forge/control/home/ControlQuest.java @@ -1,19 +1,22 @@ package forge.control.home; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import javax.swing.JOptionPane; import forge.AllZone; import forge.Command; import forge.Constant; +import forge.control.ControlAllUI; +import forge.deck.Deck; import forge.gui.deckeditor.DeckEditorQuest; import forge.gui.deckeditor.DeckEditorShop; import forge.quest.data.QuestData; import forge.quest.data.QuestUtil; -import forge.quest.gui.QuestFrame; -import forge.quest.gui.bazaar.QuestBazaarPanel; +import forge.quest.data.item.QuestItemZeppelin; +import forge.quest.gui.main.QuestChallenge; +import forge.quest.gui.main.QuestEvent; import forge.view.GuiTopLevel; import forge.view.home.ViewQuest; @@ -23,6 +26,7 @@ import forge.view.home.ViewQuest; */ public class ControlQuest { private ViewQuest view; + private QuestEvent event; /** * Controls logic and listeners for quest mode in home screen. @@ -31,8 +35,27 @@ public class ControlQuest { */ public ControlQuest(ViewQuest v0) { this.view = v0; - updateDeckList(); + + view.getPetComboBox().addActionListener(new ActionListener() { + @Override + public void actionPerformed(final ActionEvent actionEvent) { + if (view.getPetComboBox().getSelectedIndex() > 0) { + view.getQuestData().getPetManager().setSelectedPet( + (String) view.getPetComboBox().getSelectedItem()); + } else { + view.getQuestData().getPetManager().setSelectedPet(null); + } + } + }); + + view.getPlantCheckBox().addActionListener(new ActionListener() { + @Override + public void actionPerformed(final ActionEvent actionEvent) { + view.getQuestData().getPetManager() + .setUsePlant(view.getPlantCheckBox().isSelected()); + } + }); } /** @return ViewQuest */ @@ -82,20 +105,11 @@ public class ControlQuest { } /** */ - // Since QuestBazaarPanel is not in a JFrame for some reason, one - // must be created here. Later, this will be integrated into the - // top level UI. Doublestrike 11-12-11. public void showBazaar() { - QuestFrame f = new QuestFrame(); - f.getContentPane().add(new QuestBazaarPanel(f)); - f.setVisible(true); + GuiTopLevel g = ((GuiTopLevel) AllZone.getDisplay()); - f.addWindowListener(new WindowAdapter() { - @Override - public void windowClosed(WindowEvent e) { - AllZone.getQuestData().saveData(); - } - }); + g.getController().changeState(ControlAllUI.QUEST_BAZAAR); + g.validate(); } // card shop button /** @@ -103,9 +117,10 @@ public class ControlQuest { */ public void newQuest() { int difficulty = 0; - QuestData questData = AllZone.getQuestData(); + QuestData questData = new QuestData(); - final String mode = view.getRadFantasy().isSelected() ? forge.quest.data.QuestData.FANTASY + final String mode = view.getRadFantasy().isSelected() + ? forge.quest.data.QuestData.FANTASY : forge.quest.data.QuestData.REALISTIC; if (view.getRadEasy().isSelected()) { @@ -118,8 +133,8 @@ public class ControlQuest { difficulty = 3; } else { JOptionPane.showMessageDialog(null, - "Please select a difficulty.", - "New Quest: Difficulty?", JOptionPane.ERROR_MESSAGE); + "This should not be happening!", + "New Quest: Difficulty Bug!?", JOptionPane.ERROR_MESSAGE); return; } @@ -147,21 +162,83 @@ public class ControlQuest { /** */ public void start() { - QuestData questData = AllZone.getQuestData(); + if (view.getLstDeckChooser().getSelectedIndex() == -1) { + JOptionPane.showMessageDialog(null, + "A mysterious wall blocks your way." + + "\n\rAn unseen sepulchral voice booms:" + + "\n\r\"Entrance Forbidden Without A Deck\"", + "No deck", JOptionPane.ERROR_MESSAGE); + return; + } - Constant.Runtime.HUMAN_DECK[0] = questData.getDeck((String) view.getLstDeckChooser().getSelectedValue()); - Constant.Runtime.COMPUTER_DECK[0] = view.getSelectedOpponent().getEvent().getEventDeck(); + event = view.getSelectedOpponent().getEvent(); + AllZone.setQuestEvent(event); + final QuestItemZeppelin zeppelin = (QuestItemZeppelin) view.getQuestData().getInventory().getItem("Zeppelin"); + zeppelin.setZeppelinUsed(false); + view.getQuestData().randomizeOpponents(); - AllZone.setQuestEvent(view.getSelectedOpponent().getEvent()); + String deckname = (String) view.getLstDeckChooser().getSelectedValue(); + Constant.Runtime.HUMAN_DECK[0] = view.getQuestData().getDeck(deckname); + Constant.Runtime.COMPUTER_DECK[0] = event.getEventDeck(); + Deck humanDeck = view.getQuestData().getDeck(deckname); + + Constant.Runtime.HUMAN_DECK[0] = humanDeck; + + Constant.Quest.OPP_ICON_NAME[0] = event.getIcon(); GuiTopLevel g = (GuiTopLevel) AllZone.getDisplay(); g.getController().changeState(1); g.getController().getMatchController().initMatch(); + AllZone.getMatchState().reset(); + if (event.getEventType().equals("challenge")) { + this.setupChallenge(humanDeck); + } else { + this.setupDuel(humanDeck); + } + + view.getQuestData().saveData(); + } + + /** + *

+ * setupDuel. + *

+ * + * @param humanDeck + * a {@link forge.deck.Deck} object. + */ + final void setupDuel(final Deck humanDeck) { + final Deck computer = event.getEventDeck(); + Constant.Runtime.COMPUTER_DECK[0] = computer; + AllZone.getGameAction().newGame( Constant.Runtime.HUMAN_DECK[0], Constant.Runtime.COMPUTER_DECK[0], - QuestUtil.getHumanStartingCards(questData), - QuestUtil.getComputerStartingCards(questData), - questData.getLife(), 20, null); + QuestUtil.getHumanStartingCards(view.getQuestData()), + QuestUtil.getComputerStartingCards(view.getQuestData()), + view.getQuestData().getLife(), 20, null); + } + + /** + *

+ * setupChallenge. + *

+ * + * @param humanDeck + * a {@link forge.deck.Deck} object. + */ + private void setupChallenge(final Deck humanDeck) { + int extraLife = 0; + + if (view.getQuestData().getInventory().getItemLevel("Gear") == 2) { + extraLife = 3; + } + + AllZone.getGameAction().newGame( + Constant.Runtime.HUMAN_DECK[0], Constant.Runtime.COMPUTER_DECK[0], + QuestUtil.getHumanStartingCards(view.getQuestData(), event), + QuestUtil.getHumanStartingCards(view.getQuestData(), event), + view.getQuestData().getLife() + extraLife, ((QuestChallenge) event).getAILife(), event); + } } diff --git a/src/main/java/forge/quest/gui/bazaar/QuestBazaarPanel.java b/src/main/java/forge/quest/gui/bazaar/QuestBazaarPanel.java index 80f1a3c8ef0..a356e39f7d1 100644 --- a/src/main/java/forge/quest/gui/bazaar/QuestBazaarPanel.java +++ b/src/main/java/forge/quest/gui/bazaar/QuestBazaarPanel.java @@ -31,9 +31,13 @@ import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JToggleButton; +import forge.AllZone; +import forge.Constant; +import forge.control.ControlAllUI; import forge.quest.data.bazaar.QuestStallManager; import forge.quest.gui.QuestAbstractPanel; import forge.quest.gui.QuestFrame; +import forge.view.GuiTopLevel; /** *

@@ -142,7 +146,14 @@ public class QuestBazaarPanel extends QuestAbstractPanel { quitButton.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { - QuestBazaarPanel.this.getMainFrame().showMainPane(); + if (Constant.Runtime.OLDGUI[0]) { + QuestBazaarPanel.this.getMainFrame().showMainPane(); + } + else { + ControlAllUI g = ((GuiTopLevel) AllZone.getDisplay()).getController(); + g.changeState(ControlAllUI.HOME_SCREEN); + g.getHomeView().showQuestMenu(); + } } }); diff --git a/src/main/java/forge/view/home/HomeTopLevel.java b/src/main/java/forge/view/home/HomeTopLevel.java index d40d53f8e13..8361f428fb7 100644 --- a/src/main/java/forge/view/home/HomeTopLevel.java +++ b/src/main/java/forge/view/home/HomeTopLevel.java @@ -87,39 +87,39 @@ public class HomeTopLevel extends FPanel { pnlContent.setBackground(skin.getColor("zebra")); pnlContent.setLayout(new MigLayout("insets 0, gap 0")); - btnDraft = new FButton(); - btnDraft.setAction(new AbstractAction() { - public void actionPerformed(ActionEvent arg0) { draft(); } - }); - btnDraft.setText("Draft (Hard)"); - btnConstructed = new FButton(); btnConstructed.setAction(new AbstractAction() { - public void actionPerformed(ActionEvent arg0) { constructed(); } + public void actionPerformed(ActionEvent arg0) { showConstructedMenu(); } }); btnConstructed.setText("Constructed (Easy)"); btnSealed = new FButton(); btnSealed.setAction(new AbstractAction() { - public void actionPerformed(ActionEvent arg0) { sealed(); } + public void actionPerformed(ActionEvent arg0) { showSealedMenu(); } }); btnSealed.setText("Sealed (Medium)"); + btnDraft = new FButton(); + btnDraft.setAction(new AbstractAction() { + public void actionPerformed(ActionEvent arg0) { showDraftMenu(); } + }); + btnDraft.setText("Draft (Hard)"); + btnQuest = new FButton(); btnQuest.setAction(new AbstractAction() { - public void actionPerformed(ActionEvent arg0) { quest(); } + public void actionPerformed(ActionEvent arg0) { showQuestMenu(); } }); btnQuest.setText("Quest"); btnSettings = new FButton(); btnSettings.setAction(new AbstractAction() { - public void actionPerformed(ActionEvent arg0) { settings(); } + public void actionPerformed(ActionEvent arg0) { showSettingsMenu(); } }); btnSettings.setText("Settings"); btnUtilities = new FButton(); btnUtilities.setAction(new AbstractAction() { - public void actionPerformed(ActionEvent arg0) { utilities(); } + public void actionPerformed(ActionEvent arg0) { showUtilitiesMenu(); } }); btnUtilities.setText("Utilities"); @@ -148,11 +148,12 @@ public class HomeTopLevel extends FPanel { pnlMenu.add(btnEditor, constraints); pnlMenu.add(btnExit, constraints); - // Open "constructed" screen on first run. - constructed(); + // Open "constructed" menu on first run. + showConstructedMenu(); } - private void constructed() { + /** Opens menu for constructed mode. */ + public void showConstructedMenu() { clearToggles(); btnConstructed.setToggled(true); pnlContent.removeAll(); @@ -161,7 +162,8 @@ public class HomeTopLevel extends FPanel { pnlContent.repaint(); } - private void draft() { + /** Opens menu for draft mode. */ + public void showDraftMenu() { clearToggles(); btnDraft.setToggled(true); pnlContent.removeAll(); @@ -170,7 +172,8 @@ public class HomeTopLevel extends FPanel { pnlContent.repaint(); } - private void sealed() { + /** Opens menu for sealed mode. */ + public void showSealedMenu() { clearToggles(); btnSealed.setToggled(true); pnlContent.removeAll(); @@ -179,7 +182,8 @@ public class HomeTopLevel extends FPanel { pnlContent.repaint(); } - private void quest() { + /** Opens menu for quest mode. */ + public void showQuestMenu() { clearToggles(); btnQuest.setToggled(true); pnlContent.removeAll(); @@ -188,7 +192,8 @@ public class HomeTopLevel extends FPanel { pnlContent.repaint(); } - private void settings() { + /** Opens menu for settings. */ + public void showSettingsMenu() { clearToggles(); btnSettings.setToggled(true); pnlContent.removeAll(); @@ -197,7 +202,8 @@ public class HomeTopLevel extends FPanel { pnlContent.repaint(); } - private void utilities() { + /** Opens menu for utilities. */ + public void showUtilitiesMenu() { clearToggles(); btnUtilities.setToggled(true); pnlContent.removeAll(); @@ -242,6 +248,6 @@ public class HomeTopLevel extends FPanel { /** */ public void resetQuest() { quest = new ViewQuest(this); - quest(); + showQuestMenu(); } } diff --git a/src/main/java/forge/view/home/ViewQuest.java b/src/main/java/forge/view/home/ViewQuest.java index bc22c447db5..b65e0fe6511 100644 --- a/src/main/java/forge/view/home/ViewQuest.java +++ b/src/main/java/forge/view/home/ViewQuest.java @@ -1,22 +1,24 @@ package forge.view.home; -import java.awt.BorderLayout; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; import java.util.List; +import java.util.Set; import javax.swing.AbstractAction; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JCheckBox; +import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; +import javax.swing.JTextArea; import javax.swing.SwingConstants; import javax.swing.border.LineBorder; import javax.swing.border.MatteBorder; @@ -25,12 +27,12 @@ import net.miginfocom.swing.MigLayout; import forge.AllZone; import forge.control.home.ControlQuest; import forge.gui.GuiUtils; -import forge.gui.MultiLineLabel; -import forge.gui.MultiLineLabelUI; import forge.properties.ForgeProps; import forge.properties.NewConstants; import forge.quest.data.QuestData; import forge.quest.data.QuestDataIO; +import forge.quest.data.item.QuestItemZeppelin; +import forge.quest.data.pet.QuestPetAbstract; import forge.quest.gui.main.QuestChallenge; import forge.quest.gui.main.QuestDuel; import forge.quest.gui.main.QuestEvent; @@ -52,7 +54,9 @@ public class ViewQuest extends JScrollPane { private JList lstDeckChooser; private ControlQuest control; private JRadioButton radEasy, radMedium, radHard, radExpert, radFantasy, radClassic; - private JCheckBox cbStandardStart; + private JCheckBox cbStandardStart, cbPlant, cbZep; + private JComboBox cbxPet; + private JLabel lblPlant, lblPet, lblZep; /** * Populates Swing components of Quest mode in home screen. @@ -62,24 +66,33 @@ public class ViewQuest extends JScrollPane { public ViewQuest(HomeTopLevel v0) { // Basic init stuff super(VERTICAL_SCROLLBAR_ALWAYS, HORIZONTAL_SCROLLBAR_AS_NEEDED); - AllZone.setQuestData(QuestDataIO.loadData()); this.setOpaque(false); this.setBorder(null); parentView = v0; skin = AllZone.getSkin(); + AllZone.setQuestData(QuestDataIO.loadData()); questData = AllZone.getQuestData(); // Panel is dropped into scroll pane for resize safety. viewport = new JPanel(); viewport.setOpaque(false); - viewport.setLayout(new MigLayout("insets 0, gap 0, wrap")); + viewport.setLayout(new MigLayout("insets 0, gap 0, wrap 2")); this.getViewport().setOpaque(false); - JLabel lblContinue = new JLabel(questData.getRank()); + JLabel lblContinue = new JLabel(" " + questData.getRank()); + lblContinue.setOpaque(true); lblContinue.setBorder(new MatteBorder(0, 0, 1, 0, skin.getColor("borders"))); lblContinue.setForeground(skin.getColor("text")); + lblContinue.setBackground(skin.getColor("theme").darker()); lblContinue.setFont(skin.getFont1().deriveFont(Font.BOLD, 20)); - viewport.add(lblContinue, "w 90%!, gap 5% 0 2% 0"); + viewport.add(lblContinue, "w 90%!, h 50px!, gap 5% 0 2% 0, span 2"); + + JLabel lblStats = new JLabel("Wins: " + questData.getWin() + + " / Losses: " + questData.getLost()); + lblStats.setForeground(skin.getColor("text")); + lblStats.setFont(skin.getFont1().deriveFont(Font.BOLD, 17)); + lblStats.setHorizontalAlignment(SwingConstants.CENTER); + viewport.add(lblStats, "h 35px!, ax center, span 2"); // Quest events populateQuestEvents(); @@ -88,19 +101,7 @@ public class ViewQuest extends JScrollPane { populateQuestOptions(); // Start button - StartButton btnStart = new StartButton(parentView); - - JPanel pnlButtonContainer = new JPanel(); - pnlButtonContainer.setOpaque(false); - - pnlButtonContainer.setLayout(new BorderLayout()); - pnlButtonContainer.add(btnStart, SwingConstants.CENTER); - viewport.add(pnlButtonContainer, "w 100%!, gapbottom 2%, gaptop 2%"); - - btnStart.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { control.start(); } - }); + populateStartArea(); // New Quest populateNewQuest(); @@ -144,18 +145,29 @@ public class ViewQuest extends JScrollPane { challengesContainer.add(temp, "w 100%, h 70px:70px, gapbottom 5px"); } + if (challenges.size() == 0) { + JLabel lblTeaser = new JLabel("(Next challenge available in " + + nextChallengeInWins() + " wins.)"); + lblTeaser.setHorizontalAlignment(SwingConstants.CENTER); + lblTeaser.setForeground(skin.getColor("text")); + lblTeaser.setFont(skin.getFont1().deriveFont(Font.BOLD, 16)); + challengesContainer.add(lblTeaser, "w 100%!, ax center, ay top"); + } + JLabel lblDuels = new JLabel("Available Duels"); lblDuels.setForeground(skin.getColor("text")); + lblDuels.setHorizontalAlignment(SwingConstants.CENTER); lblDuels.setFont(skin.getFont1().deriveFont(Font.ITALIC, 14)); JLabel lblChallenges = new JLabel("Available Challenges"); lblChallenges.setForeground(skin.getColor("text")); + lblChallenges.setHorizontalAlignment(SwingConstants.CENTER); lblChallenges.setFont(skin.getFont1().deriveFont(Font.ITALIC, 14)); - viewport.add(lblDuels, "w 90%, gapleft 5%, gapbottom 1%, gaptop 1%"); - viewport.add(duelsContainer, " w 90%, gapleft 5%, gapbottom 2%"); - viewport.add(lblChallenges, "w 90%, gapleft 5%, gapbottom 1%"); - viewport.add(challengesContainer, " w 90%, gapleft 5%, gapbottom 2%"); + viewport.add(lblDuels, "w 48%, gap 1% 1% 2% 1%"); + viewport.add(lblChallenges, "w 48%, gap 0 0 2% 1%, wrap"); + viewport.add(duelsContainer, " w 48%, gap 1% 1% 1% 2%, ay top"); + viewport.add(challengesContainer, " w 48%, gap 0 0 1% 2%, wrap"); // Select first event. selectedOpponent = (SelectablePanel) duelsContainer.getComponent(0); @@ -167,6 +179,21 @@ public class ViewQuest extends JScrollPane { JPanel optionsContainer = new JPanel(); optionsContainer.setOpaque(false); optionsContainer.setLayout(new MigLayout("insets 0, gap 0")); + optionsContainer.setBorder(new MatteBorder(0, 0, 1, 0, skin.getColor("borders"))); + + JLabel lblCredits = new JLabel("Credits: " + Long.toString(questData.getCredits())); + lblCredits.setIcon(GuiUtils.getResizedIcon(new ImageIcon("res/pics/icons/CoinStack.png"), 26, 26)); + lblCredits.setForeground(skin.getColor("text")); + lblCredits.setIconTextGap(5); + lblCredits.setHorizontalAlignment(SwingConstants.CENTER); + lblCredits.setFont(skin.getFont1().deriveFont(Font.BOLD, 14)); + + JLabel lblLife = new JLabel("Life: " + Long.toString(questData.getLife())); + lblLife.setIcon(GuiUtils.getResizedIcon(new ImageIcon("res/pics/icons/Life.png"), 26, 26)); + lblLife.setForeground(skin.getColor("text")); + lblLife.setIconTextGap(5); + lblLife.setHorizontalAlignment(SwingConstants.CENTER); + lblLife.setFont(skin.getFont1().deriveFont(Font.BOLD, 14)); SubButton btnEditor = new SubButton(""); btnEditor.setAction(new AbstractAction() { @@ -195,38 +222,112 @@ public class ViewQuest extends JScrollPane { }); btnBazaar.setText("Bazaar"); - OptionsCheckBox cbPet = new OptionsCheckBox("Summon Pet"); - OptionsCheckBox cbWall = new OptionsCheckBox("Summon Wall"); - OptionsCheckBox cbZep = new OptionsCheckBox("Launch Zeppelin"); - lstDeckChooser = new JList(); - optionsContainer.add(btnEditor, "w 30%, h 30px!, gapleft 5%, gapright 5%, gapbottom 5px"); - optionsContainer.add(cbPet, "w 25%, h 30px!, ax center"); - optionsContainer.add(btnCardShop, "w 25%, h 30px!, gapleft 5%, wrap"); + optionsContainer.add(btnEditor, "w 35%, h 30px!, gap 10% 5% 10px 10px"); + optionsContainer.add(lblCredits, "w 35%!, h 30px!, wrap"); - optionsContainer.add(new JScrollPane(lstDeckChooser), "w 30%, h 60px!, gapleft 5%, gapright 5%, span 1 2"); - optionsContainer.add(cbWall, "w 25%, h 30px!, ax center, gapbottom 5px, wrap"); + optionsContainer.add(new JScrollPane(lstDeckChooser), "w 35%, h 110px!, gap 10% 5% 0 10px, span 1 3"); + optionsContainer.add(lblLife, "w 35%, h 30px!, gap 0 0 0 10px, wrap"); - optionsContainer.add(cbZep, "w 25%, h 30px!"); - optionsContainer.add(btnBazaar, "w 25%, h 30px!, gapleft 5%, wrap"); + optionsContainer.add(btnCardShop, "w 35%, h 30px!, gap 0 0 0 10px, wrap"); + optionsContainer.add(btnBazaar, "w 35%, h 30px!, gap 0 0 0 10px, wrap"); if (!questData.isFantasy()) { - cbPet.setVisible(false); - cbWall.setVisible(false); - cbZep.setVisible(false); + lblLife.setVisible(false); btnBazaar.setVisible(false); } - viewport.add(optionsContainer, "w 90%, gap 5% 0 1% 1%"); + viewport.add(optionsContainer, "w 90%, gap 5% 0 1% 1%, span 2 1"); + } + + private void populateStartArea() { + JPanel pnlButtonContainer = new JPanel(); + pnlButtonContainer.setOpaque(false); + pnlButtonContainer.setLayout(new MigLayout("insets 0, gap 0, wrap 2, ax center, hidemode 3")); + + cbxPet = new JComboBox(); + cbxPet.setFont(skin.getFont1().deriveFont(Font.PLAIN, 14)); + + cbPlant = new OptionsCheckBox("Summon Wall"); + cbZep = new OptionsCheckBox("Launch Zeppelin"); + + lblPet = new JLabel(GuiUtils.getResizedIcon( + new ImageIcon("res/pics/icons/PetIcon.png"), 30, 30)); + lblPlant = new JLabel(GuiUtils.getResizedIcon( + new ImageIcon("res/pics/icons/PlantIcon.png"), 30, 30)); + lblZep = new JLabel(GuiUtils.getResizedIcon( + new ImageIcon("res/pics/icons/ZeppelinIcon.png"), 30, 30)); + + StartButton btnStart = new StartButton(parentView); + btnStart.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { control.start(); } + }); + + pnlButtonContainer.add(lblPet, "w 30px!, h 30px!, gapright 10px"); + pnlButtonContainer.add(cbxPet, "w 30%!, h 30px!, gapbottom 10px, wrap"); + + pnlButtonContainer.add(lblPlant, "w 30px!, h 30px!, gapright 10px"); + pnlButtonContainer.add(cbPlant, "w 30%!, h 30px!, gapbottom 10px, wrap"); + + pnlButtonContainer.add(lblZep, "w 30px!, h 30px!, gapright 10px"); + pnlButtonContainer.add(cbZep, "w 30%!, h 30px!, gapbottom 10px, wrap"); + + pnlButtonContainer.add(btnStart, "span 2 1"); + + viewport.add(pnlButtonContainer, "w 100%!, gapbottom 2%, gaptop 2%, span 2"); + + if (this.questData.getMode().equals(QuestData.FANTASY)) { + final Set petList = this.questData.getPetManager().getAvailablePetNames(); + final QuestPetAbstract pet = this.questData.getPetManager().getSelectedPet(); + + // Pet list visibility + if (petList.size() > 0) { + cbxPet.setEnabled(true); + cbxPet.addItem("Don't summon a pet"); + for (final String aPetList : petList) { + cbxPet.addItem(aPetList); + } + + if (pet != null) { cbxPet.setSelectedItem(pet.getName()); } + } else { + cbxPet.setVisible(false); + lblPet.setVisible(false); + } + + // Plant visiblity + if (this.questData.getPetManager().getPlant().getLevel() == 0) { + cbPlant.setVisible(false); + lblPlant.setVisible(false); + } + else { + cbPlant.setSelected(this.questData.getPetManager().shouldPlantBeUsed()); + } + + // Zeppelin visibility + final QuestItemZeppelin zeppelin = (QuestItemZeppelin) this.questData.getInventory().getItem("Zeppelin"); + cbZep.setVisible(zeppelin.hasBeenUsed()); + lblZep.setVisible(zeppelin.hasBeenUsed()); + } + else { + cbxPet.setVisible(false); + lblPet.setVisible(false); + cbPlant.setVisible(false); + lblPlant.setVisible(false); + cbZep.setVisible(false); + lblZep.setVisible(false); + } } private void populateNewQuest() { - JLabel lblNew = new JLabel("Embark on a new Quest"); + JLabel lblNew = new JLabel(" Embark on a new Quest"); lblNew.setForeground(skin.getColor("text")); + lblNew.setBackground(skin.getColor("theme").darker()); + lblNew.setOpaque(true); lblNew.setBorder(new MatteBorder(1, 0, 1, 0, skin.getColor("borders"))); lblNew.setFont(skin.getFont1().deriveFont(Font.BOLD, 16)); - viewport.add(lblNew, "w 90%!, h 50px!, gap 5% 5% 2%"); + viewport.add(lblNew, "w 90%!, h 50px!, gap 5% 5% 2%, span 2"); JLabel lblNotes = new JLabel("" + "Start a new Quest will delete your current player decks, credits and win loss record." @@ -234,7 +335,7 @@ public class ViewQuest extends JScrollPane { + ""); lblNotes.setFont(skin.getFont1().deriveFont(Font.PLAIN, 14)); lblNotes.setForeground(skin.getColor("text")); - viewport.add(lblNotes, "w 90%, gapleft 5%"); + viewport.add(lblNotes, "w 90%, gapleft 5%, span 2"); radEasy = new OptionsRadio("Easy - 50 games"); radMedium = new OptionsRadio("Medium - 100 games"); @@ -283,7 +384,7 @@ public class ViewQuest extends JScrollPane { optionsContainer.add(btnEmbark, "w 40%!, h 30px!, gapleft 30%, gaptop 3%, span 3 1"); - viewport.add(optionsContainer, "w 100%!, gaptop 2%"); + viewport.add(optionsContainer, "w 100%!, gaptop 2%, span 2"); } //========= CUSTOM CLASSES @@ -293,7 +394,21 @@ public class ViewQuest extends JScrollPane { public OptionsRadio(String txt0) { super(); setText(txt0); + setForeground(skin.getColor("text")); + setBackground(skin.getColor("hover")); setOpaque(false); + + this.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + setOpaque(true); + } + + @Override + public void mouseExited(MouseEvent e) { + setOpaque(false); + } + }); } } @@ -302,7 +417,21 @@ public class ViewQuest extends JScrollPane { public OptionsCheckBox(String txt0) { super(); setText(txt0); + setForeground(skin.getColor("text")); + setBackground(skin.getColor("hover")); setOpaque(false); + + this.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + setOpaque(true); + } + + @Override + public void mouseExited(MouseEvent e) { + setOpaque(false); + } + }); } } @@ -316,8 +445,42 @@ public class ViewQuest extends JScrollPane { setBorder(new LineBorder(skin.getColor("borders"), 1)); setBackground(skin.getColor("inactive")); setLayout(new MigLayout("insets 0, gap 0")); - this.event = e0; + + final File base = ForgeProps.getFile(NewConstants.IMAGE_ICON); + File file = new File(base, event.getIcon()); + + if (!file.exists()) { + file = new File(base, "Unknown.jpg"); + } + + JLabel lblIcon = new JLabel(GuiUtils.getResizedIcon(new ImageIcon(file.toString()), 60, 60)); + lblIcon.setForeground(skin.getColor("text")); + this.add(lblIcon, "h 60px!, w 60px!, gap 5px 5px 5px 5px, span 1 2"); + + // Name + JLabel lblName = new JLabel(event.getTitle() + ": " + event.getDifficulty()); + lblName.setFont(skin.getFont1().deriveFont(Font.BOLD, 17)); + lblName.setForeground(skin.getColor("text")); + this.add(lblName, "h 20px!, gap 1% 1% 5px 5px, wrap"); + + // Description + JTextArea tarDesc = new JTextArea(); + tarDesc.setText(event.getDescription()); + tarDesc.setFont(skin.getFont1().deriveFont(Font.ITALIC, 12)); + tarDesc.setForeground(skin.getColor("text")); + tarDesc.setOpaque(false); + tarDesc.setWrapStyleWord(true); + tarDesc.setLineWrap(true); + tarDesc.setFocusable(false); + tarDesc.setEditable(false); + this.add(tarDesc, " h 35px!, w 75%!, gap 1% 0 0 5px"); + + this.setToolTipText("" + event.getTitle() + + ": " + event.getDifficulty() + + "
" + event.getDescription() + + ""); + this.addMouseListener(new MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { @@ -345,29 +508,7 @@ public class ViewQuest extends JScrollPane { } } }); - - final File base = ForgeProps.getFile(NewConstants.IMAGE_ICON); - File file = new File(base, event.getIcon()); - - if (!file.exists()) { - file = new File(base, "Unknown.jpg"); - } - - JLabel lblIcon = new JLabel(GuiUtils.getResizedIcon(new ImageIcon(file.toString()), 60, 60)); - lblIcon.setForeground(skin.getColor("text")); - this.add(lblIcon, "h 60px!, w 60px!, gap 5px 5px 5px 5px, span 1 2"); - - JLabel lblName = new JLabel(event.getTitle() + ": " + event.getDifficulty()); - lblName.setFont(skin.getFont1().deriveFont(Font.BOLD, 17)); - lblName.setForeground(skin.getColor("text")); - this.add(lblName, "h 20px!, gap 1% 1% 5px 5px, wrap"); - - MultiLineLabel lblDesc = new MultiLineLabel(event.getDescription()); - lblDesc.setFont(skin.getFont1().deriveFont(Font.PLAIN, 12)); - lblDesc.setForeground(skin.getColor("text")); - lblDesc.setUI(MultiLineLabelUI.getLabelUI()); - this.add(lblDesc, " h 35px!, w 80%!, gap 1% 0 0 5px"); - } + } /** @return QuestEvent */ public QuestEvent getEvent() { @@ -375,6 +516,38 @@ public class ViewQuest extends JScrollPane { } } + /** + *

+ * nextChallengeInWins. + *

+ * + * @return a int. + */ + private int nextChallengeInWins() { + final QuestData questData = AllZone.getQuestData(); + + // Number of wins was 25, lowereing the number to 20 to help short term + // questers. + if (questData.getWin() < 20) { + return 20 - questData.getWin(); + } + + // The int mul has been lowered by one, should face special opps more + // frequently. + final int challengesPlayed = questData.getChallengesPlayed(); + int mul = 5; + + if (questData.getInventory().hasItem("Zeppelin")) { + mul = 3; + } else if (questData.getInventory().hasItem("Map")) { + mul = 4; + } + + final int delta = (challengesPlayed * mul) - questData.getWin(); + + return (delta > 0) ? delta : 0; + } + //========= RETRIEVAL FUNCTIONS /** @return JList */ @@ -431,4 +604,19 @@ public class ViewQuest extends JScrollPane { public ControlQuest getController() { return control; } + + /** @return JComboBox */ + public JComboBox getPetComboBox() { + return cbxPet; + } + + /** @return JCheckBox */ + public JCheckBox getPlantCheckBox() { + return cbPlant; + } + + /** @return QuestData instance currently in use in this view */ + public QuestData getQuestData() { + return questData; + } }