From c9e131a1f01bfc1d215d3f1acd0ce95ee671b6d0 Mon Sep 17 00:00:00 2001 From: drdev Date: Wed, 24 Sep 2014 21:03:49 +0000 Subject: [PATCH] Refactor code to prevent duplication of match code --- .gitattributes | 5 +- .../src/main/java/forge/GuiDesktop.java | 311 ----------- .../src/main/java/forge/control/FControl.java | 379 +------------- .../java/forge/control/KeyboardShortcuts.java | 6 +- .../gauntlet/CSubmenuGauntletContests.java | 4 +- .../home/gauntlet/CSubmenuGauntletLoad.java | 4 +- .../home/gauntlet/CSubmenuGauntletQuick.java | 6 +- .../home/sanctioned/CSubmenuConstructed.java | 6 +- .../home/sanctioned/CSubmenuDraft.java | 7 +- .../home/sanctioned/CSubmenuSealed.java | 2 +- .../home/sanctioned/CSubmenuWinston.java | 3 +- .../home/settings/CSubmenuPreferences.java | 3 +- .../java/forge/screens/match/CMatchUI.java | 487 +++++++++++++----- .../forge/screens/match/ControlWinLose.java | 10 +- .../forge/screens/match/GauntletWinLose.java | 2 +- .../screens/match/QuestDraftWinLose.java | 14 +- .../forge/screens/match/TargetingOverlay.java | 3 +- .../forge/screens/match/VAssignDamage.java | 4 +- .../java/forge/screens/match/VMatchUI.java | 14 +- .../java/forge/screens/match/ViewWinLose.java | 2 +- .../forge/screens/match/controllers/CDev.java | 34 +- .../screens/match/controllers/CDock.java | 9 +- .../screens/match/controllers/CField.java | 3 +- .../screens/match/controllers/CPrompt.java | 18 +- .../screens/match/menus/DevModeMenu.java | 6 +- .../forge/screens/match/menus/GameMenu.java | 13 +- .../forge/screens/match/views/VAntes.java | 4 +- .../forge/screens/match/views/VField.java | 10 +- .../java/forge/screens/match/views/VLog.java | 4 +- .../forge/screens/match/views/VPlayers.java | 4 +- .../forge/screens/match/views/VStack.java | 6 +- .../src/main/java/forge/view/FFrame.java | 6 +- .../src/main/java/forge/view/FView.java | 3 +- .../java/forge/view/arcane/CardPanel.java | 6 +- forge-gui-mobile/src/forge/Forge.java | 19 +- forge-gui-mobile/src/forge/GuiMobile.java | 255 +-------- .../src/forge/card/CardRenderer.java | 9 +- .../src/forge/screens/LaunchScreen.java | 4 +- .../src/forge/screens/draft/DraftScreen.java | 4 +- .../forge/screens/match/MatchController.java | 419 +++++++++++++++ .../src/forge/screens/match/MatchScreen.java | 83 ++- .../forge/screens/match/TargetingOverlay.java | 2 +- .../screens/match/views/VAssignDamage.java | 7 +- .../forge/screens/match/views/VAvatar.java | 9 +- .../screens/match/views/VCardDisplayArea.java | 4 +- .../forge/screens/match/views/VDevMenu.java | 34 +- .../src/forge/screens/match/views/VField.java | 4 +- .../forge/screens/match/views/VGameMenu.java | 22 +- .../src/forge/screens/match/views/VLog.java | 4 +- .../forge/screens/match/views/VManaPool.java | 4 +- .../screens/match/views/VPlayerPanel.java | 11 +- .../forge/screens/match/views/VPlayers.java | 9 +- .../src/forge/screens/match/views/VStack.java | 24 +- .../screens/match/winlose/ControlWinLose.java | 11 +- .../match/winlose/GauntletWinLose.java | 2 +- .../screens/match/winlose/ViewWinLose.java | 3 +- .../forge/screens/sealed/SealedScreen.java | 2 +- .../forge/screens/settings/SettingsPage.java | 3 +- .../src/forge/toolbox/FChoiceList.java | 4 +- .../control/FControlGameEventHandler.java | 32 +- .../forge/control/FControlGamePlayback.java | 3 +- .../gauntlet/GauntletWinLoseController.java | 10 +- .../main/java/forge/interfaces/IGuiBase.java | 50 -- .../main/java/forge/limited/GauntletMini.java | 11 +- .../limited/LimitedWinLoseController.java | 2 +- .../java/forge/match/IMatchController.java | 54 ++ .../src/main/java/forge/match/MatchUtil.java | 380 +++----------- .../java/forge/match/input/ButtonUtil.java | 18 +- .../java/forge/match/input/InputAttack.java | 25 +- .../java/forge/match/input/InputBase.java | 11 +- .../java/forge/match/input/InputBlock.java | 13 +- .../java/forge/match/input/InputConfirm.java | 2 +- .../match/input/InputConfirmMulligan.java | 13 +- .../java/forge/match/input/InputLockUI.java | 5 +- .../java/forge/match/input/InputNone.java | 54 -- .../forge/match/input/InputPassPriority.java | 4 +- .../java/forge/match/input/InputPayMana.java | 11 +- .../match/input/InputPlaybackControl.java | 4 +- .../match/input/InputSelectManyBase.java | 7 +- .../forge/match/input/InputSelectTargets.java | 13 +- .../src/main/java/forge/model/FModel.java | 4 +- .../java/forge/player/LobbyPlayerHuman.java | 3 +- .../forge/player/PlayerControllerHuman.java | 50 +- .../java/forge/player/TargetSelection.java | 5 +- .../java/forge/quest/QuestDraftUtils.java | 27 +- .../src/main/java/forge/quest/QuestUtil.java | 3 +- .../main/java/forge/sound/SoundSystem.java | 5 +- 87 files changed, 1337 insertions(+), 1832 deletions(-) create mode 100644 forge-gui-mobile/src/forge/screens/match/MatchController.java create mode 100644 forge-gui/src/main/java/forge/match/IMatchController.java rename forge-gui-mobile/src/forge/screens/match/FControl.java => forge-gui/src/main/java/forge/match/MatchUtil.java (54%) delete mode 100644 forge-gui/src/main/java/forge/match/input/InputNone.java diff --git a/.gitattributes b/.gitattributes index a9bd776a29b..1566468a888 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1207,7 +1207,7 @@ forge-gui-mobile/src/forge/screens/draft/DraftScreen.java -text forge-gui-mobile/src/forge/screens/draft/DraftingProcessScreen.java -text forge-gui-mobile/src/forge/screens/gauntlet/GauntletScreen.java -text forge-gui-mobile/src/forge/screens/home/HomeScreen.java -text -forge-gui-mobile/src/forge/screens/match/FControl.java -text +forge-gui-mobile/src/forge/screens/match/MatchController.java -text forge-gui-mobile/src/forge/screens/match/MatchScreen.java -text forge-gui-mobile/src/forge/screens/match/TargetingOverlay.java -text forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java -text @@ -16981,7 +16981,9 @@ forge-gui/src/main/java/forge/limited/SealedDeckBuilder.java svneol=native#text/ forge-gui/src/main/java/forge/limited/WinstonDraft.java -text forge-gui/src/main/java/forge/limited/WinstonDraftAI.java -text forge-gui/src/main/java/forge/limited/package-info.java svneol=native#text/plain +forge-gui/src/main/java/forge/match/IMatchController.java -text forge-gui/src/main/java/forge/match/MatchConstants.java -text +forge-gui/src/main/java/forge/match/MatchUtil.java -text forge-gui/src/main/java/forge/match/input/ButtonUtil.java -text forge-gui/src/main/java/forge/match/input/Input.java -text forge-gui/src/main/java/forge/match/input/InputAttack.java -text @@ -16990,7 +16992,6 @@ forge-gui/src/main/java/forge/match/input/InputBlock.java -text forge-gui/src/main/java/forge/match/input/InputConfirm.java -text forge-gui/src/main/java/forge/match/input/InputConfirmMulligan.java -text forge-gui/src/main/java/forge/match/input/InputLockUI.java -text -forge-gui/src/main/java/forge/match/input/InputNone.java -text forge-gui/src/main/java/forge/match/input/InputPassPriority.java -text forge-gui/src/main/java/forge/match/input/InputPayMana.java -text forge-gui/src/main/java/forge/match/input/InputPayManaOfCostPayment.java -text diff --git a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java index f96331fa3fb..c93caa295fd 100644 --- a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java +++ b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java @@ -4,88 +4,48 @@ import java.awt.Desktop; import java.awt.Graphics2D; import java.awt.Toolkit; import java.awt.datatransfer.StringSelection; -import java.awt.event.KeyEvent; -import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.File; import java.lang.reflect.InvocationTargetException; import java.net.URI; import java.util.Collection; import java.util.List; -import java.util.Map; - import javax.swing.ImageIcon; import javax.swing.JFileChooser; -import javax.swing.JPopupMenu; -import javax.swing.KeyStroke; -import javax.swing.MenuElement; -import javax.swing.MenuSelectionManager; import javax.swing.SwingUtilities; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.Pair; - import com.google.common.base.Function; import forge.assets.FSkinProp; import forge.assets.ISkinImage; -import forge.control.FControl; import forge.deck.CardPool; import forge.error.BugReportDialog; -import forge.events.UiEvent; import forge.game.GameObject; -import forge.game.GameType; -import forge.game.Match; -import forge.game.phase.PhaseType; import forge.game.player.IHasIcon; -import forge.game.player.RegisteredPlayer; -import forge.game.zone.ZoneType; import forge.gui.BoxedProductCardListViewer; import forge.gui.CardListViewer; -import forge.gui.FNetOverlay; import forge.gui.GuiChoose; -import forge.gui.GuiUtils; -import forge.gui.SOverlayUtils; import forge.gui.framework.FScreen; -import forge.gui.framework.SDisplayUtil; -import forge.gui.framework.SLayoutIO; -import forge.interfaces.IButton; import forge.interfaces.IGuiBase; import forge.item.PaperCard; import forge.model.FModel; import forge.screens.deckeditor.CDeckEditorUI; import forge.screens.deckeditor.controllers.CEditorQuestCardShop; import forge.screens.match.CMatchUI; -import forge.screens.match.VMatchUI; -import forge.screens.match.ViewWinLose; -import forge.screens.match.controllers.CPrompt; -import forge.screens.match.controllers.CStack; -import forge.screens.match.views.VField; -import forge.screens.match.views.VHand; -import forge.screens.match.views.VPrompt; import forge.sound.AltSoundSystem; import forge.sound.AudioClip; import forge.sound.AudioMusic; import forge.sound.IAudioClip; import forge.sound.IAudioMusic; -import forge.toolbox.FButton; import forge.toolbox.FOptionPane; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinImage; -import forge.toolbox.MouseTriggerEvent; -import forge.toolbox.special.PhaseLabel; import forge.util.BuildInfo; import forge.util.FileUtil; -import forge.util.ITriggerEvent; import forge.view.CardView; -import forge.view.CombatView; -import forge.view.GameEntityView; -import forge.view.PlayerView; -import forge.view.SpellAbilityView; public class GuiDesktop implements IGuiBase { - private boolean showOverlay = true; - @Override public boolean isRunningOnDesktop() { return true; @@ -233,165 +193,6 @@ public class GuiDesktop implements IGuiBase { return viewer.skipTheRest(); } - @Override - public IButton getBtnOK(PlayerView playerView) { - return VMatchUI.SINGLETON_INSTANCE.getBtnOK(); - } - - @Override - public IButton getBtnCancel(PlayerView playerView) { - return VMatchUI.SINGLETON_INSTANCE.getBtnCancel(); - } - - @Override - public void focusButton(final IButton button) { - // ensure we don't steal focus from an overlay - if (!SOverlayUtils.overlayHasFocus()) { - FThreads.invokeInEdtLater(GuiBase.getInterface(), new Runnable() { - @Override - public void run() { - ((FButton)button).requestFocusInWindow(); - } - }); - } - } - - @Override - public void flashIncorrectAction() { - SDisplayUtil.remind(VPrompt.SINGLETON_INSTANCE); - } - - @Override - public void updatePhase() { - final PlayerView p = Singletons.getControl().getGameView().getPlayerTurn(); - final PhaseType ph = Singletons.getControl().getGameView().getPhase(); - final CMatchUI matchUi = CMatchUI.SINGLETON_INSTANCE; - PhaseLabel lbl = matchUi.getFieldViewFor(p).getPhaseIndicator().getLabelFor(ph); - - matchUi.resetAllPhaseButtons(); - if (lbl != null) { - lbl.setActive(true); - } - } - - @Override - public void updateTurn(final PlayerView player) { - VField nextField = CMatchUI.SINGLETON_INSTANCE.getFieldViewFor(player); - SDisplayUtil.showTab(nextField); - CPrompt.SINGLETON_INSTANCE.updateText(); - CMatchUI.SINGLETON_INSTANCE.repaintCardOverlays(); - } - - @Override - public void updatePlayerControl() { - CMatchUI.SINGLETON_INSTANCE.initHandViews(); - SLayoutIO.loadLayout(null); - VMatchUI.SINGLETON_INSTANCE.populate(); - for (VHand h : VMatchUI.SINGLETON_INSTANCE.getHands()) { - h.getLayoutControl().updateHand(); - } - } - - @Override - public void disableOverlay() { - showOverlay = false; - } - - @Override - public void enableOverlay() { - showOverlay = true; - } - - @Override - public void finishGame() { - new ViewWinLose(Singletons.getControl().getGameView()); - if (showOverlay) { - SOverlayUtils.showOverlay(); - } - } - - @Override - public void updateStack() { - CStack.SINGLETON_INSTANCE.update(); - } - - @Override - public void startMatch(GameType gameType, List players) { - FControl.instance.startMatch(gameType, players); - } - - @Override - public void setPanelSelection(final CardView c) { - GuiUtils.setPanelSelection(c); - } - - @Override - public int getAbilityToPlay(List abilities, ITriggerEvent triggerEvent) { - if (triggerEvent == null) { - if (abilities.isEmpty()) { - return -1; - } - if (abilities.size() == 1) { - return abilities.get(0).getId(); - } - final SpellAbilityView choice = GuiChoose.oneOrNone("Choose ability to play", abilities); - return choice == null ? -1 : choice.getId(); - } - - if (abilities.isEmpty()) { - return -1; - } - if (abilities.size() == 1 && !abilities.get(0).isPromptIfOnlyPossibleAbility()) { - if (abilities.get(0).canPlay()) { - return abilities.get(0).getId(); //only return ability if it's playable, otherwise return null - } - return -1; - } - - //show menu if mouse was trigger for ability - final JPopupMenu menu = new JPopupMenu("Abilities"); - - boolean enabled; - boolean hasEnabled = false; - int shortcut = KeyEvent.VK_1; //use number keys as shortcuts for abilities 1-9 - for (final SpellAbilityView ab : abilities) { - enabled = ab.canPlay(); - if (enabled) { - hasEnabled = true; - } - GuiUtils.addMenuItem(menu, FSkin.encodeSymbols(ab.toString(), true), - shortcut > 0 ? KeyStroke.getKeyStroke(shortcut, 0) : null, - new Runnable() { - @Override - public void run() { - CPrompt.SINGLETON_INSTANCE.selectAbility(ab); - } - }, enabled); - if (shortcut > 0) { - shortcut++; - if (shortcut > KeyEvent.VK_9) { - shortcut = 0; //stop adding shortcuts after 9 - } - } - } - if (hasEnabled) { //only show menu if at least one ability can be played - SwingUtilities.invokeLater(new Runnable() { //use invoke later to ensure first ability selected by default - public void run() { - MenuSelectionManager.defaultManager().setSelectedPath(new MenuElement[]{menu, menu.getSubElements()[0]}); - } - }); - MouseEvent mouseEvent = ((MouseTriggerEvent)triggerEvent).getMouseEvent(); - menu.show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY()); - } - - return -1; //delay ability until choice made - } - - @Override - public void hear(LobbyPlayer player, String message) { - FNetOverlay.SINGLETON_INSTANCE.addMessage(player.getName(), message); - } - @Override public int getAvatarCount() { if (FSkin.isLoaded()) { @@ -400,105 +201,11 @@ public class GuiDesktop implements IGuiBase { return 0; } - @Override - public void fireEvent(UiEvent e) { - CMatchUI.SINGLETON_INSTANCE.fireEvent(e); - } - @Override public void setCard(final CardView card) { CMatchUI.SINGLETON_INSTANCE.setCard(card); } - @Override - public void showCombat(final CombatView combat) { - CMatchUI.SINGLETON_INSTANCE.showCombat(combat); - } - - @Override - public void setUsedToPay(final CardView card, final boolean b) { - CMatchUI.SINGLETON_INSTANCE.setUsedToPay(card, b); - } - - @Override - public void setHighlighted(final PlayerView player, final boolean b) { - CMatchUI.SINGLETON_INSTANCE.setHighlighted(player, b); - } - - @Override - public void showPromptMessage(final PlayerView playerView, final String message) { - CMatchUI.SINGLETON_INSTANCE.showMessage(message); - } - - @Override - public boolean stopAtPhase(final PlayerView playerTurn, PhaseType phase) { - return CMatchUI.SINGLETON_INSTANCE.stopAtPhase(playerTurn, phase); - } - - public Object showManaPool(final PlayerView player) { - return null; //not needed since mana pool icons are always visible - } - - @Override - public void hideManaPool(final PlayerView player, final Object zoneToRestore) { - //not needed since mana pool icons are always visible - } - - @Override - public boolean openZones(final Collection zones, final Map players) { - if (zones.size() == 1) { - switch (zones.iterator().next()) { - case Battlefield: - case Hand: - return true; //don't actually need to open anything, but indicate that zone can be opened - default: - return false; - } - } - return false; - } - - @Override - public void restoreOldZones(final Map playersToRestoreZonesFor) { - } - - @Override - public void updateZones(final List> zonesToUpdate) { - CMatchUI.SINGLETON_INSTANCE.updateZones(zonesToUpdate); - } - - @Override - public void updateCards(final Iterable cardsToUpdate) { - CMatchUI.SINGLETON_INSTANCE.updateCards(cardsToUpdate); - } - - @Override - public void refreshCardDetails(final Iterable cards) { - CMatchUI.SINGLETON_INSTANCE.refreshCardDetails(cards); - } - - @Override - public void updateManaPool(final List manaPoolUpdate) { - CMatchUI.SINGLETON_INSTANCE.updateManaPool(manaPoolUpdate); - } - - @Override - public void updateLives(final List livesUpdate) { - CMatchUI.SINGLETON_INSTANCE.updateLives(livesUpdate); - } - - @Override - public void endCurrentGame() { - FControl.instance.endCurrentGame(false, false); - } - - @Override - public Map getDamageToAssign(final CardView attacker, - final List blockers, final int damageDealt, - final GameEntityView defender, final boolean overrideOrder) { - return CMatchUI.SINGLETON_INSTANCE.getDamageToAssign(attacker, - blockers, damageDealt, defender, overrideOrder); - } @Override public String showFileDialog(String title, String defaultDir) { @@ -554,24 +261,6 @@ public class GuiDesktop implements IGuiBase { ImageCache.clear(); } - @Override - public void startGame(Match match) { - SOverlayUtils.startGameOverlay(); - SOverlayUtils.showOverlay(); - Singletons.getControl().startGameWithUi(match); - } - - @Override - public void continueMatch(Match match) { - Singletons.getControl().endCurrentGame(false, false); - if (match == null) { - Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN); - } - else { - Singletons.getControl().startGameWithUi(match); - } - } - @Override public void showSpellShop() { Singletons.getControl().setCurrentScreen(FScreen.QUEST_CARD_SHOP); diff --git a/forge-gui-desktop/src/main/java/forge/control/FControl.java b/forge-gui-desktop/src/main/java/forge/control/FControl.java index 12be410060f..69ed1cb366d 100644 --- a/forge-gui-desktop/src/main/java/forge/control/FControl.java +++ b/forge-gui-desktop/src/main/java/forge/control/FControl.java @@ -26,69 +26,40 @@ import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; import java.util.List; -import java.util.Set; import javax.swing.ImageIcon; import javax.swing.JLayeredPane; import javax.swing.SwingUtilities; import javax.swing.WindowConstants; -import org.apache.commons.lang3.StringUtils; - -import forge.FThreads; -import forge.GuiBase; import forge.ImageCache; import forge.LobbyPlayer; import forge.Singletons; -import forge.ai.LobbyPlayerAi; import forge.assets.FSkinProp; import forge.control.KeyboardShortcuts.Shortcut; -import forge.game.Game; -import forge.game.GameRules; -import forge.game.GameType; -import forge.game.Match; -import forge.game.player.Player; -import forge.game.player.RegisteredPlayer; import forge.gui.GuiDialog; import forge.gui.SOverlayUtils; -import forge.gui.framework.EDocID; import forge.gui.framework.FScreen; import forge.gui.framework.InvalidLayoutFileException; -import forge.gui.framework.SDisplayUtil; import forge.gui.framework.SLayoutIO; import forge.gui.framework.SOverflowUtil; import forge.gui.framework.SResizingUtil; -import forge.match.input.InputQueue; -import forge.match.input.InputSynchronized; +import forge.match.MatchUtil; import forge.menus.ForgeMenu; import forge.model.FModel; import forge.player.GamePlayerUtil; -import forge.player.LobbyPlayerHuman; -import forge.player.PlayerControllerHuman; import forge.properties.ForgeConstants; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; -import forge.quest.QuestController; import forge.quest.data.QuestPreferences.QPref; import forge.quest.io.QuestDataIO; import forge.screens.deckeditor.CDeckEditorUI; import forge.screens.match.CMatchUI; -import forge.screens.match.VMatchUI; -import forge.screens.match.views.VField; -import forge.sound.MusicPlaylist; -import forge.sound.SoundSystem; import forge.toolbox.FOptionPane; import forge.toolbox.FSkin; -import forge.toolbox.special.PhaseIndicator; import forge.view.FFrame; import forge.view.FView; -import forge.view.LocalGameView; -import forge.view.PlayerView; -import forge.view.WatchLocalGame; /** *

