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;
}
}
}