diff --git a/.gitattributes b/.gitattributes index 73baa93e723..18617d159ed 100644 --- a/.gitattributes +++ b/.gitattributes @@ -16732,6 +16732,7 @@ forge-gui/src/main/java/forge/quest/QuestSpellShop.java -text forge-gui/src/main/java/forge/quest/QuestUtil.java svneol=native#text/plain forge-gui/src/main/java/forge/quest/QuestUtilCards.java -text forge-gui/src/main/java/forge/quest/QuestUtilUnlockSets.java -text +forge-gui/src/main/java/forge/quest/QuestWinLoseController.java -text forge-gui/src/main/java/forge/quest/QuestWorld.java -text forge-gui/src/main/java/forge/quest/SellRules.java -text forge-gui/src/main/java/forge/quest/StartingPoolPreferences.java -text diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLose.java index 3ac4e9da490..fd805b7b80a 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLose.java @@ -16,45 +16,24 @@ */ package forge.screens.match; -import forge.GuiBase; -import forge.LobbyPlayer; -import forge.Singletons; import forge.assets.FSkinProp; -import forge.card.CardEdition; -import forge.card.IUnOpenedProduct; -import forge.card.UnOpenedProduct; import forge.game.Game; -import forge.game.GameEndReason; -import forge.game.GameFormat; -import forge.game.GameOutcome; -import forge.game.player.*; -import forge.gui.GuiChoose; -import forge.gui.SOverlayUtils; -import forge.gui.framework.FScreen; import forge.item.*; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; import forge.quest.*; -import forge.quest.bazaar.QuestItemType; -import forge.quest.data.QuestPreferences; -import forge.quest.data.QuestPreferences.DifficultyPrefs; -import forge.quest.data.QuestPreferences.QPref; import forge.screens.home.quest.CSubmenuChallenges; import forge.screens.home.quest.CSubmenuDuels; import forge.toolbox.FSkin; +import forge.toolbox.FSkin.Colors; +import forge.toolbox.FSkin.SkinColor; import forge.toolbox.FSkin.SkinIcon; import forge.toolbox.FSkin.SkinnedLabel; -import forge.util.MyRandom; -import org.apache.commons.lang3.StringUtils; - -import javax.swing.*; - -import java.awt.*; -import java.util.ArrayList; -import java.util.Collections; +import java.awt.Dimension; import java.util.List; -import java.util.Map.Entry; + +import javax.swing.SwingConstants; /** *
@@ -66,22 +45,16 @@ import java.util.Map.Entry;
*
*/
public class QuestWinLose extends ControlWinLose {
- private final transient boolean wonMatch;
private final transient ViewWinLose view;
- private transient SkinIcon icoTemp;
- private transient TitleLabel lblTemp1;
- private transient SkinnedLabel lblTemp2;
- private final transient boolean isAnte;
+ private final QuestWinLoseController controller;
/** String constraint parameters for title blocks and cardviewer blocks. */
+ private static final SkinColor FORE_COLOR = FSkin.getColor(Colors.CLR_TEXT);
private static final String CONSTRAINTS_TITLE = "w 95%!, gap 0 0 20px 10px";
private static final String CONSTRAINTS_TEXT = "w 95%!, h 220px!, gap 0 0 0 20px";
private static final String CONSTRAINTS_CARDS = "w 95%!, h 330px!, gap 0 0 0 20px";
private static final String CONSTRAINTS_CARDS_LARGE = "w 95%!, h 600px!, gap 0 0 0 20px";
- private final transient QuestController qData;
- private final transient QuestEvent qEvent;
-
/**
* Instantiates a new quest win lose handler.
*
@@ -90,11 +63,43 @@ public class QuestWinLose extends ControlWinLose {
*/
public QuestWinLose(final ViewWinLose view0, Game lastGame) {
super(view0, lastGame);
- this.view = view0;
- qData = FModel.getQuest();
- qEvent = qData.getCurrentEvent();
- this.wonMatch = lastGame.getMatch().isWonBy(GuiBase.getInterface().getQuestPlayer());
- this.isAnte = FModel.getPreferences().getPrefBoolean(FPref.UI_ANTE);
+ view = view0;
+ controller = new QuestWinLoseController(lastGame) {
+ @Override
+ protected void showRewards(Runnable runnable) {
+ runnable.run(); //just run on GUI thread
+ }
+
+ @Override
+ protected void showCards(String title, List
* actionOnQuit.
@@ -239,649 +128,10 @@ public class QuestWinLose extends ControlWinLose {
*/
@Override
public final void actionOnQuit() {
- final int x = FModel.getQuestPreferences().getPrefInt(QPref.PENALTY_LOSS);
-
- // Record win/loss in quest data
- if (this.wonMatch) {
- qData.getAchievements().addWin();
- } else {
- qData.getAchievements().addLost();
- qData.getAssets().subtractCredits(x);
- }
-
- // Reset cards and zeppelin use
- if (qData.getAssets().hasItem(QuestItemType.ZEPPELIN)) {
- qData.getAssets().setItemLevel(QuestItemType.ZEPPELIN, 1);
- }
-
- if (qEvent instanceof QuestEventChallenge) {
- final String id = ((QuestEventChallenge) qEvent).getId();
- qData.getAchievements().getCurrentChallenges().remove(id);
- qData.getAchievements().addLockedChallenge(id);
-
- // Increment challenge counter to limit challenges available
- qData.getAchievements().addChallengesPlayed();
- }
-
+ controller.actionOnQuit();
CSubmenuDuels.SINGLETON_INSTANCE.update();
CSubmenuChallenges.SINGLETON_INSTANCE.update();
-
- qData.setCurrentEvent(null);
- qData.save();
- FModel.getQuestPreferences().save();
- Singletons.getControl().writeMatchPreferences();
-
- Singletons.getControl().endCurrentGame();
- Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN);
-
- SOverlayUtils.hideOverlay();
- }
-
- /**
- *
- * awardEventCredits.
- *
") + "";
+ }
+ SkinnedLabel lblMessage = new SkinnedLabel(message);
+ lblMessage.setFont(FSkin.getFont(14));
+ lblMessage.setForeground(FORE_COLOR);
+ lblMessage.setHorizontalAlignment(SwingConstants.CENTER);
+ lblMessage.setIconTextGap(50);
+ lblMessage.setIcon(icoTemp);
+
+ view.getPnlCustom().add(new TitleLabel(title), QuestWinLose.CONSTRAINTS_TITLE);
+ view.getPnlCustom().add(lblMessage, QuestWinLose.CONSTRAINTS_TEXT);
+ }
+ };
}
@@ -109,126 +114,10 @@ public class QuestWinLose extends ControlWinLose {
*/
@Override
public final boolean populateCustomPanel() {
- this.getView().getBtnRestart().setVisible(false);
- QuestController qc = FModel.getQuest();
-
- // After the first game, reset the card shop pool to be able to buy back anted cards
- if (lastGame.getMatch().getPlayedGames().size() == 1) {
- qc.getCards().clearShopList();
- qc.getCards().getShopList();
- }
-
- final LobbyPlayer questLobbyPlayer = GuiBase.getInterface().getQuestPlayer();
- Player questPlayer = null;
- for (Player p : lastGame.getRegisteredPlayers()) {
- if (p.getLobbyPlayer().equals(questLobbyPlayer)) {
- questPlayer = p;
- }
- }
- if (isAnte) {
- //do per-game actions
- GameOutcome outcome = lastGame.getOutcome();
-
- // Won/lost cards should already be calculated (even in a draw)
- GameOutcome.AnteResult anteResult = outcome.anteResult.get(questPlayer);
- if (anteResult != null) {
- if (anteResult.wonCards != null)
- qc.getCards().addAllCards(anteResult.wonCards);
- if (anteResult.lostCards != null)
- qc.getCards().loseCards(anteResult.lostCards);
- this.anteReport(anteResult.wonCards, anteResult.lostCards, questPlayer.equals(outcome.getWinningPlayer()));
- }
- }
-
- if (!lastGame.getMatch().isMatchOver()) {
- this.getView().getBtnQuit().setText("Quit (-15 Credits)");
- return isAnte;
- } else {
- this.getView().getBtnContinue().setVisible(false);
- if (this.wonMatch) {
- this.getView().getBtnQuit().setText("Great!");
- } else {
- this.getView().getBtnQuit().setText("OK");
- }
- }
-
- // TODO: We don't have a enum for difficulty?
- int difficulty = qData.getAchievements().getDifficulty();
-
-
- final int wins = qData.getAchievements().getWin();
- // Win case
- if (this.wonMatch) {
- // Standard event reward credits
- this.awardEventCredits();
-
- // Challenge reward credits
- if (qEvent instanceof QuestEventChallenge) {
- this.awardChallengeWin();
- }
-
- else {
- awardSpecialReward("Special bonus reward:"); // If any
- // Random rare for winning against a very hard deck
- if (qEvent.getDifficulty() == QuestEventDifficulty.EXPERT) {
- this.awardRandomRare("You've won a random rare for winning against a very hard deck.");
- }
- }
-
- this.awardWinStreakBonus();
-
- // Random rare given at 50% chance (65% with luck upgrade)
- if (this.getLuckyCoinResult()) {
- this.awardRandomRare("You've won a random rare.");
- }
-
- // Award jackpot every 80 games won (currently 10 rares)
-
- if ((wins > 0) && (((wins + 1) % 80) == 0)) {
- this.awardJackpot();
- }
-
- }
- // Lose case
- else {
- this.penalizeLoss();
- }
-
- // Grant booster on a win, or on a loss in easy mode
- if (this.wonMatch || difficulty == 0) {
- final int outcome = this.wonMatch ? wins : qData.getAchievements().getLost();
- int winsPerBooster = FModel.getQuestPreferences().getPrefInt(DifficultyPrefs.WINS_BOOSTER, qData.getAchievements().getDifficulty());
- if (winsPerBooster > 0 && (outcome + 1) % winsPerBooster == 0) {
- this.awardBooster();
- }
- }
-
+ controller.showRewards(view.getBtnContinue(), view.getBtnRestart(), view.getBtnQuit());
return true;
}
- private void anteReport(final List
");
-
- int creditsForPreviousWins = (int) ((Double.parseDouble(FModel.getQuestPreferences()
- .getPref(QPref.REWARDS_WINS_MULTIPLIER)) * qData.getAchievements().getWin()));
- credBase += creditsForPreviousWins;
-
- sb.append("Bonus for previous wins: ").append(creditsForPreviousWins).append(
- creditsForPreviousWins != 1 ? " credits.
" : " credit.
");
-
- // Gameplay bonuses (for each game win)
- boolean hasNeverLost = true;
- int lifeDifferenceCredits = 0;
-
- LobbyPlayer localHuman = GuiBase.getInterface().getQuestPlayer();
- for (final GameOutcome game : lastGame.getMatch().getPlayedGames()) {
- if (!game.isWinner(localHuman)) {
- hasNeverLost = false;
- continue; // no rewards for losing a game
- }
- // Alternate win
-
- // final PlayerStatistics aiRating = game.getStatistics(computer.getName());
- PlayerStatistics humanRating = null;
- for (Entry
",
- winConditionName, altReward));
- }
- }
- // Mulligan to zero
- final int cntCardsHumanStartedWith = humanRating.getOpeningHandSize();
- final int mulliganReward = FModel.getQuestPreferences().getPrefInt(QPref.REWARDS_MULLIGAN0);
-
- if (0 == cntCardsHumanStartedWith) {
- credGameplay += mulliganReward;
- sb.append(String.format("Mulliganed to zero and still won! Bonus: %d credits.
", mulliganReward));
- }
-
- // Early turn bonus
- final int winTurn = game.getLastTurnNumber();
- final int turnCredits = this.getCreditsRewardForWinByTurn(winTurn);
-
- if (winTurn == 0) {
- throw new UnsupportedOperationException("QuestWinLose > "
- + "turn calculation error: Zero turn win");
- } else if (winTurn == 1) {
- sb.append("Won in one turn!");
- } else if (winTurn <= 5) {
- sb.append("Won by turn 5!");
- } else if (winTurn <= 10) {
- sb.append("Won by turn 10!");
- } else if (winTurn <= 15) {
- sb.append("Won by turn 15!");
- }
-
- if (turnCredits > 0) {
- credGameplay += turnCredits;
- sb.append(String.format(" Bonus: %d credits.
", turnCredits));
- }
-
- if (game.getLifeDelta() >= 50) {
- lifeDifferenceCredits += Math.max(Math.min((game.getLifeDelta() - 46) / 4, 750), 0);
- }
-
- } // End for(game)
-
- if (lifeDifferenceCredits > 0) {
- sb.append(String.format("Life total difference: %d credits.
", lifeDifferenceCredits));
- }
-
- // Undefeated bonus
- if (hasNeverLost) {
- credUndefeated += FModel.getQuestPreferences().getPrefInt(QPref.REWARDS_UNDEFEATED);
- final int reward = FModel.getQuestPreferences().getPrefInt(QPref.REWARDS_UNDEFEATED);
- sb.append(String.format("You have not lost once! Bonus: %d credits.
", reward));
- }
-
- // Estates bonus
- credTotal = credBase + credGameplay + credUndefeated + lifeDifferenceCredits;
- double estateValue = 0;
- switch (qData.getAssets().getItemLevel(QuestItemType.ESTATES)) {
- case 1:
- estateValue = .1;
- break;
-
- case 2:
- estateValue = .15;
- break;
-
- case 3:
- estateValue = .2;
- break;
-
- default:
- break;
- }
- if (estateValue > 0) {
- credEstates = (int) (estateValue * credTotal);
- sb.append("Estates bonus: ").append((int) (100 * estateValue)).append("%.
");
- credTotal += credEstates;
- }
-
- // Final output
- String congrats = "";
- if (credTotal < 100) {
- congrats += "You've earned";
- } else if (credTotal < 250) {
- congrats += "Could be worse: ";
- } else if (credTotal < 500) {
- congrats += "A respectable";
- } else if (credTotal < 750) {
- congrats += "An impressive";
- } else {
- congrats += "Spectacular match!";
- }
-
- sb.append(String.format("%s %d credits in total.
", congrats, credTotal));
- sb.append("