SaveInfo_v1 ReadSaveInfo(string saveFolder) { string saveInfoJson = ReadSaveFile(Path.Combine(saveFolder, saveInfoFilename)); SaveInfo_v1 saveInfo = Deserialize(typeof(SaveInfo_v1), saveInfoJson) as SaveInfo_v1; return(saveInfo); }
IEnumerator SaveGame(string saveName, string path) { // Build save data SaveData_v1 saveData = BuildSaveData(); // Build save info SaveInfo_v1 saveInfo = new SaveInfo_v1(); saveInfo.saveVersion = LatestSaveVersion; saveInfo.saveName = saveName; saveInfo.characterName = saveData.playerData.playerEntity.name; saveInfo.dateAndTime = saveData.dateAndTime; // Build faction data FactionData_v1 factionData = GetPlayerFactionData(); // Serialize save data to JSON strings string saveDataJson = Serialize(saveData.GetType(), saveData); string saveInfoJson = Serialize(saveInfo.GetType(), saveInfo); string factionDataJson = Serialize(factionData.GetType(), factionData); // Create screenshot for save // TODO: Hide UI for screenshot or use a different method yield return(new WaitForEndOfFrame()); Texture2D screenshot = new Texture2D(Screen.width, Screen.height); screenshot.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0); screenshot.Apply(); // Save data to files WriteSaveFile(Path.Combine(path, saveDataFilename), saveDataJson); WriteSaveFile(Path.Combine(path, saveInfoFilename), saveInfoJson); WriteSaveFile(Path.Combine(path, factionDataFilename), factionDataJson); // Save automap state try { Dictionary <string, DaggerfallAutomap.AutomapGeometryDungeonState> automapState = GameManager.Instance.Automap.GetState(); string automapDataJson = Serialize(automapState.GetType(), automapState); WriteSaveFile(Path.Combine(path, automapDataFilename), automapDataJson); } catch (Exception ex) { string message = string.Format("Failed to save automap state. Message: {0}", ex.Message); Debug.Log(message); } // Save screenshot byte[] bytes = screenshot.EncodeToJPG(); File.WriteAllBytes(Path.Combine(path, screenshotFilename), bytes); // Raise OnSaveEvent RaiseOnSaveEvent(saveData); // Notify DaggerfallUI.Instance.PopupMessage(HardStrings.gameSaved); }
/// <summary> /// Finds existing save folder. /// </summary> /// <param name="characterName">Name of character to match.</param> /// <param name="saveName">Name of save to match.</param> /// <returns>Save key or -1 if save not found.</returns> public int FindSaveFolderByNames(string characterName, string saveName) { int[] saves = GetCharacterSaveKeys(characterName); foreach (int key in saves) { SaveInfo_v1 compareInfo = GetSaveInfo(key); if (compareInfo.characterName == characterName && compareInfo.saveName == saveName) { return(key); } } return(-1); }
Dictionary <int, SaveInfo_v1> EnumerateSaveInfo(Dictionary <int, string> saveFolders) { Dictionary <int, SaveInfo_v1> saveInfoDict = new Dictionary <int, SaveInfo_v1>(); foreach (var kvp in saveFolders) { try { SaveInfo_v1 saveInfo = ReadSaveInfo(kvp.Value); saveInfoDict.Add(kvp.Key, saveInfo); } catch (Exception ex) { DaggerfallUnity.LogMessage(string.Format("Failed to read {0} in save folder {1}. Exception.Message={2}", saveInfoFilename, kvp.Value, ex.Message)); } } return(saveInfoDict); }
IEnumerator SaveGame(string saveName, string path, bool instantReload = false) { // Build save data SaveData_v1 saveData = BuildSaveData(); // Build save info SaveInfo_v1 saveInfo = new SaveInfo_v1(); saveInfo.saveVersion = LatestSaveVersion; saveInfo.saveName = saveName; saveInfo.characterName = saveData.playerData.playerEntity.name; saveInfo.dateAndTime = saveData.dateAndTime; // Build faction data FactionData_v2 factionData = stateManager.GetPlayerFactionData(); // Build quest data QuestMachine.QuestMachineData_v1 questData = QuestMachine.Instance.GetSaveData(); // Get discovery data Dictionary <int, PlayerGPS.DiscoveredLocation> discoveryData = GameManager.Instance.PlayerGPS.GetDiscoverySaveData(); // Get conversation data TalkManager.SaveDataConversation conversationData = GameManager.Instance.TalkManager.GetConversationSaveData(); // Get notebook data PlayerNotebook.NotebookData_v1 notebookData = GameManager.Instance.PlayerEntity.Notebook.GetNotebookSaveData(); // Serialize save data to JSON strings string saveDataJson = Serialize(saveData.GetType(), saveData); string saveInfoJson = Serialize(saveInfo.GetType(), saveInfo); string factionDataJson = Serialize(factionData.GetType(), factionData); string questDataJson = Serialize(questData.GetType(), questData); string discoveryDataJson = Serialize(discoveryData.GetType(), discoveryData); string conversationDataJson = Serialize(conversationData.GetType(), conversationData); string notebookDataJson = Serialize(notebookData.GetType(), notebookData); //// Attempt to hide UI for screenshot //bool rawImageEnabled = false; //UnityEngine.UI.RawImage rawImage = GUI.GetDiegeticCanvasRawImage(); //if (rawImage) //{ // rawImageEnabled = rawImage.enabled; // rawImage.enabled = false; //} // Create screenshot for save // TODO: Hide UI for screenshot or use a different method yield return(new WaitForEndOfFrame()); yield return(new WaitForEndOfFrame()); Texture2D screenshot = new Texture2D(Screen.width, Screen.height); screenshot.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0); screenshot.Apply(); //// Restore UI after screenshot //if (rawImageEnabled) //{ // rawImage.enabled = true; //} // Save data to files WriteSaveFile(Path.Combine(path, saveDataFilename), saveDataJson); WriteSaveFile(Path.Combine(path, saveInfoFilename), saveInfoJson); WriteSaveFile(Path.Combine(path, factionDataFilename), factionDataJson); WriteSaveFile(Path.Combine(path, questDataFilename), questDataJson); WriteSaveFile(Path.Combine(path, discoveryDataFilename), discoveryDataJson); WriteSaveFile(Path.Combine(path, conversationDataFilename), conversationDataJson); WriteSaveFile(Path.Combine(path, notebookDataFilename), notebookDataJson); // Save backstory text if (!File.Exists(Path.Combine(path, bioFileName))) { StreamWriter file = new StreamWriter(Path.Combine(path, bioFileName).ToString()); foreach (string line in GameManager.Instance.PlayerEntity.BackStory) { file.WriteLine(line); } file.Close(); } // Save automap state try { Dictionary <string, Automap.AutomapDungeonState> automapState = GameManager.Instance.InteriorAutomap.GetState(); string automapDataJson = Serialize(automapState.GetType(), automapState); WriteSaveFile(Path.Combine(path, automapDataFilename), automapDataJson); } catch (Exception ex) { string message = string.Format("Failed to save automap state. Message: {0}", ex.Message); Debug.Log(message); } // Save mod data if (ModManager.Instance != null) { foreach (Mod mod in ModManager.Instance.GetAllModsWithSaveData()) { object modData = mod.SaveDataInterface.GetSaveData(); if (modData != null) { string modDataJson = Serialize(modData.GetType(), modData); WriteSaveFile(Path.Combine(path, GetModDataFilename(mod)), modDataJson); } else { File.Delete(Path.Combine(path, GetModDataFilename(mod))); } } } // Save screenshot byte[] bytes = screenshot.EncodeToJPG(); File.WriteAllBytes(Path.Combine(path, screenshotFilename), bytes); // Raise OnSaveEvent RaiseOnSaveEvent(saveData); // Notify DaggerfallUI.Instance.PopupMessage(HardStrings.gameSaved); // Reload this save instantly if requested if (instantReload) { Load(saveData.playerData.playerEntity.name, saveName); } }
IEnumerator SaveGame(string saveName, string path) { // Build save data SaveData_v1 saveData = BuildSaveData(); // Build save info SaveInfo_v1 saveInfo = new SaveInfo_v1(); saveInfo.saveVersion = LatestSaveVersion; saveInfo.saveName = saveName; saveInfo.characterName = saveData.playerData.playerEntity.name; saveInfo.dateAndTime = saveData.dateAndTime; // Build faction data FactionData_v2 factionData = stateManager.GetPlayerFactionData(); // Build quest data QuestMachine.QuestMachineData_v1 questData = QuestMachine.Instance.GetSaveData(); // Get discovery data Dictionary <int, PlayerGPS.DiscoveredLocation> discoveryData = GameManager.Instance.PlayerGPS.GetDiscoverySaveData(); // Get conversation data TalkManager.SaveDataConversation conversationData = GameManager.Instance.TalkManager.GetConversationSaveData(); // Serialize save data to JSON strings string saveDataJson = Serialize(saveData.GetType(), saveData); string saveInfoJson = Serialize(saveInfo.GetType(), saveInfo); string factionDataJson = Serialize(factionData.GetType(), factionData); string questDataJson = Serialize(questData.GetType(), questData); string discoveryDataJson = Serialize(discoveryData.GetType(), discoveryData); string conversationDataJson = Serialize(conversationData.GetType(), conversationData); // Create screenshot for save // TODO: Hide UI for screenshot or use a different method yield return(new WaitForEndOfFrame()); Texture2D screenshot = new Texture2D(Screen.width, Screen.height); screenshot.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0); screenshot.Apply(); // Save data to files WriteSaveFile(Path.Combine(path, saveDataFilename), saveDataJson); WriteSaveFile(Path.Combine(path, saveInfoFilename), saveInfoJson); WriteSaveFile(Path.Combine(path, factionDataFilename), factionDataJson); WriteSaveFile(Path.Combine(path, questDataFilename), questDataJson); WriteSaveFile(Path.Combine(path, discoveryDataFilename), discoveryDataJson); WriteSaveFile(Path.Combine(path, conversationDataFilename), conversationDataJson); // Save automap state try { Dictionary <string, DaggerfallAutomap.AutomapGeometryDungeonState> automapState = GameManager.Instance.InteriorAutomap.GetState(); string automapDataJson = Serialize(automapState.GetType(), automapState); WriteSaveFile(Path.Combine(path, automapDataFilename), automapDataJson); } catch (Exception ex) { string message = string.Format("Failed to save automap state. Message: {0}", ex.Message); Debug.Log(message); } // Save mod data if (ModManager.Instance != null) { foreach (Mod mod in ModManager.Instance.GetAllModsWithSaveData()) { object modData = mod.SaveDataInterface.GetSaveData(); if (modData != null) { string modDataJson = Serialize(modData.GetType(), modData); WriteSaveFile(Path.Combine(path, GetModDataFilename(mod)), modDataJson); } else { File.Delete(Path.Combine(path, GetModDataFilename(mod))); } } } // Save screenshot byte[] bytes = screenshot.EncodeToJPG(); File.WriteAllBytes(Path.Combine(path, screenshotFilename), bytes); // Raise OnSaveEvent RaiseOnSaveEvent(saveData); // Notify DaggerfallUI.Instance.PopupMessage(HardStrings.gameSaved); }
IEnumerator SaveGame(string saveName, string path) { // Build save data SaveData_v1 saveData = BuildSaveData(); // Build save info SaveInfo_v1 saveInfo = new SaveInfo_v1(); saveInfo.saveVersion = LatestSaveVersion; saveInfo.saveName = saveName; saveInfo.characterName = saveData.playerData.playerEntity.name; saveInfo.dateAndTime = saveData.dateAndTime; // Serialize save data to JSON strings string saveDataJson = Serialize(saveData.GetType(), saveData); string saveInfoJson = Serialize(saveInfo.GetType(), saveInfo); // Create screenshot for save // TODO: Hide UI for screenshot or use a different method yield return new WaitForEndOfFrame(); Texture2D screenshot = new Texture2D(Screen.width, Screen.height); screenshot.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0); screenshot.Apply(); // Save data to files WriteSaveFile(Path.Combine(path, saveDataFilename), saveDataJson); WriteSaveFile(Path.Combine(path, saveInfoFilename), saveInfoJson); // Save automap state try { Dictionary<string, DaggerfallAutomap.AutomapGeometryDungeonState> automapState = GameManager.Instance.Automap.GetState(); string automapDataJson = Serialize(automapState.GetType(), automapState); WriteSaveFile(Path.Combine(path, automapDataFilename), automapDataJson); } catch(Exception ex) { string message = string.Format("Failed to save automap state. Message: {0}", ex.Message); Debug.Log(message); } // Save screenshot byte[] bytes = screenshot.EncodeToJPG(); File.WriteAllBytes(Path.Combine(path, screenshotFilename), bytes); // Raise OnSaveEvent RaiseOnSaveEvent(saveData); // Notify DaggerfallUI.Instance.PopupMessage(HardStrings.gameSaved); }