@@ -101,8 +72,6 @@ import forge.view.WatchLocalGame; public enum FControl implements KeyEventDispatcher { instance; - private Game game; - private List gameViews = new ArrayList(); private ForgeMenu forgeMenu; private List shortcuts; private JLayeredPane display; @@ -116,8 +85,6 @@ public enum FControl implements KeyEventDispatcher { EXIT_FORGE } - private SoundSystem soundSystem; - /** *

* FControl. @@ -184,10 +151,10 @@ public enum FControl implements KeyEventDispatcher { public boolean canExitForge(boolean forRestart) { String action = (forRestart ? "Restart" : "Exit"); String userPrompt = "Are you sure you wish to " + (forRestart ? "restart" : "exit") + " Forge?"; - if (game != null) { + if (MatchUtil.getGame() != null) { userPrompt = "A game is currently active. " + userPrompt; } - if (!FOptionPane.showConfirmDialog(userPrompt, action + " Forge", action, "Cancel", game == null)) { //default Yes if no game active + if (!FOptionPane.showConfirmDialog(userPrompt, action + " Forge", action, "Cancel", MatchUtil.getGame() == null)) { //default Yes if no game active return false; } if (!CDeckEditorUI.SINGLETON_INSTANCE.canSwitchAway(true)) { @@ -207,11 +174,11 @@ public enum FControl implements KeyEventDispatcher { /** After view and model have been initialized, control can start.*/ public void initialize() { + MatchUtil.setController(CMatchUI.SINGLETON_INSTANCE); + // Preloads skin components (using progress bar). FSkin.loadFull(true); - soundSystem = new SoundSystem(GuiBase.getInterface()); - shortcuts = KeyboardShortcuts.attachKeyboardShortcuts(); display = FView.SINGLETON_INSTANCE.getLpnDocument(); @@ -364,212 +331,6 @@ public enum FControl implements KeyEventDispatcher { if (children.length != 0) { children[0].setSize(display.getSize()); } } - /** - * TODO: Write javadoc for this method. - * @return - */ - public SoundSystem getSoundSystem() { - return soundSystem; - } - - public final void stopGame() { - List pp = new ArrayList(); - for (Player p : game.getPlayers()) { - if (p.getOriginalLobbyPlayer() == getGuiPlayer()) { - pp.add(p); - } - } - boolean hasHuman = !pp.isEmpty(); - - if (pp.isEmpty()) { - pp.addAll(game.getPlayers()); // no human? then all players surrender! - } - - for (Player p: pp) { - p.concede(); - } - - Player priorityPlayer = game.getPhaseHandler().getPriorityPlayer(); - boolean humanHasPriority = priorityPlayer == null || priorityPlayer.getLobbyPlayer() == getGuiPlayer(); - - if (hasHuman && humanHasPriority) { - game.getAction().checkGameOverCondition(); - } - else { - game.isGameOver(); // this is synchronized method - it's used to make Game-0 thread see changes made here - getInputQueue().onGameOver(false); //release any waiting input, effectively passing priority - } - - if (playbackControl != null) { - playbackControl.onGameStopRequested(); - } - } - - public Player getCurrentPlayer() { - if (game == null) { return null; } - - LobbyPlayer lobbyPlayer = getGuiPlayer(); - if (gameViews.size() > 1) { - //account for if second human player is currently being prompted - InputSynchronized activeInput = InputQueue.getActiveInput(); - if (activeInput != null) { - lobbyPlayer = activeInput.getOwner().getLobbyPlayer(); - } - } - - for (Player p : game.getPlayers()) { - if (p.getLobbyPlayer() == lobbyPlayer) { - return p; - } - } - return null; - } - - public LocalGameView getGameView() { - return getGameView(getCurrentPlayer()); - } - public LocalGameView getGameView(Player player) { - switch (gameViews.size()) { - case 1: - return gameViews.get(0); - case 0: - return null; - default: - if (player != null && player.getController() instanceof PlayerControllerHuman) { - return ((PlayerControllerHuman)player.getController()).getGameView(); - } - return gameViews.get(0); - } - } - - public InputQueue getInputQueue() { - LocalGameView gameView = getGameView(); - if (gameView != null) { - return gameView.getInputQueue(); - } - return null; - } - - public final void startGameWithUi(final Match match) { - if (game != null) { - setCurrentScreen(FScreen.MATCH_SCREEN); - SOverlayUtils.hideOverlay(); - FOptionPane.showMessageDialog("Cannot start a new game while another game is already in progress."); - return; //TODO: See if it's possible to run multiple games at once without crashing - } - - setPlayerName(match.getPlayers()); - - getSoundSystem().setBackgroundMusic(MusicPlaylist.MATCH); - - game = match.createGame(); - - if (game.getRules().getGameType() == GameType.Quest) { - QuestController qc = FModel.getQuest(); - // Reset new list when the Match round starts, not when each game starts - if (game.getMatch().getPlayedGames().isEmpty()) { - qc.getCards().resetNewList(); - } - game.subscribeToEvents(qc); // this one listens to player's mulligans ATM - } - - game.subscribeToEvents(getSoundSystem()); - - final String[] indices = FModel.getPreferences().getPref(FPref.UI_AVATARS).split(","); - - // Instantiate all required field slots (user at 0) - final List sortedPlayers = new ArrayList(game.getRegisteredPlayers()); - Collections.sort(sortedPlayers, new Comparator() { - @Override - public int compare(Player p1, Player p2) { - int v1 = p1.getController() instanceof PlayerControllerHuman ? 0 : 1; - int v2 = p2.getController() instanceof PlayerControllerHuman ? 0 : 1; - return Integer.compare(v1, v2); - } - }); - - gameViews.clear(); - - int i = 0; - int avatarIndex = 0; - int humanCount = 0; - for (Player p : sortedPlayers) { - if (i < indices.length) { - avatarIndex = Integer.parseInt(indices[i]); - i++; - } - p.getLobbyPlayer().setAvatarIndex(avatarIndex); - - if (p.getController() instanceof PlayerControllerHuman) { - final PlayerControllerHuman controller = (PlayerControllerHuman) p.getController(); - LocalGameView gameView = controller.getGameView(); - game.subscribeToEvents(new FControlGameEventHandler(gameView)); - gameViews.add(gameView); - humanCount++; - } - } - - if (humanCount == 0) { //watch game but do not participate - LocalGameView gameView = new WatchLocalGame(GuiBase.getInterface(), game); - gameView.setLocalPlayer(sortedPlayers.get(0)); - game.subscribeToEvents(new FControlGameEventHandler(gameView)); - gameViews.add(gameView); - } - else if (humanCount == sortedPlayers.size()) { - //if there are no AI's, allow all players to see all cards (hotseat mode). - for (Player p : sortedPlayers) { - ((PlayerControllerHuman) p.getController()).setMayLookAtAllCards(true); - } - } - - List sortedPlayerViews = new ArrayList(); - for (Player p : sortedPlayers) { - sortedPlayerViews.add(getGameView().getPlayerView(p)); - } - CMatchUI.SINGLETON_INSTANCE.initMatch(sortedPlayerViews, humanCount != 1); - - actuateMatchPreferences(); - - setCurrentScreen(FScreen.MATCH_SCREEN); - SDisplayUtil.showTab(EDocID.REPORT_LOG.getDoc()); - - // per player observers were set in CMatchUI.SINGLETON_INSTANCE.initMatch - //Set Field shown to current player. - if (humanCount > 0) { - final VField nextField = CMatchUI.SINGLETON_INSTANCE.getFieldViewFor(sortedPlayerViews.get(0)); - SDisplayUtil.showTab(nextField); - } - - // It's important to run match in a different thread to allow GUI inputs to be invoked from inside game. - // Game is set on pause while gui player takes decisions - game.getAction().invoke(new Runnable() { - @Override - public void run() { - match.startGame(game); - } - }); - SOverlayUtils.hideOverlay(); - } - - public final void endCurrentGame(boolean nextGame, boolean restart) { - if (game == null) { return; } - - Match match = game.getMatch(); - game = null; - - Singletons.getView().getNavigationBar().closeTab(FScreen.MATCH_SCREEN); - - if (nextGame) { - startGameWithUi(match); - } - else if (restart) { - match.clearGamesPlayed(); - startGameWithUi(match); - } - } - - private FControlGamePlayback playbackControl; - /* (non-Javadoc) * @see java.awt.KeyEventDispatcher#dispatchKeyEvent(java.awt.event.KeyEvent) */ @@ -604,136 +365,6 @@ public enum FControl implements KeyEventDispatcher { return false; } - /** - * Prompts user for a name that will be used instead of "Human" during gameplay. - *

- * This is a one time only event that is triggered when starting a game and the - * PLAYER_NAME setting is blank. Does not apply to a hotseat game. - */ - private void setPlayerName(List players) { - final ForgePreferences prefs = FModel.getPreferences(); - if (StringUtils.isBlank(prefs.getPref(FPref.PLAYER_NAME))) { - boolean isPlayerOneHuman = players.get(0).getPlayer() instanceof LobbyPlayerHuman; - boolean isPlayerTwoComputer = players.get(1).getPlayer() instanceof LobbyPlayerAi; - if (isPlayerOneHuman && isPlayerTwoComputer) { - GamePlayerUtil.setPlayerName(GuiBase.getInterface()); - } - } - } - - public void startMatch(GameType gameType, List players) { - startMatch(gameType, null, players); - } - - public void startMatch(GameType gameType, Set appliedVariants, List players) { - boolean useRandomFoil = FModel.getPreferences().getPrefBoolean(FPref.UI_RANDOM_FOIL); - for(RegisteredPlayer rp : players) { - rp.setRandomFoil(useRandomFoil); - } - - GameRules rules = new GameRules(gameType); - if (null != appliedVariants && !appliedVariants.isEmpty()) - rules.setAppliedVariants(appliedVariants); - rules.setPlayForAnte(FModel.getPreferences().getPrefBoolean(FPref.UI_ANTE)); - rules.setMatchAnteRarity(FModel.getPreferences().getPrefBoolean(FPref.UI_ANTE_MATCH_RARITY)); - rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); - rules.canCloneUseTargetsImage = FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE); - - final Match mc = new Match(rules, players); - SOverlayUtils.startGameOverlay(); - SOverlayUtils.showOverlay(); - FThreads.invokeInEdtLater(GuiBase.getInterface(), new Runnable(){ - @Override - public void run() { - startGameWithUi(mc); - } - }); - } - - /** - * TODO: Needs to be reworked for efficiency with rest of prefs saves in - * codebase. - */ - public void writeMatchPreferences() { - final ForgePreferences prefs = FModel.getPreferences(); - final List fieldViews = VMatchUI.SINGLETON_INSTANCE.getFieldViews(); - - // AI field is at index [1] - PhaseIndicator fvAi = fieldViews.get(1).getPhaseIndicator(); - prefs.setPref(FPref.PHASE_AI_UPKEEP, String.valueOf(fvAi.getLblUpkeep().getEnabled())); - prefs.setPref(FPref.PHASE_AI_DRAW, String.valueOf(fvAi.getLblDraw().getEnabled())); - prefs.setPref(FPref.PHASE_AI_MAIN1, String.valueOf(fvAi.getLblMain1().getEnabled())); - prefs.setPref(FPref.PHASE_AI_BEGINCOMBAT, String.valueOf(fvAi.getLblBeginCombat().getEnabled())); - prefs.setPref(FPref.PHASE_AI_DECLAREATTACKERS, String.valueOf(fvAi.getLblDeclareAttackers().getEnabled())); - prefs.setPref(FPref.PHASE_AI_DECLAREBLOCKERS, String.valueOf(fvAi.getLblDeclareBlockers().getEnabled())); - prefs.setPref(FPref.PHASE_AI_FIRSTSTRIKE, String.valueOf(fvAi.getLblFirstStrike().getEnabled())); - prefs.setPref(FPref.PHASE_AI_COMBATDAMAGE, String.valueOf(fvAi.getLblCombatDamage().getEnabled())); - prefs.setPref(FPref.PHASE_AI_ENDCOMBAT, String.valueOf(fvAi.getLblEndCombat().getEnabled())); - prefs.setPref(FPref.PHASE_AI_MAIN2, String.valueOf(fvAi.getLblMain2().getEnabled())); - prefs.setPref(FPref.PHASE_AI_EOT, String.valueOf(fvAi.getLblEndTurn().getEnabled())); - prefs.setPref(FPref.PHASE_AI_CLEANUP, String.valueOf(fvAi.getLblCleanup().getEnabled())); - - // Human field is at index [0] - PhaseIndicator fvHuman = fieldViews.get(0).getPhaseIndicator(); - prefs.setPref(FPref.PHASE_HUMAN_UPKEEP, String.valueOf(fvHuman.getLblUpkeep().getEnabled())); - prefs.setPref(FPref.PHASE_HUMAN_DRAW, String.valueOf(fvHuman.getLblDraw().getEnabled())); - prefs.setPref(FPref.PHASE_HUMAN_MAIN1, String.valueOf(fvHuman.getLblMain1().getEnabled())); - prefs.setPref(FPref.PHASE_HUMAN_BEGINCOMBAT, String.valueOf(fvHuman.getLblBeginCombat().getEnabled())); - prefs.setPref(FPref.PHASE_HUMAN_DECLAREATTACKERS, String.valueOf(fvHuman.getLblDeclareAttackers().getEnabled())); - prefs.setPref(FPref.PHASE_HUMAN_DECLAREBLOCKERS, String.valueOf(fvHuman.getLblDeclareBlockers().getEnabled())); - prefs.setPref(FPref.PHASE_HUMAN_FIRSTSTRIKE, String.valueOf(fvHuman.getLblFirstStrike().getEnabled())); - prefs.setPref(FPref.PHASE_HUMAN_COMBATDAMAGE, String.valueOf(fvHuman.getLblCombatDamage().getEnabled())); - prefs.setPref(FPref.PHASE_HUMAN_ENDCOMBAT, String.valueOf(fvHuman.getLblEndCombat().getEnabled())); - prefs.setPref(FPref.PHASE_HUMAN_MAIN2, String.valueOf(fvHuman.getLblMain2().getEnabled())); - prefs.setPref(FPref.PHASE_HUMAN_EOT, fvHuman.getLblEndTurn().getEnabled()); - prefs.setPref(FPref.PHASE_HUMAN_CLEANUP, fvHuman.getLblCleanup().getEnabled()); - - prefs.save(); - } - - /** - * TODO: Needs to be reworked for efficiency with rest of prefs saves in - * codebase. - */ - private void actuateMatchPreferences() { - final ForgePreferences prefs = FModel.getPreferences(); - final List fieldViews = VMatchUI.SINGLETON_INSTANCE.getFieldViews(); - - // Human field is at index [0] - PhaseIndicator fvHuman = fieldViews.get(0).getPhaseIndicator(); - fvHuman.getLblUpkeep().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_UPKEEP)); - fvHuman.getLblDraw().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DRAW)); - fvHuman.getLblMain1().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_MAIN1)); - fvHuman.getLblBeginCombat().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_BEGINCOMBAT)); - fvHuman.getLblDeclareAttackers().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREATTACKERS)); - fvHuman.getLblDeclareBlockers().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREBLOCKERS)); - fvHuman.getLblFirstStrike().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_FIRSTSTRIKE)); - fvHuman.getLblCombatDamage().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_COMBATDAMAGE)); - fvHuman.getLblEndCombat().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_ENDCOMBAT)); - fvHuman.getLblMain2().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_MAIN2)); - fvHuman.getLblEndTurn().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_EOT)); - fvHuman.getLblCleanup().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_CLEANUP)); - - // AI field is at index [1], ... - for (int i = 1; i < fieldViews.size(); i++) { - PhaseIndicator fvAi = fieldViews.get(i).getPhaseIndicator(); - fvAi.getLblUpkeep().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_UPKEEP)); - fvAi.getLblDraw().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_DRAW)); - fvAi.getLblMain1().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_MAIN1)); - fvAi.getLblBeginCombat().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_BEGINCOMBAT)); - fvAi.getLblDeclareAttackers().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_DECLAREATTACKERS)); - fvAi.getLblDeclareBlockers().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_DECLAREBLOCKERS)); - fvAi.getLblFirstStrike().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_FIRSTSTRIKE)); - fvAi.getLblCombatDamage().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_COMBATDAMAGE)); - fvAi.getLblEndCombat().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_ENDCOMBAT)); - fvAi.getLblMain2().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_MAIN2)); - fvAi.getLblEndTurn().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_EOT)); - fvAi.getLblCleanup().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_CLEANUP)); - } - - //Singletons.getView().getViewMatch().setLayoutParams(prefs.getPref(FPref.UI_LAYOUT_PARAMS)); - } - public final LobbyPlayer getGuiPlayer() { return GamePlayerUtil.getGuiPlayer(); } diff --git a/forge-gui-desktop/src/main/java/forge/control/KeyboardShortcuts.java b/forge-gui-desktop/src/main/java/forge/control/KeyboardShortcuts.java index df258bd655b..840ac3c3346 100644 --- a/forge-gui-desktop/src/main/java/forge/control/KeyboardShortcuts.java +++ b/forge-gui-desktop/src/main/java/forge/control/KeyboardShortcuts.java @@ -4,11 +4,11 @@ import forge.Singletons; import forge.gui.framework.EDocID; import forge.gui.framework.FScreen; import forge.gui.framework.SDisplayUtil; +import forge.match.MatchUtil; import forge.model.FModel; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; import forge.screens.home.settings.VSubmenuPreferences.KeyboardShortcutField; -import forge.screens.match.CMatchUI; import forge.screens.match.controllers.CDock; import org.apache.commons.lang3.StringUtils; @@ -97,7 +97,7 @@ public class KeyboardShortcuts { @Override public void actionPerformed(final ActionEvent e) { if (Singletons.getControl().getCurrentScreen() != FScreen.MATCH_SCREEN) { return; } - CMatchUI.SINGLETON_INSTANCE.concede(); + MatchUtil.concede(); } }; @@ -115,7 +115,7 @@ public class KeyboardShortcuts { @Override public void actionPerformed(final ActionEvent e) { if (Singletons.getControl().getCurrentScreen() != FScreen.MATCH_SCREEN) { return; } - Singletons.getControl().getGameView().alphaStrike(); + MatchUtil.alphaStrike(); } }; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletContests.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletContests.java index 8fbeb761d7a..c2420b97afe 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletContests.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletContests.java @@ -1,6 +1,5 @@ package forge.screens.home.gauntlet; -import forge.Singletons; import forge.UiCommand; import forge.deck.Deck; import forge.game.GameType; @@ -9,6 +8,7 @@ import forge.gauntlet.GauntletData; import forge.gauntlet.GauntletIO; import forge.gui.SOverlayUtils; import forge.gui.framework.ICDoc; +import forge.match.MatchUtil; import forge.model.FModel; import forge.player.GamePlayerUtil; @@ -106,7 +106,7 @@ public enum CSubmenuGauntletContests implements ICDoc { starter.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer())); starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); - Singletons.getControl().startMatch(GameType.Gauntlet, starter); + MatchUtil.startMatch(GameType.Gauntlet, starter); } /* (non-Javadoc) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletLoad.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletLoad.java index 1aa67b21db7..7f408924a9d 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletLoad.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletLoad.java @@ -1,6 +1,5 @@ package forge.screens.home.gauntlet; -import forge.Singletons; import forge.UiCommand; import forge.deck.Deck; import forge.deck.DeckType; @@ -11,6 +10,7 @@ import forge.gauntlet.GauntletData; import forge.gauntlet.GauntletIO; import forge.gui.SOverlayUtils; import forge.gui.framework.ICDoc; +import forge.match.MatchUtil; import forge.model.FModel; import forge.player.GamePlayerUtil; @@ -133,7 +133,7 @@ public enum CSubmenuGauntletLoad implements ICDoc { starter.add(new RegisteredPlayer(userDeck).setPlayer(GamePlayerUtil.getGuiPlayer())); starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); - Singletons.getControl().startMatch(GameType.Gauntlet, starter); + MatchUtil.startMatch(GameType.Gauntlet, starter); } /* (non-Javadoc) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletQuick.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletQuick.java index 6b95769cf33..acd8681a504 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletQuick.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletQuick.java @@ -1,7 +1,6 @@ package forge.screens.home.gauntlet; import forge.UiCommand; -import forge.Singletons; import forge.deck.DeckType; import forge.game.GameType; import forge.game.player.RegisteredPlayer; @@ -9,6 +8,7 @@ import forge.gauntlet.GauntletData; import forge.gauntlet.GauntletUtil; import forge.gui.SOverlayUtils; import forge.gui.framework.ICDoc; +import forge.match.MatchUtil; import forge.player.GamePlayerUtil; import javax.swing.*; @@ -76,8 +76,8 @@ public enum CSubmenuGauntletQuick implements ICDoc { List starter = new ArrayList(); starter.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer())); starter.add(new RegisteredPlayer(gd.getDecks().get(gd.getCompleted())).setPlayer(GamePlayerUtil.createAiPlayer())); - - Singletons.getControl().startMatch(GameType.Gauntlet, starter); + + MatchUtil.startMatch(GameType.Gauntlet, starter); } /* (non-Javadoc) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java index d193795c7bb..3e3f8b0d6a4 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java @@ -2,7 +2,6 @@ package forge.screens.home.sanctioned; import forge.LobbyPlayer; import forge.UiCommand; -import forge.Singletons; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; @@ -13,6 +12,7 @@ import forge.game.player.RegisteredPlayer; import forge.gui.GuiDialog; import forge.gui.framework.ICDoc; import forge.item.PaperCard; +import forge.match.MatchUtil; import forge.menus.IMenuProvider; import forge.menus.MenuUtil; import forge.model.CardCollections; @@ -372,8 +372,8 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider { } view.getDeckChooser(i).saveState(); } - - Singletons.getControl().startMatch(GameType.Constructed, variantTypes, players); + + MatchUtil.startMatch(GameType.Constructed, variantTypes, players); } /* (non-Javadoc) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java index 1a2a959619b..69da1b363aa 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java @@ -15,6 +15,7 @@ import forge.gui.framework.ICDoc; import forge.itemmanager.ItemManagerConfig; import forge.limited.BoosterDraft; import forge.limited.LimitedPoolType; +import forge.match.MatchUtil; import forge.model.FModel; import forge.player.GamePlayerUtil; import forge.properties.ForgePreferences.FPref; @@ -115,11 +116,11 @@ public enum CSubmenuDraft implements ICDoc { } } - FModel.getGauntletMini(GuiBase.getInterface()).resetGauntletDraft(); + FModel.getGauntletMini().resetGauntletDraft(); if (gauntlet) { int rounds = FModel.getDecks().getDraft().get(humanDeck.getName()).getAiDecks().size(); - FModel.getGauntletMini(GuiBase.getInterface()).launch(rounds, humanDeck.getDeck(), gameType); + FModel.getGauntletMini().launch(rounds, humanDeck.getDeck(), gameType); return; } @@ -144,7 +145,7 @@ public enum CSubmenuDraft implements ICDoc { pl.assignConspiracies(); } - Singletons.getControl().startMatch(GameType.Draft, starter); + MatchUtil.startMatch(GameType.Draft, starter); } /** */ diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuSealed.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuSealed.java index cc6654f8d0e..d9182f1c699 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuSealed.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuSealed.java @@ -110,7 +110,7 @@ public enum CSubmenuSealed implements ICDoc { } int matches = FModel.getDecks().getSealed().get(human.getName()).getAiDecks().size(); - FModel.getGauntletMini(GuiBase.getInterface()).launch(matches, human.getDeck(), gameType); + FModel.getGauntletMini().launch(matches, human.getDeck(), gameType); } @SuppressWarnings("unchecked") diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuWinston.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuWinston.java index 546044e88da..ca8f1a1b7e4 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuWinston.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuWinston.java @@ -9,6 +9,7 @@ import forge.game.GameType; import forge.game.player.RegisteredPlayer; import forge.gui.GuiChoose; import forge.gui.SOverlayUtils; +import forge.match.MatchUtil; import forge.model.FModel; import forge.screens.deckeditor.CDeckEditorUI; import forge.deck.DeckProxy; @@ -132,7 +133,7 @@ public enum CSubmenuWinston implements ICDoc { starter.add(new RegisteredPlayer(humanDeck.getDeck()).setPlayer(GamePlayerUtil.getGuiPlayer())); starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer())); - Singletons.getControl().startMatch(GameType.Winston, starter); + MatchUtil.startMatch(GameType.Winston, starter); } /** */ diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java index 122c1d359c5..3308b10a98e 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java @@ -14,6 +14,7 @@ import forge.player.GamePlayerUtil; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; import forge.properties.ForgeConstants; +import forge.sound.SoundSystem; import forge.toolbox.FComboBox; import forge.toolbox.FComboBoxPanel; import forge.toolbox.FLabel; @@ -79,7 +80,7 @@ public enum CSubmenuPreferences implements ICDoc { final boolean toggle = view.getCbEnableMusic().isSelected(); prefs.setPref(FPref.UI_ENABLE_MUSIC, String.valueOf(toggle)); prefs.save(); - Singletons.getControl().getSoundSystem().changeBackgroundTrack(); + SoundSystem.instance.changeBackgroundTrack(); } }); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index c67cc2c3bb1..b9a550eac93 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -17,63 +17,78 @@ */ package forge.screens.match; +import java.awt.event.KeyEvent; +import java.awt.event.MouseEvent; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; import javax.swing.JMenu; +import javax.swing.JPopupMenu; +import javax.swing.KeyStroke; +import javax.swing.MenuElement; +import javax.swing.MenuSelectionManager; +import javax.swing.SwingUtilities; import org.apache.commons.lang3.tuple.Pair; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import com.google.common.eventbus.EventBus; -import com.google.common.eventbus.Subscribe; - import forge.FThreads; import forge.GuiBase; import forge.ImageCache; import forge.LobbyPlayer; import forge.Singletons; import forge.UiCommand; -import forge.events.IUiEventVisitor; -import forge.events.UiEvent; -import forge.events.UiEventAttackerDeclared; -import forge.events.UiEventBlockerAssigned; +import forge.game.Match; import forge.game.phase.PhaseType; +import forge.game.player.Player; import forge.game.zone.ZoneType; +import forge.gui.FNetOverlay; +import forge.gui.GuiChoose; +import forge.gui.GuiUtils; +import forge.gui.SOverlayUtils; import forge.gui.framework.EDocID; import forge.gui.framework.FScreen; import forge.gui.framework.ICDoc; import forge.gui.framework.IVDoc; import forge.gui.framework.SDisplayUtil; +import forge.gui.framework.SLayoutIO; +import forge.interfaces.IButton; import forge.item.InventoryItem; +import forge.match.IMatchController; +import forge.match.MatchUtil; import forge.menus.IMenuProvider; import forge.model.FModel; import forge.player.LobbyPlayerHuman; +import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; -import forge.quest.QuestDraftUtils; import forge.screens.match.controllers.CAntes; import forge.screens.match.controllers.CCombat; import forge.screens.match.controllers.CDetail; import forge.screens.match.controllers.CPicture; import forge.screens.match.controllers.CPrompt; +import forge.screens.match.controllers.CStack; import forge.screens.match.menus.CMatchUIMenus; import forge.screens.match.views.VCommand; import forge.screens.match.views.VField; import forge.screens.match.views.VHand; import forge.screens.match.views.VPlayers; +import forge.screens.match.views.VPrompt; +import forge.toolbox.FButton; import forge.toolbox.FOptionPane; -import forge.toolbox.FOverlay; import forge.toolbox.FSkin; +import forge.toolbox.MouseTriggerEvent; import forge.toolbox.FSkin.SkinImage; +import forge.toolbox.special.PhaseIndicator; import forge.toolbox.special.PhaseLabel; +import forge.util.ITriggerEvent; import forge.view.CardView; import forge.view.CombatView; import forge.view.GameEntityView; +import forge.view.LocalGameView; import forge.view.PlayerView; +import forge.view.SpellAbilityView; import forge.view.ViewUtil; import forge.view.arcane.CardPanel; import forge.view.arcane.PlayArea; @@ -86,24 +101,17 @@ import forge.view.arcane.PlayArea; * *

(C at beginning of class name denotes a control class.) */ -public enum CMatchUI implements ICDoc, IMenuProvider { +public enum CMatchUI implements ICDoc, IMenuProvider, IMatchController { SINGLETON_INSTANCE; private List sortedPlayers; private VMatchUI view; private boolean allHands; + private boolean showOverlay = true; - private EventBus uiEvents; private IVDoc selectedDocBeforeCombat; - private MatchUiEventVisitor visitor = new MatchUiEventVisitor(); public final Map avatarImages = new HashMap(); - private CMatchUI() { - uiEvents = new EventBus("ui events"); - uiEvents.register(Singletons.getControl().getSoundSystem()); - uiEvents.register(visitor); - } - private SkinImage getPlayerAvatar(final LobbyPlayer p, final int defaultIndex) { if (avatarImages.containsKey(p)) { return ImageCache.getIcon(avatarImages.get(p)); @@ -206,40 +214,6 @@ public enum CMatchUI implements ICDoc, IMenuProvider { return idx < 0 || idx >= allHands.size() ? null : allHands.get(idx); } - /** - * - * Fires up trample dialog. Very old code, due for refactoring with new UI. - * Could possibly move to view. - * - * @param attacker   {@link forge.game.card.Card} - * @param blockers   {@link forge.CardList} - * @param damage   int - * @param overrideOrder overriding combatant order - */ - @SuppressWarnings("unchecked") - public Map getDamageToAssign(final CardView attacker, final List blockers, final int damage, final GameEntityView defender, final boolean overrideOrder) { - if (damage <= 0) { - return Maps.newHashMap(); - } - - // If the first blocker can absorb all of the damage, don't show the Assign Damage Frame - final CardView firstBlocker = blockers.get(0); - if (!overrideOrder && !attacker.getOriginal().hasDeathtouch() && firstBlocker.getLethalDamage() >= damage) { - final Map res = Maps.newHashMap(); - res.put(firstBlocker, damage); - return res; - } - - final Object[] result = { null }; // how else can I extract a value from EDT thread? - FThreads.invokeInEdtAndWait(GuiBase.getInterface(), new Runnable() { - @Override - public void run() { - VAssignDamage v = new VAssignDamage(attacker, blockers, damage, defender, overrideOrder); - result[0] = v.getDamageMap(); - }}); - return (Map)result[0]; - } - /** * * Checks if game control should stop at a phase, for either @@ -275,7 +249,7 @@ public enum CMatchUI implements ICDoc, IMenuProvider { } public void showCombat(final CombatView combat) { - if (combat != null && combat.getNumAttackers() > 0 && Singletons.getControl().getGameView().peekStack() == null) { + if (combat != null && combat.getNumAttackers() > 0 && MatchUtil.getGameView().peekStack() == null) { if (selectedDocBeforeCombat == null) { IVDoc combatDoc = EDocID.REPORT_COMBAT.getDoc(); if (combatDoc.getParentCell() != null) { @@ -297,31 +271,6 @@ public enum CMatchUI implements ICDoc, IMenuProvider { CCombat.SINGLETON_INSTANCE.update(); } // showCombat(CombatView) - final Set highlightedPlayers = Sets.newHashSet(); - public void setHighlighted(PlayerView ge, boolean b) { - if (b) highlightedPlayers.add(ge); - else highlightedPlayers.remove(ge); - } - - public boolean isHighlighted(final PlayerView player) { - return highlightedPlayers.contains(player); - } - - Set highlightedCards = Sets.newHashSet(); - // used to highlight cards in UI - public void setUsedToPay(CardView card, boolean value) { - FThreads.assertExecutedByEdt(GuiBase.getInterface(), true); - - boolean hasChanged = value ? highlightedCards.add(card) : highlightedCards.remove(card); - if (hasChanged) { // since we are in UI thread, may redraw the card right now - updateSingleCard(card); - } - } - - public boolean isUsedToPay(CardView card) { - return highlightedCards.contains(card); - } - public void updateZones(List> zonesToUpdate) { //System.out.println("updateZones " + zonesToUpdate); for (Pair kv : zonesToUpdate) { @@ -362,13 +311,6 @@ public enum CMatchUI implements ICDoc, IMenuProvider { for (final PlayerView p : livesUpdate) { getFieldViewFor(p).updateDetails(); } - - } - - public void updateCards(final Iterable cardsToUpdate) { - for (final CardView c : cardsToUpdate) { - updateSingleCard(c); - } } public void updateSingleCard(final CardView c) { @@ -390,35 +332,6 @@ public enum CMatchUI implements ICDoc, IMenuProvider { } } - private final static boolean LOG_UIEVENTS = false; - - // UI-related events should arrive here - public void fireEvent(UiEvent uiEvent) { - if (LOG_UIEVENTS) { - System.out.println("UI: " + uiEvent.toString() + " \t\t " + FThreads.debugGetStackTraceItem(GuiBase.getInterface(), 4, true)); - } - uiEvents.post(uiEvent); - } - - public class MatchUiEventVisitor implements IUiEventVisitor { - @Override - public Void visit(UiEventBlockerAssigned event) { - updateSingleCard(event.blocker); - return null; - } - - @Override - public Void visit(UiEventAttackerDeclared event) { - updateSingleCard(event.attacker); - return null; - } - - @Subscribe - public void receiveEvent(UiEvent evt) { - evt.visit(this); - } - } - /* (non-Javadoc) * @see forge.gui.menubar.IMenuProvider#getMenus() */ @@ -469,19 +382,339 @@ public enum CMatchUI implements ICDoc, IMenuProvider { return panels; } - /** Concede game, bring up WinLose UI. */ - public void concede() { - if (FOverlay.SINGLETON_INSTANCE.getPanel().isShowing() || QuestDraftUtils.aiMatchInProgress) { - return; + @Override + public boolean resetForNewGame() { + if (MatchUtil.getGame() != null) { + Singletons.getControl().setCurrentScreen(FScreen.MATCH_SCREEN); + SOverlayUtils.hideOverlay(); + FOptionPane.showMessageDialog("Cannot start a new game while another game is already in progress."); + return false; //TODO: See if it's possible to run multiple games at once without crashing } + return true; + } - Singletons.getControl().ensureScreenActive(FScreen.MATCH_SCREEN); + @Override + public IButton getBtnOK(PlayerView playerView) { + return VMatchUI.SINGLETON_INSTANCE.getBtnOK(); + } - String userPrompt = - "This will end the current game and you will not be able to resume.\n\n" + - "Concede anyway?"; - if (FOptionPane.showConfirmDialog(userPrompt, "Concede Game?", "Concede", "Cancel", false)) { - Singletons.getControl().stopGame(); + @Override + public IButton getBtnCancel(PlayerView playerView) { + return VMatchUI.SINGLETON_INSTANCE.getBtnCancel(); + } + + @Override + public void focusButton(final IButton button) { + // ensure we don't steal focus from an overlay + if (!SOverlayUtils.overlayHasFocus()) { + FThreads.invokeInEdtLater(GuiBase.getInterface(), new Runnable() { + @Override + public void run() { + ((FButton)button).requestFocusInWindow(); + } + }); } } + + @Override + public void flashIncorrectAction() { + SDisplayUtil.remind(VPrompt.SINGLETON_INSTANCE); + } + + @Override + public void updatePhase() { + LocalGameView gameView = MatchUtil.getGameView(); + final PlayerView p = gameView.getPlayerTurn(); + final PhaseType ph = gameView.getPhase(); + final CMatchUI matchUi = CMatchUI.SINGLETON_INSTANCE; + PhaseLabel lbl = matchUi.getFieldViewFor(p).getPhaseIndicator().getLabelFor(ph); + + matchUi.resetAllPhaseButtons(); + if (lbl != null) { + lbl.setActive(true); + } + } + + @Override + public void updateTurn(final PlayerView player) { + VField nextField = CMatchUI.SINGLETON_INSTANCE.getFieldViewFor(player); + SDisplayUtil.showTab(nextField); + CPrompt.SINGLETON_INSTANCE.updateText(); + CMatchUI.SINGLETON_INSTANCE.repaintCardOverlays(); + } + + @Override + public void updatePlayerControl() { + CMatchUI.SINGLETON_INSTANCE.initHandViews(); + SLayoutIO.loadLayout(null); + VMatchUI.SINGLETON_INSTANCE.populate(); + for (VHand h : VMatchUI.SINGLETON_INSTANCE.getHands()) { + h.getLayoutControl().updateHand(); + } + } + + @Override + public void disableOverlay() { + showOverlay = false; + } + + @Override + public void enableOverlay() { + showOverlay = true; + } + + @Override + public void finishGame() { + new ViewWinLose(MatchUtil.getGameView()); + if (showOverlay) { + SOverlayUtils.showOverlay(); + } + } + + @Override + public void updateStack() { + CStack.SINGLETON_INSTANCE.update(); + } + + @Override + public void setPanelSelection(final CardView c) { + GuiUtils.setPanelSelection(c); + } + + @Override + public int getAbilityToPlay(List abilities, ITriggerEvent triggerEvent) { + if (triggerEvent == null) { + if (abilities.isEmpty()) { + return -1; + } + if (abilities.size() == 1) { + return abilities.get(0).getId(); + } + final SpellAbilityView choice = GuiChoose.oneOrNone("Choose ability to play", abilities); + return choice == null ? -1 : choice.getId(); + } + + if (abilities.isEmpty()) { + return -1; + } + if (abilities.size() == 1 && !abilities.get(0).isPromptIfOnlyPossibleAbility()) { + if (abilities.get(0).canPlay()) { + return abilities.get(0).getId(); //only return ability if it's playable, otherwise return null + } + return -1; + } + + //show menu if mouse was trigger for ability + final JPopupMenu menu = new JPopupMenu("Abilities"); + + boolean enabled; + boolean hasEnabled = false; + int shortcut = KeyEvent.VK_1; //use number keys as shortcuts for abilities 1-9 + for (final SpellAbilityView ab : abilities) { + enabled = ab.canPlay(); + if (enabled) { + hasEnabled = true; + } + GuiUtils.addMenuItem(menu, FSkin.encodeSymbols(ab.toString(), true), + shortcut > 0 ? KeyStroke.getKeyStroke(shortcut, 0) : null, + new Runnable() { + @Override + public void run() { + CPrompt.SINGLETON_INSTANCE.selectAbility(ab); + } + }, enabled); + if (shortcut > 0) { + shortcut++; + if (shortcut > KeyEvent.VK_9) { + shortcut = 0; //stop adding shortcuts after 9 + } + } + } + if (hasEnabled) { //only show menu if at least one ability can be played + SwingUtilities.invokeLater(new Runnable() { //use invoke later to ensure first ability selected by default + public void run() { + MenuSelectionManager.defaultManager().setSelectedPath(new MenuElement[]{menu, menu.getSubElements()[0]}); + } + }); + MouseEvent mouseEvent = ((MouseTriggerEvent)triggerEvent).getMouseEvent(); + menu.show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY()); + } + + return -1; //delay ability until choice made + } + + @Override + public void showPromptMessage(final PlayerView playerView, final String message) { + CMatchUI.SINGLETON_INSTANCE.showMessage(message); + } + + public Object showManaPool(final PlayerView player) { + return null; //not needed since mana pool icons are always visible + } + + @Override + public void hideManaPool(final PlayerView player, final Object zoneToRestore) { + //not needed since mana pool icons are always visible + } + + @Override + public boolean openZones(final Collection zones, final Map players) { + if (zones.size() == 1) { + switch (zones.iterator().next()) { + case Battlefield: + case Hand: + return true; //don't actually need to open anything, but indicate that zone can be opened + default: + return false; + } + } + return false; + } + + @Override + public void restoreOldZones(final Map playersToRestoreZonesFor) { + } + + @SuppressWarnings("unchecked") + @Override + public Map assignDamage(final CardView attacker, + final List blockers, final int damage, + final GameEntityView defender, final boolean overrideOrder) { + final Object[] result = { null }; // how else can I extract a value from EDT thread? + FThreads.invokeInEdtAndWait(GuiBase.getInterface(), new Runnable() { + @Override + public void run() { + VAssignDamage v = new VAssignDamage(attacker, blockers, damage, defender, overrideOrder); + result[0] = v.getDamageMap(); + }}); + return (Map)result[0]; + } + + @Override + public void hear(LobbyPlayer player, String message) { + FNetOverlay.SINGLETON_INSTANCE.addMessage(player.getName(), message); + } + + @Override + public void startNewMatch(final Match match) { + FThreads.invokeInEdtLater(GuiBase.getInterface(), new Runnable(){ + @Override + public void run() { + SOverlayUtils.startGameOverlay(); + SOverlayUtils.showOverlay(); + MatchUtil.startGame(match); + } + }); + } + + @Override + public void openView(List sortedPlayers, int humanCount) { + List sortedPlayerViews = new ArrayList(); + for (Player p : sortedPlayers) { + sortedPlayerViews.add(MatchUtil.getGameView().getPlayerView(p)); + } + CMatchUI.SINGLETON_INSTANCE.initMatch(sortedPlayerViews, humanCount != 1); + + actuateMatchPreferences(); + + Singletons.getControl().setCurrentScreen(FScreen.MATCH_SCREEN); + SDisplayUtil.showTab(EDocID.REPORT_LOG.getDoc()); + + // per player observers were set in CMatchUI.SINGLETON_INSTANCE.initMatch + //Set Field shown to current player. + if (humanCount > 0) { + final VField nextField = CMatchUI.SINGLETON_INSTANCE.getFieldViewFor(sortedPlayerViews.get(0)); + SDisplayUtil.showTab(nextField); + } + SOverlayUtils.hideOverlay(); + } + + @Override + public void afterGameEnd() { + Singletons.getView().getNavigationBar().closeTab(FScreen.MATCH_SCREEN); + } + + /** + * TODO: Needs to be reworked for efficiency with rest of prefs saves in + * codebase. + */ + public void writeMatchPreferences() { + final ForgePreferences prefs = FModel.getPreferences(); + final List fieldViews = VMatchUI.SINGLETON_INSTANCE.getFieldViews(); + + // AI field is at index [1] + PhaseIndicator fvAi = fieldViews.get(1).getPhaseIndicator(); + prefs.setPref(FPref.PHASE_AI_UPKEEP, String.valueOf(fvAi.getLblUpkeep().getEnabled())); + prefs.setPref(FPref.PHASE_AI_DRAW, String.valueOf(fvAi.getLblDraw().getEnabled())); + prefs.setPref(FPref.PHASE_AI_MAIN1, String.valueOf(fvAi.getLblMain1().getEnabled())); + prefs.setPref(FPref.PHASE_AI_BEGINCOMBAT, String.valueOf(fvAi.getLblBeginCombat().getEnabled())); + prefs.setPref(FPref.PHASE_AI_DECLAREATTACKERS, String.valueOf(fvAi.getLblDeclareAttackers().getEnabled())); + prefs.setPref(FPref.PHASE_AI_DECLAREBLOCKERS, String.valueOf(fvAi.getLblDeclareBlockers().getEnabled())); + prefs.setPref(FPref.PHASE_AI_FIRSTSTRIKE, String.valueOf(fvAi.getLblFirstStrike().getEnabled())); + prefs.setPref(FPref.PHASE_AI_COMBATDAMAGE, String.valueOf(fvAi.getLblCombatDamage().getEnabled())); + prefs.setPref(FPref.PHASE_AI_ENDCOMBAT, String.valueOf(fvAi.getLblEndCombat().getEnabled())); + prefs.setPref(FPref.PHASE_AI_MAIN2, String.valueOf(fvAi.getLblMain2().getEnabled())); + prefs.setPref(FPref.PHASE_AI_EOT, String.valueOf(fvAi.getLblEndTurn().getEnabled())); + prefs.setPref(FPref.PHASE_AI_CLEANUP, String.valueOf(fvAi.getLblCleanup().getEnabled())); + + // Human field is at index [0] + PhaseIndicator fvHuman = fieldViews.get(0).getPhaseIndicator(); + prefs.setPref(FPref.PHASE_HUMAN_UPKEEP, String.valueOf(fvHuman.getLblUpkeep().getEnabled())); + prefs.setPref(FPref.PHASE_HUMAN_DRAW, String.valueOf(fvHuman.getLblDraw().getEnabled())); + prefs.setPref(FPref.PHASE_HUMAN_MAIN1, String.valueOf(fvHuman.getLblMain1().getEnabled())); + prefs.setPref(FPref.PHASE_HUMAN_BEGINCOMBAT, String.valueOf(fvHuman.getLblBeginCombat().getEnabled())); + prefs.setPref(FPref.PHASE_HUMAN_DECLAREATTACKERS, String.valueOf(fvHuman.getLblDeclareAttackers().getEnabled())); + prefs.setPref(FPref.PHASE_HUMAN_DECLAREBLOCKERS, String.valueOf(fvHuman.getLblDeclareBlockers().getEnabled())); + prefs.setPref(FPref.PHASE_HUMAN_FIRSTSTRIKE, String.valueOf(fvHuman.getLblFirstStrike().getEnabled())); + prefs.setPref(FPref.PHASE_HUMAN_COMBATDAMAGE, String.valueOf(fvHuman.getLblCombatDamage().getEnabled())); + prefs.setPref(FPref.PHASE_HUMAN_ENDCOMBAT, String.valueOf(fvHuman.getLblEndCombat().getEnabled())); + prefs.setPref(FPref.PHASE_HUMAN_MAIN2, String.valueOf(fvHuman.getLblMain2().getEnabled())); + prefs.setPref(FPref.PHASE_HUMAN_EOT, fvHuman.getLblEndTurn().getEnabled()); + prefs.setPref(FPref.PHASE_HUMAN_CLEANUP, fvHuman.getLblCleanup().getEnabled()); + + prefs.save(); + } + + /** + * TODO: Needs to be reworked for efficiency with rest of prefs saves in + * codebase. + */ + private void actuateMatchPreferences() { + final ForgePreferences prefs = FModel.getPreferences(); + final List fieldViews = VMatchUI.SINGLETON_INSTANCE.getFieldViews(); + + // Human field is at index [0] + PhaseIndicator fvHuman = fieldViews.get(0).getPhaseIndicator(); + fvHuman.getLblUpkeep().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_UPKEEP)); + fvHuman.getLblDraw().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DRAW)); + fvHuman.getLblMain1().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_MAIN1)); + fvHuman.getLblBeginCombat().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_BEGINCOMBAT)); + fvHuman.getLblDeclareAttackers().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREATTACKERS)); + fvHuman.getLblDeclareBlockers().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREBLOCKERS)); + fvHuman.getLblFirstStrike().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_FIRSTSTRIKE)); + fvHuman.getLblCombatDamage().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_COMBATDAMAGE)); + fvHuman.getLblEndCombat().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_ENDCOMBAT)); + fvHuman.getLblMain2().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_MAIN2)); + fvHuman.getLblEndTurn().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_EOT)); + fvHuman.getLblCleanup().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_CLEANUP)); + + // AI field is at index [1], ... + for (int i = 1; i < fieldViews.size(); i++) { + PhaseIndicator fvAi = fieldViews.get(i).getPhaseIndicator(); + fvAi.getLblUpkeep().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_UPKEEP)); + fvAi.getLblDraw().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_DRAW)); + fvAi.getLblMain1().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_MAIN1)); + fvAi.getLblBeginCombat().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_BEGINCOMBAT)); + fvAi.getLblDeclareAttackers().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_DECLAREATTACKERS)); + fvAi.getLblDeclareBlockers().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_DECLAREBLOCKERS)); + fvAi.getLblFirstStrike().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_FIRSTSTRIKE)); + fvAi.getLblCombatDamage().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_COMBATDAMAGE)); + fvAi.getLblEndCombat().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_ENDCOMBAT)); + fvAi.getLblMain2().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_MAIN2)); + fvAi.getLblEndTurn().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_EOT)); + fvAi.getLblCleanup().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_CLEANUP)); + } + + //Singletons.getView().getViewMatch().setLayoutParams(prefs.getPref(FPref.UI_LAYOUT_PARAMS)); + } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/ControlWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/ControlWinLose.java index 31bce2b7bb8..c57a78890a4 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/ControlWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/ControlWinLose.java @@ -8,6 +8,7 @@ import javax.swing.JButton; import forge.Singletons; import forge.gui.SOverlayUtils; import forge.gui.framework.FScreen; +import forge.match.MatchUtil; import forge.view.IGameView; /** @@ -57,22 +58,21 @@ public class ControlWinLose { public void actionOnContinue() { SOverlayUtils.hideOverlay(); saveOptions(); - - Singletons.getControl().endCurrentGame(true, false); + MatchUtil.continueMatch(); } /** Action performed when "restart" button is pressed in default win/lose UI. */ public void actionOnRestart() { SOverlayUtils.hideOverlay(); saveOptions(); - Singletons.getControl().endCurrentGame(false, true); + MatchUtil.restartMatch(); } /** Action performed when "quit" button is pressed in default win/lose UI. */ public void actionOnQuit() { // Reset other stuff saveOptions(); - Singletons.getControl().endCurrentGame(false, false); + MatchUtil.endCurrentGame(); Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN); SOverlayUtils.hideOverlay(); } @@ -82,7 +82,7 @@ public class ControlWinLose { * with other game modes. */ public void saveOptions() { - Singletons.getControl().writeMatchPreferences(); + CMatchUI.SINGLETON_INSTANCE.writeMatchPreferences(); } /** diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java index f7712af1702..4506c648ca1 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java @@ -48,7 +48,7 @@ public class GauntletWinLose extends ControlWinLose { */ public GauntletWinLose(final ViewWinLose view0, final IGameView game0, final IGuiBase gui) { super(view0, game0); - controller = new GauntletWinLoseController(view0, game0, gui) { + controller = new GauntletWinLoseController(view0, game0) { @Override protected void showOutcome(String message1, String message2, FSkinProp icon, List lstEventNames, List lstEventRecords, int len, int num) { final JLabel lblTitle = new FLabel.Builder().text("Gauntlet Progress") diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/QuestDraftWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/QuestDraftWinLose.java index 3eea046d44d..a26d191bbc3 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/QuestDraftWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/QuestDraftWinLose.java @@ -26,6 +26,7 @@ import forge.Singletons; import forge.assets.FSkinProp; import forge.gui.SOverlayUtils; import forge.gui.framework.FScreen; +import forge.match.MatchUtil; import forge.model.FModel; import forge.player.GamePlayerUtil; import forge.quest.QuestController; @@ -76,7 +77,6 @@ public class QuestDraftWinLose extends ControlWinLose { */ @Override public final boolean populateCustomPanel() { - QuestController quest = FModel.getQuest(); final LobbyPlayer questLobbyPlayer = GamePlayerUtil.getQuestPlayer(); @@ -125,7 +125,7 @@ public class QuestDraftWinLose extends ControlWinLose { view.getBtnQuit().addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { - GuiBase.getInterface().endCurrentGame(); + MatchUtil.endCurrentGame(); QuestDraftUtils.matchInProgress = false; QuestDraftUtils.continueMatches(GuiBase.getInterface()); } @@ -140,7 +140,7 @@ public class QuestDraftWinLose extends ControlWinLose { @Override public void actionPerformed(final ActionEvent e) { if (FOptionPane.showOptionDialog("Quitting the match now will forfeit the tournament!\n\nReally quit?", "Really Quit Tournament?", FSkin.getImage(FSkinProp.ICO_WARNING).scale(2), new String[] { "Yes", "No" }, 1) == 0) { - GuiBase.getInterface().endCurrentGame(); + MatchUtil.endCurrentGame(); QuestDraftUtils.matchInProgress = false; QuestDraftUtils.continueMatches(GuiBase.getInterface()); } @@ -152,24 +152,20 @@ public class QuestDraftWinLose extends ControlWinLose { VSubmenuQuestDraft.SINGLETON_INSTANCE.populate(); return false; //We're not awarding anything, so never display the custom panel. - } public final void actionOnQuitMatch() { - CSubmenuDuels.SINGLETON_INSTANCE.update(); CSubmenuChallenges.SINGLETON_INSTANCE.update(); qData.setCurrentEvent(null); qData.save(); FModel.getQuestPreferences().save(); - Singletons.getControl().writeMatchPreferences(); + CMatchUI.SINGLETON_INSTANCE.writeMatchPreferences(); - Singletons.getControl().endCurrentGame(false, false); + MatchUtil.endCurrentGame(); Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN); SOverlayUtils.hideOverlay(); - } - } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java index 3644dd69017..3320cdfbe44 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java @@ -36,6 +36,7 @@ import com.google.common.collect.Lists; import forge.Singletons; import forge.gui.framework.FScreen; +import forge.match.MatchUtil; import forge.screens.match.controllers.CDock; import forge.screens.match.views.VField; import forge.toolbox.FSkin; @@ -363,7 +364,7 @@ public enum TargetingOverlay { if (overlaystate == 0) { return; } // Arc drawing - assembleArcs(Singletons.getControl().getGameView().getCombat()); + assembleArcs(MatchUtil.getGameView().getCombat()); if (arcsCombat.isEmpty() && arcsOther.isEmpty()) { return; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java index f4465cfc5d8..585bcb47797 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java @@ -37,8 +37,8 @@ import net.miginfocom.swing.MigLayout; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import forge.control.FControl; import forge.gui.SOverlayUtils; +import forge.match.MatchUtil; import forge.toolbox.FButton; import forge.toolbox.FLabel; import forge.toolbox.FScrollPane; @@ -445,7 +445,7 @@ public class VAssignDamage { if (card == null) { if (defender instanceof PlayerView) { final PlayerView p = (PlayerView)defender; - lethalDamage = attackerHasInfect ? FControl.instance.getGameView().getPoisonCountersToLose() - p.getPoisonCounters() : p.getLife(); + lethalDamage = attackerHasInfect ? MatchUtil.getGameView().getPoisonCountersToLose() - p.getPoisonCounters() : p.getLife(); } else if (defender instanceof CardView) { // planeswalker final CardView pw = (CardView)defender; lethalDamage = pw.getOriginal().getLoyalty(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/VMatchUI.java index 728b5e3b417..edfcbfac42f 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/VMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VMatchUI.java @@ -1,10 +1,11 @@ package forge.screens.match; -import forge.Singletons; import forge.gui.framework.*; +import forge.match.MatchUtil; import forge.properties.ForgePreferences; import forge.screens.match.views.*; import forge.sound.MusicPlaylist; +import forge.sound.SoundSystem; import forge.toolbox.FButton; import forge.view.FView; @@ -93,7 +94,7 @@ public enum VMatchUI implements IVTopLevelUI { } } - if (Singletons.getControl().getGameView().isCommandZoneNeeded()) { + if (MatchUtil.getGameView().isCommandZoneNeeded()) { // Add extra players alternatively to existing user/AI field panels. for (int i = 2; i < lstCommands.size(); i++) { // If already in layout, no need to add again. @@ -102,7 +103,8 @@ public enum VMatchUI implements IVTopLevelUI { lstCommands.get(i % 2).getParentCell().addDoc(cmdView); } } - } else { + } + else { //If game goesn't need command zone, remove it from existing field panels for (int i = 0; i < 2; i++) { VCommand cmdView = lstCommands.get(i); @@ -205,13 +207,13 @@ public enum VMatchUI implements IVTopLevelUI { */ @Override public boolean onClosing(FScreen screen) { - if (!Singletons.getControl().getGameView().isGameOver()) { - CMatchUI.SINGLETON_INSTANCE.concede(); + if (!MatchUtil.getGameView().isGameOver()) { + MatchUtil.concede(); return false; //delay hiding tab even if concede successful } //switch back to menus music when closing screen - Singletons.getControl().getSoundSystem().setBackgroundMusic(MusicPlaylist.MENUS); + SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS); wasClosed = true; return true; 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 af707f6ef3f..c05d761620b 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 @@ -69,7 +69,7 @@ public class ViewWinLose implements IWinLoseView { control = new QuestDraftWinLose(this, game0); break; case Draft: - if (!FModel.getGauntletMini(GuiBase.getInterface()).isGauntletDraft()) { + if (!FModel.getGauntletMini().isGauntletDraft()) { break; } case Sealed: diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDev.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDev.java index 15df768d59d..75724df26b9 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDev.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDev.java @@ -4,9 +4,9 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; -import forge.Singletons; import forge.UiCommand; import forge.gui.framework.ICDoc; +import forge.match.MatchUtil; import forge.screens.match.views.VDev; /** @@ -27,7 +27,7 @@ public enum CDev implements ICDoc { public void togglePlayManyLandsPerTurn() { boolean newValue = !VDev.SINGLETON_INSTANCE.getLblUnlimitedLands().getToggled(); VDev.SINGLETON_INSTANCE.getLblUnlimitedLands().setToggled(newValue); - Singletons.getControl().getGameView().cheat().setCanPlayUnlimitedLands(newValue); + MatchUtil.getGameView().cheat().setCanPlayUnlimitedLands(newValue); } private final MouseListener madViewAll = new MouseAdapter() { @@ -39,7 +39,7 @@ public enum CDev implements ICDoc { public void toggleViewAllCards() { boolean newValue = !VDev.SINGLETON_INSTANCE.getLblViewAll().getToggled(); VDev.SINGLETON_INSTANCE.getLblViewAll().setToggled(newValue); - Singletons.getControl().getGameView().cheat().setViewAllCards(newValue); + MatchUtil.getGameView().cheat().setViewAllCards(newValue); } private final MouseListener madMana = new MouseAdapter() { @@ -49,7 +49,7 @@ public enum CDev implements ICDoc { } }; public void generateMana() { - Singletons.getControl().getGameView().cheat().generateMana(); + MatchUtil.getGameView().cheat().generateMana(); } private final MouseListener madSetup = new MouseAdapter() { @@ -59,7 +59,7 @@ public enum CDev implements ICDoc { } }; public void setupGameState() { - Singletons.getControl().getGameView().cheat().setupGameState(); + MatchUtil.getGameView().cheat().setupGameState(); } private final MouseListener madTutor = new MouseAdapter() { @@ -69,7 +69,7 @@ public enum CDev implements ICDoc { } }; public void tutorForCard() { - Singletons.getControl().getGameView().cheat().tutorForCard(); + MatchUtil.getGameView().cheat().tutorForCard(); } private final MouseListener madCardToHand = new MouseAdapter() { @@ -79,7 +79,7 @@ public enum CDev implements ICDoc { } }; public void addCardToHand() { - Singletons.getControl().getGameView().cheat().addCardToHand(); + MatchUtil.getGameView().cheat().addCardToHand(); } private final MouseListener madCounter = new MouseAdapter() { @@ -89,7 +89,7 @@ public enum CDev implements ICDoc { } }; public void addCounterToPermanent() { - Singletons.getControl().getGameView().cheat().addCountersToPermanent(); + MatchUtil.getGameView().cheat().addCountersToPermanent(); } private final MouseListener madTap = new MouseAdapter() { @@ -99,7 +99,7 @@ public enum CDev implements ICDoc { } }; public void tapPermanent() { - Singletons.getControl().getGameView().cheat().tapPermanents(); + MatchUtil.getGameView().cheat().tapPermanents(); } private final MouseListener madUntap = new MouseAdapter() { @@ -109,7 +109,7 @@ public enum CDev implements ICDoc { } }; public void untapPermanent() { - Singletons.getControl().getGameView().cheat().untapPermanents(); + MatchUtil.getGameView().cheat().untapPermanents(); } private final MouseListener madLife = new MouseAdapter() { @@ -119,7 +119,7 @@ public enum CDev implements ICDoc { } }; public void setPlayerLife() { - Singletons.getControl().getGameView().cheat().setPlayerLife(); + MatchUtil.getGameView().cheat().setPlayerLife(); } private final MouseListener madWinGame = new MouseAdapter() { @@ -129,7 +129,7 @@ public enum CDev implements ICDoc { } }; public void winGame() { - Singletons.getControl().getGameView().cheat().winGame(); + MatchUtil.getGameView().cheat().winGame(); } private final MouseListener madCardToBattlefield = new MouseAdapter() { @@ -139,7 +139,7 @@ public enum CDev implements ICDoc { } }; public void addCardToBattlefield() { - Singletons.getControl().getGameView().cheat().addCardToBattlefield(); + MatchUtil.getGameView().cheat().addCardToBattlefield(); } private final MouseListener madRiggedRoll = new MouseAdapter() { @@ -149,7 +149,7 @@ public enum CDev implements ICDoc { } }; public void riggedPlanerRoll() { - Singletons.getControl().getGameView().cheat().riggedPlanarRoll(); + MatchUtil.getGameView().cheat().riggedPlanarRoll(); } private final MouseListener madWalkToPlane = new MouseAdapter() { @@ -159,7 +159,7 @@ public enum CDev implements ICDoc { } }; public void planeswalkTo() { - Singletons.getControl().getGameView().cheat().planeswalkTo(); + MatchUtil.getGameView().cheat().planeswalkTo(); } //========== End mouse listener inits @@ -198,7 +198,7 @@ public enum CDev implements ICDoc { */ @Override public void update() { - VDev.SINGLETON_INSTANCE.getLblUnlimitedLands().setToggled(Singletons.getControl().getGameView().canPlayUnlimitedLands()); - VDev.SINGLETON_INSTANCE.getLblViewAll().setToggled(Singletons.getControl().getGameView().canViewAllCards()); + VDev.SINGLETON_INSTANCE.getLblUnlimitedLands().setToggled(MatchUtil.getGameView().canPlayUnlimitedLands()); + VDev.SINGLETON_INSTANCE.getLblViewAll().setToggled(MatchUtil.getGameView().canViewAllCards()); } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDock.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDock.java index 82012b4255f..f6fc6477083 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDock.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDock.java @@ -24,17 +24,16 @@ import forge.GuiBase; import forge.Singletons; import forge.UiCommand; import forge.assets.FSkinProp; -import forge.control.FControl; import forge.deck.Deck; import forge.deckchooser.FDeckViewer; import forge.gui.SOverlayUtils; import forge.gui.framework.ICDoc; import forge.gui.framework.SLayoutIO; +import forge.match.MatchUtil; import forge.model.FModel; import forge.player.GamePlayerUtil; import forge.properties.FileLocation; import forge.properties.ForgePreferences.FPref; -import forge.screens.match.CMatchUI; import forge.screens.match.views.VDock; import forge.toolbox.FSkin; import forge.toolbox.SaveOpenDialog; @@ -110,7 +109,7 @@ public enum CDock implements ICDoc { * View deck list. */ public void viewDeckList() { - final Deck deck = FControl.instance.getGameView().getDeck(GamePlayerUtil.getGuiPlayer()); + final Deck deck = MatchUtil.getGameView().getDeck(GamePlayerUtil.getGuiPlayer()); if (deck != null) { FDeckViewer.show(deck); } @@ -196,7 +195,7 @@ public enum CDock implements ICDoc { VDock.SINGLETON_INSTANCE.getBtnConcede().setCommand(new UiCommand() { @Override public void run() { - CMatchUI.SINGLETON_INSTANCE.concede(); + MatchUtil.concede(); } }); VDock.SINGLETON_INSTANCE.getBtnSettings().setCommand(new UiCommand() { @@ -238,7 +237,7 @@ public enum CDock implements ICDoc { VDock.SINGLETON_INSTANCE.getBtnAlphaStrike().setCommand(new UiCommand() { @Override public void run() { - Singletons.getControl().getGameView().alphaStrike(); + MatchUtil.getGameView().alphaStrike(); } }); VDock.SINGLETON_INSTANCE.getBtnTargeting().setCommand(new UiCommand() { diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java index 5caf7196a94..62f7fbaaef7 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java @@ -28,6 +28,7 @@ import forge.UiCommand; import forge.game.zone.ZoneType; import forge.gui.framework.ICDoc; import forge.match.MatchConstants; +import forge.match.MatchUtil; import forge.screens.match.ZoneAction; import forge.screens.match.views.VField; import forge.toolbox.MouseTriggerEvent; @@ -85,7 +86,7 @@ public class CField implements ICDoc { Function manaAction = new Function() { public Void apply(Byte colorCode) { if (CField.this.player.getLobbyPlayer() == Singletons.getControl().getGuiPlayer()) { - Singletons.getControl().getGameView().useMana(colorCode.byteValue()); + MatchUtil.getGameView().useMana(colorCode.byteValue()); } return null; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java index 0f5f40c60cd..9ab8a43ded8 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java @@ -28,10 +28,10 @@ import javax.swing.JButton; import forge.FThreads; import forge.GuiBase; -import forge.Singletons; import forge.UiCommand; import forge.gui.framework.ICDoc; import forge.gui.framework.SDisplayUtil; +import forge.match.MatchUtil; import forge.screens.match.views.VPrompt; import forge.toolbox.FSkin; import forge.util.ITriggerEvent; @@ -90,31 +90,31 @@ public enum CPrompt implements ICDoc { } public void selectButtonOk() { - Singletons.getControl().getGameView().selectButtonOk(); + MatchUtil.getGameView().selectButtonOk(); } public void selectButtonCancel() { - Singletons.getControl().getGameView().selectButtonCancel(); + MatchUtil.getGameView().selectButtonCancel(); } public boolean passPriority() { - return Singletons.getControl().getGameView().passPriority(); + return MatchUtil.getGameView().passPriority(); } public boolean passPriorityUntilEndOfTurn() { - return Singletons.getControl().getGameView().passPriorityUntilEndOfTurn(); + return MatchUtil.getGameView().passPriorityUntilEndOfTurn(); } public void selectPlayer(final PlayerView player, final ITriggerEvent triggerEvent) { - Singletons.getControl().getGameView().selectPlayer(player, triggerEvent); + MatchUtil.getGameView().selectPlayer(player, triggerEvent); } public void selectCard(final CardView card, final ITriggerEvent triggerEvent) { - Singletons.getControl().getGameView().selectCard(card, triggerEvent); + MatchUtil.getGameView().selectCard(card, triggerEvent); } public void selectAbility(final SpellAbilityView sa) { - Singletons.getControl().getGameView().selectAbility(sa); + MatchUtil.getGameView().selectAbility(sa); } /** @param s0   {@link java.lang.String} */ @@ -148,7 +148,7 @@ public enum CPrompt implements ICDoc { public void updateText() { FThreads.assertExecutedByEdt(GuiBase.getInterface(), true); - final IGameView game = Singletons.getControl().getGameView(); + final IGameView game = MatchUtil.getGameView(); final String text = String.format("T:%d G:%d/%d [%s]", game.getTurnNumber(), game.getNumPlayedGamesInMatch() + 1, game.getNumGamesInMatch(), game.getGameType()); view.getLblGames().setText(text); view.getLblGames().setToolTipText(String.format("%s: Game #%d of %d, turn %d", game.getGameType(), game.getNumPlayedGamesInMatch() + 1, game.getNumGamesInMatch(), game.getTurnNumber())); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/menus/DevModeMenu.java b/forge-gui-desktop/src/main/java/forge/screens/match/menus/DevModeMenu.java index 7096af554bf..0a4e35cf4fe 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/menus/DevModeMenu.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/menus/DevModeMenu.java @@ -1,6 +1,6 @@ package forge.screens.match.menus; -import forge.Singletons; +import forge.match.MatchUtil; import forge.menus.MenuUtil; import forge.screens.match.controllers.CDev; @@ -67,8 +67,8 @@ public class DevModeMenu implements ActionListener { menu.add(getMenuItem(DevMenuItem.WIN_GAME)); menu.addSeparator(); menu.add(getMenuItem(DevMenuItem.SETUP_GAME_STATE)); - menu.add(getCheckboxMenuItem(DevMenuItem.PLAY_UNLIMITED_LANDS, Singletons.getControl().getGameView().canPlayUnlimitedLands())); - menu.add(getCheckboxMenuItem(DevMenuItem.VIEW_ALL, Singletons.getControl().getGameView().canViewAllCards())); + menu.add(getCheckboxMenuItem(DevMenuItem.PLAY_UNLIMITED_LANDS, MatchUtil.getGameView().canPlayUnlimitedLands())); + menu.add(getCheckboxMenuItem(DevMenuItem.VIEW_ALL, MatchUtil.getGameView().canViewAllCards())); menu.add(getMenuItem(DevMenuItem.ADD_COUNTER)); menu.addSeparator(); menu.add(getMenuItem(DevMenuItem.TAP_PERMANENT)); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/menus/GameMenu.java b/forge-gui-desktop/src/main/java/forge/screens/match/menus/GameMenu.java index d0518a45c50..e2ac93367e1 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/menus/GameMenu.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/menus/GameMenu.java @@ -8,14 +8,12 @@ import javax.swing.ButtonGroup; import javax.swing.JMenu; import javax.swing.JPopupMenu; -import forge.Singletons; import forge.assets.FSkinProp; -import forge.control.FControl; +import forge.match.MatchUtil; import forge.menus.MenuUtil; import forge.model.FModel; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; -import forge.screens.match.CMatchUI; import forge.screens.match.VAutoYields; import forge.screens.match.controllers.CDock; import forge.toolbox.FSkin.SkinIcon; @@ -85,7 +83,7 @@ public final class GameMenu { return new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - Singletons.getControl().getGameView().tryUndoLastAction(); + MatchUtil.getGameView().tryUndoLastAction(); } }; } @@ -102,7 +100,7 @@ public final class GameMenu { return new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - CMatchUI.SINGLETON_INSTANCE.concede(); + MatchUtil.concede(); } }; } @@ -119,7 +117,7 @@ public final class GameMenu { return new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - Singletons.getControl().getGameView().alphaStrike(); + MatchUtil.alphaStrike(); } }; } @@ -203,8 +201,7 @@ public final class GameMenu { return new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - final FControl control = Singletons.getControl(); - final VAutoYields autoYields = new VAutoYields(control.getGameView()); + final VAutoYields autoYields = new VAutoYields(MatchUtil.getGameView()); autoYields.showAutoYields(); } }; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java index 2cd928552cf..c337e238182 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java @@ -25,13 +25,13 @@ import javax.swing.JPanel; import javax.swing.SwingConstants; import net.miginfocom.swing.MigLayout; -import forge.Singletons; import forge.gui.CardPicturePanel; import forge.gui.WrapLayout; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; import forge.gui.framework.IVDoc; +import forge.match.MatchUtil; import forge.screens.match.controllers.CAntes; import forge.toolbox.FLabel; import forge.toolbox.FScrollPane; @@ -120,7 +120,7 @@ public enum VAntes implements IVDoc { allAntes.clear(); pnl.removeAll(); - for (final PlayerView p : Singletons.getControl().getGameView().getPlayers()) { + for (final PlayerView p : MatchUtil.getGameView().getPlayers()) { for (final CardView c : p.getAnteCards()) { final AntePanel pnlTemp = new AntePanel(c); allAntes.add(pnlTemp); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VField.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VField.java index 58accc375d4..f93a944803a 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VField.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VField.java @@ -33,7 +33,7 @@ import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; import forge.gui.framework.IVDoc; -import forge.screens.match.CMatchUI; +import forge.match.MatchUtil; import forge.screens.match.controllers.CField; import forge.toolbox.FLabel; import forge.toolbox.FScrollPane; @@ -110,15 +110,17 @@ public class VField implements IVDoc { @Override public void mouseEntered(final MouseEvent e) { avatarArea.setOpaque(true); - if (!isHighlighted()) + if (!isHighlighted()) { avatarArea.setBorder(new FSkin.LineSkinBorder(FSkin.getColor(FSkin.Colors.CLR_BORDERS))); + } } @Override public void mouseExited(final MouseEvent e) { avatarArea.setOpaque(false); - if (!isHighlighted()) + if (!isHighlighted()) { avatarArea.setBorder(borderAvatarSimple); + } } }); @@ -243,7 +245,7 @@ public class VField implements IVDoc { } public boolean isHighlighted() { - return CMatchUI.SINGLETON_INSTANCE.isHighlighted(player); + return MatchUtil.isHighlighted(player); } /** diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VLog.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VLog.java index 5fbf11f2d5b..a9f37a925c6 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VLog.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VLog.java @@ -25,13 +25,13 @@ import net.miginfocom.swing.MigLayout; import com.google.common.collect.Lists; -import forge.Singletons; import forge.game.GameLogEntry; import forge.game.GameLogEntryType; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; import forge.gui.framework.IVDoc; +import forge.match.MatchUtil; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; import forge.screens.match.GameLogPanel; @@ -128,7 +128,7 @@ public enum VLog implements IVDoc { */ public void updateConsole() { if (isGameLogConsoleVisible()) { - LocalGameView model = Singletons.getControl().getGameView(); + LocalGameView model = MatchUtil.getGameView(); resetDisplayIfNewGame(model); displayNewGameLogEntries(model); // Important : refreshLayout() needs to be called every update. diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VPlayers.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VPlayers.java index 58c60cde189..77b6612ce93 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VPlayers.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VPlayers.java @@ -28,11 +28,11 @@ import javax.swing.ScrollPaneConstants; import com.google.common.collect.Lists; import net.miginfocom.swing.MigLayout; -import forge.Singletons; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; import forge.gui.framework.IVDoc; +import forge.match.MatchUtil; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; import forge.screens.match.controllers.CPlayers; @@ -145,7 +145,7 @@ public enum VPlayers implements IVDoc { public void update() { // No need to update if this panel isn't showing if (parentCell == null || !this.equals(parentCell.getSelected())) { return; } - boolean isCommander = Singletons.getControl().getGameView().isCommander(); + boolean isCommander = MatchUtil.getGameView().isCommander(); for(final Entry rr : infoLBLs.entrySet()) { PlayerView p0 = rr.getKey(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java index 518568b6650..87b86c2c50a 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java @@ -36,7 +36,6 @@ import javax.swing.border.EmptyBorder; import net.miginfocom.swing.MigLayout; import forge.ImageCache; -import forge.Singletons; import forge.card.CardDetailUtil; import forge.card.CardDetailUtil.DetailColors; import forge.game.player.Player; @@ -44,6 +43,7 @@ import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; import forge.gui.framework.IVDoc; +import forge.match.MatchUtil; import forge.screens.match.CMatchUI; import forge.screens.match.controllers.CPrompt; import forge.screens.match.controllers.CStack; @@ -137,7 +137,7 @@ public enum VStack implements IVDoc { * @param models * @param viewer */ public void updateStack() { - final LocalGameView model = Singletons.getControl().getGameView(); + final LocalGameView model = MatchUtil.getGameView(); final List items = model.getStack(); tab.setText("Stack : " + items.size()); @@ -181,7 +181,7 @@ public enum VStack implements IVDoc { public StackInstanceTextArea(final IGameView game, final StackItemView item) { sourceCard = item.getSource(); - final Player localPlayer = Singletons.getControl().getCurrentPlayer(); + final Player localPlayer = MatchUtil.getCurrentPlayer(); final String txt = (item.isOptionalTrigger() && item.getActivatingPlayer().equals(localPlayer) ? "(OPTIONAL) " : "") + item.getText(); diff --git a/forge-gui-desktop/src/main/java/forge/view/FFrame.java b/forge-gui-desktop/src/main/java/forge/view/FFrame.java index c4c9975ca57..5eaabe35b51 100644 --- a/forge-gui-desktop/src/main/java/forge/view/FFrame.java +++ b/forge-gui-desktop/src/main/java/forge/view/FFrame.java @@ -1,8 +1,8 @@ package forge.view; -import forge.Singletons; import forge.gui.framework.SDisplayUtil; import forge.gui.framework.SResizingUtil; +import forge.match.MatchUtil; import forge.model.FModel; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; @@ -78,14 +78,14 @@ public class FFrame extends SkinnedFrame implements ITitleBarOwner { private void pause() { if (paused || !isMainFrame) { return; } - Singletons.getControl().getSoundSystem().pause(); + MatchUtil.pause(); paused = true; } private void resume() { if (!paused || !isMainFrame) { return; } - Singletons.getControl().getSoundSystem().resume(); + MatchUtil.resume(); paused = false; } diff --git a/forge-gui-desktop/src/main/java/forge/view/FView.java b/forge-gui-desktop/src/main/java/forge/view/FView.java index 7e6e7fa0cd1..8234d2cf256 100644 --- a/forge-gui-desktop/src/main/java/forge/view/FView.java +++ b/forge-gui-desktop/src/main/java/forge/view/FView.java @@ -16,6 +16,7 @@ import forge.screens.home.VHomeUI; import forge.screens.match.TargetingOverlay; import forge.screens.match.VMatchUI; import forge.sound.MusicPlaylist; +import forge.sound.SoundSystem; import forge.toolbox.*; import forge.toolbox.FSkin.SkinnedLayeredPane; import forge.util.BuildInfo; @@ -223,7 +224,7 @@ public enum FView { } //start background music - Singletons.getControl().getSoundSystem().setBackgroundMusic(MusicPlaylist.MENUS); + SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS); } // will populate remainingFiles with remaining files if not null, returns whether any files have diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java index 664132d1494..2eccd5eb3e3 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java @@ -38,9 +38,9 @@ import forge.ImageCache; import forge.card.CardEdition; import forge.card.mana.ManaCost; import forge.gui.CardContainer; +import forge.match.MatchUtil; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; -import forge.screens.match.CMatchUI; import forge.toolbox.CardFaceSymbols; import forge.toolbox.FSkin.SkinnedPanel; import forge.toolbox.IDisposable; @@ -310,7 +310,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl final int offset = this.isTapped() ? 1 : 0; // Magenta outline for when card was chosen to pay - if (CMatchUI.SINGLETON_INSTANCE.isUsedToPay(this.getCard())) { + if (MatchUtil.isUsedToPay(this.getCard())) { g2d.setColor(Color.magenta); final int n2 = Math.max(1, Math.round(2 * this.cardWidth * CardPanel.SELECTED_BORDER_SIZE)); g2d.fillRoundRect(this.cardXOffset - n2, (this.cardYOffset - n2) + offset, this.cardWidth + (n2 * 2), this.cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); @@ -480,7 +480,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl CardFaceSymbols.drawSymbol("phasing", g, stateXSymbols, ySymbols); } - if (CMatchUI.SINGLETON_INSTANCE.isUsedToPay(card)) { + if (MatchUtil.isUsedToPay(card)) { CardFaceSymbols.drawSymbol("sacrifice", g, (this.cardXOffset + (this.cardWidth / 2)) - 20, (this.cardYOffset + (this.cardHeight / 2)) - 20); } diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 60b27bca318..a5edeafdf2f 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -18,6 +18,7 @@ import forge.error.BugReporter; import forge.error.ExceptionHandler; import forge.interfaces.IDeviceAdapter; import forge.interfaces.IGuiBase; +import forge.match.MatchUtil; import forge.model.FModel; import forge.properties.ForgeConstants; import forge.properties.ForgePreferences; @@ -25,7 +26,7 @@ import forge.properties.ForgePreferences.FPref; import forge.screens.FScreen; import forge.screens.SplashScreen; import forge.screens.home.HomeScreen; -import forge.screens.match.FControl; +import forge.screens.match.MatchController; import forge.sound.MusicPlaylist; import forge.sound.SoundSystem; import forge.toolbox.FContainer; @@ -50,7 +51,6 @@ public class Forge implements ApplicationListener { private static SplashScreen splashScreen; private static KeyInputAdapter keyInputAdapter; private static boolean exited; - private static SoundSystem soundSystem; private static final Stack screens = new Stack(); public static ApplicationListener getApp(Clipboard clipboard0, IDeviceAdapter deviceAdapter0, String assetDir0) { @@ -59,7 +59,6 @@ public class Forge implements ApplicationListener { deviceAdapter = deviceAdapter0; final IGuiBase gui = new GuiMobile(assetDir0); GuiBase.setInterface(gui); - soundSystem = new SoundSystem(gui); } return app; } @@ -72,6 +71,8 @@ public class Forge implements ApplicationListener { //install our error handler ExceptionHandler.registerErrorHandling(GuiBase.getInterface()); + MatchUtil.setController(MatchController.instance); + graphics = new Graphics(); splashScreen = new SplashScreen(); Gdx.input.setInputProcessor(new MainInputProcessor()); @@ -115,7 +116,7 @@ public class Forge implements ApplicationListener { FSkin.loadFull(splashScreen); - soundSystem.setBackgroundMusic(MusicPlaylist.MENUS); //start background music + SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS); //start background music Gdx.input.setCatchBackKey(true); Gdx.input.setCatchMenuKey(true); @@ -218,10 +219,6 @@ public class Forge implements ApplicationListener { } } - public static SoundSystem getSoundSystem() { - return soundSystem; - } - @Override public void render() { try { @@ -272,12 +269,12 @@ public class Forge implements ApplicationListener { @Override public void pause() { - FControl.pause(); + MatchUtil.pause(); } @Override public void resume() { - FControl.resume(); + MatchUtil.resume(); } @Override @@ -289,7 +286,7 @@ public class Forge implements ApplicationListener { } screens.clear(); graphics.dispose(); - soundSystem.dispose(); + SoundSystem.instance.dispose(); } //log message to Forge.log file diff --git a/forge-gui-mobile/src/forge/GuiMobile.java b/forge-gui-mobile/src/forge/GuiMobile.java index facc1ba8276..3b9c47ea4e4 100644 --- a/forge-gui-mobile/src/forge/GuiMobile.java +++ b/forge-gui-mobile/src/forge/GuiMobile.java @@ -3,11 +3,6 @@ package forge; import java.io.File; import java.util.Collection; import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import org.apache.commons.lang3.tuple.Pair; - import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Application.ApplicationType; import com.badlogic.gdx.graphics.Texture; @@ -26,22 +21,11 @@ import forge.deck.Deck; import forge.deck.FDeckViewer; import forge.deck.FSideboardDialog; import forge.error.BugReportDialog; -import forge.events.UiEvent; -import forge.game.GameType; -import forge.game.Match; -import forge.game.phase.PhaseType; import forge.game.player.IHasIcon; -import forge.game.player.RegisteredPlayer; -import forge.game.zone.ZoneType; -import forge.interfaces.IButton; import forge.interfaces.IGuiBase; import forge.item.PaperCard; import forge.properties.ForgeConstants; -import forge.screens.match.FControl; -import forge.screens.match.views.VPlayerPanel; -import forge.screens.match.views.VPhaseIndicator.PhaseLabel; -import forge.screens.match.views.VPlayerPanel.InfoTab; -import forge.screens.match.winlose.ViewWinLose; +import forge.screens.match.MatchController; import forge.screens.quest.QuestMenu; import forge.sound.AudioClip; import forge.sound.AudioMusic; @@ -50,16 +34,10 @@ import forge.sound.IAudioMusic; import forge.toolbox.FOptionPane; import forge.toolbox.GuiChoose; import forge.util.FileUtil; -import forge.util.ITriggerEvent; import forge.util.ThreadUtil; import forge.util.WaitCallback; import forge.util.WaitRunnable; -import forge.util.gui.SGuiChoose; import forge.view.CardView; -import forge.view.CombatView; -import forge.view.GameEntityView; -import forge.view.PlayerView; -import forge.view.SpellAbilityView; public class GuiMobile implements IGuiBase { private final String assetsDir; @@ -236,100 +214,6 @@ public class GuiMobile implements IGuiBase { return false; } - @Override - public IButton getBtnOK(PlayerView player) { - return FControl.getView().getPrompt(player).getBtnOk(); - } - - @Override - public IButton getBtnCancel(PlayerView player) { - return FControl.getView().getPrompt(player).getBtnCancel(); - } - - @Override - public void showPromptMessage(final PlayerView player, String message) { - FControl.getView().getPrompt(player).setMessage(message); - } - - @Override - public void focusButton(final IButton button) { - //not needed for mobile game - } - - @Override - public void flashIncorrectAction() { - //SDisplayUtil.remind(VPrompt.SINGLETON_INSTANCE); //TODO - } - - @Override - public void updatePhase() { - final PlayerView p = FControl.getGameView().getPlayerTurn(); - final PhaseType ph = FControl.getGameView().getPhase(); - - PhaseLabel lbl = FControl.getPlayerPanel(p).getPhaseIndicator().getLabel(ph); - - FControl.resetAllPhaseButtons(); - if (lbl != null) { - lbl.setActive(true); - } - } - - @Override - public void updateTurn(final PlayerView player) { - //VField nextField = FControl.getFieldViewFor(event.turnOwner); - //SDisplayUtil.showTab(nextField); - } - - @Override - public void updatePlayerControl() { - //TODO - } - - @Override - public void disableOverlay() { - } - - @Override - public void enableOverlay() { - } - - @Override - public void finishGame() { - new ViewWinLose(FControl.getGameView()).setVisible(true); - } - - @Override - public void updateStack() { - FControl.getView().getStack().update(); - } - - @Override - public void startMatch(GameType gameType, List players) { - FControl.startMatch(gameType, players); - } - - @Override - public void setPanelSelection(final CardView c) { - //GuiUtils.setPanelSelection(c); //TODO - } - - @Override - public int getAbilityToPlay(List abilities, ITriggerEvent triggerEvent) { - if (abilities.isEmpty()) { - return -1; - } - if (abilities.size() == 1) { - return abilities.get(0).getId(); - } - final SpellAbilityView choice = SGuiChoose.oneOrNone(this, "Choose ability to play", abilities); - return choice == null ? -1 : choice.getId(); - } - - @Override - public void hear(LobbyPlayer player, String message) { - //FNetOverlay.SINGLETON_INSTANCE.addMessage(player.getName(), message); //TODO - } - @Override public int getAvatarCount() { if (FSkin.isLoaded()) { @@ -338,130 +222,11 @@ public class GuiMobile implements IGuiBase { return 0; } - @Override - public void fireEvent(UiEvent e) { - FControl.fireEvent(e); - } - @Override public void setCard(final CardView card) { //doesn't need to do anything } - @Override - public void showCombat(final CombatView combat) { - FControl.showCombat(combat); - } - - @Override - public void setUsedToPay(final CardView card, final boolean b) { - FControl.setUsedToPay(card, b); - } - - @Override - public void setHighlighted(final PlayerView player, boolean b) { - FControl.setHighlighted(player, b); - } - - @Override - public boolean stopAtPhase(final PlayerView playerTurn, final PhaseType phase) { - return FControl.stopAtPhase(playerTurn, phase); - } - - @Override - public Object showManaPool(final PlayerView player) { - VPlayerPanel playerPanel = FControl.getPlayerPanel(player); - InfoTab oldSelectedTab = playerPanel.getSelectedTab(); - playerPanel.setSelectedTab(playerPanel.getManaPoolTab()); - return oldSelectedTab; - } - - @Override - public void hideManaPool(final PlayerView player, final Object zoneToRestore) { - VPlayerPanel playerPanel = FControl.getPlayerPanel(player); - if (zoneToRestore == playerPanel.getManaPoolTab()) { - return; //if mana pool was selected previously, we don't need to switch back to anything - } - if (playerPanel.getSelectedTab() != playerPanel.getManaPoolTab()) { - return; //if player switch away from mana pool already, don't change anything - } - playerPanel.setSelectedTab((InfoTab)zoneToRestore); - } - - @Override - public boolean openZones(Collection zones, Map players) { - if (zones.size() == 1) { - ZoneType zoneType = zones.iterator().next(); - switch (zoneType) { - case Battlefield: - case Command: - players.clear(); //clear since no zones need to be restored - return true; //Battlefield is always open - default: - //open zone tab for given zone if needed - boolean result = true; - for (PlayerView player : players.keySet()) { - VPlayerPanel playerPanel = FControl.getPlayerPanel(player); - players.put(player, playerPanel.getSelectedTab()); //backup selected tab before changing it - InfoTab zoneTab = playerPanel.getZoneTab(zoneType); - if (zoneTab == null) { - result = false; - } - else { - playerPanel.setSelectedTab(zoneTab); - } - } - return result; - } - } - return false; - } - - @Override - public void restoreOldZones(Map playersToRestoreZonesFor) { - for (Entry player : playersToRestoreZonesFor.entrySet()) { - VPlayerPanel playerPanel = FControl.getPlayerPanel(player.getKey()); - playerPanel.setSelectedTab((InfoTab)player.getValue()); - } - } - - @Override - public void updateZones(List> zonesToUpdate) { - FControl.updateZones(zonesToUpdate); - } - - @Override - public void updateCards(Iterable cardsToUpdate) { - FControl.updateCards(cardsToUpdate); - } - - @Override - public void refreshCardDetails(Iterable cards) { - FControl.refreshCardDetails(cards); - } - - @Override - public void updateManaPool(List manaPoolUpdate) { - FControl.updateManaPool(manaPoolUpdate); - } - - @Override - public void updateLives(List livesUpdate) { - FControl.updateLives(livesUpdate); - } - - @Override - public void endCurrentGame() { - FControl.endCurrentGame(); - } - - @Override - public Map getDamageToAssign(CardView attacker, List blockers, - int damageDealt, GameEntityView defender, boolean overrideOrder) { - return FControl.getDamageToAssign(attacker, blockers, - damageDealt, defender, overrideOrder); - } - @Override public String showFileDialog(String title, String defaultDir) { return ForgeConstants.USER_GAMES_DIR + "Test.fgs"; //TODO: Show dialog @@ -502,22 +267,6 @@ public class GuiMobile implements IGuiBase { ImageCache.clear(); } - @Override - public void startGame(Match match) { - FControl.startGame(match); - } - - @Override - public void continueMatch(Match match) { - FControl.endCurrentGame(); - if (match == null) { - Forge.back(); - } - else { - FControl.startGame(match); - } - } - @Override public void showSpellShop() { QuestMenu.showSpellShop(); @@ -530,6 +279,6 @@ public class GuiMobile implements IGuiBase { @Override public void setPlayerAvatar(LobbyPlayer player, IHasIcon ihi) { - FControl.setPlayerAvatar(player, ImageCache.getIcon(ihi)); + MatchController.setPlayerAvatar(player, ImageCache.getIcon(ihi)); } } diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index fcc4a79cc93..f71404ecc89 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -25,9 +25,10 @@ import forge.card.CardDetailUtil.DetailColors; import forge.card.mana.ManaCost; import forge.game.zone.ZoneType; import forge.item.IPaperCard; +import forge.match.MatchUtil; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; -import forge.screens.match.FControl; +import forge.screens.match.MatchController; import forge.toolbox.FCardPanel; import forge.toolbox.FDialog; import forge.toolbox.FList; @@ -540,7 +541,7 @@ public class CardRenderer { w -= 2 * padding; h -= 2 * padding; - CardStateView details = FControl.getCardDetails(card); + CardStateView details = MatchController.getCardDetails(card); DetailColors borderColor = CardDetailUtil.getBorderColor(details); Color color = FSkinColor.fromRGB(borderColor.r, borderColor.g, borderColor.b); color = FSkinColor.tintColor(Color.WHITE, color, CardRenderer.PT_BOX_TINT); @@ -598,7 +599,7 @@ public class CardRenderer { final float stateXSymbols = (x + (w / 2)) - otherSymbolsSize / 2; final float ySymbols = (y + h) - (h / 8) - otherSymbolsSize / 2; - final IGameView game = FControl.getGameView(); + final IGameView game = MatchUtil.getGameView(); if (game != null) { final CombatView combat = game.getCombat(); if (combat != null) { @@ -619,7 +620,7 @@ public class CardRenderer { CardFaceSymbols.drawSymbol("phasing", g, stateXSymbols, ySymbols, otherSymbolsSize, otherSymbolsSize); } - if (FControl.isUsedToPay(card)) { + if (MatchUtil.isUsedToPay(card)) { float sacSymbolSize = otherSymbolsSize * 1.2f; CardFaceSymbols.drawSymbol("sacrifice", g, (x + (w / 2)) - sacSymbolSize / 2, (y + (h / 2)) - sacSymbolSize / 2, otherSymbolsSize, otherSymbolsSize); } diff --git a/forge-gui-mobile/src/forge/screens/LaunchScreen.java b/forge-gui-mobile/src/forge/screens/LaunchScreen.java index 707f8dad866..a9f97b28e98 100644 --- a/forge-gui-mobile/src/forge/screens/LaunchScreen.java +++ b/forge-gui-mobile/src/forge/screens/LaunchScreen.java @@ -7,9 +7,9 @@ import java.util.Set; import com.badlogic.gdx.Input.Keys; +import forge.match.MatchUtil; import forge.menu.FPopupMenu; import forge.screens.FScreen; -import forge.screens.match.FControl; import forge.Graphics; import forge.assets.FSkinImage; import forge.game.GameType; @@ -71,7 +71,7 @@ public abstract class LaunchScreen extends FScreen { throw new RuntimeException("Must add at least one player to launchParams.players"); } - FControl.startMatch(launchParams.gameType, launchParams.appliedVariants, launchParams.players); + MatchUtil.startMatch(launchParams.gameType, launchParams.appliedVariants, launchParams.players); } creatingMatch = false; } diff --git a/forge-gui-mobile/src/forge/screens/draft/DraftScreen.java b/forge-gui-mobile/src/forge/screens/draft/DraftScreen.java index 5db06a2d73e..5eec5f3e9e5 100644 --- a/forge-gui-mobile/src/forge/screens/draft/DraftScreen.java +++ b/forge-gui-mobile/src/forge/screens/draft/DraftScreen.java @@ -145,8 +145,8 @@ public class DraftScreen extends LaunchScreen { LoadingOverlay.show("Loading new game...", new Runnable() { @Override public void run() { - FModel.getGauntletMini(GuiBase.getInterface()).resetGauntletDraft(); - FModel.getGauntletMini(GuiBase.getInterface()).launch(rounds, humanDeck.getDeck(), GameType.Draft); + FModel.getGauntletMini().resetGauntletDraft(); + FModel.getGauntletMini().launch(rounds, humanDeck.getDeck(), GameType.Draft); creatingMatch = false; } }); diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java new file mode 100644 index 00000000000..beb8edeb147 --- /dev/null +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -0,0 +1,419 @@ +package forge.screens.match; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.Map.Entry; + +import org.apache.commons.lang3.tuple.Pair; + +import forge.Forge; +import forge.Graphics; +import forge.GuiBase; +import forge.LobbyPlayer; +import forge.assets.FImage; +import forge.assets.FSkin; +import forge.assets.FTextureRegionImage; +import forge.game.Match; +import forge.game.phase.PhaseType; +import forge.game.player.Player; +import forge.game.zone.ZoneType; +import forge.interfaces.IButton; +import forge.match.IMatchController; +import forge.match.MatchUtil; +import forge.model.FModel; +import forge.player.PlayerControllerHuman; +import forge.properties.ForgePreferences; +import forge.properties.ForgePreferences.FPref; +import forge.screens.match.views.VAssignDamage; +import forge.screens.match.views.VPhaseIndicator; +import forge.screens.match.views.VPlayerPanel; +import forge.screens.match.views.VCardDisplayArea.CardAreaPanel; +import forge.screens.match.views.VPhaseIndicator.PhaseLabel; +import forge.screens.match.views.VPlayerPanel.InfoTab; +import forge.screens.match.views.VPrompt; +import forge.screens.match.winlose.ViewWinLose; +import forge.toolbox.FDisplayObject; +import forge.util.ITriggerEvent; +import forge.util.WaitCallback; +import forge.util.gui.SGuiChoose; +import forge.view.CardView; +import forge.view.CombatView; +import forge.view.GameEntityView; +import forge.view.LocalGameView; +import forge.view.PlayerView; +import forge.view.SpellAbilityView; +import forge.view.CardView.CardStateView; + +public class MatchController implements IMatchController { + private MatchController() { } + public static final MatchController instance = new MatchController(); + + private static final Map avatarImages = new HashMap(); + private static final Map cardDetailsCache = new HashMap(); + + private static MatchScreen view; + + public static MatchScreen getView() { + return view; + } + + public static FImage getPlayerAvatar(final PlayerView p) { + LobbyPlayer lp = p.getLobbyPlayer(); + FImage avatar = avatarImages.get(lp); + if (avatar == null) { + avatar = new FTextureRegionImage(FSkin.getAvatars().get(lp.getAvatarIndex())); + } + return avatar; + } + + public static void setPlayerAvatar(final LobbyPlayer lp, final FImage avatarImage) { + avatarImages.put(lp, avatarImage); + } + + public static CardStateView getCardDetails(CardView card) { + final CardStateView details = cardDetailsCache.get(card.getId()); + if (details == null) { + cardDetailsCache.put(card.getId(), card.getOriginal()); + return card.getOriginal(); + } + return details; + } + + public void refreshCardDetails(Iterable cards) { + Set playersNeedingFieldUpdate = null; + + for (final CardView c : cards) { + //for each card in play, if it changed from creature to non-creature or vice versa, + //or if it changed from land to non-land or vice-versa, + //ensure field containing that card is updated to reflect that change + final CardStateView state = c.getOriginal(); + if (c.getZone() == ZoneType.Battlefield) { + CardStateView oldDetails = cardDetailsCache.get(c); + if (oldDetails == null || state.isCreature() != oldDetails.isCreature() || state.isLand() != oldDetails.isLand()) { + if (playersNeedingFieldUpdate == null) { + playersNeedingFieldUpdate = new HashSet(); + } + playersNeedingFieldUpdate.add(c.getController()); + } + } + cardDetailsCache.put(c.getId(), c.getOriginal()); + } + + if (playersNeedingFieldUpdate != null) { //update field for any players necessary + for (PlayerView p : playersNeedingFieldUpdate) { + view.getPlayerPanel(p).getField().update(); + } + } + } + + @Override + public void startNewMatch(Match match) { + MatchUtil.startGame(match); + } + + @Override + public boolean resetForNewGame() { + cardDetailsCache.clear(); //ensure details cache cleared before starting a new game + CardAreaPanel.resetForNewGame(); //ensure card panels reset between games + return true; + } + + @Override + public void openView(List sortedPlayers, int humanCount) { + List playerPanels = new ArrayList(); + for (Player p : sortedPlayers) { + playerPanels.add(new VPlayerPanel(MatchUtil.getGameView(p).getPlayerView(p), humanCount == 0 || p.getController() instanceof PlayerControllerHuman)); + } + view = new MatchScreen(playerPanels); + + if (humanCount == 0) { + //add special object that pauses game if screen touched + view.add(new FDisplayObject() { + @Override + public void draw(Graphics g) { + //don't draw anything + } + + @Override + public void buildTouchListeners(float screenX, float screenY, ArrayList listeners) { + if (screenY < view.getHeight() - VPrompt.HEIGHT) { + MatchUtil.pause(); + } + } + }); + } + + actuateMatchPreferences(); + + Forge.openScreen(view); + } + + @Override + public IButton getBtnOK(PlayerView player) { + return view.getPrompt(player).getBtnOk(); + } + + @Override + public IButton getBtnCancel(PlayerView player) { + return view.getPrompt(player).getBtnCancel(); + } + + @Override + public void showPromptMessage(final PlayerView player, String message) { + view.getPrompt(player).setMessage(message); + } + + @Override + public void focusButton(final IButton button) { + //not needed for mobile game + } + + @Override + public void flashIncorrectAction() { + //SDisplayUtil.remind(VPrompt.SINGLETON_INSTANCE); //TODO + } + + @Override + public void updatePhase() { + LocalGameView gameView = MatchUtil.getGameView(); + final PlayerView p = gameView.getPlayerTurn(); + final PhaseType ph = gameView.getPhase(); + + PhaseLabel lbl = view.getPlayerPanel(p).getPhaseIndicator().getLabel(ph); + + view.resetAllPhaseButtons(); + if (lbl != null) { + lbl.setActive(true); + } + } + + @Override + public void updateTurn(final PlayerView player) { + //VField nextField = getFieldViewFor(event.turnOwner); + //SDisplayUtil.showTab(nextField); + } + + @Override + public void updatePlayerControl() { + //TODO + } + + @Override + public void disableOverlay() { + } + + @Override + public void enableOverlay() { + } + + @Override + public void finishGame() { + new ViewWinLose(MatchUtil.getGameView()).setVisible(true); + } + + @Override + public void updateStack() { + view.getStack().update(); + } + + @Override + public void setPanelSelection(final CardView c) { + //GuiUtils.setPanelSelection(c); //TODO + } + + @Override + public int getAbilityToPlay(List abilities, ITriggerEvent triggerEvent) { + if (abilities.isEmpty()) { + return -1; + } + if (abilities.size() == 1) { + return abilities.get(0).getId(); + } + final SpellAbilityView choice = SGuiChoose.oneOrNone(GuiBase.getInterface(), "Choose ability to play", abilities); + return choice == null ? -1 : choice.getId(); + } + + @Override + public void showCombat(final CombatView combat) { + //not needed + } + + @Override + public Object showManaPool(final PlayerView player) { + VPlayerPanel playerPanel = view.getPlayerPanel(player); + InfoTab oldSelectedTab = playerPanel.getSelectedTab(); + playerPanel.setSelectedTab(playerPanel.getManaPoolTab()); + return oldSelectedTab; + } + + @Override + public void hideManaPool(final PlayerView player, final Object zoneToRestore) { + VPlayerPanel playerPanel = view.getPlayerPanel(player); + if (zoneToRestore == playerPanel.getManaPoolTab()) { + return; //if mana pool was selected previously, we don't need to switch back to anything + } + if (playerPanel.getSelectedTab() != playerPanel.getManaPoolTab()) { + return; //if player switch away from mana pool already, don't change anything + } + playerPanel.setSelectedTab((InfoTab)zoneToRestore); + } + + @Override + public boolean openZones(Collection zones, Map players) { + if (zones.size() == 1) { + ZoneType zoneType = zones.iterator().next(); + switch (zoneType) { + case Battlefield: + case Command: + players.clear(); //clear since no zones need to be restored + return true; //Battlefield is always open + default: + //open zone tab for given zone if needed + boolean result = true; + for (PlayerView player : players.keySet()) { + VPlayerPanel playerPanel = view.getPlayerPanel(player); + players.put(player, playerPanel.getSelectedTab()); //backup selected tab before changing it + InfoTab zoneTab = playerPanel.getZoneTab(zoneType); + if (zoneTab == null) { + result = false; + } + else { + playerPanel.setSelectedTab(zoneTab); + } + } + return result; + } + } + return false; + } + + @Override + public void restoreOldZones(Map playersToRestoreZonesFor) { + for (Entry player : playersToRestoreZonesFor.entrySet()) { + VPlayerPanel playerPanel = view.getPlayerPanel(player.getKey()); + playerPanel.setSelectedTab((InfoTab)player.getValue()); + } + } + + @Override + public Map assignDamage(final CardView attacker, final List blockers, final int damage, final GameEntityView defender, final boolean overrideOrder) { + return new WaitCallback>() { + @Override + public void run() { + VAssignDamage v = new VAssignDamage(attacker, blockers, damage, defender, overrideOrder, this); + v.show(); + } + }.invokeAndWait(); + } + + @Override + public void updateManaPool(List manaPoolUpdate) { + for (PlayerView p : manaPoolUpdate) { + view.getPlayerPanel(p).updateManaPool(); + } + } + + @Override + public void updateLives(List livesUpdate) { + for (PlayerView p : livesUpdate) { + view.getPlayerPanel(p).updateLife(); + } + } + + @Override + public void hear(LobbyPlayer player, String message) { + //FNetOverlay.SINGLETON_INSTANCE.addMessage(player.getName(), message); //TODO + } + + @Override + public boolean stopAtPhase(PlayerView turn, PhaseType phase) { + return view.stopAtPhase(turn, phase); + } + + @Override + public void updateZones(List> zonesToUpdate) { + view.updateZones(zonesToUpdate); + } + + @Override + public void updateSingleCard(CardView card) { + view.updateSingleCard(card); + } + + @Override + public void afterGameEnd() { + Forge.back(); + cardDetailsCache.clear(); //ensure card details cache cleared ending game + } + + private static void actuateMatchPreferences() { + ForgePreferences prefs = FModel.getPreferences(); + + VPhaseIndicator fvAi = view.getTopPlayerPanel().getPhaseIndicator(); + fvAi.getLabel(PhaseType.UPKEEP).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_UPKEEP)); + fvAi.getLabel(PhaseType.DRAW).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_DRAW)); + fvAi.getLabel(PhaseType.MAIN1).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_MAIN1)); + fvAi.getLabel(PhaseType.COMBAT_BEGIN).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_BEGINCOMBAT)); + fvAi.getLabel(PhaseType.COMBAT_DECLARE_ATTACKERS).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_DECLAREATTACKERS)); + fvAi.getLabel(PhaseType.COMBAT_DECLARE_BLOCKERS).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_DECLAREBLOCKERS)); + fvAi.getLabel(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_FIRSTSTRIKE)); + fvAi.getLabel(PhaseType.COMBAT_DAMAGE).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_COMBATDAMAGE)); + fvAi.getLabel(PhaseType.COMBAT_END).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_ENDCOMBAT)); + fvAi.getLabel(PhaseType.MAIN2).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_MAIN2)); + fvAi.getLabel(PhaseType.END_OF_TURN).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_EOT)); + fvAi.getLabel(PhaseType.CLEANUP).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_CLEANUP)); + + VPhaseIndicator fvHuman = view.getBottomPlayerPanel().getPhaseIndicator(); + fvHuman.getLabel(PhaseType.UPKEEP).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_UPKEEP)); + fvHuman.getLabel(PhaseType.DRAW).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DRAW)); + fvHuman.getLabel(PhaseType.MAIN1).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_MAIN1)); + fvHuman.getLabel(PhaseType.COMBAT_BEGIN).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_BEGINCOMBAT)); + fvHuman.getLabel(PhaseType.COMBAT_DECLARE_ATTACKERS).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREATTACKERS)); + fvHuman.getLabel(PhaseType.COMBAT_DECLARE_BLOCKERS).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREBLOCKERS)); + fvHuman.getLabel(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_FIRSTSTRIKE)); + fvHuman.getLabel(PhaseType.COMBAT_DAMAGE).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_COMBATDAMAGE)); + fvHuman.getLabel(PhaseType.COMBAT_END).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_ENDCOMBAT)); + fvHuman.getLabel(PhaseType.MAIN2).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_MAIN2)); + fvHuman.getLabel(PhaseType.END_OF_TURN).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_EOT)); + fvHuman.getLabel(PhaseType.CLEANUP).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_CLEANUP)); + } + + public static void writeMatchPreferences() { + ForgePreferences prefs = FModel.getPreferences(); + + VPhaseIndicator fvAi = view.getTopPlayerPanel().getPhaseIndicator(); + prefs.setPref(FPref.PHASE_AI_UPKEEP, String.valueOf(fvAi.getLabel(PhaseType.UPKEEP).getStopAtPhase())); + prefs.setPref(FPref.PHASE_AI_DRAW, String.valueOf(fvAi.getLabel(PhaseType.DRAW).getStopAtPhase())); + prefs.setPref(FPref.PHASE_AI_MAIN1, String.valueOf(fvAi.getLabel(PhaseType.MAIN1).getStopAtPhase())); + prefs.setPref(FPref.PHASE_AI_BEGINCOMBAT, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_BEGIN).getStopAtPhase())); + prefs.setPref(FPref.PHASE_AI_DECLAREATTACKERS, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_DECLARE_ATTACKERS).getStopAtPhase())); + prefs.setPref(FPref.PHASE_AI_DECLAREBLOCKERS, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_DECLARE_BLOCKERS).getStopAtPhase())); + prefs.setPref(FPref.PHASE_AI_FIRSTSTRIKE, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE).getStopAtPhase())); + prefs.setPref(FPref.PHASE_AI_COMBATDAMAGE, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_DAMAGE).getStopAtPhase())); + prefs.setPref(FPref.PHASE_AI_ENDCOMBAT, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_END).getStopAtPhase())); + prefs.setPref(FPref.PHASE_AI_MAIN2, String.valueOf(fvAi.getLabel(PhaseType.MAIN2).getStopAtPhase())); + prefs.setPref(FPref.PHASE_AI_EOT, String.valueOf(fvAi.getLabel(PhaseType.END_OF_TURN).getStopAtPhase())); + prefs.setPref(FPref.PHASE_AI_CLEANUP, String.valueOf(fvAi.getLabel(PhaseType.CLEANUP).getStopAtPhase())); + + VPhaseIndicator fvHuman = view.getBottomPlayerPanel().getPhaseIndicator(); + prefs.setPref(FPref.PHASE_HUMAN_UPKEEP, String.valueOf(fvHuman.getLabel(PhaseType.UPKEEP).getStopAtPhase())); + prefs.setPref(FPref.PHASE_HUMAN_DRAW, String.valueOf(fvHuman.getLabel(PhaseType.DRAW).getStopAtPhase())); + prefs.setPref(FPref.PHASE_HUMAN_MAIN1, String.valueOf(fvHuman.getLabel(PhaseType.MAIN1).getStopAtPhase())); + prefs.setPref(FPref.PHASE_HUMAN_BEGINCOMBAT, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_BEGIN).getStopAtPhase())); + prefs.setPref(FPref.PHASE_HUMAN_DECLAREATTACKERS, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_DECLARE_ATTACKERS).getStopAtPhase())); + prefs.setPref(FPref.PHASE_HUMAN_DECLAREBLOCKERS, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_DECLARE_BLOCKERS).getStopAtPhase())); + prefs.setPref(FPref.PHASE_HUMAN_FIRSTSTRIKE, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE).getStopAtPhase())); + prefs.setPref(FPref.PHASE_HUMAN_COMBATDAMAGE, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_DAMAGE).getStopAtPhase())); + prefs.setPref(FPref.PHASE_HUMAN_ENDCOMBAT, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_END).getStopAtPhase())); + prefs.setPref(FPref.PHASE_HUMAN_MAIN2, String.valueOf(fvHuman.getLabel(PhaseType.MAIN2).getStopAtPhase())); + prefs.setPref(FPref.PHASE_HUMAN_EOT, fvHuman.getLabel(PhaseType.END_OF_TURN).getStopAtPhase()); + prefs.setPref(FPref.PHASE_HUMAN_CLEANUP, fvHuman.getLabel(PhaseType.CLEANUP).getStopAtPhase()); + + prefs.save(); + } +} diff --git a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java index 39d69c1ccc4..51845deac70 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java @@ -11,7 +11,9 @@ import org.apache.commons.lang3.tuple.Pair; import com.badlogic.gdx.Input.Keys; import com.google.common.collect.Maps; -import forge.Forge; +import forge.game.phase.PhaseType; +import forge.game.zone.ZoneType; +import forge.match.MatchUtil; import forge.menu.FMenuBar; import forge.model.FModel; import forge.player.LobbyPlayerHuman; @@ -24,17 +26,20 @@ import forge.screens.match.views.VGameMenu; import forge.screens.match.views.VLog; import forge.screens.match.views.VManaPool; import forge.screens.match.views.VPlayerPanel; +import forge.screens.match.views.VPhaseIndicator.PhaseLabel; import forge.screens.match.views.VPlayerPanel.InfoTab; import forge.screens.match.views.VPlayers; import forge.screens.match.views.VPrompt; import forge.screens.match.views.VStack; import forge.sound.MusicPlaylist; +import forge.sound.SoundSystem; import forge.Forge.KeyInputAdapter; import forge.Graphics; import forge.animation.AbilityEffect; import forge.assets.FSkinColor; import forge.assets.FSkinTexture; import forge.assets.FSkinColor.Colors; +import forge.toolbox.FCardPanel; import forge.toolbox.FEvent; import forge.toolbox.FEvent.FEventHandler; import forge.toolbox.FScrollPane; @@ -76,13 +81,13 @@ public class MatchScreen extends FScreen { new FEventHandler() { @Override public void handleEvent(FEvent e) { - FControl.getGameView().selectButtonOk(); + MatchUtil.getGameView().selectButtonOk(); } }, new FEventHandler() { @Override public void handleEvent(FEvent e) { - FControl.getGameView().selectButtonCancel(); + MatchUtil.getGameView().selectButtonCancel(); } })); @@ -91,13 +96,13 @@ public class MatchScreen extends FScreen { new FEventHandler() { @Override public void handleEvent(FEvent e) { - FControl.getGameView().selectButtonOk(); + MatchUtil.getGameView().selectButtonOk(); } }, new FEventHandler() { @Override public void handleEvent(FEvent e) { - FControl.getGameView().selectButtonCancel(); + MatchUtil.getGameView().selectButtonCancel(); } })); } @@ -130,7 +135,7 @@ public class MatchScreen extends FScreen { } public VPrompt getActivePrompt() { - if (topPlayerPrompt != null && topPlayerPanel.getPlayer().equals(FControl.getCurrentPlayer())) { + if (topPlayerPrompt != null && topPlayerPanel.getPlayer().equals(MatchUtil.getCurrentPlayer())) { return topPlayerPrompt; } return bottomPlayerPrompt; @@ -165,8 +170,8 @@ public class MatchScreen extends FScreen { @Override public void onClose(Callback canCloseCallback) { - FControl.writeMatchPreferences(); - Forge.getSoundSystem().setBackgroundMusic(MusicPlaylist.MENUS); + MatchController.writeMatchPreferences(); + SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS); super.onClose(canCloseCallback); } @@ -196,7 +201,7 @@ public class MatchScreen extends FScreen { } //draw arrows for combat - final CombatView combat = FControl.getGameView().getCombat(); + final CombatView combat = MatchUtil.getGameView().getCombat(); if (combat != null) { for (final CardView attacker : combat.getAttackers()) { //connect each attacker with planeswalker it's attacking if applicable @@ -234,25 +239,25 @@ public class MatchScreen extends FScreen { return true; //suppress Back button so it's not bumped when trying to press OK or Cancel buttons case Keys.A: //alpha strike on Ctrl+A if (KeyInputAdapter.isCtrlKeyDown()) { - FControl.alphaStrike(); + MatchUtil.alphaStrike(); return true; } break; case Keys.E: //end turn on Ctrl+E if (KeyInputAdapter.isCtrlKeyDown()) { - FControl.endCurrentTurn(); + MatchUtil.endCurrentTurn(); return true; } break; case Keys.Q: //concede game on Ctrl+Q if (KeyInputAdapter.isCtrlKeyDown()) { - FControl.concede(); + MatchUtil.concede(); return true; } break; case Keys.Z: //undo on Ctrl+Z if (KeyInputAdapter.isCtrlKeyDown()) { - FControl.getGameView().tryUndoLastAction(); + MatchUtil.getGameView().tryUndoLastAction(); return true; } break; @@ -265,6 +270,58 @@ public class MatchScreen extends FScreen { //don't show menu from this screen since it's too easy to bump the menu button when trying to press OK or Cancel } + public boolean stopAtPhase(final PlayerView turn, final PhaseType phase) { + PhaseLabel label = getPlayerPanel(turn).getPhaseIndicator().getLabel(phase); + return label == null || label.getStopAtPhase(); + } + + public void resetAllPhaseButtons() { + for (final VPlayerPanel panel : getPlayerPanels().values()) { + panel.getPhaseIndicator().resetPhaseButtons(); + } + } + + public VPlayerPanel getPlayerPanel(final PlayerView playerView) { + return getPlayerPanels().get(playerView); + } + + public void highlightCard(final CardView c) { + for (VPlayerPanel playerPanel : getPlayerPanels().values()) { + for (FCardPanel p : playerPanel.getField().getCardPanels()) { + if (p.getCard().equals(c)) { + p.setHighlighted(true); + return; + } + } + } + } + + public void clearCardHighlights() { + for (VPlayerPanel playerPanel : getPlayerPanels().values()) { + for (FCardPanel p : playerPanel.getField().getCardPanels()) { + p.setHighlighted(false); + } + } + } + + public void updateZones(List> zonesToUpdate) { + for (Pair kv : zonesToUpdate) { + PlayerView owner = kv.getKey(); + ZoneType zt = kv.getValue(); + if (owner == null || zt == null) { + continue; + } + getPlayerPanel(owner).updateZone(zt); + } + } + + public void updateSingleCard(final CardView card) { + final ZoneType zone = card.getZone(); + if (zone != null && zone == ZoneType.Battlefield) { + getPlayerPanel(card.getController()).getField().updateCard(card); + } + } + private class FieldScroller extends FScrollPane { private float extraHeight = 0; diff --git a/forge-gui-mobile/src/forge/screens/match/TargetingOverlay.java b/forge-gui-mobile/src/forge/screens/match/TargetingOverlay.java index e079b14b1ce..59b4ddb8001 100644 --- a/forge-gui-mobile/src/forge/screens/match/TargetingOverlay.java +++ b/forge-gui-mobile/src/forge/screens/match/TargetingOverlay.java @@ -61,7 +61,7 @@ public class TargetingOverlay { } public static void drawArrow(Graphics g, Vector2 start, PlayerView targetPlayer, boolean connectsFoes) { drawArrow(g, start, - FControl.getPlayerPanel(targetPlayer).getAvatar().getTargetingArrowOrigin(), + MatchController.getView().getPlayerPanel(targetPlayer).getAvatar().getTargetingArrowOrigin(), connectsFoes); } public static void drawArrow(Graphics g, Vector2 start, Vector2 end, boolean connectsFoes) { diff --git a/forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java b/forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java index d87180b2586..7e63598acc0 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java @@ -24,7 +24,8 @@ import forge.assets.FSkinFont; import forge.assets.FSkinImage; import forge.assets.FSkinColor.Colors; import forge.card.CardZoom; -import forge.screens.match.FControl; +import forge.match.MatchUtil; +import forge.screens.match.MatchController; import forge.toolbox.FButton; import forge.toolbox.FCardPanel; import forge.toolbox.FContainer; @@ -225,7 +226,7 @@ public class VAssignDamage extends FDialog { } else if (defender instanceof PlayerView) { PlayerView player = (PlayerView)defender; - obj = add(new MiscAttDefPanel(player.getName(), FControl.getPlayerAvatar(player))); + obj = add(new MiscAttDefPanel(player.getName(), MatchController.getPlayerAvatar(player))); } else { obj = add(new MiscAttDefPanel(defender.toString(), FSkinImage.UNKNOWN)); @@ -456,7 +457,7 @@ public class VAssignDamage extends FDialog { if (source == null) { if (defender instanceof PlayerView) { PlayerView p = (PlayerView)defender; - lethalDamage = attackerHasInfect ? FControl.getGameView().getPoisonCountersToLose() - p.getPoisonCounters() : p.getLife(); + lethalDamage = attackerHasInfect ? MatchUtil.getGameView().getPoisonCountersToLose() - p.getPoisonCounters() : p.getLife(); } else if (defender instanceof CardView) { // planeswalker CardView pw = (CardView)defender; diff --git a/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java b/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java index 324efdc6efb..335e84bdbe1 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java @@ -4,7 +4,8 @@ import com.badlogic.gdx.math.Vector2; import forge.Graphics; import forge.assets.FImage; -import forge.screens.match.FControl; +import forge.match.MatchUtil; +import forge.screens.match.MatchController; import forge.toolbox.FDisplayObject; import forge.util.ThreadUtil; import forge.util.Utils; @@ -19,7 +20,7 @@ public class VAvatar extends FDisplayObject { public VAvatar(PlayerView player0) { player = player0; - image = FControl.getPlayerAvatar(player); + image = MatchController.getPlayerAvatar(player); setSize(WIDTH, HEIGHT); } @@ -28,7 +29,7 @@ public class VAvatar extends FDisplayObject { ThreadUtil.invokeInGameThread(new Runnable() { //must invoke in game thread in case a dialog needs to be shown @Override public void run() { - FControl.getGameView().selectPlayer(player, null); + MatchUtil.getGameView().selectPlayer(player, null); } }); return true; @@ -38,7 +39,7 @@ public class VAvatar extends FDisplayObject { Vector2 origin = new Vector2(getScreenPosition()); origin.x += WIDTH * 0.75f; - if (origin.y < FControl.getView().getHeight() / 2) { + if (origin.y < MatchController.getView().getHeight() / 2) { origin.y += HEIGHT * 0.75f; //target bottom right corner if on top half of screen } else { diff --git a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java index 794cafc9206..7538cba7548 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java @@ -11,7 +11,7 @@ import forge.FThreads; import forge.Graphics; import forge.GuiBase; import forge.card.CardZoom; -import forge.screens.match.FControl; +import forge.match.MatchUtil; import forge.toolbox.FCardPanel; import forge.util.ThreadUtil; import forge.view.CardView; @@ -245,7 +245,7 @@ public abstract class VCardDisplayArea extends VDisplayArea { } public boolean selectCard() { - if (FControl.getGameView().selectCard(getCard(), null)) { + if (MatchUtil.getGameView().selectCard(getCard(), null)) { return true; } //if panel can't do anything with card selection, try selecting previous panel in stack diff --git a/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java b/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java index 7fbc94fd7dd..4a37449c09a 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java @@ -1,9 +1,9 @@ package forge.screens.match.views; +import forge.match.MatchUtil; import forge.menu.FCheckBoxMenuItem; import forge.menu.FDropDownMenu; import forge.menu.FMenuItem; -import forge.screens.match.FControl; import forge.toolbox.FEvent; import forge.toolbox.FEvent.FEventHandler; import forge.util.ThreadUtil; @@ -17,7 +17,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { //must invoke all these in game thread since they may require synchronous user input @Override public void run() { - FControl.getGameView().cheat().generateMana(); + MatchUtil.getGameView().cheat().generateMana(); } }); } @@ -28,7 +28,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - FControl.getGameView().cheat().tutorForCard(); + MatchUtil.getGameView().cheat().tutorForCard(); } }); } @@ -39,7 +39,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - FControl.getGameView().cheat().addCardToHand(); + MatchUtil.getGameView().cheat().addCardToHand(); } }); } @@ -50,7 +50,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - FControl.getGameView().cheat().addCardToBattlefield(); + MatchUtil.getGameView().cheat().addCardToBattlefield(); } }); } @@ -61,7 +61,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - FControl.getGameView().cheat().setPlayerLife(); + MatchUtil.getGameView().cheat().setPlayerLife(); } }); } @@ -72,7 +72,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - FControl.getGameView().cheat().winGame(); + MatchUtil.getGameView().cheat().winGame(); } }); } @@ -83,26 +83,26 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - FControl.getGameView().cheat().setupGameState(); + MatchUtil.getGameView().cheat().setupGameState(); } }); } })); - final boolean unlimitedLands = FControl.getGameView().canPlayUnlimitedLands(); + final boolean unlimitedLands = MatchUtil.getGameView().canPlayUnlimitedLands(); addItem(new FCheckBoxMenuItem("Play Unlimited Lands", unlimitedLands, new FEventHandler() { @Override public void handleEvent(FEvent e) { - FControl.getGameView().cheat().setCanPlayUnlimitedLands(!unlimitedLands); + MatchUtil.getGameView().cheat().setCanPlayUnlimitedLands(!unlimitedLands); } })); - final boolean viewAll = FControl.getGameView().canViewAllCards(); + final boolean viewAll = MatchUtil.getGameView().canViewAllCards(); addItem(new FCheckBoxMenuItem("View All Cards", viewAll, new FEventHandler() { @Override public void handleEvent(FEvent e) { - FControl.getGameView().cheat().setViewAllCards(!viewAll); + MatchUtil.getGameView().cheat().setViewAllCards(!viewAll); } })); addItem(new FMenuItem("Add Counters to Permanent", new FEventHandler() { @@ -111,7 +111,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - FControl.getGameView().cheat().addCountersToPermanent(); + MatchUtil.getGameView().cheat().addCountersToPermanent(); } }); } @@ -122,7 +122,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - FControl.getGameView().cheat().tapPermanents(); + MatchUtil.getGameView().cheat().tapPermanents(); } }); } @@ -133,7 +133,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - FControl.getGameView().cheat().untapPermanents(); + MatchUtil.getGameView().cheat().untapPermanents(); } }); } @@ -144,7 +144,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - FControl.getGameView().cheat().riggedPlanarRoll(); + MatchUtil.getGameView().cheat().riggedPlanarRoll(); } }); } @@ -155,7 +155,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - FControl.getGameView().cheat().planeswalkTo(); + MatchUtil.getGameView().cheat().planeswalkTo(); } }); } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VField.java b/forge-gui-mobile/src/forge/screens/match/views/VField.java index 5b59922c01c..7e2eb26dcaf 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VField.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VField.java @@ -5,7 +5,7 @@ import java.util.List; import forge.FThreads; import forge.GuiBase; -import forge.screens.match.FControl; +import forge.screens.match.MatchController; import forge.screens.match.views.VCardDisplayArea.CardAreaPanel; import forge.toolbox.FContainer; import forge.view.CardView; @@ -62,7 +62,7 @@ public class VField extends FContainer { for (CardView card : model) { CardAreaPanel cardPanel = CardAreaPanel.get(card); - CardStateView details = FControl.getCardDetails(card); //use details so creature/land check is accurate + CardStateView details = MatchController.getCardDetails(card); //use details so creature/land check is accurate if (cardPanel.getAttachedToPanel() == null) { //skip attached panels if (details.isCreature()) { if (!tryStackCard(card, creatures)) { diff --git a/forge-gui-mobile/src/forge/screens/match/views/VGameMenu.java b/forge-gui-mobile/src/forge/screens/match/views/VGameMenu.java index cc883ff78d7..15a7fb36fbe 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VGameMenu.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VGameMenu.java @@ -7,13 +7,14 @@ import forge.deck.FDeckViewer; import forge.game.Game; import forge.game.player.Player; import forge.game.spellability.SpellAbility; +import forge.match.MatchUtil; import forge.menu.FDropDownMenu; import forge.menu.FMenuItem; import forge.player.GamePlayerUtil; -import forge.screens.match.FControl; import forge.screens.settings.SettingsScreen; import forge.toolbox.FEvent; import forge.toolbox.FEvent.FEventHandler; +import forge.util.ThreadUtil; public class VGameMenu extends FDropDownMenu { public VGameMenu() { @@ -21,31 +22,36 @@ public class VGameMenu extends FDropDownMenu { @Override protected void buildMenu() { - final Game game = FControl.getGame(); + final Game game = MatchUtil.getGame(); addItem(new FMenuItem("Concede", FSkinImage.CONCEDE, new FEventHandler() { @Override public void handleEvent(FEvent e) { - FControl.concede(); + ThreadUtil.invokeInGameThread(new Runnable() { + @Override + public void run() { + MatchUtil.concede(); + } + }); } })); /*addItem(new FMenuItem("Save Game", FSkinImage.SAVE, new FEventHandler() { @Override public void handleEvent(FEvent e) { - GameStateSerializer.saveGameState(FControl.getGame(), ForgeConstants.USER_GAMES_DIR + "GameSave.txt"); + GameStateSerializer.saveGameState(MatchUtil.getGame(), ForgeConstants.USER_GAMES_DIR + "GameSave.txt"); FOptionPane.showMessageDialog("Game saved successfully.", "Save Game", FOptionPane.INFORMATION_ICON); } })); addItem(new FMenuItem("Load Game", FSkinImage.OPEN, new FEventHandler() { @Override public void handleEvent(FEvent e) { - GameStateDeserializer.loadGameState(FControl.getGame(), ForgeConstants.USER_GAMES_DIR + "GameSave.txt"); + GameStateDeserializer.loadGameState(MatchUtil.getGame(), ForgeConstants.USER_GAMES_DIR + "GameSave.txt"); } }));*/ addItem(new FMenuItem("Deck List", FSkinImage.DECKLIST, new FEventHandler() { @Override public void handleEvent(FEvent e) { final LobbyPlayer guiPlayer = GamePlayerUtil.getGuiPlayer(); - final Deck deck = FControl.getGameView().getDeck(guiPlayer); + final Deck deck = MatchUtil.getGameView().getDeck(guiPlayer); if (deck != null) { FDeckViewer.show(deck); } @@ -54,7 +60,7 @@ public class VGameMenu extends FDropDownMenu { addItem(new FMenuItem("Auto-Yields", FSkinImage.WARNING, new FEventHandler() { @Override public void handleEvent(FEvent e) { - final Player localPlayer = FControl.getCurrentPlayer(); + final Player localPlayer = MatchUtil.getCurrentPlayer(); if (localPlayer == null) { return; } final boolean autoYieldsDisabled = game.getDisableAutoYields(); @@ -67,7 +73,7 @@ public class VGameMenu extends FDropDownMenu { //if re-enabling auto-yields, auto-yield to current ability on stack if applicable SpellAbility ability = game.getStack().peekAbility(); if (ability != null && ability.isAbility() && localPlayer.getController().shouldAutoYield(ability.toUnsuppressedString())) { - FControl.getGameView().passPriority(); + MatchUtil.getGameView().passPriority(); } } } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VLog.java b/forge-gui-mobile/src/forge/screens/match/views/VLog.java index aba2c6f6904..e6561447919 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VLog.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VLog.java @@ -11,10 +11,10 @@ import forge.assets.TextRenderer; import forge.assets.FSkinColor.Colors; import forge.game.GameLogEntry; import forge.game.GameLogEntryType; +import forge.match.MatchUtil; import forge.menu.FDropDown; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; -import forge.screens.match.FControl; import forge.toolbox.FDisplayObject; import forge.util.Utils; @@ -45,7 +45,7 @@ public class VLog extends FDropDown { clear(); GameLogEntryType logVerbosityFilter = GameLogEntryType.valueOf(FModel.getPreferences().getPref(FPref.DEV_LOG_ENTRY_TYPE)); - List logEntrys = FControl.getGameView().getLogEntries(logVerbosityFilter); + List logEntrys = MatchUtil.getGameView().getLogEntries(logVerbosityFilter); LogEntryDisplay logEntryDisplay; float width = maxWidth - getMenuTab().getScreenPosition().x; //stretch from tab to edge of screen diff --git a/forge-gui-mobile/src/forge/screens/match/views/VManaPool.java b/forge-gui-mobile/src/forge/screens/match/views/VManaPool.java index c40575a6655..c1871d30c07 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VManaPool.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VManaPool.java @@ -11,8 +11,8 @@ import forge.assets.FSkinFont; import forge.assets.FSkinImage; import forge.assets.FSkinColor.Colors; import forge.card.MagicColor; +import forge.match.MatchUtil; import forge.player.GamePlayerUtil; -import forge.screens.match.FControl; import forge.toolbox.FDisplayObject; import forge.view.PlayerView; @@ -82,7 +82,7 @@ public class VManaPool extends VDisplayArea { @Override public boolean tap(float x, float y, int count) { if (player.getLobbyPlayer() == GamePlayerUtil.getGuiPlayer()) { - FControl.getGameView().useMana(colorCode); + MatchUtil.getGameView().useMana(colorCode); } return true; } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java index 612a283a509..5ea6a51eb9e 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java @@ -14,9 +14,10 @@ import forge.assets.FSkinFont; import forge.assets.FSkinImage; import forge.assets.FSkinColor.Colors; import forge.game.zone.ZoneType; +import forge.match.MatchUtil; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; -import forge.screens.match.FControl; +import forge.screens.match.MatchController; import forge.screens.match.MatchScreen; import forge.toolbox.FContainer; import forge.toolbox.FDisplayObject; @@ -114,8 +115,8 @@ public class VPlayerPanel extends FContainer { selectedTab.displayArea.setVisible(true); } - if (FControl.getView() != null) { //must revalidate entire screen so panel heights updated - FControl.getView().revalidate(); + if (MatchController.getView() != null) { //must revalidate entire screen so panel heights updated + MatchController.getView().revalidate(); } } @@ -289,7 +290,7 @@ public class VPlayerPanel extends FContainer { } //when gui player loses life, vibrate device for a length of time based on amount of life lost - if (vibrateDuration > 0 && player.getLobbyPlayer() == FControl.getGuiPlayer() && + if (vibrateDuration > 0 && player.getLobbyPlayer() == MatchUtil.getGuiPlayer() && FModel.getPreferences().getPrefBoolean(FPref.UI_VIBRATE_ON_LIFE_LOSS)) { //never vibrate more than two seconds regardless of life lost or poison counters gained Gdx.input.vibrate(Math.min(vibrateDuration, 2000)); @@ -298,7 +299,7 @@ public class VPlayerPanel extends FContainer { @Override public boolean tap(float x, float y, int count) { - FControl.getGameView().selectPlayer(player, null); //treat tapping on life the same as tapping on the avatar + MatchUtil.getGameView().selectPlayer(player, null); //treat tapping on life the same as tapping on the avatar return true; } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VPlayers.java b/forge-gui-mobile/src/forge/screens/match/views/VPlayers.java index 37729933755..4a1573a65c1 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VPlayers.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VPlayers.java @@ -7,10 +7,11 @@ import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; import forge.Graphics; import forge.assets.FImage; import forge.assets.FSkinFont; +import forge.match.MatchUtil; import forge.menu.FDropDown; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; -import forge.screens.match.FControl; +import forge.screens.match.MatchController; import forge.toolbox.FContainer; import forge.toolbox.FDisplayObject; import forge.toolbox.FList; @@ -20,7 +21,7 @@ import forge.view.PlayerView; public class VPlayers extends FDropDown { public VPlayers() { - for (final PlayerView p : FControl.getGameView().getPlayers()) { + for (final PlayerView p : MatchUtil.getGameView().getPlayers()) { add(new PlayerInfoPanel(p)); } } @@ -63,7 +64,7 @@ public class VPlayers extends FDropDown { float y = PADDING; float h = getHeight() - 2 * y; - FImage avatarImage = FControl.getPlayerAvatar(player); + FImage avatarImage = MatchController.getPlayerAvatar(player); g.drawImage(avatarImage, x, y, h, h); x += h + PADDING; @@ -87,7 +88,7 @@ public class VPlayers extends FDropDown { } } } - if (FControl.getGameView().isCommander()) { + if (MatchUtil.getGameView().isCommander()) { builder.append(" | " + player.getCommanderInfo()); } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VStack.java b/forge-gui-mobile/src/forge/screens/match/views/VStack.java index ffcc794a1cb..47688922313 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VStack.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VStack.java @@ -11,7 +11,6 @@ import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; import com.badlogic.gdx.math.Vector2; import forge.Graphics; -import forge.GuiBase; import forge.assets.FSkinColor; import forge.assets.FSkinFont; import forge.assets.TextRenderer; @@ -21,11 +20,12 @@ import forge.card.CardZoom; import forge.card.CardDetailUtil.DetailColors; import forge.game.player.Player; import forge.game.zone.ZoneType; +import forge.match.MatchUtil; import forge.menu.FCheckBoxMenuItem; import forge.menu.FDropDown; import forge.menu.FMenuItem; import forge.menu.FPopupMenu; -import forge.screens.match.FControl; +import forge.screens.match.MatchController; import forge.screens.match.TargetingOverlay; import forge.toolbox.FCardPanel; import forge.toolbox.FDisplayObject; @@ -73,14 +73,14 @@ public class VStack extends FDropDown { playersWithValidTargets.put(c.getController(), c); } if (zones != null && zones.size() > 0 && playersWithValidTargets != null && playersWithValidTargets.size() > 0) { - GuiBase.getInterface().openZones(zones, playersWithValidTargets); + MatchController.instance.openZones(zones, playersWithValidTargets); } } //restore old zones when active stack instance changes private void restoreOldZones() { if (playersWithValidTargets == null) { return; } - GuiBase.getInterface().restoreOldZones(playersWithValidTargets); + MatchController.instance.restoreOldZones(playersWithValidTargets); playersWithValidTargets = null; } @@ -90,7 +90,7 @@ public class VStack extends FDropDown { activeStackInstance = null; //reset before updating stack restoreOldZones(); - final List stack = FControl.getGameView().getStack(); + final List stack = MatchUtil.getGameView().getStack(); if (stackSize != stack.size()) { int oldStackSize = stackSize; stackSize = stack.size(); @@ -118,10 +118,10 @@ public class VStack extends FDropDown { float x = MARGINS; float y = MARGINS; - float totalWidth = maxWidth - FControl.getView().getTopPlayerPanel().getTabs().iterator().next().getRight(); //keep avatar, life total, and hand tab visible to left of stack + float totalWidth = maxWidth - MatchController.getView().getTopPlayerPanel().getTabs().iterator().next().getRight(); //keep avatar, life total, and hand tab visible to left of stack float width = totalWidth - 2 * MARGINS; - final List stack = FControl.getGameView().getStack(); + final List stack = MatchUtil.getGameView().getStack(); if (stack.isEmpty()) { //show label if stack empty FLabel label = add(new FLabel.Builder().text("[Empty]").font(FONT).align(HAlignment.CENTER).build()); @@ -201,7 +201,7 @@ public class VStack extends FDropDown { text = stackInstance.getText(); if (stackInstance.isOptionalTrigger() && - stackInstance0.getActivatingPlayer().equals(FControl.getCurrentPlayer())) { + stackInstance0.getActivatingPlayer().equals(MatchUtil.getCurrentPlayer())) { text = "(OPTIONAL) " + text; } @@ -224,21 +224,21 @@ public class VStack extends FDropDown { VStack.this.updateSizeAndPosition(); return true; } - Player player = FControl.getCurrentPlayer(); + Player player = MatchUtil.getCurrentPlayer(); if (player != null) { //don't show menu if tapping on art if (stackInstance.isAbility()) { FPopupMenu menu = new FPopupMenu() { @Override protected void buildMenu() { - final IGameView gameView = FControl.getGameView(); - final Player player = FControl.getCurrentPlayer(); + final IGameView gameView = MatchUtil.getGameView(); + final Player player = MatchUtil.getCurrentPlayer(); final String key = stackInstance.getKey(); final boolean autoYield = gameView.shouldAutoYield(key); addItem(new FCheckBoxMenuItem("Auto-Yield", autoYield, new FEventHandler() { @Override public void handleEvent(FEvent e) { - FControl.getGameView().setShouldAutoYield(key, !autoYield); + MatchUtil.getGameView().setShouldAutoYield(key, !autoYield); if (!autoYield && stackInstance.equals(gameView.peekStack())) { //auto-pass priority if ability is on top of stack gameView.passPriority(); diff --git a/forge-gui-mobile/src/forge/screens/match/winlose/ControlWinLose.java b/forge-gui-mobile/src/forge/screens/match/winlose/ControlWinLose.java index 81c8fe823bd..b1764a43d45 100644 --- a/forge-gui-mobile/src/forge/screens/match/winlose/ControlWinLose.java +++ b/forge-gui-mobile/src/forge/screens/match/winlose/ControlWinLose.java @@ -1,6 +1,7 @@ package forge.screens.match.winlose; -import forge.screens.match.FControl; +import forge.match.MatchUtil; +import forge.screens.match.MatchController; import forge.toolbox.FEvent; import forge.toolbox.FEvent.FEventHandler; import forge.view.IGameView; @@ -53,21 +54,21 @@ public class ControlWinLose { view.hide(); saveOptions(); - FControl.startGameInSameMatch(); + MatchUtil.continueMatch(); } /** Action performed when "restart" button is pressed in default win/lose UI. */ public void actionOnRestart() { view.hide(); saveOptions(); - FControl.startGameInNewMatch(); + MatchUtil.restartMatch(); } /** Action performed when "quit" button is pressed in default win/lose UI. */ public void actionOnQuit() { // Reset other stuff saveOptions(); - FControl.endCurrentGame(); + MatchUtil.endCurrentGame(); view.hide(); } @@ -76,7 +77,7 @@ public class ControlWinLose { * with other game modes. */ public void saveOptions() { - FControl.writeMatchPreferences(); + MatchController.writeMatchPreferences(); } /** diff --git a/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java b/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java index 6f036243fc2..977374bb27b 100644 --- a/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java +++ b/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java @@ -41,7 +41,7 @@ public class GauntletWinLose extends ControlWinLose { */ public GauntletWinLose(final ViewWinLose view0, IGameView lastGame) { super(view0, lastGame); - controller = new GauntletWinLoseController(view0, lastGame, GuiBase.getInterface()) { + controller = new GauntletWinLoseController(view0, lastGame) { @Override protected void showOutcome(final String message1, final String message2, final FSkinProp icon, final List lstEventNames, final List lstEventRecords, final int len, final int num) { FThreads.invokeInBackgroundThread(new Runnable() { 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 cb0b30c33a8..e72c09d1a3a 100644 --- a/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java +++ b/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java @@ -6,7 +6,6 @@ import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; import forge.Forge; -import forge.GuiBase; import forge.LobbyPlayer; import forge.assets.FSkinColor; import forge.assets.FSkinColor.Colors; @@ -61,7 +60,7 @@ public class ViewWinLose extends FOverlay implements IWinLoseView { //control = new QuestDraftWinLose(this, game0); break; case Draft: - if (!FModel.getGauntletMini(GuiBase.getInterface()).isGauntletDraft()) { + if (!FModel.getGauntletMini().isGauntletDraft()) { break; } case Sealed: diff --git a/forge-gui-mobile/src/forge/screens/sealed/SealedScreen.java b/forge-gui-mobile/src/forge/screens/sealed/SealedScreen.java index c9811c9b4ec..8daf753fbb9 100644 --- a/forge-gui-mobile/src/forge/screens/sealed/SealedScreen.java +++ b/forge-gui-mobile/src/forge/screens/sealed/SealedScreen.java @@ -116,7 +116,7 @@ public class SealedScreen extends LaunchScreen { } int matches = FModel.getDecks().getSealed().get(human.getName()).getAiDecks().size(); - FModel.getGauntletMini(GuiBase.getInterface()).launch(matches, human.getDeck(), GameType.Sealed); + FModel.getGauntletMini().launch(matches, human.getDeck(), GameType.Sealed); return false; //prevent launching via launch screen since gauntlet handles it } } diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java index 158204c6527..71e735a4f2a 100644 --- a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java @@ -18,6 +18,7 @@ import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; import forge.screens.FScreen; import forge.screens.TabPageScreen.TabPage; +import forge.sound.SoundSystem; import forge.toolbox.FCheckBox; import forge.toolbox.FGroupList; import forge.toolbox.FList; @@ -194,7 +195,7 @@ public class SettingsPage extends TabPage { public void select() { super.select(); //update background music when this setting changes - Forge.getSoundSystem().changeBackgroundTrack(); + SoundSystem.instance.changeBackgroundTrack(); } }, 7); /*lstSettings.addItem(new BooleanSetting(FPref.UI_ALT_SOUND_SYSTEM, diff --git a/forge-gui-mobile/src/forge/toolbox/FChoiceList.java b/forge-gui-mobile/src/forge/toolbox/FChoiceList.java index 9898d21a7b3..bbb7f439f76 100644 --- a/forge-gui-mobile/src/forge/toolbox/FChoiceList.java +++ b/forge-gui-mobile/src/forge/toolbox/FChoiceList.java @@ -16,7 +16,7 @@ import forge.card.CardRenderer; import forge.card.CardZoom; import forge.game.spellability.SpellAbility; import forge.item.PaperCard; -import forge.screens.match.FControl; +import forge.screens.match.MatchController; import forge.screens.match.views.VAvatar; import forge.screens.match.views.VStack; import forge.util.Utils; @@ -426,7 +426,7 @@ public class FChoiceList extends FList { @Override public void drawValue(Graphics g, T value, FSkinFont font, FSkinColor foreColor, boolean pressed, float x, float y, float w, float h) { PlayerView player = (PlayerView)value; - g.drawImage(FControl.getPlayerAvatar(player), x - FList.PADDING, y - FList.PADDING, VAvatar.WIDTH, VAvatar.HEIGHT); + g.drawImage(MatchController.getPlayerAvatar(player), x - FList.PADDING, y - FList.PADDING, VAvatar.WIDTH, VAvatar.HEIGHT); x += VAvatar.WIDTH; w -= VAvatar.WIDTH; g.drawText(player.getName() + " (" + player.getLife() + ")", font, foreColor, x, y, w, h, false, HAlignment.LEFT, true); diff --git a/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java b/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java index 72e4223c68b..d73e245dc7e 100644 --- a/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java +++ b/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java @@ -49,9 +49,9 @@ import forge.game.player.Player; import forge.game.zone.PlayerZone; import forge.game.zone.Zone; import forge.game.zone.ZoneType; +import forge.match.MatchUtil; import forge.match.input.ButtonUtil; import forge.match.input.InputBase; -import forge.match.input.InputNone; import forge.model.FModel; import forge.player.GamePlayerUtil; import forge.properties.ForgePreferences.FPref; @@ -83,7 +83,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { @Override public void run() { phaseUpdPlanned.set(false); - gameView.getGui().updatePhase(); + MatchUtil.getController().updatePhase(); } }); return null; @@ -100,7 +100,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { @Override public void run() { combatUpdPlanned.set(false); - gameView.getGui().showCombat(gameView.getCombat()); + MatchUtil.getController().showCombat(gameView.getCombat()); } }); return null; @@ -120,7 +120,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { @Override public void run() { turnUpdPlanned.set(false); - gameView.getGui().updateTurn(gameView.getPlayerView(event.turnOwner)); + MatchUtil.getController().updateTurn(gameView.getPlayerView(event.turnOwner)); } }); return null; @@ -148,7 +148,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { FThreads.invokeInEdtNowOrLater(gameView.getGui(), new Runnable() { @Override public void run() { - gameView.getGui().updatePlayerControl(); + MatchUtil.getController().updatePlayerControl(); } }); return null; @@ -172,11 +172,11 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { FThreads.invokeInEdtNowOrLater(gameView.getGui(), new Runnable() { @Override public void run() { - InputNone inputNone = new InputNone(gameView); + PlayerView localPlayer = gameView.getLocalPlayerView(); InputBase.cancelAwaitNextInput(); //ensure "Waiting for opponent..." doesn't appear behind WinLo - gameView.getGui().showPromptMessage(inputNone.getOwner(), ""); //clear prompt behind WinLose overlay - ButtonUtil.update(inputNone, "", "", false, false, false); - gameView.getGui().finishGame(); + MatchUtil.getController().showPromptMessage(localPlayer, ""); //clear prompt behind WinLose overlay + ButtonUtil.update(localPlayer, "", "", false, false, false); + MatchUtil.getController().finishGame(); gameView.updateAchievements(); } }); @@ -188,7 +188,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { @Override public void run() { stackUpdPlanned.set(false); - gameView.getGui().updateStack(); + MatchUtil.getController().updateStack(); } }; @@ -219,7 +219,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { @Override public void run() { synchronized (zonesToUpdate) { - gameView.getGui().updateZones(zonesToUpdate); + MatchUtil.getController().updateZones(zonesToUpdate); zonesToUpdate.clear(); } } @@ -271,7 +271,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { public void run() { synchronized (cardsToUpdate) { final Iterable newCardsToUpdate = gameView.getRefreshedCardViews(cardsToUpdate); - gameView.getGui().updateCards(newCardsToUpdate); + MatchUtil.updateCards(newCardsToUpdate); cardsToUpdate.clear(); } } @@ -372,14 +372,14 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { @Override public Void visit(GameEventCardStatsChanged event) { final Iterable cardViews = gameView.getCardViews(event.cards); - gameView.getGui().refreshCardDetails(cardViews); + MatchUtil.getController().refreshCardDetails(cardViews); return updateManyCards(cardViews); } @Override public Void visit(GameEventPlayerStatsChanged event) { for (final Player p : event.players) { - gameView.getGui().refreshCardDetails(gameView.getCardViews(p.getAllCards())); + MatchUtil.getController().refreshCardDetails(gameView.getCardViews(p.getAllCards())); } return null; } @@ -395,7 +395,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { private final Runnable updManaPool = new Runnable() { @Override public void run() { synchronized (manaPoolUpdate) { - gameView.getGui().updateManaPool(gameView.getPlayerViews(manaPoolUpdate)); + MatchUtil.getController().updateManaPool(gameView.getPlayerViews(manaPoolUpdate)); manaPoolUpdate.clear(); } } @@ -421,7 +421,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { private final Runnable updLives = new Runnable() { @Override public void run() { synchronized (livesUpdate) { - gameView.getGui().updateLives(gameView.getPlayerViews(livesUpdate)); + MatchUtil.getController().updateLives(gameView.getPlayerViews(livesUpdate)); livesUpdate.clear(); } } diff --git a/forge-gui/src/main/java/forge/control/FControlGamePlayback.java b/forge-gui/src/main/java/forge/control/FControlGamePlayback.java index 2d1c4dbe5ec..541c2dac930 100644 --- a/forge-gui/src/main/java/forge/control/FControlGamePlayback.java +++ b/forge-gui/src/main/java/forge/control/FControlGamePlayback.java @@ -19,6 +19,7 @@ import forge.game.event.GameEventSpellResolved; import forge.game.event.GameEventTurnPhase; import forge.game.event.IGameEventVisitor; import forge.interfaces.IGuiBase; +import forge.match.MatchUtil; import forge.match.input.InputPlaybackControl; import forge.view.LocalGameView; @@ -76,7 +77,7 @@ public class FControlGamePlayback extends IGameEventVisitor.Base { */ @Override public Void visit(GameEventTurnPhase ev) { - boolean isUiToStop = gui.stopAtPhase( + boolean isUiToStop = MatchUtil.getController().stopAtPhase( gameView.getPlayerView(ev.playerTurn), ev.phase); switch(ev.phase) { diff --git a/forge-gui/src/main/java/forge/gauntlet/GauntletWinLoseController.java b/forge-gui/src/main/java/forge/gauntlet/GauntletWinLoseController.java index dce2e5f6615..48b0a3dcb64 100644 --- a/forge-gui/src/main/java/forge/gauntlet/GauntletWinLoseController.java +++ b/forge-gui/src/main/java/forge/gauntlet/GauntletWinLoseController.java @@ -10,8 +10,8 @@ import forge.deck.Deck; import forge.game.GameType; import forge.game.player.RegisteredPlayer; import forge.interfaces.IButton; -import forge.interfaces.IGuiBase; import forge.interfaces.IWinLoseView; +import forge.match.MatchUtil; import forge.model.FModel; import forge.player.GamePlayerUtil; import forge.view.IGameView; @@ -19,12 +19,10 @@ import forge.view.IGameView; public abstract class GauntletWinLoseController { private final IGameView lastGame; private final IWinLoseView view; - private final IGuiBase gui; - public GauntletWinLoseController(IWinLoseView view0, final IGameView game0, final IGuiBase gui) { + public GauntletWinLoseController(IWinLoseView view0, final IGameView game0) { view = view0; lastGame = game0; - this.gui = gui; } public void showOutcome() { @@ -121,9 +119,9 @@ public abstract class GauntletWinLoseController { view.hide(); saveOptions(); - gui.endCurrentGame(); + MatchUtil.endCurrentGame(); - gui.startMatch(GameType.Gauntlet, players); + MatchUtil.startMatch(GameType.Gauntlet, players); return true; } return false; diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiBase.java b/forge-gui/src/main/java/forge/interfaces/IGuiBase.java index 0c9c3ea4bf0..301a06e573b 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiBase.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiBase.java @@ -3,32 +3,17 @@ package forge.interfaces; import java.io.File; import java.util.Collection; import java.util.List; -import java.util.Map; - -import org.apache.commons.lang3.tuple.Pair; - import com.google.common.base.Function; import forge.LobbyPlayer; import forge.assets.FSkinProp; import forge.assets.ISkinImage; import forge.deck.CardPool; -import forge.events.UiEvent; -import forge.game.GameType; -import forge.game.Match; -import forge.game.phase.PhaseType; import forge.game.player.IHasIcon; -import forge.game.player.RegisteredPlayer; -import forge.game.zone.ZoneType; import forge.item.PaperCard; import forge.sound.IAudioClip; import forge.sound.IAudioMusic; -import forge.util.ITriggerEvent; import forge.view.CardView; -import forge.view.CombatView; -import forge.view.GameEntityView; -import forge.view.PlayerView; -import forge.view.SpellAbilityView; public interface IGuiBase { boolean isRunningOnDesktop(); @@ -53,40 +38,7 @@ public interface IGuiBase { File getSaveFile(File defaultFile); void showCardList(final String title, final String message, final List list); boolean showBoxedProduct(final String title, final String message, final List list); - void fireEvent(UiEvent e); void setCard(CardView card); - void showCombat(CombatView combat); - void setUsedToPay(CardView card, boolean b); - void setHighlighted(PlayerView player, boolean b); - void showPromptMessage(PlayerView playerView, String message); - boolean stopAtPhase(PlayerView playerTurn, PhaseType phase); - IButton getBtnOK(PlayerView playerView); - IButton getBtnCancel(PlayerView playerView); - void focusButton(IButton button); - void flashIncorrectAction(); - void updatePhase(); - void updateTurn(PlayerView player); - void updatePlayerControl(); - void enableOverlay(); - void disableOverlay(); - void finishGame(); - Object showManaPool(PlayerView player); - void hideManaPool(PlayerView player, Object zoneToRestore); - boolean openZones(Collection zones, Map players); - void restoreOldZones(Map playersToRestoreZonesFor); - void updateStack(); - void updateZones(List> zonesToUpdate); - void updateCards(Iterable cardsToUpdate); - void refreshCardDetails(Iterable cards); - void updateManaPool(List manaPoolUpdate); - void updateLives(List livesUpdate); - void endCurrentGame(); - void startMatch(GameType gauntletType, List starter); - void setPanelSelection(CardView hostCard); - Map getDamageToAssign(CardView attacker, List blockers, - int damageDealt, GameEntityView defender, boolean overrideOrder); - int getAbilityToPlay(List abilities, ITriggerEvent triggerEvent); - void hear(LobbyPlayer player, String message); int getAvatarCount(); void copyToClipboard(String text); void browseToUrl(String url) throws Exception; @@ -94,8 +46,6 @@ public interface IGuiBase { IAudioMusic createAudioMusic(String filename); void startAltSoundSystem(String filename, boolean isSynchronized); void clearImageCache(); - void startGame(Match match); - void continueMatch(Match match); void showSpellShop(); void showBazaar(); void setPlayerAvatar(LobbyPlayer player, IHasIcon ihi); diff --git a/forge-gui/src/main/java/forge/limited/GauntletMini.java b/forge-gui/src/main/java/forge/limited/GauntletMini.java index a631718afe7..adbeb848708 100644 --- a/forge-gui/src/main/java/forge/limited/GauntletMini.java +++ b/forge-gui/src/main/java/forge/limited/GauntletMini.java @@ -23,7 +23,7 @@ import java.util.List; import forge.deck.Deck; import forge.game.GameType; import forge.game.player.RegisteredPlayer; -import forge.interfaces.IGuiBase; +import forge.match.MatchUtil; import forge.model.FModel; import forge.player.GamePlayerUtil; import forge.util.Aggregates; @@ -38,8 +38,6 @@ import forge.util.Aggregates; * @since 1.2.xx */ public class GauntletMini { - - private final IGuiBase gui; private int rounds; private Deck humanDeck; private int currentRound; @@ -49,8 +47,7 @@ public class GauntletMini { private GameType gauntletType; private List aiOpponents = new ArrayList(); - public GauntletMini(IGuiBase gui) { - this.gui = gui; + public GauntletMini() { } // private final String humanName; @@ -86,7 +83,7 @@ public class GauntletMini { } currentRound++; - gui.endCurrentGame(); + MatchUtil.endCurrentGame(); startRound(); } @@ -143,7 +140,7 @@ public class GauntletMini { starter.add(new RegisteredPlayer(humanDeck).setPlayer(GamePlayerUtil.getGuiPlayer())); starter.add(aiOpponents.get(currentRound - 1).setPlayer(GamePlayerUtil.createAiPlayer())); - gui.startMatch(gauntletType, starter); + MatchUtil.startMatch(gauntletType, starter); } /** diff --git a/forge-gui/src/main/java/forge/limited/LimitedWinLoseController.java b/forge-gui/src/main/java/forge/limited/LimitedWinLoseController.java index 4d696948ec0..f35d618cac3 100644 --- a/forge-gui/src/main/java/forge/limited/LimitedWinLoseController.java +++ b/forge-gui/src/main/java/forge/limited/LimitedWinLoseController.java @@ -17,7 +17,7 @@ public abstract class LimitedWinLoseController { public LimitedWinLoseController(IWinLoseView view0, final IGameView game0, final IGuiBase gui) { view = view0; lastGame = game0; - gauntlet = FModel.getGauntletMini(gui); + gauntlet = FModel.getGauntletMini(); wonMatch = lastGame.isMatchWonBy(GamePlayerUtil.getGuiPlayer()); } diff --git a/forge-gui/src/main/java/forge/match/IMatchController.java b/forge-gui/src/main/java/forge/match/IMatchController.java new file mode 100644 index 00000000000..a22e8fd4030 --- /dev/null +++ b/forge-gui/src/main/java/forge/match/IMatchController.java @@ -0,0 +1,54 @@ +package forge.match; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.tuple.Pair; + +import forge.LobbyPlayer; +import forge.game.Match; +import forge.game.phase.PhaseType; +import forge.game.player.Player; +import forge.game.zone.ZoneType; +import forge.interfaces.IButton; +import forge.util.ITriggerEvent; +import forge.view.CardView; +import forge.view.CombatView; +import forge.view.GameEntityView; +import forge.view.PlayerView; +import forge.view.SpellAbilityView; + +public interface IMatchController { + void startNewMatch(Match match); + boolean resetForNewGame(); + void openView(List sortedPlayers, int humanCount); + void afterGameEnd(); + void showCombat(CombatView combat); + void showPromptMessage(PlayerView playerView, String message); + boolean stopAtPhase(PlayerView playerTurn, PhaseType phase); + IButton getBtnOK(PlayerView playerView); + IButton getBtnCancel(PlayerView playerView); + void focusButton(IButton button); + void flashIncorrectAction(); + void updatePhase(); + void updateTurn(PlayerView player); + void updatePlayerControl(); + void enableOverlay(); + void disableOverlay(); + void finishGame(); + Object showManaPool(PlayerView player); + void hideManaPool(PlayerView player, Object zoneToRestore); + boolean openZones(Collection zones, Map players); + void restoreOldZones(Map playersToRestoreZonesFor); + void updateStack(); + void updateZones(List> zonesToUpdate); + void updateSingleCard(CardView card); + void refreshCardDetails(Iterable cards); + void updateManaPool(List manaPoolUpdate); + void updateLives(List livesUpdate); + void setPanelSelection(CardView hostCard); + void hear(LobbyPlayer player, String message); + int getAbilityToPlay(List abilities, ITriggerEvent triggerEvent); + Map assignDamage(CardView attacker, List blockers, int damage, GameEntityView defender, boolean overrideOrder); +} diff --git a/forge-gui-mobile/src/forge/screens/match/FControl.java b/forge-gui/src/main/java/forge/match/MatchUtil.java similarity index 54% rename from forge-gui-mobile/src/forge/screens/match/FControl.java rename to forge-gui/src/main/java/forge/match/MatchUtil.java index 552a916ed74..3aa6c2e46d6 100644 --- a/forge-gui-mobile/src/forge/screens/match/FControl.java +++ b/forge-gui/src/main/java/forge/match/MatchUtil.java @@ -1,4 +1,4 @@ -package forge.screens.match; +package forge.match; import java.io.BufferedReader; import java.io.DataInputStream; @@ -16,18 +16,14 @@ import java.util.Map; import java.util.Set; import java.util.Map.Entry; -import org.apache.commons.lang3.tuple.Pair; +import org.apache.commons.lang3.StringUtils; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; -import forge.Forge; -import forge.Graphics; import forge.GuiBase; import forge.LobbyPlayer; -import forge.assets.FImage; -import forge.assets.FSkin; -import forge.assets.FTextureRegionImage; +import forge.ai.LobbyPlayerAi; import forge.card.CardCharacteristicName; import forge.control.FControlGameEventHandler; import forge.control.FControlGamePlayback; @@ -51,49 +47,43 @@ import forge.match.input.InputQueue; import forge.match.input.InputSynchronized; import forge.model.FModel; import forge.player.GamePlayerUtil; +import forge.player.LobbyPlayerHuman; import forge.player.PlayerControllerHuman; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; import forge.quest.QuestController; -import forge.screens.match.views.VAssignDamage; -import forge.screens.match.views.VPrompt; -import forge.screens.match.views.VCardDisplayArea.CardAreaPanel; -import forge.screens.match.views.VPhaseIndicator; -import forge.screens.match.views.VPhaseIndicator.PhaseLabel; -import forge.screens.match.views.VPlayerPanel; import forge.sound.MusicPlaylist; -import forge.toolbox.FCardPanel; -import forge.toolbox.FDisplayObject; -import forge.toolbox.FOptionPane; -import forge.util.Callback; +import forge.sound.SoundSystem; import forge.util.GuiDisplayUtil; import forge.util.NameGenerator; -import forge.util.WaitCallback; +import forge.util.gui.SOptionPane; import forge.view.CardView; -import forge.view.CardView.CardStateView; -import forge.view.CombatView; import forge.view.GameEntityView; import forge.view.LocalGameView; import forge.view.PlayerView; import forge.view.WatchLocalGame; -public class FControl { - private FControl() { } //don't allow creating instance - +public class MatchUtil { + private static IMatchController controller; private static Game game; private static List gameViews = new ArrayList(); - private static MatchScreen view; private static final EventBus uiEvents; - private static final MatchUiEventVisitor visitor = new MatchUiEventVisitor(); private static FControlGamePlayback playbackControl; - private static final Map avatarImages = new HashMap(); + private static final MatchUiEventVisitor visitor = new MatchUiEventVisitor(); static { uiEvents = new EventBus("ui events"); - uiEvents.register(Forge.getSoundSystem()); + uiEvents.register(SoundSystem.instance); uiEvents.register(visitor); } + public static IMatchController getController() { + return controller; + } + public static void setController(IMatchController controller0) { + controller = controller0; + } + public static void startMatch(GameType gameType, List players) { startMatch(gameType, null, players); } @@ -112,16 +102,16 @@ public class FControl { rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); rules.canCloneUseTargetsImage = FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE); - startGame(new Match(rules, players)); + controller.startNewMatch(new Match(rules, players)); } - public static void startGameInSameMatch() { + public static void continueMatch() { final Match match = game.getMatch(); endCurrentGame(); startGame(match); } - public static void startGameInNewMatch() { + public static void restartMatch() { final Match match = game.getMatch(); endCurrentGame(); match.clearGamesPlayed(); @@ -129,10 +119,19 @@ public class FControl { } public static void startGame(final Match match) { - cardDetailsCache.clear(); //ensure details cache cleared before starting a new game - CardAreaPanel.resetForNewGame(); //ensure card panels reset between games + if (!controller.resetForNewGame()) { return; } - Forge.getSoundSystem().setBackgroundMusic(MusicPlaylist.MATCH); + //prompt user for player one name if needed + final ForgePreferences prefs = FModel.getPreferences(); + if (StringUtils.isBlank(prefs.getPref(FPref.PLAYER_NAME))) { + boolean isPlayerOneHuman = match.getPlayers().get(0).getPlayer() instanceof LobbyPlayerHuman; + boolean isPlayerTwoComputer = match.getPlayers().get(1).getPlayer() instanceof LobbyPlayerAi; + if (isPlayerOneHuman && isPlayerTwoComputer) { + GamePlayerUtil.setPlayerName(GuiBase.getInterface()); + } + } + + SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MATCH); game = match.createGame(); @@ -145,9 +144,9 @@ public class FControl { game.subscribeToEvents(qc); // this one listens to player's mulligans ATM } - game.subscribeToEvents(Forge.getSoundSystem()); + game.subscribeToEvents(SoundSystem.instance); - final String[] indices = FModel.getPreferences().getPref(FPref.UI_AVATARS).split(","); + final String[] indices = prefs.getPref(FPref.UI_AVATARS).split(","); // Instantiate all required field slots (user at 0) final List sortedPlayers = new ArrayList(game.getRegisteredPlayers()); @@ -161,7 +160,6 @@ public class FControl { }); gameViews.clear(); - List playerPanels = new ArrayList(); int i = 0; int avatarIndex = 0; @@ -195,35 +193,13 @@ public class FControl { } } - for (Player p : sortedPlayers) { - playerPanels.add(new VPlayerPanel(getGameView(p).getPlayerView(p), humanCount == 0 || p.getController() instanceof PlayerControllerHuman)); - } - view = new MatchScreen(playerPanels); - if (humanCount == 0) { playbackControl = new FControlGamePlayback(GuiBase.getInterface(), getGameView()); playbackControl.setGame(game); game.subscribeToEvents(playbackControl); - - //add special object that pauses game if screen touched - view.add(new FDisplayObject() { - @Override - public void draw(Graphics g) { - //don't draw anything - } - - @Override - public void buildTouchListeners(float screenX, float screenY, ArrayList listeners) { - if (screenY < view.getHeight() - VPrompt.HEIGHT) { - pause(); - } - } - }); } - actuateMatchPreferences(); - - Forge.openScreen(view); + controller.openView(sortedPlayers, humanCount); // It's important to run match in a different thread to allow GUI inputs to be invoked from inside game. // Game is set on pause while gui player takes decisions @@ -256,10 +232,6 @@ public class FControl { } } - public static MatchScreen getView() { - return view; - } - public static InputQueue getInputQueue() { LocalGameView gameView = getGameView(); if (gameView != null) { @@ -268,44 +240,10 @@ public class FControl { return null; } - public static boolean stopAtPhase(final PlayerView turn, final PhaseType phase) { - PhaseLabel label = getPlayerPanel(turn).getPhaseIndicator().getLabel(phase); - return label == null || label.getStopAtPhase(); - } - public static void endCurrentTurn() { getGameView().passPriorityUntilEndOfTurn(); } - public static void resetAllPhaseButtons() { - for (final VPlayerPanel panel : view.getPlayerPanels().values()) { - panel.getPhaseIndicator().resetPhaseButtons(); - } - } - - public static VPlayerPanel getPlayerPanel(final PlayerView playerView) { - return view.getPlayerPanels().get(playerView); - } - - public static void highlightCard(final CardView c) { - for (VPlayerPanel playerPanel : FControl.getView().getPlayerPanels().values()) { - for (FCardPanel p : playerPanel.getField().getCardPanels()) { - if (p.getCard().equals(c)) { - p.setHighlighted(true); - return; - } - } - } - } - - public static void clearCardHighlights() { - for (VPlayerPanel playerPanel : FControl.getView().getPlayerPanels().values()) { - for (FCardPanel p : playerPanel.getField().getCardPanels()) { - p.setHighlighted(false); - } - } - } - public static Player getCurrentPlayer() { if (game == null) { return null; } @@ -330,29 +268,6 @@ public class FControl { getGameView().alphaStrike(); } - public static void showCombat(CombatView combat) { - /*if (combat != null && combat.getAttackers().size() > 0 && combat.getAttackingPlayer().getGame().getStack().isEmpty()) { - if (selectedDocBeforeCombat == null) { - IVDoc combatDoc = EDocID.REPORT_COMBAT.getDoc(); - if (combatDoc.getParentCell() != null) { - selectedDocBeforeCombat = combatDoc.getParentCell().getSelected(); - if (selectedDocBeforeCombat != combatDoc) { - SDisplayUtil.showTab(combatDoc); - } - else { - selectedDocBeforeCombat = null; //don't need to cache combat doc this way - } - } - } - } - else if (selectedDocBeforeCombat != null) { //re-select doc that was selected before once combat finished - SDisplayUtil.showTab(selectedDocBeforeCombat); - selectedDocBeforeCombat = null; - } - CCombat.SINGLETON_INSTANCE.setModel(combat); - CCombat.SINGLETON_INSTANCE.update();*/ - } - public static Map getDamageToAssign(final CardView attacker, final List blockers, final int damage, final GameEntityView defender, final boolean overrideOrder) { if (damage <= 0) { return new HashMap(); @@ -366,22 +281,20 @@ public class FControl { return res; } - return new WaitCallback>() { - @Override - public void run() { - VAssignDamage v = new VAssignDamage(attacker, blockers, damage, defender, overrideOrder, this); - v.show(); - } - }.invokeAndWait(); + return controller.assignDamage(attacker, blockers, damage, defender, overrideOrder); } private static Set highlightedPlayers = new HashSet(); - public static void setHighlighted(PlayerView ge, boolean b) { - if (b) highlightedPlayers.add(ge); - else highlightedPlayers.remove(ge); + public static void setHighlighted(PlayerView pv, boolean b) { + if (b) { + highlightedPlayers.add(pv); + } + else { + highlightedPlayers.remove(pv); + } } - public static boolean isHighlighted(Player player) { + public static boolean isHighlighted(PlayerView player) { return highlightedPlayers.contains(player); } @@ -390,7 +303,7 @@ public class FControl { public static void setUsedToPay(CardView card, boolean value) { boolean hasChanged = value ? highlightedCards.add(card) : highlightedCards.remove(card); if (hasChanged) { // since we are in UI thread, may redraw the card right now - updateSingleCard(card); + controller.updateSingleCard(card); } } @@ -398,79 +311,9 @@ public class FControl { return highlightedCards.contains(card); } - public static void updateZones(List> zonesToUpdate) { - for (Pair kv : zonesToUpdate) { - PlayerView owner = kv.getKey(); - ZoneType zt = kv.getValue(); - if (owner == null || zt == null) { - continue; - } - getPlayerPanel(owner).updateZone(zt); - } - } - - // Player's mana pool changes - public static void updateManaPool(List manaPoolUpdate) { - for (PlayerView p : manaPoolUpdate) { - getPlayerPanel(p).updateManaPool(); - } - } - - // Player's lives and poison counters - public static void updateLives(List livesUpdate) { - for (PlayerView p : livesUpdate) { - getPlayerPanel(p).updateLife(); - } - } - public static void updateCards(Iterable cardsToUpdate) { for (CardView c : cardsToUpdate) { - updateSingleCard(c); - } - } - - private static final Map cardDetailsCache = new HashMap(); - - public static CardStateView getCardDetails(CardView card) { - final CardStateView details = cardDetailsCache.get(card.getId()); - if (details == null) { - cardDetailsCache.put(card.getId(), card.getOriginal()); - return card.getOriginal(); - } - return details; - } - - public static void refreshCardDetails(Iterable cards) { - Set playersNeedingFieldUpdate = null; - - for (final CardView c : cards) { - //for each card in play, if it changed from creature to non-creature or vice versa, - //or if it changed from land to non-land or vice-versa, - //ensure field containing that card is updated to reflect that change - final CardStateView state = c.getOriginal(); - if (c.getZone() == ZoneType.Battlefield) { - CardStateView oldDetails = cardDetailsCache.get(c); - if (oldDetails == null || state.isCreature() != oldDetails.isCreature() || state.isLand() != oldDetails.isLand()) { - if (playersNeedingFieldUpdate == null) { - playersNeedingFieldUpdate = new HashSet(); - } - playersNeedingFieldUpdate.add(c.getController()); - } - } - cardDetailsCache.put(c.getId(), c.getOriginal()); - } - - if (playersNeedingFieldUpdate != null) { //update field for any players necessary - for (PlayerView p : playersNeedingFieldUpdate) { - getPlayerPanel(p).getField().update(); - } - } - } - - public static void updateSingleCard(final CardView card) { - final ZoneType zone = card.getZone(); - if (zone != null && zone == ZoneType.Battlefield) { - getPlayerPanel(card.getController()).getField().updateCard(card); + controller.updateSingleCard(c); } } @@ -479,14 +322,9 @@ public class FControl { String userPrompt = "This will end the current game and you will not be able to resume.\n\n" + "Concede anyway?"; - FOptionPane.showConfirmDialog(userPrompt, "Concede Game?", "Concede", "Cancel", false, new Callback() { - @Override - public void run(Boolean result) { - if (result) { - stopGame(); - } - } - }); + if (SOptionPane.showConfirmDialog(GuiBase.getInterface(), userPrompt, "Concede Game?", "Concede", "Cancel")) { + stopGame(); + } } public static void stopGame() { @@ -525,13 +363,12 @@ public class FControl { public static void endCurrentGame() { if (game == null) { return; } - Forge.back(); game = null; - cardDetailsCache.clear(); //ensure card details cache cleared ending game + controller.afterGameEnd(); } public static void pause() { - Forge.getSoundSystem().pause(); + SoundSystem.instance.pause(); //pause playback if needed InputQueue inputQueue = getInputQueue(); if (inputQueue != null && inputQueue.getInput() instanceof InputPlaybackControl) { @@ -540,7 +377,7 @@ public class FControl { } public static void resume() { - Forge.getSoundSystem().resume(); + SoundSystem.instance.resume(); } private final static boolean LOG_UIEVENTS = false; @@ -553,25 +390,6 @@ public class FControl { uiEvents.post(uiEvent); } - private static class MatchUiEventVisitor implements IUiEventVisitor { - @Override - public Void visit(UiEventBlockerAssigned event) { - updateSingleCard(event.blocker); - return null; - } - - @Override - public Void visit(UiEventAttackerDeclared event) { - updateSingleCard(event.attacker); - return null; - } - - @Subscribe - public void receiveEvent(UiEvent evt) { - evt.visit(this); - } - } - public static void setupGameState(String filename) { int humanLife = -1; int aiLife = -1; @@ -647,10 +465,10 @@ public class FControl { in.close(); } catch (final FileNotFoundException fnfe) { - FOptionPane.showErrorDialog("File not found: " + filename); + SOptionPane.showErrorDialog(GuiBase.getInterface(), "File not found: " + filename); } catch (final Exception e) { - FOptionPane.showErrorDialog("Error loading battle setup file!"); + SOptionPane.showErrorDialog(GuiBase.getInterface(), "Error loading battle setup file!"); return; } @@ -745,72 +563,6 @@ public class FControl { } return cl; } - - public static void writeMatchPreferences() { - ForgePreferences prefs = FModel.getPreferences(); - - VPhaseIndicator fvAi = FControl.getView().getTopPlayerPanel().getPhaseIndicator(); - prefs.setPref(FPref.PHASE_AI_UPKEEP, String.valueOf(fvAi.getLabel(PhaseType.UPKEEP).getStopAtPhase())); - prefs.setPref(FPref.PHASE_AI_DRAW, String.valueOf(fvAi.getLabel(PhaseType.DRAW).getStopAtPhase())); - prefs.setPref(FPref.PHASE_AI_MAIN1, String.valueOf(fvAi.getLabel(PhaseType.MAIN1).getStopAtPhase())); - prefs.setPref(FPref.PHASE_AI_BEGINCOMBAT, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_BEGIN).getStopAtPhase())); - prefs.setPref(FPref.PHASE_AI_DECLAREATTACKERS, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_DECLARE_ATTACKERS).getStopAtPhase())); - prefs.setPref(FPref.PHASE_AI_DECLAREBLOCKERS, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_DECLARE_BLOCKERS).getStopAtPhase())); - prefs.setPref(FPref.PHASE_AI_FIRSTSTRIKE, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE).getStopAtPhase())); - prefs.setPref(FPref.PHASE_AI_COMBATDAMAGE, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_DAMAGE).getStopAtPhase())); - prefs.setPref(FPref.PHASE_AI_ENDCOMBAT, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_END).getStopAtPhase())); - prefs.setPref(FPref.PHASE_AI_MAIN2, String.valueOf(fvAi.getLabel(PhaseType.MAIN2).getStopAtPhase())); - prefs.setPref(FPref.PHASE_AI_EOT, String.valueOf(fvAi.getLabel(PhaseType.END_OF_TURN).getStopAtPhase())); - prefs.setPref(FPref.PHASE_AI_CLEANUP, String.valueOf(fvAi.getLabel(PhaseType.CLEANUP).getStopAtPhase())); - - VPhaseIndicator fvHuman = FControl.getView().getBottomPlayerPanel().getPhaseIndicator(); - prefs.setPref(FPref.PHASE_HUMAN_UPKEEP, String.valueOf(fvHuman.getLabel(PhaseType.UPKEEP).getStopAtPhase())); - prefs.setPref(FPref.PHASE_HUMAN_DRAW, String.valueOf(fvHuman.getLabel(PhaseType.DRAW).getStopAtPhase())); - prefs.setPref(FPref.PHASE_HUMAN_MAIN1, String.valueOf(fvHuman.getLabel(PhaseType.MAIN1).getStopAtPhase())); - prefs.setPref(FPref.PHASE_HUMAN_BEGINCOMBAT, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_BEGIN).getStopAtPhase())); - prefs.setPref(FPref.PHASE_HUMAN_DECLAREATTACKERS, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_DECLARE_ATTACKERS).getStopAtPhase())); - prefs.setPref(FPref.PHASE_HUMAN_DECLAREBLOCKERS, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_DECLARE_BLOCKERS).getStopAtPhase())); - prefs.setPref(FPref.PHASE_HUMAN_FIRSTSTRIKE, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE).getStopAtPhase())); - prefs.setPref(FPref.PHASE_HUMAN_COMBATDAMAGE, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_DAMAGE).getStopAtPhase())); - prefs.setPref(FPref.PHASE_HUMAN_ENDCOMBAT, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_END).getStopAtPhase())); - prefs.setPref(FPref.PHASE_HUMAN_MAIN2, String.valueOf(fvHuman.getLabel(PhaseType.MAIN2).getStopAtPhase())); - prefs.setPref(FPref.PHASE_HUMAN_EOT, fvHuman.getLabel(PhaseType.END_OF_TURN).getStopAtPhase()); - prefs.setPref(FPref.PHASE_HUMAN_CLEANUP, fvHuman.getLabel(PhaseType.CLEANUP).getStopAtPhase()); - - prefs.save(); - } - - private static void actuateMatchPreferences() { - ForgePreferences prefs = FModel.getPreferences(); - - VPhaseIndicator fvAi = FControl.getView().getTopPlayerPanel().getPhaseIndicator(); - fvAi.getLabel(PhaseType.UPKEEP).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_UPKEEP)); - fvAi.getLabel(PhaseType.DRAW).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_DRAW)); - fvAi.getLabel(PhaseType.MAIN1).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_MAIN1)); - fvAi.getLabel(PhaseType.COMBAT_BEGIN).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_BEGINCOMBAT)); - fvAi.getLabel(PhaseType.COMBAT_DECLARE_ATTACKERS).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_DECLAREATTACKERS)); - fvAi.getLabel(PhaseType.COMBAT_DECLARE_BLOCKERS).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_DECLAREBLOCKERS)); - fvAi.getLabel(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_FIRSTSTRIKE)); - fvAi.getLabel(PhaseType.COMBAT_DAMAGE).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_COMBATDAMAGE)); - fvAi.getLabel(PhaseType.COMBAT_END).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_ENDCOMBAT)); - fvAi.getLabel(PhaseType.MAIN2).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_MAIN2)); - fvAi.getLabel(PhaseType.END_OF_TURN).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_EOT)); - fvAi.getLabel(PhaseType.CLEANUP).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_CLEANUP)); - - VPhaseIndicator fvHuman = FControl.getView().getBottomPlayerPanel().getPhaseIndicator(); - fvHuman.getLabel(PhaseType.UPKEEP).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_UPKEEP)); - fvHuman.getLabel(PhaseType.DRAW).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DRAW)); - fvHuman.getLabel(PhaseType.MAIN1).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_MAIN1)); - fvHuman.getLabel(PhaseType.COMBAT_BEGIN).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_BEGINCOMBAT)); - fvHuman.getLabel(PhaseType.COMBAT_DECLARE_ATTACKERS).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREATTACKERS)); - fvHuman.getLabel(PhaseType.COMBAT_DECLARE_BLOCKERS).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREBLOCKERS)); - fvHuman.getLabel(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_FIRSTSTRIKE)); - fvHuman.getLabel(PhaseType.COMBAT_DAMAGE).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_COMBATDAMAGE)); - fvHuman.getLabel(PhaseType.COMBAT_END).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_ENDCOMBAT)); - fvHuman.getLabel(PhaseType.MAIN2).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_MAIN2)); - fvHuman.getLabel(PhaseType.END_OF_TURN).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_EOT)); - fvHuman.getLabel(PhaseType.CLEANUP).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_CLEANUP)); - } /** Returns a random name from the supplied list. */ public static String getRandomName() { @@ -823,16 +575,22 @@ public class FControl { return GamePlayerUtil.getGuiPlayer(); } - public static FImage getPlayerAvatar(final PlayerView p) { - LobbyPlayer lp = p.getLobbyPlayer(); - FImage avatar = avatarImages.get(lp); - if (avatar == null) { - avatar = new FTextureRegionImage(FSkin.getAvatars().get(lp.getAvatarIndex())); + private static class MatchUiEventVisitor implements IUiEventVisitor { + @Override + public Void visit(UiEventBlockerAssigned event) { + controller.updateSingleCard(event.blocker); + return null; } - return avatar; - } - public static void setPlayerAvatar(final LobbyPlayer lp, final FImage avatarImage) { - avatarImages.put(lp, avatarImage); + @Override + public Void visit(UiEventAttackerDeclared event) { + controller.updateSingleCard(event.attacker); + return null; + } + + @Subscribe + public void receiveEvent(UiEvent evt) { + evt.visit(this); + } } } diff --git a/forge-gui/src/main/java/forge/match/input/ButtonUtil.java b/forge-gui/src/main/java/forge/match/input/ButtonUtil.java index 5482b52a0d3..1845b5414d0 100644 --- a/forge-gui/src/main/java/forge/match/input/ButtonUtil.java +++ b/forge-gui/src/main/java/forge/match/input/ButtonUtil.java @@ -18,31 +18,29 @@ package forge.match.input; import forge.interfaces.IButton; -import forge.interfaces.IGuiBase; +import forge.match.MatchUtil; import forge.view.PlayerView; /** * Manages match UI OK/Cancel button enabling and focus */ public class ButtonUtil { - public static void update(final Input input, boolean okEnabled, boolean cancelEnabled, boolean focusOk) { - update(input, "OK", "Cancel", okEnabled, cancelEnabled, focusOk); + public static void update(PlayerView owner, boolean okEnabled, boolean cancelEnabled, boolean focusOk) { + update(owner, "OK", "Cancel", okEnabled, cancelEnabled, focusOk); } - public static void update(final Input input, String okLabel, String cancelLabel, boolean okEnabled, boolean cancelEnabled, boolean focusOk) { - IGuiBase gui = input.getGui(); - PlayerView owner = input.getOwner(); - IButton btnOk = gui.getBtnOK(owner); - IButton btnCancel = gui.getBtnCancel(owner); + public static void update(PlayerView owner, String okLabel, String cancelLabel, boolean okEnabled, boolean cancelEnabled, boolean focusOk) { + IButton btnOk = MatchUtil.getController().getBtnOK(owner); + IButton btnCancel = MatchUtil.getController().getBtnCancel(owner); btnOk.setText(okLabel); btnCancel.setText(cancelLabel); btnOk.setEnabled(okEnabled); btnCancel.setEnabled(cancelEnabled); if (okEnabled && focusOk) { - gui.focusButton(btnOk); + MatchUtil.getController().focusButton(btnOk); } else if (cancelEnabled) { - gui.focusButton(btnCancel); + MatchUtil.getController().focusButton(btnCancel); } } } diff --git a/forge-gui/src/main/java/forge/match/input/InputAttack.java b/forge-gui/src/main/java/forge/match/input/InputAttack.java index ad8da6fda15..ce1d5402d32 100644 --- a/forge-gui/src/main/java/forge/match/input/InputAttack.java +++ b/forge-gui/src/main/java/forge/match/input/InputAttack.java @@ -37,6 +37,7 @@ import forge.game.combat.Combat; import forge.game.combat.CombatUtil; import forge.game.player.Player; import forge.game.zone.ZoneType; +import forge.match.MatchUtil; import forge.player.PlayerControllerHuman; import forge.util.ITriggerEvent; import forge.view.CardView; @@ -81,7 +82,7 @@ public class InputAttack extends InputSyncronizedBase { List> mandatoryAttackers = CombatUtil.getMandatoryAttackers(playerAttacks, combat, defenders); for (Pair attacker : mandatoryAttackers) { combat.addAttacker(attacker.getLeft(), attacker.getRight()); - getGui().fireEvent(new UiEventAttackerDeclared( + MatchUtil.fireEvent(new UiEventAttackerDeclared( getController().getCardView(attacker.getLeft()), getController().getGameEntityView(attacker.getRight()))); } @@ -100,10 +101,10 @@ public class InputAttack extends InputSyncronizedBase { private void updatePrompt() { if (canCallBackAttackers()) { - ButtonUtil.update(this, "OK", "Call Back", true, true, true); + ButtonUtil.update(getOwner(), "OK", "Call Back", true, true, true); } else { - ButtonUtil.update(this, "OK", "Alpha Strike", true, true, true); + ButtonUtil.update(getOwner(), "OK", "Alpha Strike", true, true, true); } } @@ -151,7 +152,7 @@ public class InputAttack extends InputSyncronizedBase { } } } - getGui().updateCards(refreshCards); + MatchUtil.updateCards(refreshCards); updateMessage(); } @@ -238,7 +239,7 @@ public class InputAttack extends InputSyncronizedBase { combat.addAttacker(card, currentDefender, activeBand); activateBand(activeBand); - getGui().fireEvent(new UiEventAttackerDeclared( + MatchUtil.fireEvent(new UiEventAttackerDeclared( getController().getCardView(card), getController().getGameEntityView(currentDefender))); } @@ -253,11 +254,11 @@ public class InputAttack extends InputSyncronizedBase { if (canUndeclareAttacker(card)) { // TODO Is there no way to attacks each turn cards to attack Planeswalkers? combat.removeFromCombat(card); - getGui().setUsedToPay(getController().getCardView(card), false); + MatchUtil.setUsedToPay(getController().getCardView(card), false); // When removing an attacker clear the attacking band activateBand(null); - getGui().fireEvent(new UiEventAttackerDeclared( + MatchUtil.fireEvent(new UiEventAttackerDeclared( getController().getCardView(card), null)); return true; } @@ -268,10 +269,10 @@ public class InputAttack extends InputSyncronizedBase { currentDefender = def; for (final GameEntity ge : defenders) { if (ge instanceof Card) { - getGui().setUsedToPay(getController().getCardView((Card) ge), ge == def); + MatchUtil.setUsedToPay(getController().getCardView((Card) ge), ge == def); } else if (ge instanceof Player) { - getGui().setHighlighted(getController().getPlayerView((Player) ge), ge == def); + MatchUtil.setHighlighted(getController().getPlayerView((Player) ge), ge == def); } } @@ -281,14 +282,14 @@ public class InputAttack extends InputSyncronizedBase { private final void activateBand(final AttackingBand band) { if (activeBand != null) { for (final Card card : activeBand.getAttackers()) { - getGui().setUsedToPay(getController().getCardView(card), false); + MatchUtil.setUsedToPay(getController().getCardView(card), false); } } activeBand = band; if (activeBand != null) { for (final Card card : activeBand.getAttackers()) { - getGui().setUsedToPay(getController().getCardView(card), true); + MatchUtil.setUsedToPay(getController().getCardView(card), true); } } } @@ -312,6 +313,6 @@ public class InputAttack extends InputSyncronizedBase { showMessage(message); updatePrompt(); - getGui().showCombat(getController().getCombat(combat)); // redraw sword icons + MatchUtil.getController().showCombat(getController().getCombat(combat)); // redraw sword icons } } diff --git a/forge-gui/src/main/java/forge/match/input/InputBase.java b/forge-gui/src/main/java/forge/match/input/InputBase.java index 0ec25ad6beb..141345f3645 100644 --- a/forge-gui/src/main/java/forge/match/input/InputBase.java +++ b/forge-gui/src/main/java/forge/match/input/InputBase.java @@ -27,6 +27,7 @@ import forge.game.phase.PhaseHandler; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.interfaces.IGuiBase; +import forge.match.MatchUtil; import forge.player.PlayerControllerHuman; import forge.util.ITriggerEvent; import forge.view.LocalGameView; @@ -110,9 +111,9 @@ public abstract class InputBase implements java.io.Serializable, Input { } private static void updatePromptForAwait(final LocalGameView gameView) { - InputNone inputNone = new InputNone(gameView); - inputNone.getGui().showPromptMessage(inputNone.getOwner(), "Waiting for opponent..."); - ButtonUtil.update(inputNone, false, false, false); + PlayerView playerView = gameView.getLocalPlayerView(); + MatchUtil.getController().showPromptMessage(playerView, "Waiting for opponent..."); + ButtonUtil.update(playerView, false, false, false); } public static void cancelAwaitNextInput() { @@ -173,11 +174,11 @@ public abstract class InputBase implements java.io.Serializable, Input { // to remove need for CMatchUI dependence protected final void showMessage(final String message) { - getGui().showPromptMessage(getOwner(), message); + MatchUtil.getController().showPromptMessage(getOwner(), message); } protected final void flashIncorrectAction() { - getGui().flashIncorrectAction(); + MatchUtil.getController().flashIncorrectAction(); } protected String getTurnPhasePriorityMessage(final Game game) { diff --git a/forge-gui/src/main/java/forge/match/input/InputBlock.java b/forge-gui/src/main/java/forge/match/input/InputBlock.java index c66d4f69f45..519115492f6 100644 --- a/forge-gui/src/main/java/forge/match/input/InputBlock.java +++ b/forge-gui/src/main/java/forge/match/input/InputBlock.java @@ -26,6 +26,7 @@ import forge.game.combat.Combat; import forge.game.combat.CombatUtil; import forge.game.player.Player; import forge.game.zone.ZoneType; +import forge.match.MatchUtil; import forge.player.PlayerControllerHuman; import forge.util.ITriggerEvent; import forge.util.ThreadUtil; @@ -74,7 +75,7 @@ public class InputBlock extends InputSyncronizedBase { @Override protected final void showMessage() { // could add "Reset Blockers" button - ButtonUtil.update(this, true, false, true); + ButtonUtil.update(getOwner(), true, false, true); if (currentAttacker == null) { showMessage("Select another attacker to declare blockers for."); @@ -85,7 +86,7 @@ public class InputBlock extends InputSyncronizedBase { showMessage(message); } - getGui().showCombat(getController().getCombat(combat)); + MatchUtil.getController().showCombat(getController().getCombat(combat)); } /** {@inheritDoc} */ @@ -114,7 +115,7 @@ public class InputBlock extends InputSyncronizedBase { boolean isCorrectAction = false; if (triggerEvent != null && triggerEvent.getButton() == 3 && card.getController() == defender) { combat.removeFromCombat(card); - getGui().fireEvent(new UiEventBlockerAssigned( + MatchUtil.fireEvent(new UiEventBlockerAssigned( getController().getCardView(card), (CardView) null)); isCorrectAction = true; } @@ -130,7 +131,7 @@ public class InputBlock extends InputSyncronizedBase { if (combat.isBlocking(card, currentAttacker)) { //if creature already blocking current attacker, remove blocker from combat combat.removeBlockAssignment(currentAttacker, card); - getGui().fireEvent(new UiEventBlockerAssigned( + MatchUtil.fireEvent(new UiEventBlockerAssigned( getController().getCardView(card), (CardView) null)); isCorrectAction = true; } @@ -138,7 +139,7 @@ public class InputBlock extends InputSyncronizedBase { isCorrectAction = CombatUtil.canBlock(currentAttacker, card, combat); if (isCorrectAction) { combat.addBlocker(currentAttacker, card); - getGui().fireEvent(new UiEventBlockerAssigned( + MatchUtil.fireEvent(new UiEventBlockerAssigned( getController().getCardView(card), getController().getCardView(currentAttacker))); } @@ -157,7 +158,7 @@ public class InputBlock extends InputSyncronizedBase { private void setCurrentAttacker(final Card card) { currentAttacker = card; for (final Card c : combat.getAttackers()) { - getGui().setUsedToPay(getController().getCardView(c), card == c); + MatchUtil.setUsedToPay(getController().getCardView(c), card == c); } } } diff --git a/forge-gui/src/main/java/forge/match/input/InputConfirm.java b/forge-gui/src/main/java/forge/match/input/InputConfirm.java index b4c79ddd53c..80b1cd02cc9 100644 --- a/forge-gui/src/main/java/forge/match/input/InputConfirm.java +++ b/forge-gui/src/main/java/forge/match/input/InputConfirm.java @@ -56,7 +56,7 @@ public class InputConfirm extends InputSyncronizedBase { /** {@inheritDoc} */ @Override protected final void showMessage() { - ButtonUtil.update(this, yesButtonText, noButtonText, true, true, defaultYes); + ButtonUtil.update(getOwner(), yesButtonText, noButtonText, true, true, defaultYes); showMessage(message); } diff --git a/forge-gui/src/main/java/forge/match/input/InputConfirmMulligan.java b/forge-gui/src/main/java/forge/match/input/InputConfirmMulligan.java index 4911e6f391a..8b82441c182 100644 --- a/forge-gui/src/main/java/forge/match/input/InputConfirmMulligan.java +++ b/forge-gui/src/main/java/forge/match/input/InputConfirmMulligan.java @@ -24,6 +24,7 @@ import forge.game.Game; import forge.game.card.Card; import forge.game.player.Player; import forge.game.zone.ZoneType; +import forge.match.MatchUtil; import forge.player.PlayerControllerHuman; import forge.util.ITriggerEvent; import forge.util.Lang; @@ -72,11 +73,11 @@ public class InputConfirmMulligan extends InputSyncronizedBase { } if (isCommander) { - ButtonUtil.update(this, "Keep", "Exile", true, false, true); + ButtonUtil.update(getOwner(), "Keep", "Exile", true, false, true); sb.append("Will you keep your hand or choose some cards to exile those and draw one less card?"); } else { - ButtonUtil.update(this, "Keep", "Mulligan", true, true, true); + ButtonUtil.update(getOwner(), "Keep", "Mulligan", true, true, true); sb.append("Do you want to keep your hand?"); } @@ -101,7 +102,7 @@ public class InputConfirmMulligan extends InputSyncronizedBase { if (isCommander) { // Clear the "selected" icon after clicking the done button for (final Card c : this.selected) { - getGui().setUsedToPay(getController().getCardView(c), false); + MatchUtil.setUsedToPay(getController().getCardView(c), false); } } stop(); @@ -137,14 +138,14 @@ public class InputConfirmMulligan extends InputSyncronizedBase { if (isCommander) { // allow to choose cards for partial paris if (selected.contains(c0)) { - getGui().setUsedToPay(getController().getCardView(c0), false); + MatchUtil.setUsedToPay(getController().getCardView(c0), false); selected.remove(c0); } else { - getGui().setUsedToPay(getController().getCardView(c0), true); + MatchUtil.setUsedToPay(getController().getCardView(c0), true); selected.add(c0); } - ButtonUtil.update(this, "Keep", "Exile", true, !selected.isEmpty(), true); + ButtonUtil.update(getOwner(), "Keep", "Exile", true, !selected.isEmpty(), true); } return true; } diff --git a/forge-gui/src/main/java/forge/match/input/InputLockUI.java b/forge-gui/src/main/java/forge/match/input/InputLockUI.java index 49bc0d033b8..0f63f3893e2 100644 --- a/forge-gui/src/main/java/forge/match/input/InputLockUI.java +++ b/forge-gui/src/main/java/forge/match/input/InputLockUI.java @@ -8,6 +8,7 @@ import forge.game.card.Card; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.interfaces.IGuiBase; +import forge.match.MatchUtil; import forge.util.ITriggerEvent; import forge.util.ThreadUtil; import forge.view.PlayerView; @@ -65,7 +66,7 @@ public class InputLockUI implements Input { private final Runnable showMessageFromEdt = new Runnable() { @Override public void run() { - ButtonUtil.update(InputLockUI.this, "", "", false, false, false); + ButtonUtil.update(InputLockUI.this.getOwner(), "", "", false, false, false); showMessage("Waiting for actions..."); } }; @@ -75,7 +76,7 @@ public class InputLockUI implements Input { } protected void showMessage(String message) { - getGui().showPromptMessage(getOwner(), message); + MatchUtil.getController().showPromptMessage(getOwner(), message); } @Override diff --git a/forge-gui/src/main/java/forge/match/input/InputNone.java b/forge-gui/src/main/java/forge/match/input/InputNone.java deleted file mode 100644 index 8f0a3487cbd..00000000000 --- a/forge-gui/src/main/java/forge/match/input/InputNone.java +++ /dev/null @@ -1,54 +0,0 @@ -package forge.match.input; - -import forge.game.card.Card; -import forge.game.player.Player; -import forge.game.spellability.SpellAbility; -import forge.interfaces.IGuiBase; -import forge.util.ITriggerEvent; -import forge.view.LocalGameView; -import forge.view.PlayerView; - -public class InputNone implements Input { - private final IGuiBase gui; - private final PlayerView owner; - - public InputNone(LocalGameView gameView) { - gui = gameView.getGui(); - owner = gameView.getLocalPlayerView(); - } - - @Override - public IGuiBase getGui() { - return gui; - } - - @Override - public PlayerView getOwner() { - return owner; - } - - @Override - public void showMessageInitial() { - } - - @Override - public boolean selectCard(Card card, ITriggerEvent triggerEvent) { - return false; - } - - @Override - public void selectAbility(SpellAbility ab) { - } - - @Override - public void selectPlayer(Player player, ITriggerEvent triggerEvent) { - } - - @Override - public void selectButtonOK() { - } - - @Override - public void selectButtonCancel() { - } -} diff --git a/forge-gui/src/main/java/forge/match/input/InputPassPriority.java b/forge-gui/src/main/java/forge/match/input/InputPassPriority.java index 5436307e990..41d0aa72a76 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPassPriority.java +++ b/forge-gui/src/main/java/forge/match/input/InputPassPriority.java @@ -57,10 +57,10 @@ public class InputPassPriority extends InputSyncronizedBase { showMessage(getTurnPhasePriorityMessage(player.getGame())); chosenSa = null; if (getController().canUndoLastAction()) { //allow undoing with cancel button if can undo last action - ButtonUtil.update(this, "OK", "Undo", true, true, true); + ButtonUtil.update(getOwner(), "OK", "Undo", true, true, true); } else { //otherwise allow ending turn with cancel button - ButtonUtil.update(this, "OK", "End Turn", true, true, true); + ButtonUtil.update(getOwner(), "OK", "End Turn", true, true, true); } } diff --git a/forge-gui/src/main/java/forge/match/input/InputPayMana.java b/forge-gui/src/main/java/forge/match/input/InputPayMana.java index 93c2a4ecd4c..9b43a264873 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPayMana.java +++ b/forge-gui/src/main/java/forge/match/input/InputPayMana.java @@ -21,6 +21,7 @@ import forge.game.player.Player; import forge.game.replacement.ReplacementEffect; import forge.game.spellability.AbilityManaPart; import forge.game.spellability.SpellAbility; +import forge.match.MatchUtil; import forge.player.HumanPlay; import forge.player.PlayerControllerHuman; import forge.util.Evaluator; @@ -53,13 +54,13 @@ public abstract class InputPayMana extends InputSyncronizedBase { //if player is floating mana, show mana pool to make it easier to use that mana wasFloatingMana = !player.getManaPool().isEmpty(); - zoneToRestore = wasFloatingMana ? getGui().showManaPool(getController().getPlayerView(player)) : null; + zoneToRestore = wasFloatingMana ? MatchUtil.getController().showManaPool(getController().getPlayerView(player)) : null; } @Override protected void onStop() { if (wasFloatingMana) { //hide mana pool if it was shown due to floating mana - getGui().hideManaPool(getController().getPlayerView(player), zoneToRestore); + MatchUtil.getController().hideManaPool(getController().getPlayerView(player), zoneToRestore); } } @@ -371,10 +372,10 @@ public abstract class InputPayMana extends InputSyncronizedBase { protected void updateButtons() { if (supportAutoPay()) { - ButtonUtil.update(this, "Auto", "Cancel", false, true, false); + ButtonUtil.update(getOwner(), "Auto", "Cancel", false, true, false); } else { - ButtonUtil.update(this, "", "Cancel", false, true, false); + ButtonUtil.update(getOwner(), "", "Cancel", false, true, false); } } @@ -393,7 +394,7 @@ public abstract class InputPayMana extends InputSyncronizedBase { canPayManaCost = proc.getResult(); } if (canPayManaCost) { //enabled Auto button if mana cost can be paid - ButtonUtil.update(this, "Auto", "Cancel", true, true, true); + ButtonUtil.update(getOwner(), "Auto", "Cancel", true, true, true); } } showMessage(getMessage()); diff --git a/forge-gui/src/main/java/forge/match/input/InputPlaybackControl.java b/forge-gui/src/main/java/forge/match/input/InputPlaybackControl.java index de3862517a2..10545c7de86 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPlaybackControl.java +++ b/forge-gui/src/main/java/forge/match/input/InputPlaybackControl.java @@ -55,10 +55,10 @@ public class InputPlaybackControl extends InputSyncronizedBase implements InputS private void setPause(boolean pause) { isPaused = pause; if (isPaused) { - ButtonUtil.update(this, "Resume", "Step", true, true, true); + ButtonUtil.update(getOwner(), "Resume", "Step", true, true, true); } else { - ButtonUtil.update(this, "Pause", isFast ? "1x Speed" : "10x Faster", true, true, true); + ButtonUtil.update(getOwner(), "Pause", isFast ? "1x Speed" : "10x Faster", true, true, true); } } diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectManyBase.java b/forge-gui/src/main/java/forge/match/input/InputSelectManyBase.java index 375f525e09e..052def52b51 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectManyBase.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectManyBase.java @@ -6,6 +6,7 @@ import com.google.common.collect.Iterables; import forge.game.GameEntity; import forge.game.card.Card; +import forge.match.MatchUtil; import forge.player.PlayerControllerHuman; public abstract class InputSelectManyBase extends InputSyncronizedBase { @@ -44,7 +45,7 @@ public abstract class InputSelectManyBase extends InputSyn @Override public final void showMessage() { showMessage(getMessage()); - ButtonUtil.update(this, hasEnoughTargets(), allowCancel, true); + ButtonUtil.update(getOwner(), hasEnoughTargets(), allowCancel, true); } @Override @@ -74,14 +75,14 @@ public abstract class InputSelectManyBase extends InputSyn protected void onSelectStateChanged(final GameEntity c, final boolean newState) { if (c instanceof Card) { - getGui().setUsedToPay(getController().getCardView((Card) c), newState); // UI supports card highlighting though this abstraction-breaking mechanism + MatchUtil.setUsedToPay(getController().getCardView((Card) c), newState); // UI supports card highlighting though this abstraction-breaking mechanism } } private void resetUsedToPay() { for (final GameEntity c : getSelected()) { if (c instanceof Card) { - getGui().setUsedToPay(getController().getCardView((Card) c), false); + MatchUtil.setUsedToPay(getController().getCardView((Card) c), false); } } } diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java b/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java index 1192f794c84..0da5af34567 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java @@ -13,6 +13,7 @@ import forge.game.card.Card; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; +import forge.match.MatchUtil; import forge.player.PlayerControllerHuman; import forge.util.ITriggerEvent; import forge.util.gui.SGuiChoose; @@ -78,19 +79,19 @@ public final class InputSelectTargets extends InputSyncronizedBase { if (!tgt.isMinTargetsChosen(sa.getHostCard(), sa) || tgt.isDividedAsYouChoose()) { if (mandatory && tgt.hasCandidates(sa, true)) { // Player has to click on a target - ButtonUtil.update(this, false, false, false); + ButtonUtil.update(getOwner(), false, false, false); } else { - ButtonUtil.update(this, false, true, false); + ButtonUtil.update(getOwner(), false, true, false); } } else { if (mandatory && tgt.hasCandidates(sa, true)) { // Player has to click on a target or ok - ButtonUtil.update(this, true, false, true); + ButtonUtil.update(getOwner(), true, false, true); } else { - ButtonUtil.update(this, true, true, true); + ButtonUtil.update(getOwner(), true, true, true); } } } @@ -238,7 +239,7 @@ public final class InputSelectTargets extends InputSyncronizedBase { private void addTarget(final GameEntity ge) { sa.getTargets().add(ge); if (ge instanceof Card) { - getGui().setUsedToPay(getController().getCardView((Card) ge), true); + MatchUtil.setUsedToPay(getController().getCardView((Card) ge), true); lastTarget = (Card) ge; } final Integer val = targetDepth.get(ge); @@ -255,7 +256,7 @@ public final class InputSelectTargets extends InputSyncronizedBase { private void done() { for (final GameEntity c : targetDepth.keySet()) { if (c instanceof Card) { - getGui().setUsedToPay(getController().getCardView((Card) c), false); + MatchUtil.setUsedToPay(getController().getCardView((Card) c), false); } } diff --git a/forge-gui/src/main/java/forge/model/FModel.java b/forge-gui/src/main/java/forge/model/FModel.java index 76a68646a2a..395aad8639d 100644 --- a/forge-gui/src/main/java/forge/model/FModel.java +++ b/forge-gui/src/main/java/forge/model/FModel.java @@ -300,9 +300,9 @@ public class FModel { gauntletData = data0; } - public static GauntletMini getGauntletMini(final IGuiBase gui) { + public static GauntletMini getGauntletMini() { if (gauntlet == null) { - gauntlet = new GauntletMini(gui); + gauntlet = new GauntletMini(); } return gauntlet; } diff --git a/forge-gui/src/main/java/forge/player/LobbyPlayerHuman.java b/forge-gui/src/main/java/forge/player/LobbyPlayerHuman.java index dcfd999acd7..1d1c1842c72 100644 --- a/forge-gui/src/main/java/forge/player/LobbyPlayerHuman.java +++ b/forge-gui/src/main/java/forge/player/LobbyPlayerHuman.java @@ -6,6 +6,7 @@ import forge.game.player.IGameEntitiesFactory; import forge.game.player.Player; import forge.game.player.PlayerController; import forge.interfaces.IGuiBase; +import forge.match.MatchUtil; import forge.util.GuiDisplayUtil; public class LobbyPlayerHuman extends LobbyPlayer implements IGameEntitiesFactory { @@ -33,7 +34,7 @@ public class LobbyPlayerHuman extends LobbyPlayer implements IGameEntitiesFactor } public void hear(LobbyPlayer player, String message) { - gui.hear(player, message); + MatchUtil.getController().hear(player, message); } public IGuiBase getGui() { diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 59c71bc145d..15efb8ab5ef 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -82,6 +82,7 @@ import forge.game.zone.ZoneType; import forge.interfaces.IGuiBase; import forge.item.IPaperCard; import forge.item.PaperCard; +import forge.match.MatchUtil; import forge.match.input.ButtonUtil; import forge.match.input.Input; import forge.match.input.InputAttack; @@ -89,7 +90,6 @@ import forge.match.input.InputBase; import forge.match.input.InputBlock; import forge.match.input.InputConfirm; import forge.match.input.InputConfirmMulligan; -import forge.match.input.InputNone; import forge.match.input.InputPassPriority; import forge.match.input.InputPayMana; import forge.match.input.InputProliferate; @@ -169,14 +169,14 @@ public class PlayerControllerHuman extends PlayerController { } public boolean isUiSetToSkipPhase(final Player turn, final PhaseType phase) { - return !getGui().stopAtPhase(gameView.getPlayerView(turn), phase); + return !MatchUtil.getController().stopAtPhase(gameView.getPlayerView(turn), phase); } /** * Uses GUI to learn which spell the player (human in our case) would like to play */ public SpellAbility getAbilityToPlay(final List abilities, final ITriggerEvent triggerEvent) { - final int choice = getGui().getAbilityToPlay(gameView.getSpellAbilityViews(abilities), triggerEvent); + final int choice = MatchUtil.getController().getAbilityToPlay(gameView.getSpellAbilityViews(abilities), triggerEvent); return gameView.getSpellAbility(choice); } @@ -258,7 +258,7 @@ public class PlayerControllerHuman extends PlayerController { if ((attacker.hasKeyword("Trample") && defender != null) || (blockers.size() > 1)) { final CardView vAttacker = gameView.getCardView(attacker); final GameEntityView vDefender = gameView.getGameEntityView(defender); - final Map result = getGui().getDamageToAssign(vAttacker, vBlockers, damageDealt, vDefender, overrideOrder); + final Map result = MatchUtil.getDamageToAssign(vAttacker, vBlockers, damageDealt, vDefender, overrideOrder); for (final Entry e : result.entrySet()) { map.put(gameView.getCard(e.getKey()), e.getValue()); } @@ -300,7 +300,7 @@ public class PlayerControllerHuman extends PlayerController { if (max <= 0) { return new ArrayList(); } - + StringBuilder builder = new StringBuilder("Select "); if (min == 0) { builder.append("up to "); @@ -325,10 +325,10 @@ public class PlayerControllerHuman extends PlayerController { if (max == 1) { Card singleChosen = chooseSingleEntityForEffect(sourceList, sa, title, isOptional); return singleChosen == null ? Lists.newArrayList() : Lists.newArrayList(singleChosen); - } + } + + MatchUtil.getController().setPanelSelection(gameView.getCardView(sa.getHostCard())); - getGui().setPanelSelection(gameView.getCardView(sa.getHostCard())); - // try to use InputSelectCardsFromList when possible boolean cardsAreInMyHandOrBattlefield = true; for (Card c : sourceList) { @@ -496,7 +496,7 @@ public class PlayerControllerHuman extends PlayerController { @Override public List orderBlockers(final Card attacker, final List blockers) { final CardView vAttacker = gameView.getCardView(attacker); - getGui().setPanelSelection(vAttacker); + MatchUtil.getController().setPanelSelection(vAttacker); final List choices = SGuiChoose.order(getGui(), "Choose Damage Order for " + vAttacker, "Damaged First", gameView.getCardViews(blockers), vAttacker); return gameView.getCards(choices); } @@ -504,7 +504,7 @@ public class PlayerControllerHuman extends PlayerController { @Override public List orderBlocker(final Card attacker, final Card blocker, final List oldBlockers) { final CardView vAttacker = gameView.getCardView(attacker); - getGui().setPanelSelection(vAttacker); + MatchUtil.getController().setPanelSelection(vAttacker); final List choices = SGuiChoose.insertInList(getGui(), "Choose blocker after which to place " + vAttacker + " in damage order; cancel to place it first", gameView.getCardView(blocker), gameView.getCardViews(oldBlockers)); return gameView.getCards(choices); } @@ -512,7 +512,7 @@ public class PlayerControllerHuman extends PlayerController { @Override public List orderAttackers(final Card blocker, final List attackers) { final CardView vBlocker = gameView.getCardView(blocker); - getGui().setPanelSelection(vBlocker); + MatchUtil.getController().setPanelSelection(vBlocker); final List choices = SGuiChoose.order(getGui(), "Choose Damage Order for " + vBlocker, "Damaged First", gameView.getCardViews(attackers), vBlocker); return gameView.getCards(choices); } @@ -733,9 +733,9 @@ public class PlayerControllerHuman extends PlayerController { Iterables.removeAll(types, invalidTypes); } if (isOptional) { - return SGuiChoose.oneOrNone(getGui(), "Choose a " + kindOfType.toLowerCase() + " type", types); + return SGuiChoose.oneOrNone(getGui(), "Choose a " + kindOfType.toLowerCase() + " type", types); } - return SGuiChoose.one(getGui(), "Choose a " + kindOfType.toLowerCase() + " type", types); + return SGuiChoose.one(getGui(), "Choose a " + kindOfType.toLowerCase() + " type", types); } @Override @@ -767,7 +767,7 @@ public class PlayerControllerHuman extends PlayerController { //ensure they're declared and then delay slightly so user can see as much for (Pair attacker : mandatoryAttackers) { combat.addAttacker(attacker.getLeft(), attacker.getRight()); - getGui().fireEvent(new UiEventAttackerDeclared(gameView.getCardView(attacker.getLeft()), gameView.getGameEntityView(attacker.getRight()))); + MatchUtil.fireEvent(new UiEventAttackerDeclared(gameView.getCardView(attacker.getLeft()), gameView.getGameEntityView(attacker.getRight()))); } try { Thread.sleep(FControlGamePlayback.combatDelay); @@ -797,10 +797,10 @@ public class PlayerControllerHuman extends PlayerController { //allow user to cancel auto-pass InputBase.cancelAwaitNextInput(); //don't overwrite prompt with awaiting opponent PhaseType phase = getAutoPassUntilPhase(); - InputNone inputNone = new InputNone(gameView); - getGui().showPromptMessage(inputNone.getOwner(), "Yielding until " + (phase == PhaseType.CLEANUP ? "end of turn" : phase.nameForUi.toString()) + + PlayerView playerView = gameView.getLocalPlayerView(); + MatchUtil.getController().showPromptMessage(playerView, "Yielding until " + (phase == PhaseType.CLEANUP ? "end of turn" : phase.nameForUi.toString()) + ".\nYou may cancel this yield to take an action."); - ButtonUtil.update(inputNone, false, true, false); + ButtonUtil.update(playerView, false, true, false); } } @@ -816,9 +816,9 @@ public class PlayerControllerHuman extends PlayerController { super.autoPassCancel(); //prevent prompt getting stuck on yielding message while actually waiting for next input opportunity - InputNone inputNone = new InputNone(gameView); - getGui().showPromptMessage(inputNone.getOwner(), ""); - ButtonUtil.update(inputNone, false, false, false); + PlayerView playerView = gameView.getLocalPlayerView(); + MatchUtil.getController().showPromptMessage(playerView, ""); + ButtonUtil.update(playerView, false, false, false); InputBase.awaitNextInput(gameView); } @@ -1163,9 +1163,9 @@ public class PlayerControllerHuman extends PlayerController { @Override public ReplacementEffect chooseSingleReplacementEffect(String prompt, List possibleReplacers, HashMap runParams) { if (possibleReplacers.size() == 1) { - return possibleReplacers.get(0); + return possibleReplacers.get(0); } - return SGuiChoose.one(getGui(), prompt, possibleReplacers); + return SGuiChoose.one(getGui(), prompt, possibleReplacers); } @Override @@ -1327,8 +1327,8 @@ public class PlayerControllerHuman extends PlayerController { public boolean isGuiPlayer() { return lobbyPlayer == GamePlayerUtil.getGuiPlayer(); - } - + } + /* * What follows are the View methods. */ @@ -1720,7 +1720,7 @@ public class PlayerControllerHuman extends PlayerController { public void setViewAllCards(final boolean canViewAll) { mayLookAtAllCards = canViewAll; for (final Player p : game.getPlayers()) { - getGui().updateCards(getCardViews(p.getAllCards())); + MatchUtil.updateCards(getCardViews(p.getAllCards())); } } diff --git a/forge-gui/src/main/java/forge/player/TargetSelection.java b/forge-gui/src/main/java/forge/player/TargetSelection.java index 7db8c956732..70728e3fad1 100644 --- a/forge-gui/src/main/java/forge/player/TargetSelection.java +++ b/forge-gui/src/main/java/forge/player/TargetSelection.java @@ -35,6 +35,7 @@ import forge.game.spellability.SpellAbilityStackInstance; import forge.game.spellability.TargetRestrictions; import forge.game.zone.Zone; import forge.game.zone.ZoneType; +import forge.match.MatchUtil; import forge.match.input.InputSelectTargets; import forge.util.Aggregates; import forge.util.gui.SGuiChoose; @@ -138,12 +139,12 @@ public class TargetSelection { for (Card card : validTargets) { playersWithValidTargets.put(controller.getPlayerView(card.getController()), null); } - if (controller.getGui().openZones(zone, playersWithValidTargets)) { + if (MatchUtil.getController().openZones(zone, playersWithValidTargets)) { InputSelectTargets inp = new InputSelectTargets(controller, validTargets, ability, mandatory); inp.showAndWait(); choiceResult = !inp.hasCancelled(); bTargetingDone = inp.hasPressedOk(); - controller.getGui().restoreOldZones(playersWithValidTargets); + MatchUtil.getController().restoreOldZones(playersWithValidTargets); } else { // for every other case an all-purpose GuiChoose diff --git a/forge-gui/src/main/java/forge/quest/QuestDraftUtils.java b/forge-gui/src/main/java/forge/quest/QuestDraftUtils.java index a7a5257c447..5fd89dee6bd 100644 --- a/forge-gui/src/main/java/forge/quest/QuestDraftUtils.java +++ b/forge-gui/src/main/java/forge/quest/QuestDraftUtils.java @@ -3,7 +3,6 @@ package forge.quest; import java.util.ArrayList; import java.util.List; -import forge.FThreads; import forge.deck.Deck; import forge.deck.DeckGroup; import forge.deck.DeckSection; @@ -13,6 +12,7 @@ import forge.game.GameType; import forge.game.Match; import forge.game.player.RegisteredPlayer; import forge.interfaces.IGuiBase; +import forge.match.MatchUtil; import forge.model.FModel; import forge.player.GamePlayerUtil; import forge.properties.ForgePreferences.FPref; @@ -29,7 +29,12 @@ public class QuestDraftUtils { if (lastGame.getMatch().isMatchOver()) { matchInProgress = false; } - gui.continueMatch(matchInProgress ? lastGame.getMatch() : null); + if (matchInProgress) { + MatchUtil.continueMatch(); + } + else { + MatchUtil.endCurrentGame(); + } } public static void completeDraft(DeckGroup finishedDraft) { @@ -184,15 +189,15 @@ public class QuestDraftUtils { if (matchInProgress) { return; } - - gui.enableOverlay(); - + + MatchUtil.getController().enableOverlay(); + DraftMatchup nextMatch = matchups.remove(0); matchInProgress = true; if (!nextMatch.hasHumanPlayer) { - gui.disableOverlay(); + MatchUtil.getController().disableOverlay(); waitForUserInput = false; aiMatchInProgress = true; } @@ -207,14 +212,8 @@ public class QuestDraftUtils { rules.setGamesPerMatch(3); rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); rules.canCloneUseTargetsImage = FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE); - - final Match match = new Match(rules, nextMatch.matchStarter); - FThreads.invokeInEdtLater(gui, new Runnable(){ - @Override - public void run() { - gui.startGame(match); - } - }); + + MatchUtil.getController().startNewMatch(new Match(rules, nextMatch.matchStarter)); } public static void continueMatches(final IGuiBase gui) { diff --git a/forge-gui/src/main/java/forge/quest/QuestUtil.java b/forge-gui/src/main/java/forge/quest/QuestUtil.java index b554b31935c..14ee95debd4 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtil.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtil.java @@ -38,6 +38,7 @@ import forge.interfaces.IButton; import forge.interfaces.IGuiBase; import forge.item.IPaperCard; import forge.item.PaperToken; +import forge.match.MatchUtil; import forge.model.FModel; import forge.player.GamePlayerUtil; import forge.properties.ForgePreferences.FPref; @@ -589,7 +590,7 @@ public class QuestUtil { FThreads.invokeInEdtNowOrLater(gui, new Runnable(){ @Override public void run() { - gui.startGame(mc); + MatchUtil.startGame(mc); } }); } diff --git a/forge-gui/src/main/java/forge/sound/SoundSystem.java b/forge-gui/src/main/java/forge/sound/SoundSystem.java index d70082a759b..93ad2e7e934 100644 --- a/forge-gui/src/main/java/forge/sound/SoundSystem.java +++ b/forge-gui/src/main/java/forge/sound/SoundSystem.java @@ -6,6 +6,7 @@ import java.util.Map; import com.google.common.eventbus.Subscribe; +import forge.GuiBase; import forge.events.UiEvent; import forge.game.event.GameEvent; import forge.interfaces.IGuiBase; @@ -19,6 +20,8 @@ import forge.properties.ForgePreferences.FPref; * */ public class SoundSystem { + public static final SoundSystem instance = new SoundSystem(GuiBase.getInterface()); + public static final int DELAY = 30; private static final IAudioClip emptySound = new NoSoundClip(); @@ -28,7 +31,7 @@ public class SoundSystem { private final IGuiBase gui; private final EventVisualizer visualizer; - public SoundSystem(final IGuiBase gui) { + private SoundSystem(final IGuiBase gui) { this.gui = gui; this.visualizer = new EventVisualizer(GamePlayerUtil.getGuiPlayer()); }