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 extends IButton> 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 extends IButton> 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 extends IButton> 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 extends IButton> 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 extends IButton> 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 extends IButton> 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 extends IButton> 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);
}