From 5e476727c66e647a46c014042911d434197f7d29 Mon Sep 17 00:00:00 2001 From: drdev Date: Tue, 12 Jan 2016 01:34:22 +0000 Subject: [PATCH] Implement Chaos battles --- .../match/winlose/ConquestWinLose.java | 2 +- .../planarconquest/ConquestEventScreen.java | 2 +- .../ConquestMultiverseScreen.java | 14 +++++++--- .../planarconquest/ConquestController.java | 25 ++++++------------ .../forge/planarconquest/ConquestData.java | 12 +++++++++ .../forge/planarconquest/ConquestEvent.java | 26 +++++++++++++++++++ .../planarconquest/ConquestPreferences.java | 6 ++++- .../forge/quest/QuestEventDuelManager.java | 7 +++-- 8 files changed, 68 insertions(+), 26 deletions(-) diff --git a/forge-gui-mobile/src/forge/screens/match/winlose/ConquestWinLose.java b/forge-gui-mobile/src/forge/screens/match/winlose/ConquestWinLose.java index 14b70b0c3e3..e934bd2568b 100644 --- a/forge-gui-mobile/src/forge/screens/match/winlose/ConquestWinLose.java +++ b/forge-gui-mobile/src/forge/screens/match/winlose/ConquestWinLose.java @@ -33,7 +33,7 @@ public class ConquestWinLose extends ControlWinLose { @Override public final void actionOnQuit() { - FModel.getConquest().finishEvent(); + FModel.getConquest().finishEvent(getView()); super.actionOnQuit(); } } diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestEventScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestEventScreen.java index d2dd6f27427..1270d11fa0c 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestEventScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestEventScreen.java @@ -43,7 +43,7 @@ public class ConquestEventScreen extends LaunchScreen { LoadingOverlay.show("Starting battle...", new Runnable() { @Override public void run() { - FModel.getConquest().launchEvent(FModel.getConquest().getModel().getSelectedCommander(), event); + FModel.getConquest().launchEvent(event); } }); } diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestMultiverseScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestMultiverseScreen.java index e090a938d7e..3085beab84f 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestMultiverseScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestMultiverseScreen.java @@ -20,6 +20,7 @@ import forge.model.FModel; import forge.planarconquest.ConquestData; import forge.planarconquest.ConquestEvent.ChaosWheelOutcome; import forge.planarconquest.ConquestEvent.ConquestEventRecord; +import forge.planarconquest.ConquestChaosBattle; import forge.planarconquest.ConquestEvent; import forge.planarconquest.ConquestLocation; import forge.planarconquest.ConquestPlane; @@ -27,6 +28,7 @@ import forge.planarconquest.ConquestPlane.Region; import forge.planarconquest.ConquestPreferences.CQPref; import forge.planarconquest.ConquestPlaneData; import forge.screens.FScreen; +import forge.screens.LoadingOverlay; import forge.toolbox.FDisplayObject; import forge.toolbox.FOptionPane; import forge.toolbox.FScrollPane; @@ -106,7 +108,7 @@ public class ConquestMultiverseScreen extends FScreen { awardPlaneswalkCharge(); break; case CHAOS: - triggerChaosTravel(); + launchChaosBattle(); break; } } @@ -170,9 +172,13 @@ public class ConquestMultiverseScreen extends FScreen { FOptionPane.showMessageDialog(null, "Received Planeswalk Charge"); } - private void triggerChaosTravel() { - //TODO - FOptionPane.showMessageDialog(null, "Chaos Travel"); + private void launchChaosBattle() { + LoadingOverlay.show("Chaos approaching...", new Runnable() { + @Override + public void run() { + FModel.getConquest().launchEvent(new ConquestChaosBattle()); + } + }); } private class PlaneGrid extends FScrollPane { diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestController.java b/forge-gui/src/main/java/forge/planarconquest/ConquestController.java index b6131489246..c84c16fdba2 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestController.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestController.java @@ -81,13 +81,14 @@ public class ConquestController { return decks; } - public void launchEvent(ConquestCommander commander, ConquestEvent event) { + public void launchEvent(ConquestEvent event) { if (activeEvent != null) { return; } //determine game variants Set variants = new HashSet(); event.addVariants(variants); + final ConquestCommander commander = model.getSelectedCommander(); final RegisteredPlayer humanStart = new RegisteredPlayer(commander.getDeck()); final RegisteredPlayer aiStart = new RegisteredPlayer(event.getOpponentDeck()); @@ -122,7 +123,7 @@ public class ConquestController { rp.setRandomFoil(useRandomFoil); } final GameRules rules = new GameRules(GameType.PlanarConquest); - rules.setGamesPerMatch(1); //only play one game at a time + rules.setGamesPerMatch(event.gamesPerMatch()); rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); rules.setCanCloneUseTargetsImage(FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE)); final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch(); @@ -170,23 +171,13 @@ public class ConquestController { } public void showGameOutcome(final GameView game, final IWinLoseView view) { - if (game.isMatchWonBy(humanPlayer)) { - view.getBtnRestart().setVisible(false); - view.getBtnQuit().setText("Great!"); - model.addWin(activeEvent); - } - else { - view.getBtnRestart().setVisible(true); - view.getBtnRestart().setText("Retry"); - view.getBtnQuit().setText("Quit"); - model.addLoss(activeEvent); - } - - model.saveData(); - FModel.getConquestPreferences().save(); + activeEvent.showGameOutcome(model, game, humanPlayer, view); } - public void finishEvent() { + public void finishEvent(final IWinLoseView view) { + if (activeEvent == null) { return; } + + activeEvent.onFinished(model, view); activeEvent = null; } diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestData.java b/forge-gui/src/main/java/forge/planarconquest/ConquestData.java index ab5c0ccf938..3f64adb9626 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestData.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestData.java @@ -57,6 +57,7 @@ public final class ConquestData { private final File directory; private final String xmlFilename; + private final ConquestRecord chaosBattleRecord; private final EnumMap planeDataMap = new EnumMap(ConquestPlane.class); private final HashSet unlockedCards = new HashSet(); private final List commanders = new ArrayList(); @@ -81,6 +82,7 @@ public final class ConquestData { unlockCard(card); } } + chaosBattleRecord = new ConquestRecord(); } public ConquestData(File directory0) { @@ -88,6 +90,7 @@ public final class ConquestData { directory = directory0; xmlFilename = directory.getPath() + ForgeConstants.PATH_SEPARATOR + XML_FILE; + ConquestRecord chaosBattleRecord0 = null; try { XmlReader xml = new XmlReader(xmlFilename); CardDb cardDb = FModel.getMagicDb().getCommonCards(); @@ -95,6 +98,7 @@ public final class ConquestData { aetherShards = xml.read("aetherShards", aetherShards); currentLocation = xml.read("currentLocation", ConquestLocation.class); selectedCommanderIndex = xml.read("selectedCommanderIndex", selectedCommanderIndex); + chaosBattleRecord0 = xml.read("chaosBattleRecord", ConquestRecord.class); xml.read("unlockedCards", unlockedCards, cardDb); xml.read("newCards", newCards, cardDb); xml.read("commanders", commanders, ConquestCommander.class); @@ -103,6 +107,10 @@ public final class ConquestData { catch (Exception e) { e.printStackTrace(); } + if (chaosBattleRecord0 == null) { + chaosBattleRecord0 = new ConquestRecord(); + } + chaosBattleRecord = chaosBattleRecord0; } public String getName() { @@ -224,6 +232,10 @@ public final class ConquestData { return Math.round(100f * (float)conquered / (float)total) + "%"; } + public ConquestRecord getChaosBattleRecord() { + return chaosBattleRecord; + } + public void saveData() { FileUtil.ensureDirectoryExists(directory); diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestEvent.java b/forge-gui/src/main/java/forge/planarconquest/ConquestEvent.java index 89106d3b3ea..dda48be74b1 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestEvent.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestEvent.java @@ -2,8 +2,12 @@ package forge.planarconquest; import java.util.Set; +import forge.LobbyPlayer; import forge.deck.Deck; import forge.game.GameType; +import forge.game.GameView; +import forge.interfaces.IButton; +import forge.interfaces.IWinLoseView; import forge.util.XmlReader; import forge.util.XmlWriter; import forge.util.XmlWriter.IXmlWritable; @@ -41,6 +45,28 @@ public abstract class ConquestEvent { conquered = conquered0; } + public int gamesPerMatch() { + return 1; //events are one game by default + } + + public void showGameOutcome(final ConquestData model, final GameView game, final LobbyPlayer humanPlayer, final IWinLoseView view) { + if (game.isMatchWonBy(humanPlayer)) { + view.getBtnRestart().setVisible(false); + view.getBtnQuit().setText("Great!"); + model.addWin(this); + } + else { + view.getBtnRestart().setVisible(true); + view.getBtnRestart().setText("Retry"); + view.getBtnQuit().setText("Quit"); + model.addLoss(this); + } + model.saveData(); + } + + public void onFinished(final ConquestData model, final IWinLoseView view) { + } + protected abstract Deck buildOpponentDeck(); public abstract void addVariants(Set variants); public abstract String getEventName(); diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestPreferences.java b/forge-gui/src/main/java/forge/planarconquest/ConquestPreferences.java index 6d2c3743a88..d1ff362588c 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestPreferences.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestPreferences.java @@ -37,7 +37,11 @@ public class ConquestPreferences extends PreferencesStore("Quest duels", new QuestDuelReader(dir)); assembleDuelDifficultyLists(); - } // End assembleAllEvents() + } - /** @return List */ public Iterable getAllDuels() { return allDuels; } + public Iterable getDuels(QuestEventDifficulty difficulty) { + return sortedDuels.get(difficulty); + } + // define fallback orders if there aren't enough opponents defined for a particular difficultly level private static List _easyOrder = Arrays.asList(QuestEventDifficulty.EASY, QuestEventDifficulty.MEDIUM, QuestEventDifficulty.HARD, QuestEventDifficulty.EXPERT); private static List _mediumOrder = Arrays.asList(QuestEventDifficulty.MEDIUM, QuestEventDifficulty.HARD, QuestEventDifficulty.EASY, QuestEventDifficulty.EXPERT);