diff --git a/src/main/java/forge/control/FControl.java b/src/main/java/forge/control/FControl.java index d0ef57ec066..5e406d6e3ea 100644 --- a/src/main/java/forge/control/FControl.java +++ b/src/main/java/forge/control/FControl.java @@ -32,20 +32,31 @@ import javax.swing.UIManager; import javax.swing.WindowConstants; import forge.Card; +import forge.Constant.Preferences; import forge.Singletons; import forge.control.KeyboardShortcuts.Shortcut; -import forge.game.MatchController; +import forge.game.GameState; import forge.game.ai.AiProfileUtil; +import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.gui.SOverlayUtils; import forge.gui.deckeditor.CDeckEditorUI; import forge.gui.deckeditor.VDeckEditorUI; +import forge.gui.framework.EDocID; +import forge.gui.framework.SDisplayUtil; import forge.gui.framework.SOverflowUtil; import forge.gui.framework.SResizingUtil; import forge.gui.home.CHomeUI; import forge.gui.home.VHomeUI; +import forge.gui.match.CMatchUI; import forge.gui.match.VMatchUI; +import forge.gui.match.controllers.CCombat; import forge.gui.match.controllers.CDock; +import forge.gui.match.controllers.CLog; +import forge.gui.match.controllers.CMessage; +import forge.gui.match.controllers.CStack; +import forge.gui.match.nonsingleton.VField; +import forge.gui.match.views.VAntes; import forge.gui.toolbox.CardFaceSymbols; import forge.gui.toolbox.FSkin; import forge.net.NetServer; @@ -114,7 +125,7 @@ public enum FControl { public void windowClosing(final WindowEvent e) { Singletons.getView().getFrame().setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - if (!getMatch().getCurrentGame().isGameOver()) + if (!FControl.this.game.isGameOver()) CDock.SINGLETON_INSTANCE.concede(); else { Singletons.getControl().changeState(FControl.Screens.HOME_SCREEN); @@ -298,11 +309,8 @@ public enum FControl { } public boolean mayShowCard(Card c) { - if (match == null) { - return true; - } - - Player p = match.getCurrentGame().getPhaseHandler().getPriorityPlayer(); + if ( game == null ) return true; + Player p = game.getPhaseHandler().getPriorityPlayer(); return c.canBeShownTo(p); } @@ -324,11 +332,48 @@ public enum FControl { return server; } - private MatchController match; - public MatchController getMatch() { - return match; + private GameState game; + public GameState getObservedGame() { + return game; } - public void setMatch(MatchController newMatch) { - match = newMatch; + + public void attachToGame(GameState game0) { + // TODO: Detach from other game we might be looking at + + this.game = game0; + game.getEvents().register(Singletons.getControl().getSoundSystem()); + + LobbyPlayer humanLobbyPlayer = getLobby().getGuiPlayer(); + // The UI controls should use these game data as models + CMatchUI.SINGLETON_INSTANCE.initMatch(game.getRegisteredPlayers(), humanLobbyPlayer); + CDock.SINGLETON_INSTANCE.setModel(game, humanLobbyPlayer); + CStack.SINGLETON_INSTANCE.setModel(game.getStack(), humanLobbyPlayer); + CLog.SINGLETON_INSTANCE.setModel(game.getGameLog()); + CCombat.SINGLETON_INSTANCE.setModel(game); + CMessage.SINGLETON_INSTANCE.setModel(game); + + + Singletons.getModel().getPreferences().actuateMatchPreferences(); + Singletons.getControl().changeState(Screens.MATCH_SCREEN); + SDisplayUtil.showTab(EDocID.REPORT_LOG.getDoc()); + + CMessage.SINGLETON_INSTANCE.getInputControl().setGame(game); + + // models shall notify controllers of changes + + game.getStack().addObserver(CStack.SINGLETON_INSTANCE); + game.getGameLog().addObserver(CLog.SINGLETON_INSTANCE); + // some observers were set in CMatchUI.initMatch + + // black magic still + + + VAntes.SINGLETON_INSTANCE.setModel(game.getRegisteredPlayers()); + + for (final VField field : VMatchUI.SINGLETON_INSTANCE.getFieldViews()) { + field.getLblLibrary().setHoverable(Preferences.DEV_MODE); + } + + // per player observers were set in CMatchUI.SINGLETON_INSTANCE.initMatch } } diff --git a/src/main/java/forge/game/MatchController.java b/src/main/java/forge/game/MatchController.java index 99f3c1891c3..819e4667a9d 100644 --- a/src/main/java/forge/game/MatchController.java +++ b/src/main/java/forge/game/MatchController.java @@ -10,7 +10,6 @@ import org.apache.commons.lang3.tuple.Pair; import com.google.common.collect.Lists; -import forge.Constant.Preferences; import forge.FThreads; import forge.Singletons; import forge.control.FControl; @@ -20,18 +19,10 @@ import forge.game.event.FlipCoinEvent; import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.game.player.PlayerStatistics; -import forge.gui.framework.EDocID; import forge.gui.framework.SDisplayUtil; import forge.gui.match.CMatchUI; -import forge.gui.match.VMatchUI; import forge.gui.match.ViewWinLose; -import forge.gui.match.controllers.CCombat; -import forge.gui.match.controllers.CDock; -import forge.gui.match.controllers.CLog; -import forge.gui.match.controllers.CMessage; -import forge.gui.match.controllers.CStack; import forge.gui.match.nonsingleton.VField; -import forge.gui.match.views.VAntes; import forge.properties.ForgePreferences.FPref; import forge.util.MyRandom; @@ -142,7 +133,7 @@ public class MatchController { currentGame = new GameState(players, gameType, this); try { - attachUiToMatch(this, FControl.SINGLETON_INSTANCE.getLobby().getGuiPlayer()); + FControl.SINGLETON_INSTANCE.attachToGame(currentGame); final boolean canRandomFoil = Singletons.getModel().getPreferences().getPrefBoolean(FPref.UI_RANDOM_FOIL) && gameType == GameType.Constructed; GameNew.newGame(currentGame, canRandomFoil, this.useAnte); @@ -174,46 +165,6 @@ public class MatchController { }); } - public static void attachUiToMatch(MatchController match, LobbyPlayer humanLobbyPlayer) { - FControl.SINGLETON_INSTANCE.setMatch(match); - - GameState game = match.getCurrentGame(); - game.getEvents().register(Singletons.getControl().getSoundSystem()); - - // The UI controls should use these game data as models - CMatchUI.SINGLETON_INSTANCE.initMatch(game.getRegisteredPlayers(), humanLobbyPlayer); - CDock.SINGLETON_INSTANCE.setModel(game, humanLobbyPlayer); - CStack.SINGLETON_INSTANCE.setModel(game.getStack(), humanLobbyPlayer); - CLog.SINGLETON_INSTANCE.setModel(game.getGameLog()); - CCombat.SINGLETON_INSTANCE.setModel(game); - CMessage.SINGLETON_INSTANCE.setModel(match); - - - Singletons.getModel().getPreferences().actuateMatchPreferences(); - Singletons.getControl().changeState(FControl.Screens.MATCH_SCREEN); - SDisplayUtil.showTab(EDocID.REPORT_LOG.getDoc()); - - CMessage.SINGLETON_INSTANCE.getInputControl().setGame(game); - - // models shall notify controllers of changes - - game.getStack().addObserver(CStack.SINGLETON_INSTANCE); - game.getGameLog().addObserver(CLog.SINGLETON_INSTANCE); - // some observers were set in CMatchUI.initMatch - - // black magic still - - - VAntes.SINGLETON_INSTANCE.setModel(game.getRegisteredPlayers()); - - for (final VField field : VMatchUI.SINGLETON_INSTANCE.getFieldViews()) { - field.getLblLibrary().setHoverable(Preferences.DEV_MODE); - } - - // per player observers were set in CMatchUI.SINGLETON_INSTANCE.initMatch - } - - public void clearGamesPlayed() { gamesPlayed.clear(); } diff --git a/src/main/java/forge/game/phase/Upkeep.java b/src/main/java/forge/game/phase/Upkeep.java index 0d4c3ba7449..ea5776ae852 100644 --- a/src/main/java/forge/game/phase/Upkeep.java +++ b/src/main/java/forge/game/phase/Upkeep.java @@ -37,7 +37,6 @@ import forge.card.spellability.AbilityManaPart; import forge.card.spellability.AbilityStatic; import forge.card.spellability.SpellAbility; import forge.control.input.InputPayManaExecuteCommands; -import forge.control.input.InputPayment; import forge.control.input.InputSelectCards; import forge.control.input.InputSelectCardsFromList; import forge.game.GameState; @@ -45,7 +44,6 @@ import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtilCard; import forge.game.ai.ComputerUtilCombat; import forge.game.ai.ComputerUtilCost; -import forge.game.ai.ComputerUtilMana; import forge.game.player.HumanPlay; import forge.game.player.Player; import forge.game.player.PlayerActionConfirmMode; @@ -520,12 +518,13 @@ public class Upkeep extends Phase { * upkeepDemonicHordes. *

*/ + /* private static void upkeepDemonicHordes(final GameState game) { /* * At the beginning of your upkeep, unless you pay BBB, tap Demonic * Hordes and sacrifice a land of an opponent's choice. - */ + *-/ final Player player = game.getPhaseHandler().getPlayerTurn(); final List cards = player.getCardsIn(ZoneType.Battlefield, "Demonic Hordes"); @@ -563,7 +562,7 @@ public class Upkeep extends Phase { @Override public void resolve() { if (game.getZoneOf(c).is(ZoneType.Battlefield)) { - InputPayment inp = new InputPayManaExecuteCommands(cp, "Pay Demonic Hordes upkeep cost", cost.getPayCosts().getTotalMana() /*, true */); + InputPayment inp = new InputPayManaExecuteCommands(cp, "Pay Demonic Hordes upkeep cost", cost.getPayCosts().getTotalMana()); cp.getGame().getInputQueue().setInputAndWait(inp); if ( !inp.isPaid() ) unpaidHordesAb.resolve(); @@ -597,7 +596,7 @@ public class Upkeep extends Phase { } // end for loop } // upkeepDemonicHordes - +*/ /** *

* upkeepSuspend. diff --git a/src/main/java/forge/gui/GuiDisplayUtil.java b/src/main/java/forge/gui/GuiDisplayUtil.java index 2721e981144..73999c964af 100644 --- a/src/main/java/forge/gui/GuiDisplayUtil.java +++ b/src/main/java/forge/gui/GuiDisplayUtil.java @@ -692,7 +692,7 @@ public final class GuiDisplayUtil { } private static GameState getGame() { - return Singletons.getControl().getMatch().getCurrentGame(); + return Singletons.getControl().getObservedGame(); } diff --git a/src/main/java/forge/gui/match/TargetingOverlay.java b/src/main/java/forge/gui/match/TargetingOverlay.java index e1eddb8c44b..b7c5a9c1810 100644 --- a/src/main/java/forge/gui/match/TargetingOverlay.java +++ b/src/main/java/forge/gui/match/TargetingOverlay.java @@ -284,7 +284,7 @@ public enum TargetingOverlay { @Override public void paintComponent(final Graphics g) { - final Combat combat = Singletons.getControl().getMatch().getCurrentGame().getCombat(); // this will get deprecated too + final Combat combat = Singletons.getControl().getObservedGame().getCombat(); // this will get deprecated too // No need for this except in match view if (FControl.SINGLETON_INSTANCE.getState() != FControl.Screens.MATCH_SCREEN) { return; } diff --git a/src/main/java/forge/gui/match/controllers/CMessage.java b/src/main/java/forge/gui/match/controllers/CMessage.java index 9ad5a643064..d196e7f0323 100644 --- a/src/main/java/forge/gui/match/controllers/CMessage.java +++ b/src/main/java/forge/gui/match/controllers/CMessage.java @@ -29,6 +29,7 @@ import java.util.Observer; import javax.swing.JButton; import forge.Command; +import forge.game.GameState; import forge.game.MatchController; import forge.gui.InputProxy; import forge.gui.framework.ICDoc; @@ -70,7 +71,7 @@ public enum CMessage implements ICDoc, Observer { } } }; - private MatchController match; + private GameState game; private void _initButton(JButton button, ActionListener onClick) { // remove to ensure listeners don't accumulate over many initializations @@ -118,6 +119,7 @@ public enum CMessage implements ICDoc, Observer { */ @Override public void update(Observable o, Object arg) { + MatchController match = game.getMatch(); view.getLblGames().setText( match.getGameType().toString() + ": Game #" + (match.getPlayedGames().size() + 1) @@ -140,9 +142,9 @@ public enum CMessage implements ICDoc, Observer { * TODO: Write javadoc for this method. * @param match */ - public void setModel(MatchController match0) { - match = match0; - match.getCurrentGame().getPhaseHandler().addObserver(this); + public void setModel(GameState game0) { + game = game0; + game.getPhaseHandler().addObserver(this); update(null, null); } }