using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Media; using V3.Camera; using V3.Data; namespace V3.Screens { /// /// Provides common actions for the main and pause menu, like saving and /// loading the game or removing and adding a screen to the screen stack. /// // ReSharper disable once ClassNeverInstantiated.Global public sealed class MenuActions { private readonly Game mGame; private readonly GraphicsDeviceManager mGraphicsDeviceManager; private readonly IGameStateManager mGameStateManager; private readonly IOptionsManager mOptionsManager; private readonly ISaveGameManager mSaveGameManager; private readonly IScreenManager mScreenManager; private readonly IScreenFactory mScreenFactory; private readonly CameraManager mCameraManager; /// /// Creates a new menu actions instance. /// public MenuActions(Game game, GraphicsDeviceManager graphicsDeviceManager, IGameStateManager gameStateManager, IOptionsManager optionsManager, ISaveGameManager saveGameManager, IScreenManager screenManager, IScreenFactory screenFactory, CameraManager cameraManager) { mGame = game; mGraphicsDeviceManager = graphicsDeviceManager; mGameStateManager = gameStateManager; mOptionsManager = optionsManager; mSaveGameManager = saveGameManager; mScreenManager = screenManager; mScreenFactory = screenFactory; mCameraManager = cameraManager; } /// /// Checks whether it is possible to load a game, i. e. whether there /// are save games. /// /// true if there are save games to load, false otherwise /// public bool CanLoadGame() { return mSaveGameManager.GetSaveGames().Count > 0; } /// /// Removes the given screen from the screen manager. /// /// the screen to remove public void Close(IScreen screen) { // TODO: something like RemoveUntil mScreenManager.RemoveScreen(screen); } /// /// Quits the game. /// public void Exit() { mGame.Exit(); } public void LoadGame(ISaveGame saveGame) { mScreenManager.Clear(); var gameScreen = mScreenFactory.CreateGameScreen(); var gameState = saveGame.GameState; mGameStateManager.LoadGameState(gameState); gameScreen.SetFog(gameState.mFog); gameScreen.SetAiState(gameState.mAiState); mScreenManager.AddScreen(gameScreen); mScreenManager.AddScreen(mScreenFactory.CreateHudScreen()); } /// /// Opens the main screen and removes all other screens. /// public void OpenMainScreen() { mScreenManager.Clear(); mScreenManager.AddScreen(mScreenFactory.CreateMainScreen()); } /// /// Opens the options screen in the front. /// public void OpenOptionsScreen() { mScreenManager.AddScreen(mScreenFactory.CreateOptionsScreen()); } public void OpenLoadScreen() { mScreenManager.AddScreen(mScreenFactory.CreateLoadScreen()); } /// /// Opens the pause screen in the front. /// public void OpenPauseScreen() { mScreenManager.AddScreen(mScreenFactory.CreatePauseScreen()); } /// /// Opens the death screen in the front. /// public void OpenDeathScreen() { mScreenManager.AddScreen(mScreenFactory.CreateDeathScreen()); } /// /// Opens the victory screen in the front. /// public void OpenVictoryScreen() { mScreenManager.AddScreen(mScreenFactory.CreateVictoryScreen()); } /// /// Opens the statistics screen in the front. /// public void OpenStatisticsScreen() { mScreenManager.AddScreen(mScreenFactory.CreateStatisticsScreen()); } /// /// Opens the achievements screen in the front. /// public void OpenAchievementsScreen() { mScreenManager.AddScreen(mScreenFactory.CreateAchievementsScreen()); } /// /// Opens the tech demo. /// public void OpenTechDemo() { mScreenManager.Clear(); mScreenManager.AddScreen(mScreenFactory.CreaTechdemoScreen()); mScreenManager.AddScreen(mScreenFactory.CreateHudScreen()); } /// /// Creates a new save game from the current game state. /// public void SaveGame() { var gameState = mGameStateManager.GetGameState(); var gameScreen = mScreenManager.GetGameScreen(); if (gameScreen != null) { gameState.mFog = gameScreen.GetFog(); gameState.mAiState = gameScreen.GetAiState(); } mSaveGameManager.CreateSaveGame(gameState); } /// /// Apply the current graphics options. /// public void ApplyOptions() { mGraphicsDeviceManager.PreferredBackBufferWidth = mOptionsManager.Options.Resolution.X; mGraphicsDeviceManager.PreferredBackBufferHeight = mOptionsManager.Options.Resolution.Y; mGraphicsDeviceManager.IsFullScreen = mOptionsManager.Options.IsFullScreen; mGraphicsDeviceManager.ApplyChanges(); #if NO_AUDIO #else MediaPlayer.Volume = mOptionsManager.Options.GetEffectiveVolume(); #endif } /// /// Save the current graphics options. /// public void SaveOptions() { mOptionsManager.SaveOptions(); } /// /// Opens the game screen with a new game. /// public void StartNewGame() { mScreenManager.Clear(); var gameScreen = mScreenFactory.CreateGameScreen(); gameScreen.CreateInitialPopulation(); mScreenManager.AddScreen(gameScreen); mScreenManager.AddScreen(mScreenFactory.CreateHudScreen()); if (mCameraManager.GetCamera() is CameraScrolling) mCameraManager.GetCamera().Location = Vector2.Zero; } } }