/*
* PauseMenu.cs
* Authors: Mike DeMauro
* Copyright (c) 2007-2008 Cornell University
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using Util;
namespace StellarProspector
{
///
/// Defines how the pause menu will work for Stellar Prospector
///
internal class PauseMenu : GameScreen
{
#region Fields
///
/// List of menu items displayed within the pause menu
///
List m_MenuItems = new List();
///
/// The currently selected menu items
///
int m_ItemSelected;
///
/// The sprite batch used for rendering textures
///
SpriteBatch m_SpriteBatch;
///
/// The sprite font used for rendering text
///
SpriteFont m_SpriteFont;
///
/// Reference to the logger used for Stellar Prospector
///
Logger mLogger;
///
/// Input handler for processing input for the pause menu
///
InputHandler inputHandler;
///
/// Reference to the Stellar Prospector game screen
///
StellarProspectorGameScreen m_ssScreen;
#endregion
#region Creation
///
/// Constructor for the Pause Menu
///
/// Reference to the Stellar Prospector game screen whcih created this
/// Reference to the logger that is used for Stellar Prospector
public PauseMenu(StellarProspectorGameScreen caller, Logger logger)
{
m_ssScreen = caller;
mLogger = logger;
}
#endregion
#region Initialization
///
/// Initializes all upon creation needed components
///
public override void Initialize()
{
inputHandler = GetInputHandler();
m_MenuItems.Add("Resume");
m_MenuItems.Add("Reset");
m_MenuItems.Add("Phase 1");
m_MenuItems.Add("Phase 2");
m_MenuItems.Add("Phase 3");
m_MenuItems.Add("Main Menu");
inputHandler.Initialize();
inputHandler.BindButton(Keys.Down, Trigger.Activated, (int)EventCodes.Menu_Down);
inputHandler.BindButton(Keys.Up, Trigger.Activated, (int)EventCodes.Menu_Up);
inputHandler.BindButton(Keys.Enter, Trigger.Activated, (int)EventCodes.Menu_Select);
inputHandler.BindButton(Keys.Escape, Trigger.Activated, (int)EventCodes.Menu_Cancel);
base.Initialize();
}
///
/// Reinitializes changable values back to the initial values
///
public override void Reinitialize()
{
inputHandler.Enable();
this.Enabled = true;
this.Visible = true;
m_ssScreen.Visible = true;
}
#endregion
#region Management
///
/// Loads in necessary content dependent information
///
protected override void LoadContent()
{
m_SpriteBatch = new SpriteBatch(GraphicsDevice);
m_SpriteFont = Content.Load(@"Fonts\menufont");
base.LoadContent();
}
///
/// Disposes of unmanaged content dependent objects
///
/// Whether or not this is currently being disposed
protected override void Dispose(bool disposing)
{
if (disposing)
{
m_SpriteBatch.Dispose();
}
base.Dispose(disposing);
}
#endregion
#region Update
///
/// Updates the pause menu
///
/// Time that has passed in-game
public override void Update(GameTime gameTime)
{
base.Update(gameTime);
while (inputHandler.HasEvent())
{
InputEvent e = inputHandler.GetNextEvent();
switch ((EventCodes)e.EventCode)
{
case EventCodes.Menu_Down:
m_ItemSelected = (m_ItemSelected + 1) % m_MenuItems.Count;
SoundManager.SoundManager.PlayEffect("Menu_Move");
e.WriteToLog(mLogger, "SP_Menu_Down");
break;
case EventCodes.Menu_Up:
m_ItemSelected = (m_ItemSelected - 1 + m_MenuItems.Count) % m_MenuItems.Count;
SoundManager.SoundManager.PlayEffect("Menu_Move");
e.WriteToLog(mLogger, "SP_Menu_Up");
break;
case EventCodes.Menu_Select:
e.WriteToLog(mLogger, "SP_Menu_Select");
SoundManager.SoundManager.PlayEffect("Menu_Select");
if (m_MenuItems[m_ItemSelected] == "Resume")
{
m_ssScreen.SetPaused(false);
}
else if (m_MenuItems[m_ItemSelected] == "Reset")
{
m_ssScreen.ResetGame();
}
else if (m_MenuItems[m_ItemSelected] == "Phase 1")
{
m_ssScreen.SetProgress(0);
m_ssScreen.setPhase(Phases.One);
}
else if (m_MenuItems[m_ItemSelected] == "Phase 2")
{
m_ssScreen.SetProgress((int)(Settings.MaxProgress * StellarProspectorGameScreen.PHASE_TWO_PERCENT));
m_ssScreen.setPhase(Phases.Two);
}
else if (m_MenuItems[m_ItemSelected] == "Phase 3")
{
m_ssScreen.SetProgress((int)(Settings.MaxProgress * StellarProspectorGameScreen.PHASE_THREE_PERCENT));
m_ssScreen.setPhase(Phases.Three);
}
else if (m_MenuItems[m_ItemSelected] == "Main Menu")
{
Done();
}
if (m_MenuItems[m_ItemSelected] != "Main Menu")
{
mLogger.Write((int)EventCodes.Resume, "SP_UnPause");
}
Done();
break;
case EventCodes.Menu_Cancel:
e.WriteToLog(mLogger, "SP_Menu_Cancel");
mLogger.Write((int)EventCodes.Resume, "SP_UnPause");
Done();
m_ssScreen.SetPaused(false);
break;
}
}
}
#endregion
#region Render
///
/// Renders the pause menu
///
/// Time that has passed in-game
public override void Draw(GameTime gameTime)
{
base.Draw(gameTime);
Vector2 location = new Vector2(100, 50);
m_SpriteBatch.Begin();
m_SpriteBatch.DrawString(m_SpriteFont, "PAUSED", location, Color.Green);
for (int i = 0; i < m_MenuItems.Count; i++)
{
location.Y += 50;
if (i == m_ItemSelected)
{
m_SpriteBatch.DrawString(m_SpriteFont, m_MenuItems[i], location, Color.Yellow);
}
else
{
m_SpriteBatch.DrawString(m_SpriteFont, m_MenuItems[i], location, Color.White);
}
}
m_SpriteBatch.End();
}
#endregion
}
}