#region File Description //----------------------------------------------------------------------------- // SaveLoadScreen.cs // // Microsoft XNA Community Game Platform // Copyright (C) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- #endregion #region Using Statements using System; using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Content; using RolePlayingGameData; #endregion namespace RolePlaying { /// /// Displays a list of existing save games, /// allowing the user to save, load, or delete. /// class SaveLoadScreen : GameScreen { public enum SaveLoadScreenMode { Save, Load, }; /// /// The mode of this screen. /// private SaveLoadScreenMode mode; /// /// The current selected slot. /// private int currentSlot; #region Graphics Data private Texture2D backgroundTexture; private Vector2 backgroundPosition; private Texture2D plankTexture; private Vector2 plankPosition; private Texture2D backTexture; private Vector2 backPosition; private Texture2D deleteTexture; private Vector2 deletePosition = new Vector2(400f, 610f); private Vector2 deleteTextPosition = new Vector2(410f, 615f); private Texture2D selectTexture; private Vector2 selectPosition; private Texture2D lineBorderTexture; private Vector2 lineBorderPosition; private Texture2D highlightTexture; private Texture2D arrowTexture; private Vector2 titleTextPosition; private Vector2 backTextPosition; private Vector2 selectTextPosition; #endregion #region Initialization /// /// Create a new SaveLoadScreen object. /// public SaveLoadScreen(SaveLoadScreenMode mode) : base() { this.mode = mode; // refresh the save game descriptions Session.RefreshSaveGameDescriptions(); } /// /// Loads the graphics content for this screen. /// public override void LoadContent() { // load the textures ContentManager content = ScreenManager.Game.Content; backgroundTexture = content.Load(@"Textures\MainMenu\MainMenu"); plankTexture = content.Load(@"Textures\MainMenu\MainMenuPlank03"); backTexture = content.Load(@"Textures\Buttons\BButton"); selectTexture = content.Load(@"Textures\Buttons\AButton"); deleteTexture = content.Load(@"Textures\Buttons\XButton"); lineBorderTexture = content.Load(@"Textures\GameScreens\LineBorder"); highlightTexture = content.Load(@"Textures\GameScreens\HighlightLarge"); arrowTexture = content.Load(@"Textures\GameScreens\SelectionArrow"); // calculate the image positions Viewport viewport = ScreenManager.GraphicsDevice.Viewport; backgroundPosition = new Vector2( (viewport.Width - backgroundTexture.Width) / 2, (viewport.Height - backgroundTexture.Height) / 2); plankPosition = backgroundPosition + new Vector2( backgroundTexture.Width / 2 - plankTexture.Width / 2, 60f); backPosition = backgroundPosition + new Vector2(225, 610); selectPosition = backgroundPosition + new Vector2(1120, 610); lineBorderPosition = backgroundPosition + new Vector2(200, 570); // calculate the text positions titleTextPosition = backgroundPosition + new Vector2( plankPosition.X + (plankTexture.Width - Fonts.HeaderFont.MeasureString("Load").X) / 2, plankPosition.Y + (plankTexture.Height - Fonts.HeaderFont.MeasureString("Load").Y) / 2); backTextPosition = new Vector2(backPosition.X + 55, backPosition.Y + 5); deleteTextPosition.X += deleteTexture.Width; selectTextPosition = new Vector2( selectPosition.X - Fonts.ButtonNamesFont.MeasureString("Select").X - 5, selectPosition.Y + 5); base.LoadContent(); } #endregion #region Handle Input /// /// Respond to user input. /// public override void HandleInput() { // handle exiting the screen if (InputManager.IsActionTriggered(InputManager.Action.Back)) { ExitScreen(); return; } // handle selecting a save game if (InputManager.IsActionTriggered(InputManager.Action.Ok) && (Session.SaveGameDescriptions != null)) { switch (mode) { case SaveLoadScreenMode.Load: if ((currentSlot >= 0) && (currentSlot < Session.SaveGameDescriptions.Count) && (Session.SaveGameDescriptions[currentSlot] != null)) { if (Session.IsActive) { MessageBoxScreen messageBoxScreen = new MessageBoxScreen( "Are you sure you want to load this game?"); messageBoxScreen.Accepted += ConfirmLoadMessageBoxAccepted; ScreenManager.AddScreen(messageBoxScreen); } else { ConfirmLoadMessageBoxAccepted(null, EventArgs.Empty); } } break; case SaveLoadScreenMode.Save: if ((currentSlot >= 0) && (currentSlot <= Session.SaveGameDescriptions.Count)) { if (currentSlot == Session.SaveGameDescriptions.Count) { ConfirmSaveMessageBoxAccepted(null, EventArgs.Empty); } else { MessageBoxScreen messageBoxScreen = new MessageBoxScreen( "Are you sure you want to overwrite this save game?"); messageBoxScreen.Accepted += ConfirmSaveMessageBoxAccepted; ScreenManager.AddScreen(messageBoxScreen); } } break; } } // handle deletion else if (InputManager.IsActionTriggered(InputManager.Action.DropUnEquip) && (Session.SaveGameDescriptions != null)) { if ((currentSlot >= 0) && (currentSlot < Session.SaveGameDescriptions.Count) && (Session.SaveGameDescriptions[currentSlot] != null)) { MessageBoxScreen messageBoxScreen = new MessageBoxScreen( "Are you sure you want to delete this save game?"); messageBoxScreen.Accepted += ConfirmDeleteMessageBoxAccepted; ScreenManager.AddScreen(messageBoxScreen); } } // handle cursor-down else if (InputManager.IsActionTriggered(InputManager.Action.CursorDown) && (Session.SaveGameDescriptions != null)) { int maximumSlot = Session.SaveGameDescriptions.Count; if (mode == SaveLoadScreenMode.Save) { maximumSlot = Math.Min(maximumSlot + 1, Session.MaximumSaveGameDescriptions); } if (currentSlot < maximumSlot - 1) { currentSlot++; } } // handle cursor-up else if (InputManager.IsActionTriggered(InputManager.Action.CursorUp) && (Session.SaveGameDescriptions != null)) { if (currentSlot >= 1) { currentSlot--; } } } /// /// Callback for the Save Game confirmation message box. /// void ConfirmSaveMessageBoxAccepted(object sender, EventArgs e) { if ((currentSlot >= 0) && (currentSlot <= Session.SaveGameDescriptions.Count)) { if (currentSlot == Session.SaveGameDescriptions.Count) { Session.SaveSession(null); } else { Session.SaveSession(Session.SaveGameDescriptions[currentSlot]); } ExitScreen(); } } /// /// Delegate type for the save-game-selected-to-load event. /// /// /// The description of the file to load. /// public delegate void LoadingSaveGameHandler( SaveGameDescription saveGameDescription); /// /// Fired when a save game is selected to load. /// /// /// Loading save games exits multiple screens, /// so we use events to move backwards. /// public event LoadingSaveGameHandler LoadingSaveGame; /// /// Callback for the Load Game confirmation message box. /// void ConfirmLoadMessageBoxAccepted(object sender, EventArgs e) { if ((Session.SaveGameDescriptions != null) && (currentSlot >= 0) && (currentSlot < Session.SaveGameDescriptions.Count) && (Session.SaveGameDescriptions[currentSlot] != null)) { ExitScreen(); if (LoadingSaveGame != null) { LoadingSaveGame(Session.SaveGameDescriptions[currentSlot]); } } } /// /// Callback for the Delete Game confirmation message box. /// void ConfirmDeleteMessageBoxAccepted(object sender, EventArgs e) { if ((Session.SaveGameDescriptions != null) && (currentSlot >= 0) && (currentSlot < Session.SaveGameDescriptions.Count) && (Session.SaveGameDescriptions[currentSlot] != null)) { Session.DeleteSaveGame(Session.SaveGameDescriptions[currentSlot]); } } #endregion #region Drawing /// /// Draws the screen. /// public override void Draw(GameTime gameTime) { SpriteBatch spriteBatch = ScreenManager.SpriteBatch; spriteBatch.Begin(); spriteBatch.Draw(backgroundTexture, backgroundPosition, Color.White); spriteBatch.Draw(plankTexture, plankPosition, Color.White); spriteBatch.Draw(lineBorderTexture, lineBorderPosition, Color.White); spriteBatch.Draw(backTexture, backPosition, Color.White); spriteBatch.DrawString(Fonts.ButtonNamesFont, "Back", backTextPosition, Color.White); spriteBatch.DrawString(Fonts.HeaderFont, (mode == SaveLoadScreenMode.Load ? "Load" : "Save"), titleTextPosition, Fonts.TitleColor); if ((Session.SaveGameDescriptions != null)) { for (int i = 0; i < Session.SaveGameDescriptions.Count; i++) { Vector2 descriptionTextPosition = new Vector2(295f, 200f + i * (Fonts.GearInfoFont.LineSpacing + 40f)); Color descriptionTextColor = Color.Black; // if the save game is selected, draw the highlight color if (i == currentSlot) { descriptionTextColor = Fonts.HighlightColor; spriteBatch.Draw(highlightTexture, descriptionTextPosition + new Vector2(-100, -23), Color.White); spriteBatch.Draw(arrowTexture, descriptionTextPosition + new Vector2(-75, -15), Color.White); spriteBatch.Draw(deleteTexture, deletePosition, Color.White); spriteBatch.DrawString(Fonts.ButtonNamesFont, "Delete", deleteTextPosition, Color.White); spriteBatch.Draw(selectTexture, selectPosition, Color.White); spriteBatch.DrawString(Fonts.ButtonNamesFont, "Select", selectTextPosition, Color.White); } spriteBatch.DrawString(Fonts.GearInfoFont, Session.SaveGameDescriptions[i].ChapterName, descriptionTextPosition, descriptionTextColor); descriptionTextPosition.X = 650; spriteBatch.DrawString(Fonts.GearInfoFont, Session.SaveGameDescriptions[i].Description, descriptionTextPosition, descriptionTextColor); } // if there is space for one, add an empty entry if ((mode == SaveLoadScreenMode.Save) && (Session.SaveGameDescriptions.Count < Session.MaximumSaveGameDescriptions)) { int i = Session.SaveGameDescriptions.Count; Vector2 descriptionTextPosition = new Vector2( 295f, 200f + i * (Fonts.GearInfoFont.LineSpacing + 40f)); Color descriptionTextColor = Color.Black; // if the save game is selected, draw the highlight color if (i == currentSlot) { descriptionTextColor = Fonts.HighlightColor; spriteBatch.Draw(highlightTexture, descriptionTextPosition + new Vector2(-100, -23), Color.White); spriteBatch.Draw(arrowTexture, descriptionTextPosition + new Vector2(-75, -15), Color.White); spriteBatch.Draw(selectTexture, selectPosition, Color.White); spriteBatch.DrawString(Fonts.ButtonNamesFont, "Select", selectTextPosition, Color.White); } spriteBatch.DrawString(Fonts.GearInfoFont, "-------empty------", descriptionTextPosition, descriptionTextColor); descriptionTextPosition.X = 650; spriteBatch.DrawString(Fonts.GearInfoFont, "-----", descriptionTextPosition, descriptionTextColor); } } // if there are no slots to load, report that if (Session.SaveGameDescriptions == null) { spriteBatch.DrawString(Fonts.GearInfoFont, "No Storage Device Available", new Vector2(295f, 200f), Color.Black); } else if ((mode == SaveLoadScreenMode.Load) && (Session.SaveGameDescriptions.Count <= 0)) { spriteBatch.DrawString(Fonts.GearInfoFont, "No Save Games Available", new Vector2(295f, 200f), Color.Black); } spriteBatch.End(); } #endregion } }