diff --git a/.gitattributes b/.gitattributes index bb3e3887384..b1b0cbb5f5e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -10240,6 +10240,8 @@ src/main/java/forge/quest/gui/QuestAbstractPanel.java svneol=native#text/plain src/main/java/forge/quest/gui/QuestFrame.java svneol=native#text/plain src/main/java/forge/quest/gui/QuestMainPanel.java -text src/main/java/forge/quest/gui/QuestOptions.java svneol=native#text/plain +src/main/java/forge/quest/gui/QuestWinLoseCardViewer.java -text +src/main/java/forge/quest/gui/QuestWinLoseHandler.java -text src/main/java/forge/quest/gui/bazaar/QuestBazaarItem.java svneol=native#text/plain src/main/java/forge/quest/gui/bazaar/QuestBazaarPanel.java svneol=native#text/plain src/main/java/forge/quest/gui/bazaar/QuestBazaarStall.java svneol=native#text/plain @@ -10263,6 +10265,8 @@ src/main/java/forge/view/swing/OldGuiNewGame.java svneol=native#text/plain src/main/java/forge/view/swing/SplashFrame.java -text src/main/java/forge/view/swing/SplashProgressComponent.java -text src/main/java/forge/view/swing/SplashProgressModel.java -text +src/main/java/forge/view/swing/WinLoseFrame.java -text +src/main/java/forge/view/swing/WinLoseModeHandler.java -text src/main/java/forge/view/swing/package-info.java svneol=native#text/plain src/main/java/net/slightlymagic/braids/LICENSE.txt svneol=native#text/plain src/main/java/net/slightlymagic/braids/util/ClumsyRunnable.java svneol=native#text/plain diff --git a/src/main/java/forge/GameAction.java b/src/main/java/forge/GameAction.java index 6e8b6e46dd3..d977ef81ba3 100644 --- a/src/main/java/forge/GameAction.java +++ b/src/main/java/forge/GameAction.java @@ -29,8 +29,10 @@ import forge.gui.input.Input_PayManaCost_Ability; import forge.item.CardPrinted; import forge.properties.ForgeProps; import forge.properties.NewConstants.LANG.GameAction.GAMEACTION_TEXT; +import forge.quest.gui.QuestWinLoseHandler; import forge.quest.gui.main.QuestChallenge; import forge.quest.gui.main.QuestEvent; +import forge.view.swing.WinLoseFrame; import java.util.ArrayList; import java.util.Arrays; @@ -655,13 +657,27 @@ public class GameAction { AllZone.getDisplay().savePrefs(); frame.setEnabled(false); //frame.dispose(); - Gui_WinLose gwl = new Gui_WinLose(AllZone.getMatchState(), AllZone.getQuestData(), AllZone.getQuestEvent()); + + //Gui_WinLose gwl = new Gui_WinLose(AllZone.getMatchState(), AllZone.getQuestData(), AllZone.getQuestChallenge()); + + // New WinLoseFrame below. Old Gui_WinLose above. + // Old code should still work if any problems with new. Doublestrike 02-10-11 + WinLoseFrame gwl; + + if(AllZone.getQuestData() != null) { + gwl = new WinLoseFrame(new QuestWinLoseHandler()); + } + else { + gwl = new WinLoseFrame(); + } + //gwl.setAlwaysOnTop(true); gwl.toFront(); canShowWinLose = false; return; } + //do this twice, sometimes creatures/permanents will survive when they shouldn't for (int q = 0; q < 9; q++) { diff --git a/src/main/java/forge/gui/GuiUtils.java b/src/main/java/forge/gui/GuiUtils.java index f4abc159e84..eb8cccc3d41 100644 --- a/src/main/java/forge/gui/GuiUtils.java +++ b/src/main/java/forge/gui/GuiUtils.java @@ -113,18 +113,48 @@ public final class GuiUtils { /** *
getIconFromFile.
* - * @param iconName a {@link java.lang.String} object. + * @param filename a {@link java.lang.String} object. * @return a {@link javax.swing.ImageIcon} object. */ - public static ImageIcon getIconFromFile(final String iconName) { + public static ImageIcon getIconFromFile(final String filename) { File base = ForgeProps.getFile(NewConstants.IMAGE_ICON); - File file = new File(base, iconName); - if (iconName.equals("") || !file.exists()) { + File file = new File(base, filename); + if (filename.equals("") || !file.exists()) { return null; } else { return new ImageIcon(file.toString()); } } + + /** + *getResizedIcon.
+ * + * @param {@link java.lang.String} filename. + * @param {@link java.lang.Double} scale + * @return {@link javax.swing.ImageIcon} object + */ + public static ImageIcon getResizedIcon(final String filename, double scale) { + ImageIcon icon = getIconFromFile(filename); + + int w = (int) (icon.getIconWidth()*scale); + int h = (int) (icon.getIconHeight()*scale); + + return new ImageIcon(icon.getImage().getScaledInstance(w, h, Image.SCALE_SMOOTH)); + } + + /** + *getResizedIcon.
+ * + * @param {@link javax.swing.ImageIcon} object + * @param {@link java.lang.Double} scale + * @return {@link javax.swing.ImageIcon} object + */ + public static ImageIcon getResizedIcon(final ImageIcon icon, double scale) { + int w = (int) (icon.getIconWidth()*scale); + int h = (int) (icon.getIconHeight()*scale); + + return new ImageIcon(icon.getImage().getScaledInstance(w, h, Image.SCALE_SMOOTH)); + } /** *getResizedIcon.
diff --git a/src/main/java/forge/properties/NewConstants.java b/src/main/java/forge/properties/NewConstants.java index 3169ce54322..b13e951d78e 100644 --- a/src/main/java/forge/properties/NewConstants.java +++ b/src/main/java/forge/properties/NewConstants.java @@ -461,6 +461,20 @@ public interface NewConstants { } } + public static interface WinLoseFrame { + public static interface WINLOSETEXT { + String WON = "%s/WinLose/won"; + String LOST = "%s/WinLose/lost"; + String WIN = "%s/WinLose/win"; + String LOSE = "%s/WinLose/lose"; + String CONTINUE = "%s/WinLose/continue"; + String RESTART = "%s/WinLose/restart"; + String QUIT = "%s/WinLose/quit"; + } + } + // end + + // Doublestrike 02-10-11 - this is soon to be deprecated. public static interface Gui_WinLose { public static interface WINLOSE_TEXT { String WON = "%s/WinLose/won"; diff --git a/src/main/java/forge/quest/gui/QuestWinLoseCardViewer.java b/src/main/java/forge/quest/gui/QuestWinLoseCardViewer.java new file mode 100644 index 00000000000..30c44a49301 --- /dev/null +++ b/src/main/java/forge/quest/gui/QuestWinLoseCardViewer.java @@ -0,0 +1,86 @@ +package forge.quest.gui; + + +import javax.swing.*; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + +import forge.AllZone; +import forge.Card; +import forge.CardUtil; +import forge.gui.game.CardDetailPanel; +import forge.gui.game.CardPicturePanel; +import forge.item.CardPrinted; + +import java.util.List; + +import static java.util.Collections.unmodifiableList; + +/** + * A simple JPanel that shows three columns: card list, pic, and description.. + * + * @author Forge + * @version $Id: ListChooser.java 9708 2011-08-09 19:34:12Z jendave $ + */ +@SuppressWarnings("serial") +public class QuestWinLoseCardViewer extends JPanel { + + //Data and number of choices for the list + private ListQuestWinLoseHandler.
+ * Processes win/lose presentation for Quest events. This presentation + * is displayed by WinLoseFrame. Components to be added to pnlCustom in + * WinLoseFrame should use MigLayout. + * + */ +public class QuestWinLoseHandler extends WinLoseModeHandler { + private boolean wonMatch; + private ImageIcon icoTemp; + private JLabel lblTemp1; + private JLabel lblTemp2; + int spacer = 50; + + private class CommonObjects { + public QuestMatchState qMatchState; + public QuestData qData; + public QuestEvent qEvent; + } + + private CommonObjects model; + + public QuestWinLoseHandler() { + super(); + model = new CommonObjects(); + model.qMatchState = AllZone.getMatchState(); + model.qData = AllZone.getQuestData(); + model.qEvent = AllZone.getQuestEvent(); + wonMatch = model.qMatchState.isMatchWonBy(AllZone.getHumanPlayer().getName()); + } + + /** + *startNextRound.
+ * Either continues or restarts a current game. + * + * @param e a {@link java.awt.event.ActionEvent} object. + */ + @Override + public void startNextRound() { + + if(model.qEvent.getEventType().equals("challenge")) { + int extraLife = 0; + + if (model.qData.getInventory().hasItem("Zeppelin")) { + extraLife += 3; + } + + // Found this commented out - is it still necessary? Doublestrike 01-10-11 + //AllZone.getGameAction().newGame(Constant.Runtime.HumanDeck[0], Constant.Runtime.ComputerDeck[0], + //humanList, computerList, humanLife, computerLife); + + CardList humanList = forge.quest.data.QuestUtil.getHumanStartingCards(model.qData,model.qEvent); + CardList computerList = forge.quest.data.QuestUtil.getComputerStartingCards(model.qData,model.qEvent); + int humanLife = model.qData.getLife() + extraLife; + int computerLife = 20; + + computerLife = ((QuestChallenge)model.qEvent).getAILife(); + + AllZone.getGameAction().newGame(Constant.Runtime.HumanDeck[0], Constant.Runtime.ComputerDeck[0], + humanList, computerList, humanLife, computerLife, model.qEvent); + } + + super.startNextRound(); + } + + /** + *populateCustomPanel.
+ * Checks conditions of win and fires various reward display methods accordingly. + * + * @param boolean indicating if custom panel has contents. + */ + @Override + public boolean populateCustomPanel() { + view.btnRestart.setVisible(false); + + if(!model.qMatchState.isMatchOver()) { + view.btnQuit.setText("Surrender (15 Credits)"); + return false; + } + + // Win case + if(wonMatch) { + // Standard event reward credits + awardEventCredits(); + + // Challenge reward credits + if(model.qEvent.getEventType().equals("challenge")) { + awardChallengeWin(); + } + + // Random rare given at 50% chance (65% with luck upgrade) + if (getLuckyCoinResult()) { + awardRandomRare("You've won a random rare."); + } + + // Random rare for winning against a very hard deck + if(model.qData.getDifficultyIndex() == 4) { + awardRandomRare("You've won a random rare for winning against a very hard deck."); + } + + // Award jackpot every 80 games won (currently 10 rares) + int wins = model.qData.getWin(); + if (wins > 0 && wins % 80 == 0) { + awardJackpot(); + } + } + // Lose case + else { + penalizeLoss(); + } + + // Win or lose, still a chance to win a booster, frequency set in preferences + int cntOutcomes = wonMatch ? model.qData.getWin() : model.qData.getLost(); + if (cntOutcomes % QuestPreferences.getWinsForBooster(model.qData.getDifficultyIndex()) == 0) { + awardBooster(); + } + + return true; + } + + /** + *actionOnQuit.
+ * When "quit" button is pressed, this method adjusts quest data as appropriate and saves. + * + */ + @Override + public void actionOnQuit() { + // Record win/loss in quest data + if (model.qMatchState.isMatchWonBy(AllZone.getHumanPlayer().getName())) { + model.qData.addWin(); + } else { + model.qData.addLost(); + model.qData.subtractCredits(15); + } + + //System.out.println("model.qData cardpoolsize:" + AllZone.getQuestData().getCardpool().size()); + model.qData.getCards().clearShopList(); + + if (model.qData.getAvailableChallenges() != null) { + model.qData.clearAvailableChallenges(); + } + + model.qData.getCards().resetNewList(); + + model.qMatchState.reset(); + AllZone.setQuestEvent(null); + + model.qData.saveData(); + + new QuestFrame(); + } + + /** + *awardEventCredits.
+ * Generates and displays standard rewards for gameplay and skill level. + * + */ + private void awardEventCredits() { + // TODO use q.qdPrefs to write bonus credits in prefs file + StringBuilder sb = new StringBuilder(""); + + int credTotal = 0; + int credBase = 0; + int credGameplay = 0; + int credUndefeated = 0; + int credEstates = 0; + + // Basic win bonus + int base = QuestPreferences.getMatchRewardBase(); + double multiplier = 1; + + String diff = AllZone.getQuestEvent().getDifficulty(); + diff = diff.substring(0, 1).toUpperCase() + diff.substring(1); + + if(diff.equalsIgnoreCase("medium")) { + multiplier = 1.5; + } + else if(diff.equalsIgnoreCase("hard")) { + multiplier = 2; + } + else if(diff.equalsIgnoreCase("very hard")) { + multiplier = 2.5; + } + else if(diff.equalsIgnoreCase("expert")) { + multiplier = 3; + } + + credBase += (int) (base*multiplier + + (QuestPreferences.getMatchRewardTotalWins() * model.qData.getWin())); + + sb.append(diff + " opponent: " + credBase + " credits.