using System.Collections.Generic; using System.IO; using UnityEngine; public class SaveLoadManager : MonoBehaviour { public static SaveLoadManager instance; [SerializeField] private int saveFileVersionNr = 1; [SerializeField] private string saveFileName = "ThroneSave.sav"; private List saveData = new List(); private string[] loadData; private LevelProgressManager levelProgressManager; private PerkManager perkManager; [SerializeField] private List allEquippablesID = new List(); private int iln; private string line; private string FullSaveFilePath => Path.Combine(Application.persistentDataPath, saveFileName); private void Awake() { if ((bool)instance) { Object.Destroy(base.gameObject); return; } Object.DontDestroyOnLoad(base.gameObject); instance = this; } private void Start() { LoadGame(); if (DebugController.SaveLoadModeToUse != DebugController.SaveLoadMode.LoadMaxedOutSaveFileOnStartup) { if (levelProgressManager.GetLevelDataForScene("Neuland(Tutorial)") == null) { SceneTransitionManager.instance.TransitionFromLevelSelectToLevel("Neuland(Tutorial)"); } else if (!levelProgressManager.GetLevelDataForScene("Neuland(Tutorial)").beatenBest) { SceneTransitionManager.instance.TransitionFromLevelSelectToLevel("Neuland(Tutorial)"); } } } public void SaveGame() { if (!DebugController.SaveTheGame) { DebugLogInEditorOnly("Saving is not enabled!"); return; } saveData.Clear(); levelProgressManager = LevelProgressManager.instance; perkManager = PerkManager.instance; SaveSingle("Save File Version", saveFileVersionNr.ToString()); SaveSingle("Perk Level", perkManager.level.ToString()); SaveSingle("Perk XP", perkManager.xp.ToString()); foreach (KeyValuePair sceneNameToLevelDatum in levelProgressManager.SceneNameToLevelData) { string key = sceneNameToLevelDatum.Key; LevelData value = sceneNameToLevelDatum.Value; if (value.highscoreBest <= 0 && !value.beatenBest) { continue; } SaveSingle("Level", key); SaveSingle("QuestsCompleteWhenLastOnMap", value.questsCompleteWhenLastVisitingMap.ToString()); SaveSingle("Beaten", value.beatenBest ? "1" : "0"); if (value.beatenBest) { AchievementManager.LevelBeaten(key); } SaveSingle("HighscoreV2", value.highscoreBest.ToString()); SaveList("NetworthV2 / Day", value.dayToDayNetworthBest); SaveList("ScoreV2 / Day", value.dayToDayScoreBest); foreach (List item in value.levelHasBeenBeatenWith) { List list = new List(); foreach (Equippable item2 in item) { if (!(item2 == null)) { list.Add(item2.name); } } SaveList("Beaten With", list); } } File.WriteAllLines(FullSaveFilePath, saveData); DebugLogInEditorOnly("Game Saved to " + FullSaveFilePath); } public void SaveSingle(string _key, string _data) { saveData.Add(_key); saveData.Add(_data); saveData.Add(""); } public void SaveList(string _key, List _data) { saveData.Add(_key); saveData.Add(_data.Count.ToString()); for (int i = 0; i < _data.Count; i++) { saveData.Add(_data[i].ToString()); } saveData.Add(""); } private void LoadGame() { levelProgressManager = LevelProgressManager.instance; perkManager = PerkManager.instance; if (DebugController.SaveLoadModeToUse == DebugController.SaveLoadMode.LoadEmptySaveFileOnStartup) { DebugLogInEditorOnly("Loading is not enabled!"); return; } if (DebugController.SaveLoadModeToUse == DebugController.SaveLoadMode.LoadMaxedOutSaveFileOnStartup) { DebugLogInEditorOnly("Loading maxed out save file with everything unlocked!"); perkManager.level = 10000; perkManager.CallAfterLoadToUnlockPerksAndStuff(); return; } if (!File.Exists(FullSaveFilePath)) { DebugLogInEditorOnly("No save file was found at " + FullSaveFilePath + " so the load process was canceled."); return; } loadData = File.ReadAllLines(FullSaveFilePath); LevelData levelData = null; levelProgressManager.SceneNameToLevelData.Clear(); for (iln = 0; iln < loadData.Length; iln++) { line = loadData[iln]; switch (line) { case "Perk Level": perkManager.level = int.Parse(ReadNextLn()); break; case "Perk XP": perkManager.xp = int.Parse(ReadNextLn()); break; case "Level": levelData = levelProgressManager.GetLevelDataForScene(ReadNextLn()); break; case "QuestsCompleteWhenLastOnMap": if (levelData != null) { levelData.questsCompleteWhenLastVisitingMap = int.Parse(ReadNextLn()); } break; case "Beaten": if (levelData != null) { levelData.beatenBest = ReadNextLn() == "1"; } break; case "HighscoreV2": if (levelData != null) { levelData.highscoreBest = int.Parse(ReadNextLn()); } break; case "NetworthV2 / Day": if (levelData != null) { int num = int.Parse(ReadNextLn()); levelData.dayToDayNetworthBest.Clear(); for (int l = 0; l < num; l++) { levelData.dayToDayNetworthBest.Add(int.Parse(ReadNextLn())); } } break; case "ScoreV2 / Day": if (levelData != null) { int num = int.Parse(ReadNextLn()); levelData.dayToDayScoreBest.Clear(); for (int k = 0; k < num; k++) { levelData.dayToDayScoreBest.Add(int.Parse(ReadNextLn())); } } break; case "Beaten With": { if (levelData == null) { break; } int num = int.Parse(ReadNextLn()); List list = new List(); for (int i = 0; i < num; i++) { string text = ReadNextLn(); Equippable item = null; for (int j = 0; j < allEquippablesID.Count; j++) { if (allEquippablesID[j].name == text) { item = allEquippablesID[j]; } } list.Add(item); } levelData.levelHasBeenBeatenWith.Add(list); break; } } } perkManager.CallAfterLoadToUnlockPerksAndStuff(); DebugLogInEditorOnly("Loaded Game from " + FullSaveFilePath); } private string ReadNextLn() { iln++; line = loadData[iln]; return line; } private void DebugLogInEditorOnly(string _log) { } }