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 f19cfd76c71..a172960b668 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,24 +16,10 @@ */ package forge.screens.match; -import java.awt.Dimension; -import java.util.List; - -import javax.swing.SwingConstants; - -import forge.assets.FSkinProp; import forge.game.GameView; -import forge.item.PaperCard; -import forge.model.FModel; -import forge.properties.ForgePreferences.FPref; import forge.quest.QuestWinLoseController; 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; /** *

@@ -45,16 +31,8 @@ import forge.toolbox.FSkin.SkinnedLabel; * */ public class QuestWinLose extends ControlWinLose { - private final transient ViewWinLose view; 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"; - /** * Instantiates a new quest win lose handler. * @@ -63,43 +41,7 @@ public class QuestWinLose extends ControlWinLose { */ public QuestWinLose(final ViewWinLose view0, final GameView game0) { super(view0, game0); - view = view0; - controller = new QuestWinLoseController(game0) { - @Override - protected void showRewards(Runnable runnable) { - runnable.run(); //just run on GUI thread - } - - @Override - protected void showCards(String title, List cards) { - final QuestWinLoseCardViewer cv = new QuestWinLoseCardViewer(cards); - view.getPnlCustom().add(new TitleLabel(title), QuestWinLose.CONSTRAINTS_TITLE); - if (FModel.getPreferences().getPrefBoolean(FPref.UI_LARGE_CARD_VIEWERS)) { - view.getPnlCustom().add(cv, QuestWinLose.CONSTRAINTS_CARDS_LARGE); - } - else { - view.getPnlCustom().add(cv, QuestWinLose.CONSTRAINTS_CARDS); - } - } - - @Override - protected void showMessage(String message, String title, FSkinProp icon) { - SkinIcon icoTemp = FSkin.getIcon(icon).scale(0.5); - - if (message.contains("\n")) { //ensure new line characters are encoded - message = "" + message.replace("\n", "
") + ""; - } - 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); - } - }; + controller = new QuestWinLoseController(game0, view0); } @@ -114,7 +56,7 @@ public class QuestWinLose extends ControlWinLose { */ @Override public final boolean populateCustomPanel() { - controller.showRewards(view); + controller.showRewards(); return true; } @@ -133,20 +75,4 @@ public class QuestWinLose extends ControlWinLose { CSubmenuChallenges.SINGLETON_INSTANCE.update(); super.actionOnQuit(); } - - /** - * JLabel header between reward sections. - * - */ - @SuppressWarnings("serial") - private class TitleLabel extends SkinnedLabel { - TitleLabel(final String msg) { - super(msg); - setFont(FSkin.getFont(16)); - setPreferredSize(new Dimension(200, 40)); - setHorizontalAlignment(SwingConstants.CENTER); - setForeground(FORE_COLOR); - setBorder(new FSkin.MatteSkinBorder(1, 0, 1, 0, FORE_COLOR)); - } - } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/ViewWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/ViewWinLose.java index ba26e92b729..32207631af5 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/ViewWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/ViewWinLose.java @@ -1,10 +1,12 @@ package forge.screens.match; import java.awt.Color; +import java.awt.Dimension; import java.awt.Font; import java.awt.Point; import java.awt.Toolkit; import java.awt.datatransfer.StringSelection; +import java.util.List; import javax.swing.JPanel; import javax.swing.SwingConstants; @@ -16,17 +18,23 @@ import org.apache.commons.lang3.StringUtils; import forge.LobbyPlayer; import forge.UiCommand; +import forge.assets.FSkinProp; import forge.game.GameLogEntry; import forge.game.GameLogEntryType; import forge.game.GameView; import forge.gui.SOverlayUtils; import forge.interfaces.IWinLoseView; +import forge.item.PaperCard; import forge.model.FModel; +import forge.properties.ForgePreferences.FPref; import forge.toolbox.FButton; import forge.toolbox.FLabel; import forge.toolbox.FOverlay; import forge.toolbox.FScrollPane; 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.toolbox.FSkin.SkinnedPanel; import forge.toolbox.FTextArea; @@ -39,6 +47,13 @@ public class ViewWinLose implements IWinLoseView { private final SkinnedLabel lblStats = new SkinnedLabel("WinLoseFrame > lblStats needs updating."); private final JPanel pnlOutcomes = new JPanel(new MigLayout("wrap, align center")); + /** 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 GameView game; @SuppressWarnings("serial") @@ -237,4 +252,55 @@ public class ViewWinLose implements IWinLoseView { public void hide() { SOverlayUtils.hideOverlay(); } + + @Override + public void showRewards(Runnable runnable) { + runnable.run(); //just run on GUI thread + } + + @Override + public void showCards(String title, List cards) { + final QuestWinLoseCardViewer cv = new QuestWinLoseCardViewer(cards); + getPnlCustom().add(new TitleLabel(title), CONSTRAINTS_TITLE); + if (FModel.getPreferences().getPrefBoolean(FPref.UI_LARGE_CARD_VIEWERS)) { + getPnlCustom().add(cv, CONSTRAINTS_CARDS_LARGE); + } + else { + getPnlCustom().add(cv, CONSTRAINTS_CARDS); + } + } + + @Override + public void showMessage(String message, String title, FSkinProp icon) { + SkinIcon icoTemp = FSkin.getIcon(icon).scale(0.5); + + if (message.contains("\n")) { //ensure new line characters are encoded + message = "" + message.replace("\n", "
") + ""; + } + SkinnedLabel lblMessage = new SkinnedLabel(message); + lblMessage.setFont(FSkin.getFont(14)); + lblMessage.setForeground(FORE_COLOR); + lblMessage.setHorizontalAlignment(SwingConstants.CENTER); + lblMessage.setIconTextGap(50); + lblMessage.setIcon(icoTemp); + + getPnlCustom().add(new TitleLabel(title), CONSTRAINTS_TITLE); + getPnlCustom().add(lblMessage, CONSTRAINTS_TEXT); + } + + /** + * JLabel header between reward sections. + * + */ + @SuppressWarnings("serial") + private class TitleLabel extends SkinnedLabel { + TitleLabel(final String msg) { + super(msg); + setFont(FSkin.getFont(16)); + setPreferredSize(new Dimension(200, 40)); + setHorizontalAlignment(SwingConstants.CENTER); + setForeground(FORE_COLOR); + setBorder(new FSkin.MatteSkinBorder(1, 0, 1, 0, FORE_COLOR)); + } + } } diff --git a/forge-gui-mobile/src/forge/screens/match/winlose/QuestWinLose.java b/forge-gui-mobile/src/forge/screens/match/winlose/QuestWinLose.java index 66351e39818..92c5c4448ab 100644 --- a/forge-gui-mobile/src/forge/screens/match/winlose/QuestWinLose.java +++ b/forge-gui-mobile/src/forge/screens/match/winlose/QuestWinLose.java @@ -16,15 +16,8 @@ */ package forge.screens.match.winlose; -import java.util.List; - -import forge.FThreads; -import forge.assets.FSkinProp; import forge.game.GameView; -import forge.item.PaperCard; import forge.quest.QuestWinLoseController; -import forge.util.gui.SGuiChoose; -import forge.util.gui.SOptionPane; /** *

@@ -46,28 +39,12 @@ public class QuestWinLose extends ControlWinLose { */ public QuestWinLose(final ViewWinLose view0, GameView lastGame) { super(view0, lastGame); - controller = new QuestWinLoseController(lastGame) { - @Override - protected void showRewards(Runnable runnable) { - //invoke reward logic in background thread so dialogs can be shown - FThreads.invokeInBackgroundThread(runnable); - } - - @Override - protected void showCards(String title, List cards) { - SGuiChoose.reveal(title, cards); - } - - @Override - protected void showMessage(String message, String title, FSkinProp icon) { - SOptionPane.showMessageDialog(message, title, icon); - } - }; + controller = new QuestWinLoseController(lastGame, view0); } @Override public final void showRewards() { - controller.showRewards(getView()); + controller.showRewards(); } /** diff --git a/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java b/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java index 0ec0254351b..db0d9ab481e 100644 --- a/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java +++ b/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java @@ -1,19 +1,24 @@ package forge.screens.match.winlose; +import java.util.List; + import org.apache.commons.lang3.StringUtils; import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; +import forge.FThreads; import forge.Forge; import forge.LobbyPlayer; import forge.assets.FSkinColor; +import forge.assets.FSkinProp; import forge.assets.FSkinColor.Colors; import forge.assets.FSkinFont; import forge.game.GameLogEntry; import forge.game.GameLogEntryType; import forge.game.GameView; import forge.interfaces.IWinLoseView; +import forge.item.PaperCard; import forge.menu.FMagnifyView; import forge.model.FModel; import forge.toolbox.FButton; @@ -25,6 +30,8 @@ import forge.toolbox.FLabel; import forge.toolbox.FOverlay; import forge.toolbox.FTextArea; import forge.util.Utils; +import forge.util.gui.SGuiChoose; +import forge.util.gui.SOptionPane; public class ViewWinLose extends FOverlay implements IWinLoseView { private static final float INSETS_FACTOR = 0.025f; @@ -208,4 +215,20 @@ public class ViewWinLose extends FOverlay implements IWinLoseView { } return super.keyDown(keyCode); } + + @Override + public void showRewards(Runnable runnable) { + //invoke reward logic in background thread so dialogs can be shown + FThreads.invokeInBackgroundThread(runnable); + } + + @Override + public void showCards(String title, List cards) { + SGuiChoose.reveal(title, cards); + } + + @Override + public void showMessage(String message, String title, FSkinProp icon) { + SOptionPane.showMessageDialog(message, title, icon); + } } diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/CommandCenterScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/CommandCenterScreen.java index ac8a48f0464..fd97de6853c 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/CommandCenterScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/CommandCenterScreen.java @@ -63,7 +63,7 @@ public class CommandCenterScreen extends FScreen implements IVCommandCenter { btnEndDay.setCommand(new FEventHandler() { @Override public void handleEvent(FEvent e) { - model.endDay(CommandCenterScreen.this); + FModel.getConquest().endDay(CommandCenterScreen.this); } }); } diff --git a/forge-gui/src/main/java/forge/interfaces/IWinLoseView.java b/forge-gui/src/main/java/forge/interfaces/IWinLoseView.java index 1284a075193..f77f7fd8ad0 100644 --- a/forge-gui/src/main/java/forge/interfaces/IWinLoseView.java +++ b/forge-gui/src/main/java/forge/interfaces/IWinLoseView.java @@ -1,8 +1,17 @@ package forge.interfaces; +import java.util.List; + +import forge.assets.FSkinProp; +import forge.item.PaperCard; + public interface IWinLoseView { T getBtnContinue(); T getBtnRestart(); T getBtnQuit(); void hide(); + + void showRewards(Runnable runnable); + void showCards(String title, List cards); + void showMessage(String message, String title, FSkinProp icon); } diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestController.java b/forge-gui/src/main/java/forge/planarconquest/ConquestController.java index 746cd7cc5e6..8772cec37f5 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestController.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestController.java @@ -17,11 +17,31 @@ */ package forge.planarconquest; +import java.util.ArrayList; +import java.util.List; + +import com.google.common.base.Predicate; import com.google.common.eventbus.Subscribe; +import forge.FThreads; +import forge.card.CardRarity; +import forge.card.CardRules; +import forge.card.CardRulesPredicates; import forge.deck.CardPool; import forge.deck.Deck; +import forge.game.GameView; import forge.game.event.GameEvent; +import forge.interfaces.IButton; +import forge.interfaces.IWinLoseView; +import forge.item.PaperCard; +import forge.model.FModel; +import forge.planarconquest.ConquestPlaneData.RegionData; +import forge.planarconquest.ConquestPreferences.CQPref; +import forge.player.GamePlayerUtil; +import forge.util.Aggregates; +import forge.util.Lang; +import forge.util.gui.SGuiChoose; +import forge.util.gui.SOptionPane; import forge.util.storage.IStorage; public class ConquestController { @@ -64,4 +84,299 @@ public class ConquestController { public void receiveGameEvent(GameEvent ev) { // Receives events only during planar conquest games } + + public void endDay(final IVCommandCenter commandCenter) { + FThreads.invokeInBackgroundThread(new Runnable() { + @Override + public void run() { + //prompt user if any commander hasn't taken an action + final List commanders = model.getCurrentPlaneData().getCommanders(); + for (ConquestCommander commander : commanders) { + if (commander.getCurrentDayAction() == null) { + if (!SOptionPane.showConfirmDialog(commander.getName() + " has not taken an action today. End day anyway?", "Action Not Taken", "End Day", "Cancel")) { + return; + } + } + } + //perform all commander actions + for (ConquestCommander commander : commanders) { + switch (commander.getCurrentDayAction()) { + case Attack1: + playGame(commander, 0, false); + break; + case Attack2: + playGame(commander, 1, false); + break; + case Attack3: + playGame(commander, 2, false); + break; + case Defend: + playGame(commander, Aggregates.randomInt(0, 2), true); //defend against random opponent + break; + case Recruit: + if (!recruit(commander)) { return; } + break; + case Study: + if (!study(commander)) { return; } + break; + case Undeploy: + model.getCurrentPlaneData().getRegionData(commander.getDeployedRegion()).setDeployedCommander(null); + break; + default: //remaining actions don't need to do anything more + break; + } + } + //increment day and reset actions, then update UI for new day + FThreads.invokeInEdtLater(new Runnable() { + @Override + public void run() { + model.incrementDay(); + for (ConquestCommander commander : commanders) { + commander.setCurrentDayAction(null); + } + commandCenter.updateCurrentDay(); + } + }); + } + }); + } + + private void playGame(ConquestCommander commander, int opponentIndex, boolean isHumanDefending) { + RegionData regionData = model.getCurrentPlaneData().getRegionData(commander.getDeployedRegion()); + ConquestCommander opponent = regionData.getOpponent(opponentIndex); + //TODO + } + + private boolean recruit(ConquestCommander commander) { + boolean bonusCard = Aggregates.randomInt(1, 100) <= FModel.getConquestPreferences().getPrefInt(CQPref.RECRUIT_BONUS_CARD_ODDS); + return awardNewCards(commander.getDeployedRegion().getCardPool().getAllCards(), + commander.getName() + " recruited", "new creature", null, null, + CardRulesPredicates.Presets.IS_CREATURE, bonusCard ? 2 : 1); + } + + private boolean study(ConquestCommander commander) { + boolean bonusCard = Aggregates.randomInt(1, 100) <= FModel.getConquestPreferences().getPrefInt(CQPref.STUDY_BONUS_CARD_ODDS); + return awardNewCards(commander.getDeployedRegion().getCardPool().getAllCards(), + commander.getName() + " unlocked", "new spell", null, null, + CardRulesPredicates.Presets.IS_NON_CREATURE_SPELL, bonusCard ? 2 : 1); + } + + public void showGameRewards(final GameView game, final IWinLoseView view) { + view.getBtnRestart().setVisible(false); + view.getBtnContinue().setVisible(false); + if (game.isMatchWonBy(GamePlayerUtil.getGuiPlayer())) { //TODO: Should this be smarter + view.getBtnQuit().setText("Great!"); + + //give controller a chance to run remaining logic on a separate thread + view.showRewards(new Runnable() { + @Override + public void run() { + awardWinStreakBonus(view); + awardBooster(view); + } + }); + } + else { + view.getBtnQuit().setText("OK"); + } + } + + public void onGameFinished(final GameView game) { + if (game.isMatchWonBy(GamePlayerUtil.getGuiPlayer())) { + model.addWin(); + } + else { + model.addLoss(); + } + + FModel.getConquest().save(); + FModel.getConquestPreferences().save(); + } + + private void awardWinStreakBonus(final IWinLoseView view) { + int currentStreak = model.getCurrentPlaneData().getWinStreakCurrent() + 1; + int mod = currentStreak % 10; + int count = (currentStreak - 1) / 10 + 1; //so on 13th win you get 2 commons, etc. + + CardRarity rarity = null; + String typeWon = ""; + + switch (mod) { + case 3: + rarity = CardRarity.Common; + count = 1; + typeWon = "common"; + break; + case 5: + rarity = CardRarity.Uncommon; + count = 1; + typeWon = "uncommon"; + break; + case 7: + rarity = CardRarity.Rare; + count = 1; + typeWon = "rare"; + break; + case 0: //0 is multiple of 10 win + rarity = CardRarity.MythicRare; + count = 1; + typeWon = "mythic rare"; + break; + default: + return; + } + + awardNewCards(model.getCurrentPlane().getCardPool().getAllCards(), currentStreak + " game win streak - unlocked", typeWon, rarity, view, null, count); + } + + private boolean awardNewCards(Iterable cardPool, String messagePrefix, String messageSuffix, CardRarity rarity, final IWinLoseView view, Predicate pred, int count) { + List commons = new ArrayList(); + List uncommons = new ArrayList(); + List rares = new ArrayList(); + List mythics = new ArrayList(); + int newCardCount = 0; + for (PaperCard c : cardPool) { + if ((pred == null || pred.apply(c.getRules())) && !model.getCollection().contains(c)) { + switch (c.getRarity()) { + case Common: + commons.add(c); + break; + case Uncommon: + uncommons.add(c); + break; + case Rare: + rares.add(c); + break; + case MythicRare: + mythics.add(c); + break; + default: + break; + } + } + } + + newCardCount = commons.size() + uncommons.size() + rares.size() + mythics.size(); + if (newCardCount == 0) { + return false; + } + + ConquestPreferences prefs = FModel.getConquestPreferences(); + int rareThreshold = prefs.getPrefInt(CQPref.BOOSTER_RARES); + int uncommonThreshold = rareThreshold + prefs.getPrefInt(CQPref.BOOSTER_UNCOMMONS); + int cardsPerPack = uncommonThreshold + prefs.getPrefInt(CQPref.BOOSTER_COMMONS); + + List rewardPool = null; + if (rarity != null) { + switch (rarity) { + case Common: + rewardPool = commons; + if (rewardPool.isEmpty()) { + rewardPool = uncommons; + messageSuffix = messageSuffix.replace("common", "uncommon"); + if (rewardPool.isEmpty()) { + rewardPool = rares; + messageSuffix = messageSuffix.replace("uncommon", "rare"); + if (rewardPool.isEmpty()) { + rewardPool = mythics; + messageSuffix = messageSuffix.replace("rare", "mythic rare"); + } + } + } + break; + case Uncommon: + rewardPool = uncommons; + if (rewardPool.isEmpty()) { + rewardPool = commons; + messageSuffix = messageSuffix.replace("uncommon", "common"); + if (rewardPool.isEmpty()) { + rewardPool = rares; + messageSuffix = messageSuffix.replace("common", "rare"); + if (rewardPool.isEmpty()) { + rewardPool = mythics; + messageSuffix = messageSuffix.replace("rare", "mythic rare"); + } + } + } + break; + case Rare: + rewardPool = rares; + if (rewardPool.isEmpty()) { + rewardPool = uncommons; + messageSuffix = messageSuffix.replace("rare", "uncommon"); + if (rewardPool.isEmpty()) { + rewardPool = commons; + messageSuffix = messageSuffix.replace("uncommon", "common"); + if (rewardPool.isEmpty()) { + rewardPool = mythics; + messageSuffix = messageSuffix.replace("common", "mythic rare"); + } + } + } + break; + case MythicRare: + rewardPool = mythics; + if (rewardPool.isEmpty()) { + rewardPool = rares; + messageSuffix = messageSuffix.replace("mythic rare", "rare"); + if (rewardPool.isEmpty()) { + rewardPool = uncommons; + messageSuffix = messageSuffix.replace("rare", "uncommon"); + if (rewardPool.isEmpty()) { + rewardPool = commons; + messageSuffix = messageSuffix.replace("uncommon", "common"); + } + } + } + break; + default: + return false; + } + newCardCount = rewardPool.size(); + } + List rewards = new ArrayList(); + for (int i = 0; i < count; i++) { + //determine which rarity card to get based on pack ratios if no rarity passed in + if (rarity == null) { + int value = Aggregates.randomInt(1, cardsPerPack); + if (value <= rareThreshold) { + if (mythics.size() > 0 && Aggregates.randomInt(1, 8) == 1) { + rewardPool = mythics; + } + else { + rewardPool = rares; + } + } + else if (value <= uncommonThreshold) { + rewardPool = uncommons; + } + else { + rewardPool = commons; + } + if (rewardPool.isEmpty()) { continue; } //if no cards in selected pool, determine random pool again + } + + int index = Aggregates.randomInt(0, rewardPool.size() - 1); + rewards.add(rewardPool.remove(index)); + + if (--newCardCount == 0) { + break; //break out if no new cards remain + } + } + + model.getCollection().add(rewards); + + String message = messagePrefix + " " + Lang.nounWithAmount(rewards.size(), messageSuffix); + if (view == null) { + SGuiChoose.reveal(message, rewards); + } + else { + view.showCards(message, rewards); + } + return true; + } + + private void awardBooster(final IWinLoseView view) { + //TODO + } } diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestData.java b/forge-gui/src/main/java/forge/planarconquest/ConquestData.java index df1ac26581c..ca85adeb7cf 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestData.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestData.java @@ -17,29 +17,14 @@ */ package forge.planarconquest; -import forge.FThreads; -import forge.card.CardRules; -import forge.card.CardRulesPredicates; import forge.deck.CardPool; import forge.deck.Deck; import forge.item.PaperCard; -import forge.model.FModel; import forge.planarconquest.ConquestPlane.Region; -import forge.planarconquest.ConquestPlaneData.RegionData; -import forge.planarconquest.ConquestPreferences.CQPref; import forge.properties.ForgeConstants; -import forge.util.Aggregates; -import forge.util.Lang; -import forge.util.gui.SGuiChoose; -import forge.util.gui.SOptionPane; - import java.io.File; -import java.util.ArrayList; import java.util.EnumMap; import java.util.HashMap; -import java.util.List; - -import com.google.common.base.Predicate; public final class ConquestData { /** Holds the latest version of the Conquest Data. */ @@ -93,154 +78,8 @@ public final class ConquestData { public int getDay() { return day; } - - public void endDay(final IVCommandCenter base) { - FThreads.invokeInBackgroundThread(new Runnable() { - @Override - public void run() { - //prompt user if any commander hasn't taken an action - final List commanders = getCurrentPlaneData().getCommanders(); - for (ConquestCommander commander : commanders) { - if (commander.getCurrentDayAction() == null) { - if (!SOptionPane.showConfirmDialog(commander.getName() + " has not taken an action today. End day anyway?", "Action Not Taken", "End Day", "Cancel")) { - return; - } - } - } - //perform all commander actions - for (ConquestCommander commander : commanders) { - switch (commander.getCurrentDayAction()) { - case Attack1: - playGame(commander, 0, false); - break; - case Attack2: - playGame(commander, 1, false); - break; - case Attack3: - playGame(commander, 2, false); - break; - case Defend: - playGame(commander, Aggregates.randomInt(0, 2), true); //defend against random opponent - break; - case Recruit: - if (!recruit(commander)) { return; } - break; - case Study: - if (!study(commander)) { return; } - break; - case Undeploy: - getCurrentPlaneData().getRegionData(commander.getDeployedRegion()).setDeployedCommander(null); - break; - default: //remaining actions don't need to do anything more - break; - } - } - //increment day and reset actions, then update UI for new day - FThreads.invokeInEdtLater(new Runnable() { - @Override - public void run() { - day++; - for (ConquestCommander commander : commanders) { - commander.setCurrentDayAction(null); - } - base.updateCurrentDay(); - } - }); - } - }); - } - - private void playGame(ConquestCommander commander, int opponentIndex, boolean isHumanDefending) { - RegionData regionData = getCurrentPlaneData().getRegionData(commander.getDeployedRegion()); - ConquestCommander opponent = regionData.getOpponent(opponentIndex); - //TODO - } - - private boolean recruit(ConquestCommander commander) { - boolean bonusCard = Aggregates.randomInt(1, 100) <= FModel.getConquestPreferences().getPrefInt(CQPref.RECRUIT_BONUS_CARD_ODDS); - return rewardNewCards(commander.getDeployedRegion().getCardPool().getAllCards(), - commander.getName() + " recruited", "new creature", - CardRulesPredicates.Presets.IS_CREATURE, bonusCard ? 2 : 1); - } - - private boolean study(ConquestCommander commander) { - boolean bonusCard = Aggregates.randomInt(1, 100) <= FModel.getConquestPreferences().getPrefInt(CQPref.STUDY_BONUS_CARD_ODDS); - return rewardNewCards(commander.getDeployedRegion().getCardPool().getAllCards(), - commander.getName() + " unlocked", "new spell", - CardRulesPredicates.Presets.IS_NON_CREATURE_SPELL, bonusCard ? 2 : 1); - } - - private boolean rewardNewCards(Iterable cardPool, String messagePrefix, String messageSuffix, Predicate pred, int count) { - List commons = new ArrayList(); - List uncommons = new ArrayList(); - List rares = new ArrayList(); - List mythics = new ArrayList(); - int newCardCount = 0; - for (PaperCard c : cardPool) { - if (pred.apply(c.getRules()) && !collection.contains(c)) { - switch (c.getRarity()) { - case Common: - commons.add(c); - break; - case Uncommon: - uncommons.add(c); - break; - case Rare: - rares.add(c); - break; - case MythicRare: - mythics.add(c); - break; - default: - break; - } - } - } - - newCardCount = commons.size() + uncommons.size() + rares.size() + mythics.size(); - if (newCardCount == 0) { - return false; - } - - ConquestPreferences prefs = FModel.getConquestPreferences(); - int rareThreshold = prefs.getPrefInt(CQPref.BOOSTER_RARES); - int uncommonThreshold = rareThreshold + prefs.getPrefInt(CQPref.BOOSTER_UNCOMMONS); - int cardsPerPack = uncommonThreshold + prefs.getPrefInt(CQPref.BOOSTER_COMMONS); - - List rewardPool; - List rewards = new ArrayList(); - for (int i = 0; i < count; i++) { - //determine which rarity card to get based on pack ratios - int value = Aggregates.randomInt(1, cardsPerPack); - if (value <= rareThreshold) { - if (mythics.size() > 0 && Aggregates.randomInt(1, 8) == 1) { - rewardPool = mythics; - } - else { - rewardPool = rares; - } - } - else if (value <= uncommonThreshold) { - rewardPool = uncommons; - } - else { - rewardPool = commons; - } - if (rewardPool.isEmpty()) { continue; } //if no cards in selected pool, determine random pool again - - int index = Aggregates.randomInt(0, rewardPool.size() - 1); - rewards.add(rewardPool.remove(index)); - - if (--newCardCount == 0) { - break; //break out if no new cards remain - } - } - - collection.add(rewards); - - String message = messagePrefix + " " + Lang.nounWithAmount(rewards.size(), messageSuffix); - SGuiChoose.reveal(message, rewards); - return true; + public void incrementDay() { + day++; } public ConquestPlane getStartingPlane() { diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestPlaneData.java b/forge-gui/src/main/java/forge/planarconquest/ConquestPlaneData.java index 384a64dcfa6..4b682031efe 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestPlaneData.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestPlaneData.java @@ -12,6 +12,8 @@ public class ConquestPlaneData { private final Map regionDataLookup = new HashMap(); private int wins, losses; + private int winStreakBest = 0; + private int winStreakCurrent = 0; public List getCommanders() { return commanders; @@ -19,6 +21,10 @@ public class ConquestPlaneData { public void addWin() { wins++; + winStreakCurrent++; + if (winStreakCurrent > winStreakBest) { + winStreakBest = winStreakCurrent; + } } public void addLoss() { @@ -33,6 +39,14 @@ public class ConquestPlaneData { return losses; } + public int getWinStreakBest() { + return winStreakBest; + } + + public int getWinStreakCurrent() { + return winStreakCurrent; + } + public RegionData getRegionData(Region region) { RegionData regionData = regionDataLookup.get(region); if (regionData == null) { diff --git a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java index 29913ad1e52..9481d12e483 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java +++ b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java @@ -34,22 +34,24 @@ import java.util.Comparator; import java.util.List; import java.util.Map.Entry; -public abstract class QuestWinLoseController { +public class QuestWinLoseController { private final GameView lastGame; + private final IWinLoseView view; private final transient boolean wonMatch; private final transient boolean isAnte; private final transient QuestController qData; private final transient QuestEvent qEvent; - public QuestWinLoseController(final GameView game0) { + public QuestWinLoseController(final GameView game0, final IWinLoseView view0) { lastGame = game0; + view = view0; qData = FModel.getQuest(); qEvent = qData.getCurrentEvent(); wonMatch = lastGame.isMatchWonBy(GamePlayerUtil.getQuestPlayer()); isAnte = FModel.getPreferences().getPrefBoolean(FPref.UI_ANTE); } - public void showRewards(final IWinLoseView view) { + public void showRewards() { view.getBtnRestart().setVisible(false); final QuestController qc = FModel.getQuest(); @@ -83,7 +85,7 @@ public abstract class QuestWinLoseController { } //give controller a chance to run remaining logic on a separate thread - showRewards(new Runnable() { + view.showRewards(new Runnable() { @Override public void run() { if (isAnte) { @@ -158,10 +160,10 @@ public abstract class QuestWinLoseController { private void anteReport(final List cardsWon, List cardsLost, boolean hasWon) { // Generate Swing components and attach. if (cardsWon != null && !cardsWon.isEmpty()) { - showCards("Spoils! Cards won from ante.", cardsWon); + view.showCards("Spoils! Cards won from ante.", cardsWon); } if (cardsLost != null && !cardsLost.isEmpty()) { - showCards("Looted! Cards lost to ante.", cardsLost); + view.showCards("Looted! Cards lost to ante.", cardsLost); } } @@ -375,7 +377,7 @@ public abstract class QuestWinLoseController { sb.append(String.format("%s %d credits in total.", congrats, credTotal)); qData.getAssets().addCredits(credTotal); - showMessage(sb.toString(), "Gameplay Results", FSkinProp.ICO_QUEST_GOLD); + view.showMessage(sb.toString(), "Gameplay Results", FSkinProp.ICO_QUEST_GOLD); } /** @@ -390,7 +392,7 @@ public abstract class QuestWinLoseController { final List cardsWon = new ArrayList(); cardsWon.add(c); - showCards(message, cardsWon); + view.showCards(message, cardsWon); } /** @@ -458,12 +460,12 @@ public abstract class QuestWinLoseController { } if (addDraftToken) { - showMessage("For achieving a 25 win streak, you have been awarded a draft token!\nUse these tokens to generate new tournaments.", "Bonus Draft Token Reward", FSkinProp.ICO_QUEST_COIN); + view.showMessage("For achieving a 25 win streak, you have been awarded a draft token!\nUse these tokens to generate new tournaments.", "Bonus Draft Token Reward", FSkinProp.ICO_QUEST_COIN); qData.getAchievements().addDraftToken(); } if (cardsWon.size() > 0) { - showCards("You have achieved a " + (currentStreak == 0 ? "50" : currentStreak) + " win streak and won " + cardsWon.size() + " " + typeWon + " card" + ((cardsWon.size() != 1) ? "s" : "") + "!", cardsWon); + view.showCards("You have achieved a " + (currentStreak == 0 ? "50" : currentStreak) + " win streak and won " + cardsWon.size() + " " + typeWon + " card" + ((cardsWon.size() != 1) ? "s" : "") + "!", cardsWon); } } @@ -476,7 +478,7 @@ public abstract class QuestWinLoseController { */ private void awardJackpot() { final List cardsWon = qData.getCards().addRandomRare(10); - showCards("You just won 10 random rares!", cardsWon); + view.showCards("You just won 10 random rares!", cardsWon); } /** @@ -569,7 +571,7 @@ public abstract class QuestWinLoseController { return c2.getRarity().compareTo(c1.getRarity()); } }); - showCards(title, cardsWon); + view.showCards(title, cardsWon); } } @@ -589,7 +591,7 @@ public abstract class QuestWinLoseController { qData.getAssets().addCredits(questRewardCredits); - showMessage(sb.toString(), "Challenge Rewards for \"" + ((QuestEventChallenge) qEvent).getTitle() + "\"", FSkinProp.ICO_QUEST_BOX); + view.showMessage(sb.toString(), "Challenge Rewards for \"" + ((QuestEventChallenge) qEvent).getTitle() + "\"", FSkinProp.ICO_QUEST_BOX); awardSpecialReward(null); } @@ -627,7 +629,7 @@ public abstract class QuestWinLoseController { } if (!boosterCards.isEmpty()) { qData.getCards().addAllCards(boosterCards); - showCards("Extra " + ii.getName() + "!", boosterCards); + view.showCards("Extra " + ii.getName() + "!", boosterCards); } } else if (ii instanceof IQuestRewardCard) { @@ -642,14 +644,14 @@ public abstract class QuestWinLoseController { if (message == null) { message = "Cards Won"; } - showCards(message, cardsWon); + view.showCards(message, cardsWon); qData.getCards().addAllCards(cardsWon); } } private void penalizeLoss() { final int x = FModel.getQuestPreferences().getPrefInt(QPref.PENALTY_LOSS); - showMessage("You lose! You have lost " + x + " credits.", "Gameplay Results", FSkinProp.ICO_QUEST_HEART); + view.showMessage("You lose! You have lost " + x + " credits.", "Gameplay Results", FSkinProp.ICO_QUEST_HEART); } /** @@ -725,8 +727,4 @@ public abstract class QuestWinLoseController { return credits; } - - protected abstract void showRewards(Runnable runnable); - protected abstract void showCards(String title, List cards); - protected abstract void showMessage(String message, String title, FSkinProp icon); }