/// <summary> /// Handle save-game-to-load-selected events from the SaveLoadScreen. /// </summary> void loadGameScreen_LoadingSaveGame(SaveGameDescription saveGameDescription) { if (Session.IsActive) { ExitScreen(); } LoadingScreen.Load(ScreenManager, true, new GameplayScreen(saveGameDescription)); }
/// <summary> /// Create a new GameplayScreen object from a saved-game description. /// </summary> public GameplayScreen(SaveGameDescription saveGameDescription) : this() { this.gameStartDescription = null; this.saveGameDescription = saveGameDescription; }
/// <summary> /// Create a new GameplayScreen object from a new-game description. /// </summary> public GameplayScreen(GameStartDescription gameStartDescription) : this() { this.gameStartDescription = gameStartDescription; this.saveGameDescription = null; }
/// <summary> /// Receives the storage device and starts a new session, /// using the data in the given save game. /// </summary> /// <remarks>The new session is created in LoadSessionResult.</remarks> /// <param name="storageDevice">The chosen storage device.</param> /// <param name="saveGameDescription">The description of the save game.</param> public static void LoadSessionResult(StorageDevice storageDevice, SaveGameDescription saveGameDescription) { // check the parameters if (saveGameDescription == null) { throw new ArgumentNullException("saveGameDescription"); } // check the parameter if ((storageDevice == null) || !storageDevice.IsConnected) { return; } // open the container using (StorageContainer storageContainer = storageDevice.OpenContainer(Session.SaveGameContainerName)) { string filename = Path.Combine(storageContainer.Path, saveGameDescription.FileName); using (FileStream stream = new FileStream(filename, FileMode.Open)) { using (XmlReader xmlReader = XmlReader.Create(stream)) { // <rolePlayingGameData> xmlReader.ReadStartElement("rolePlayingGameSaveData"); // read the map information xmlReader.ReadStartElement("mapData"); string mapAssetName = xmlReader.ReadElementString("mapContentName"); PlayerPosition playerPosition = new XmlSerializer( typeof(PlayerPosition)).Deserialize(xmlReader) as PlayerPosition; singleton.removedMapChests = new XmlSerializer( typeof(List<WorldEntry<Chest>>)).Deserialize(xmlReader) as List<WorldEntry<Chest>>; singleton.removedMapFixedCombats = new XmlSerializer( typeof(List<WorldEntry<FixedCombat>>)).Deserialize(xmlReader) as List<WorldEntry<FixedCombat>>; singleton.removedMapPlayerNpcs = new XmlSerializer( typeof(List<WorldEntry<Player>>)).Deserialize(xmlReader) as List<WorldEntry<Player>>; singleton.modifiedMapChests = new XmlSerializer( typeof(List<ModifiedChestEntry>)).Deserialize(xmlReader) as List<ModifiedChestEntry>; ChangeMap(mapAssetName, null); TileEngine.PartyLeaderPosition = playerPosition; xmlReader.ReadEndElement(); // read the quest information ContentManager content = Session.ScreenManager.Game.Content; xmlReader.ReadStartElement("questData"); singleton.questLine = content.Load<QuestLine>( xmlReader.ReadElementString("questLineContentName")).Clone() as QuestLine; singleton.currentQuestIndex = Convert.ToInt32( xmlReader.ReadElementString("currentQuestIndex")); for (int i = 0; i < singleton.currentQuestIndex; i++) { singleton.questLine.Quests[i].Stage = Quest.QuestStage.Completed; } singleton.removedQuestChests = new XmlSerializer( typeof(List<WorldEntry<Chest>>)).Deserialize(xmlReader) as List<WorldEntry<Chest>>; singleton.removedQuestFixedCombats = new XmlSerializer( typeof(List<WorldEntry<FixedCombat>>)).Deserialize(xmlReader) as List<WorldEntry<FixedCombat>>; singleton.modifiedQuestChests = new XmlSerializer( typeof(List<ModifiedChestEntry>)).Deserialize(xmlReader) as List<ModifiedChestEntry>; Quest.QuestStage questStage = (Quest.QuestStage)Enum.Parse( typeof(Quest.QuestStage), xmlReader.ReadElementString("currentQuestStage"), true); if ((singleton.questLine != null) && !IsQuestLineComplete) { singleton.quest = singleton.questLine.Quests[CurrentQuestIndex]; singleton.ModifyQuest(singleton.quest); singleton.quest.Stage = questStage; } xmlReader.ReadEndElement(); // read the party data singleton.party = new Party(new XmlSerializer( typeof(PartySaveData)).Deserialize(xmlReader) as PartySaveData, content); // </rolePlayingGameSaveData> xmlReader.ReadEndElement(); } } } }
/// <summary> /// Start a new session, using the data in the given save game. /// </summary> /// <param name="saveGameDescription">The description of the save game.</param> /// <param name="screenManager">The ScreenManager for the new session.</param> public static void LoadSession(SaveGameDescription saveGameDescription, ScreenManager screenManager, GameplayScreen gameplayScreen) { // check the parameters if (saveGameDescription == null) { throw new ArgumentNullException("saveGameDescription"); } if (screenManager == null) { throw new ArgumentNullException("screenManager"); } if (gameplayScreen == null) { throw new ArgumentNullException("gameplayScreen"); } // end any existing session EndSession(); // create the new session singleton = new Session(screenManager, gameplayScreen); // get the storage device and load the session GetStorageDevice( delegate(StorageDevice storageDevice) { LoadSessionResult(storageDevice, saveGameDescription); }); }
/// <summary> /// Delete the save game specified by the description. /// </summary> /// <param name="storageDevice">The chosen storage device.</param> /// <param name="saveGameDescription">The description of the save game.</param> public static void DeleteSaveGameResult(StorageDevice storageDevice, SaveGameDescription saveGameDescription) { // check the parameters if (saveGameDescription == null) { throw new ArgumentNullException("saveGameDescription"); } // check the parameter if ((storageDevice == null) || !storageDevice.IsConnected) { return; } // open the container using (StorageContainer storageContainer = storageDevice.OpenContainer(Session.SaveGameContainerName)) { File.Delete(Path.Combine(storageContainer.Path, saveGameDescription.FileName)); File.Delete(Path.Combine(storageContainer.Path, "SaveGameDescription" + Path.GetFileNameWithoutExtension( saveGameDescription.FileName).Substring(8) + ".xml")); } // refresh the save game descriptions Session.RefreshSaveGameDescriptions(); }
/// <summary> /// Delete the save game specified by the description. /// </summary> /// <param name="saveGameDescription">The description of the save game.</param> public static void DeleteSaveGame(SaveGameDescription saveGameDescription) { // check the parameters if (saveGameDescription == null) { throw new ArgumentNullException("saveGameDescription"); } // get the storage device and load the session GetStorageDevice( delegate(StorageDevice storageDevice) { DeleteSaveGameResult(storageDevice, saveGameDescription); }); }
/// <summary> /// Save the current state of the session, with the given storage device. /// </summary> /// <param name="storageDevice">The chosen storage device.</param> /// <param name="overwriteDescription"> /// The description of the save game to over-write, if any. /// </param> private static void SaveSessionResult(StorageDevice storageDevice, SaveGameDescription overwriteDescription) { // check the parameter if ((storageDevice == null) || !storageDevice.IsConnected) { return; } // open the container using (StorageContainer storageContainer = storageDevice.OpenContainer(Session.SaveGameContainerName)) { string filename; string descriptionFilename; // get the filenames if (overwriteDescription == null) { int saveGameIndex = 0; string testFilename; do { saveGameIndex++; testFilename = Path.Combine(storageContainer.Path, "SaveGame" + saveGameIndex.ToString() + ".xml"); } while (File.Exists(testFilename)); filename = testFilename; descriptionFilename = "SaveGameDescription" + saveGameIndex.ToString() + ".xml"; } else { filename = Path.Combine(storageContainer.Path, overwriteDescription.FileName); descriptionFilename = "SaveGameDescription" + Path.GetFileNameWithoutExtension( overwriteDescription.FileName).Substring(8) + ".xml"; } using (FileStream stream = new FileStream(filename, FileMode.Create)) { using (XmlWriter xmlWriter = XmlWriter.Create(stream)) { // <rolePlayingGameData> xmlWriter.WriteStartElement("rolePlayingGameSaveData"); // write the map information xmlWriter.WriteStartElement("mapData"); xmlWriter.WriteElementString("mapContentName", TileEngine.Map.AssetName); new XmlSerializer(typeof(PlayerPosition)).Serialize( xmlWriter, TileEngine.PartyLeaderPosition); new XmlSerializer(typeof(List<WorldEntry<Chest>>)).Serialize( xmlWriter, singleton.removedMapChests); new XmlSerializer( typeof(List<WorldEntry<FixedCombat>>)).Serialize( xmlWriter, singleton.removedMapFixedCombats); new XmlSerializer(typeof(List<WorldEntry<Player>>)).Serialize( xmlWriter, singleton.removedMapPlayerNpcs); new XmlSerializer(typeof(List<ModifiedChestEntry>)).Serialize( xmlWriter, singleton.modifiedMapChests); xmlWriter.WriteEndElement(); // write the quest information xmlWriter.WriteStartElement("questData"); xmlWriter.WriteElementString("questLineContentName", singleton.questLine.AssetName); xmlWriter.WriteElementString("currentQuestIndex", singleton.currentQuestIndex.ToString()); new XmlSerializer(typeof(List<WorldEntry<Chest>>)).Serialize( xmlWriter, singleton.removedQuestChests); new XmlSerializer( typeof(List<WorldEntry<FixedCombat>>)).Serialize( xmlWriter, singleton.removedQuestFixedCombats); new XmlSerializer(typeof(List<ModifiedChestEntry>)).Serialize( xmlWriter, singleton.modifiedQuestChests); xmlWriter.WriteElementString("currentQuestStage", IsQuestLineComplete ? Quest.QuestStage.NotStarted.ToString() : singleton.quest.Stage.ToString()); xmlWriter.WriteEndElement(); // write the party data new XmlSerializer(typeof(PartySaveData)).Serialize(xmlWriter, new PartySaveData(singleton.party)); // </rolePlayingGameSaveData> xmlWriter.WriteEndElement(); } } // create the save game description SaveGameDescription description = new SaveGameDescription(); description.FileName = Path.GetFileName(filename); description.ChapterName = IsQuestLineComplete ? "Quest Line Complete" : Quest.Name; description.Description = DateTime.Now.ToString(); using (FileStream stream = new FileStream(Path.Combine( storageContainer.Path, descriptionFilename), FileMode.Create)) { new XmlSerializer(typeof(SaveGameDescription)).Serialize(stream, description); } } }
/// <summary> /// Save the current state of the session. /// </summary> /// <param name="overwriteDescription"> /// The description of the save game to over-write, if any. /// </param> public static void SaveSession(SaveGameDescription overwriteDescription) { // retrieve the storage device, asynchronously GetStorageDevice(delegate(StorageDevice storageDevice) { SaveSessionResult(storageDevice, overwriteDescription); }); }
/// <summary> /// Delete the save game specified by the description. /// </summary> /// <param name="storageDevice">The chosen storage device.</param> /// <param name="saveGameDescription">The description of the save game.</param> public static void DeleteSaveGameResult(SaveGameDescription saveGameDescription) { // check the parameters if (saveGameDescription == null) { throw new ArgumentNullException("saveGameDescription"); } // open the container using (IsolatedStorageFile container = IsolatedStorageFile.GetUserStoreForApplication()) { container.DeleteFile(saveGameDescription.FileName); container.DeleteFile("SaveGameDescription" + Path.GetFileNameWithoutExtension( saveGameDescription.FileName).Substring(8) + ".xml"); } // refresh the save game descriptions Session.RefreshSaveGameDescriptions(); }