using UnityEngine; using UnityEngine.SceneManagement; namespace Fungus { public class SaveManager : MonoBehaviour { const string ActiveSlotKey = "active_slot"; const string SlotKeyFormat = "slot{0}"; // Make serialize data extensible (subclassing?) // Save key, use save profile and variable substitution // Store scene name, flowchart name and block name to execute after load // Show link to Block to be executed // Handle New Save Slot case: Scene to load? // Save command stores data in SaveManager for writing later // If SaveImmediately is selected then save it straight away (SaveGame command) // If not selected, then Save when a Save button is pressed // Select / Load button - set active slot (in playerprefs) and load the state // Get list of saved games // Delete Save Game // Rename SaveFlowchart to SaveGame protected string saveBuffer = ""; protected static SaveManager instance; protected SavePointData tempSaveData; protected virtual void Awake() { instance = this; } protected virtual string FormatSaveKey(int slot) { return string.Format(SlotKeyFormat, slot); } protected virtual bool LoadNewGame(string key, string startScene) { if (PlayerPrefs.HasKey(key) && PlayerPrefs.GetString(key) != "") { return false; } // Create a new save entry PlayerPrefs.SetString(key, ""); // Load the start scene SceneManager.LoadScene(startScene); return true; } protected virtual string CreateSaveData(Flowchart flowchart, string saveKey, string description) { var saveData = new SavePointData(); // Store the scene, flowchart and block to execute on resume saveData.SceneName = SceneManager.GetActiveScene().name; saveData.SaveKey = saveKey; saveData.Description = description; var flowchartData = FlowchartData.Encode(flowchart); saveData.FlowchartData.Add(flowchartData); return JsonUtility.ToJson(saveData, true); } protected virtual void RestoreSavedGame(SavePointData saveData) { var flowchartData = saveData.FlowchartData[0]; FlowchartData.Decode(flowchartData); // Fire any matching SavePointLoaded event handler with matching save key. var eventHandlers = Object.FindObjectsOfType(); for (int i = 0; i < eventHandlers.Length; i++) { var eventHandler = eventHandlers[i]; eventHandler.OnSavePointLoaded(saveData.SaveKey); } // Execute any block with a Label matching the save key var labels = Object.FindObjectsOfType