private void GetFilesList() { saveFiles = new Dictionary <string, List <SaveGameFileDetails> >(); List <string> allFiles = SaveLoader.GetAllFiles(); if (allFiles.Count > 0) { for (int i = 0; i < allFiles.Count; i++) { if (IsFileValid(allFiles[i])) { Tuple <SaveGame.Header, SaveGame.GameInfo> fileInfo = GetFileInfo(allFiles[i]); SaveGame.Header first = fileInfo.first; SaveGame.GameInfo second = fileInfo.second; System.DateTime lastWriteTime = File.GetLastWriteTime(allFiles[i]); string path = (!(second.originalSaveName != string.Empty)) ? allFiles[i] : second.originalSaveName; path = Path.GetFileNameWithoutExtension(path); SaveGameFileDetails item = default(SaveGameFileDetails); item.BaseName = second.baseName; item.FileName = allFiles[i]; item.FileDate = lastWriteTime; item.FileHeader = first; item.FileInfo = second; if (!saveFiles.ContainsKey(path)) { saveFiles.Add(path, new List <SaveGameFileDetails>()); } saveFiles[path].Add(item); } } } }
/// <summary> /// Applied before LoadHeader runs. /// </summary> internal static bool Prefix(string filename, ref SaveGame.Header header, ref SaveGame.GameInfo __result) { // Klei does not catch the IOException at this level var reader = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read); try { __result = SaveGame.GetHeader(new KBinaryReader(reader), out header, filename); } finally { reader.Close(); reader.Dispose(); } return(false); }
private bool IsFileValid(string filename) { bool result = false; try { SaveGame.Header header; SaveGame.GameInfo gameInfo = SaveLoader.LoadHeader(filename, out header); result = (gameInfo.saveMajorVersion >= 7); return(result); } catch (Exception ex) { Debug.LogWarning("Corrupted save file: " + filename + "\n" + ex.ToString()); return(result); } }
private Tuple <SaveGame.Header, SaveGame.GameInfo> GetFileInfo(string filename) { try { SaveGame.Header header; SaveGame.GameInfo b = SaveLoader.LoadHeader(filename, out header); if (b.saveMajorVersion >= 7) { return(new Tuple <SaveGame.Header, SaveGame.GameInfo>(header, b)); } } catch (Exception obj) { Debug.LogWarning(obj); InfoText.text = string.Format(UI.FRONTEND.LOADSCREEN.CORRUPTEDSAVE, filename); } return(null); }
private void DoLoad() { ReportErrorDialog.MOST_RECENT_SAVEFILE = this.selectedFileName; bool flag = true; SaveGame.Header header; SaveGame.GameInfo gameInfo = SaveLoader.LoadHeader(this.selectedFileName, out header); string arg = null; string arg2 = null; if (header.buildVersion > 260525u) { arg = header.buildVersion.ToString(); arg2 = 260525u.ToString(); } else if (gameInfo.saveMajorVersion < 7) { arg = string.Format("v{0}.{1}", gameInfo.saveMajorVersion, gameInfo.saveMinorVersion); arg2 = string.Format("v{0}.{1}", 7, 3); } if (!flag) { GameObject parent = (!(FrontEndManager.Instance == null)) ? FrontEndManager.Instance.gameObject : GameScreenManager.Instance.ssOverlayCanvas; ConfirmDialogScreen component = Util.KInstantiateUI(ScreenPrefabs.Instance.ConfirmDialogScreen.gameObject, parent, true).GetComponent <ConfirmDialogScreen>(); component.PopupConfirmDialog(string.Format(UI.CRASHSCREEN.LOADFAILED, "Version Mismatch", arg, arg2), null, null, null, null, null, null, null); } else { if (Game.Instance != null) { ModScreen.ForceStopGame(); } SaveLoader.SetActiveSaveFilePath(this.selectedFileName); Time.timeScale = 0f; App.LoadScene("backend"); this.Deactivate(); } }
private static void DoLoad(string filename) { ReportErrorDialog.MOST_RECENT_SAVEFILE = filename; bool flag = true; SaveGame.Header header; SaveGame.GameInfo gameInfo = SaveLoader.LoadHeader(filename, out header); string arg = null; string arg2 = null; if (header.buildVersion > 365655) { arg = header.buildVersion.ToString(); arg2 = 365655.ToString(); } else if (gameInfo.saveMajorVersion < 7) { arg = $"v{gameInfo.saveMajorVersion}.{gameInfo.saveMinorVersion}"; arg2 = $"v{7}.{11}"; } if (!flag) { GameObject parent = (!((UnityEngine.Object)FrontEndManager.Instance == (UnityEngine.Object)null)) ? FrontEndManager.Instance.gameObject : GameScreenManager.Instance.ssOverlayCanvas; ConfirmDialogScreen component = Util.KInstantiateUI(ScreenPrefabs.Instance.ConfirmDialogScreen.gameObject, parent, true).GetComponent <ConfirmDialogScreen>(); component.PopupConfirmDialog(string.Format(UI.CRASHSCREEN.LOADFAILED, "Version Mismatch", arg, arg2), null, null, null, null, null, null, null, null, true); } else { if ((UnityEngine.Object)Game.Instance != (UnityEngine.Object)null) { ForceStopGame(); } SaveLoader.SetActiveSaveFilePath(filename); Time.timeScale = 0f; App.LoadScene("backend"); } }
private void RefreshResumeButton() { string latestSaveFile = SaveLoader.GetLatestSaveFile(); bool flag = !string.IsNullOrEmpty(latestSaveFile) && File.Exists(latestSaveFile); if (flag) { try { if (GenericGameSettings.instance.demoMode) { flag = false; } System.DateTime lastWriteTime = File.GetLastWriteTime(latestSaveFile); SaveFileEntry value = default(SaveFileEntry); SaveGame.Header header = default(SaveGame.Header); SaveGame.GameInfo gameInfo = default(SaveGame.GameInfo); if (!saveFileEntries.TryGetValue(latestSaveFile, out value) || value.timeStamp != lastWriteTime) { gameInfo = SaveLoader.LoadHeader(latestSaveFile, out header); SaveFileEntry saveFileEntry = default(SaveFileEntry); saveFileEntry.timeStamp = lastWriteTime; saveFileEntry.header = header; saveFileEntry.headerData = gameInfo; value = saveFileEntry; saveFileEntries[latestSaveFile] = value; } else { header = value.header; gameInfo = value.headerData; } if (header.buildVersion > 365655 || gameInfo.saveMajorVersion < 7) { flag = false; } string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(latestSaveFile); if (!string.IsNullOrEmpty(gameInfo.baseName)) { Button_ResumeGame.GetComponentsInChildren <LocText>()[1].text = string.Format(UI.FRONTEND.MAINMENU.RESUMEBUTTON_BASENAME, gameInfo.baseName, gameInfo.numberOfCycles + 1); } else { Button_ResumeGame.GetComponentsInChildren <LocText>()[1].text = fileNameWithoutExtension; } } catch (Exception obj) { Debug.LogWarning(obj); flag = false; } } if ((UnityEngine.Object)Button_ResumeGame != (UnityEngine.Object)null && (UnityEngine.Object)Button_ResumeGame.gameObject != (UnityEngine.Object)null) { Button_ResumeGame.gameObject.SetActive(flag); } else { Debug.LogWarning("Why is the resume game button null?"); } }
private void SetSelectedGame(string filename) { if (string.IsNullOrEmpty(filename) || !File.Exists(filename)) { global::Debug.LogError("The filename provided is not valid.", null); } else { KButton kButton = (this.selectedFileName == null) ? null : this.fileButtonMap[this.selectedFileName]; if (kButton != null) { kButton.GetComponent <ImageToggleState>().SetState(ImageToggleState.State.Inactive); } this.selectedFileName = filename; kButton = this.fileButtonMap[this.selectedFileName]; kButton.GetComponent <ImageToggleState>().SetState(ImageToggleState.State.Active); this.moreInfoButton.gameObject.SetActive(false); try { SaveGame.Header header; SaveGame.GameInfo gameInfo = SaveLoader.LoadHeader(filename, out header); string format = UI.FRONTEND.LOADSCREEN.SAVEDETAILS; string text = string.Format("{0:H:mm:ss}\n" + Localization.GetFileDateFormat(0), File.GetLastWriteTime(filename)); string text2 = Path.GetFileName(filename); if (gameInfo.isAutoSave) { text2 += UI.FRONTEND.LOADSCREEN.AUTOSAVEWARNING; } string text3 = string.Format(format, new object[] { text2, text, gameInfo.baseName, gameInfo.numberOfDuplicants.ToString(), gameInfo.numberOfCycles.ToString() }); this.saveDetails.text = text3; if (ModScreen.IsSaveFileFromUnsupportedFutureBuild(header)) { this.saveDetails.text = string.Format(UI.FRONTEND.LOADSCREEN.SAVE_TOO_NEW, filename, header.buildVersion, 260525u); this.loadButton.isInteractable = false; this.loadButton.GetComponent <ImageToggleState>().SetState(ImageToggleState.State.Disabled); } else if (gameInfo.saveMajorVersion < 7) { this.saveDetails.text = string.Format(UI.FRONTEND.LOADSCREEN.UNSUPPORTED_SAVE_VERSION, new object[] { filename, gameInfo.saveMajorVersion, gameInfo.saveMinorVersion, 7, 3 }); this.loadButton.isInteractable = false; this.loadButton.GetComponent <ImageToggleState>().SetState(ImageToggleState.State.Disabled); } else if (!this.loadButton.isInteractable) { this.loadButton.isInteractable = true; this.loadButton.GetComponent <ImageToggleState>().SetState(ImageToggleState.State.Inactive); } } catch (Exception obj) { global::Debug.LogWarning(obj, null); this.saveDetails.text = string.Format(UI.FRONTEND.LOADSCREEN.CORRUPTEDSAVE, filename); if (this.loadButton.isInteractable) { this.loadButton.isInteractable = false; this.loadButton.GetComponent <ImageToggleState>().SetState(ImageToggleState.State.Disabled); } } } }
public bool Load(string filename) { SetActiveSaveFilePath(filename); try { KSerialization.Manager.Clear(); byte[] array = File.ReadAllBytes(filename); IReader reader = new FastReader(array); GameInfo = SaveGame.GetHeader(reader, out SaveGame.Header header); LoadedHeader = header; DebugUtil.LogArgs(string.Format("Loading save file: {4}\n headerVersion:{0}, buildVersion:{1}, headerSize:{2}, IsCompressed:{3}", header.headerVersion, header.buildVersion, header.headerSize, header.IsCompressed, filename)); object[] obj = new object[1]; object[] obj2 = new object[7]; SaveGame.GameInfo gameInfo = GameInfo; obj2[0] = gameInfo.numberOfCycles; SaveGame.GameInfo gameInfo2 = GameInfo; obj2[1] = gameInfo2.numberOfDuplicants; SaveGame.GameInfo gameInfo3 = GameInfo; obj2[2] = gameInfo3.baseName; SaveGame.GameInfo gameInfo4 = GameInfo; obj2[3] = gameInfo4.isAutoSave; SaveGame.GameInfo gameInfo5 = GameInfo; obj2[4] = gameInfo5.originalSaveName; SaveGame.GameInfo gameInfo6 = GameInfo; obj2[5] = gameInfo6.saveMajorVersion; SaveGame.GameInfo gameInfo7 = GameInfo; obj2[6] = gameInfo7.saveMinorVersion; obj[0] = string.Format("GameInfo: numberOfCycles:{0}, numberOfDuplicants:{1}, baseName:{2}, isAutoSave:{3}, originalSaveName:{4}, saveVersion:{5}.{6}", obj2); DebugUtil.LogArgs(obj); SaveGame.GameInfo gameInfo8 = GameInfo; if (gameInfo8.saveMajorVersion == 7) { SaveGame.GameInfo gameInfo9 = GameInfo; if (gameInfo9.saveMinorVersion < 4) { Helper.SetTypeInfoMask((SerializationTypeInfo)191); } } KSerialization.Manager.DeserializeDirectory(reader); if (header.IsCompressed) { int num = array.Length - reader.Position; byte[] array2 = new byte[num]; Array.Copy(array, reader.Position, array2, 0, num); byte[] bytes = DecompressContents(array2); IReader reader2 = new FastReader(bytes); Load(reader2); } else { Load(reader); } SaveGame.GameInfo gameInfo10 = GameInfo; if (gameInfo10.isAutoSave) { SaveGame.GameInfo gameInfo11 = GameInfo; if (!string.IsNullOrEmpty(gameInfo11.originalSaveName)) { SaveGame.GameInfo gameInfo12 = GameInfo; SetActiveSaveFilePath(gameInfo12.originalSaveName); } } } catch (Exception ex) { DebugUtil.LogWarningArgs("\n--- Error loading save ---\n" + ex.Message + "\n" + ex.StackTrace); Sim.Shutdown(); SetActiveSaveFilePath(null); return(false); } Stats.Print(); DebugUtil.LogArgs("Loaded", "[" + filename + "]"); DebugUtil.LogArgs("World Seeds", "[" + worldDetailSave.globalWorldSeed + "/" + worldDetailSave.globalWorldLayoutSeed + "/" + worldDetailSave.globalTerrainSeed + "/" + worldDetailSave.globalNoiseSeed + "]"); GC.Collect(); return(true); }
private bool Load(IReader reader) { string a = reader.ReadKleiString(); Debug.Assert(a == "world"); Deserializer deserializer = new Deserializer(reader); SaveFileRoot saveFileRoot = new SaveFileRoot(); deserializer.Deserialize(saveFileRoot); SaveGame.GameInfo gameInfo = GameInfo; if (gameInfo.saveMajorVersion != 7) { SaveGame.GameInfo gameInfo2 = GameInfo; if (gameInfo2.saveMinorVersion >= 8) { goto IL_00f7; } } if (saveFileRoot.requiredMods != null) { saveFileRoot.active_mods = new List <Label>(); foreach (ModInfo requiredMod in saveFileRoot.requiredMods) { ModInfo current = requiredMod; saveFileRoot.active_mods.Add(new Label { id = current.assetID, version = current.lastModifiedTime, distribution_platform = Label.DistributionPlatform.Steam, title = current.description }); } saveFileRoot.requiredMods.Clear(); } goto IL_00f7; IL_00f7: KMod.Manager modManager = Global.Instance.modManager; modManager.Load(Content.LayerableFiles); if (!modManager.MatchFootprint(saveFileRoot.active_mods, Content.LayerableFiles | Content.Strings | Content.DLL | Content.Translation | Content.Animation)) { DebugUtil.LogWarningArgs("Mod footprint of save file doesn't match current mod configuration"); } Global.Instance.modManager.SendMetricsEvent(); string text = saveFileRoot.worldID; if (text == null) { try { text = CustomGameSettings.Instance.GetCurrentQualitySetting(CustomGameSettingConfigs.World).id; } catch { text = "worlds/SandstoneDefault"; } } Game.worldID = text; worldGen = new WorldGen(text, null); Game.LoadSettings(deserializer); GridSettings.Reset(saveFileRoot.WidthInCells, saveFileRoot.HeightInCells); Singleton <KBatchedAnimUpdater> .Instance.InitializeGrid(); Sim.SIM_Initialize(Sim.DLL_MessageHandler); SimMessages.CreateSimElementsTable(ElementLoader.elements); SimMessages.CreateDiseaseTable(); byte[] bytes = saveFileRoot.streamed["Sim"]; FastReader reader2 = new FastReader(bytes); if (Sim.Load(reader2) != 0) { DebugUtil.LogWarningArgs("\n--- Error loading save ---\nSimDLL found bad data\n"); Sim.Shutdown(); return(false); } SceneInitializer.Instance.PostLoadPrefabs(); mustRestartOnFail = true; if (!saveManager.Load(reader)) { Sim.Shutdown(); DebugUtil.LogWarningArgs("\n--- Error loading save ---\n"); SetActiveSaveFilePath(null); return(false); } Grid.Visible = saveFileRoot.streamed["GridVisible"]; if (saveFileRoot.streamed.ContainsKey("GridSpawnable")) { Grid.Spawnable = saveFileRoot.streamed["GridSpawnable"]; } Grid.Damage = BytesToFloat(saveFileRoot.streamed["GridDamage"]); Game.Instance.Load(deserializer); FastReader reader3 = new FastReader(saveFileRoot.streamed["Camera"]); CameraSaveData.Load(reader3); return(true); }
private void SetSelectedGame(string filename, string savename) { if (string.IsNullOrEmpty(filename) || !File.Exists(filename)) { Debug.LogError("The filename provided is not valid."); deleteButton.isInteractable = false; } else { deleteButton.isInteractable = true; KButton kButton = (selectedFileName == null) ? null : fileButtonMap[selectedFileName]; if ((UnityEngine.Object)kButton != (UnityEngine.Object)null) { kButton.GetComponent <ImageToggleState>().SetState(ImageToggleState.State.Inactive); } selectedFileName = filename; FileName.text = Path.GetFileName(selectedFileName); kButton = fileButtonMap[selectedFileName]; kButton.GetComponent <ImageToggleState>().SetState(ImageToggleState.State.Active); try { SaveGame.Header header; SaveGame.GameInfo gameInfo = SaveLoader.LoadHeader(filename, out header); string fileName = Path.GetFileName(filename); if (gameInfo.isAutoSave) { fileName = fileName + "\n" + UI.FRONTEND.LOADSCREEN.AUTOSAVEWARNING; } CyclesSurvivedValue.text = gameInfo.numberOfCycles.ToString(); DuplicantsAliveValue.text = gameInfo.numberOfDuplicants.ToString(); InfoText.text = string.Empty; if (IsSaveFileFromUnsupportedFutureBuild(header)) { InfoText.text = string.Format(UI.FRONTEND.LOADSCREEN.SAVE_TOO_NEW, filename, header.buildVersion, 365655u); loadButton.isInteractable = false; loadButton.GetComponent <ImageToggleState>().SetState(ImageToggleState.State.Disabled); } else if (gameInfo.saveMajorVersion < 7) { InfoText.text = string.Format(UI.FRONTEND.LOADSCREEN.UNSUPPORTED_SAVE_VERSION, filename, gameInfo.saveMajorVersion, gameInfo.saveMinorVersion, 7, 11); loadButton.isInteractable = false; loadButton.GetComponent <ImageToggleState>().SetState(ImageToggleState.State.Disabled); } else if (!loadButton.isInteractable) { loadButton.isInteractable = true; loadButton.GetComponent <ImageToggleState>().SetState(ImageToggleState.State.Inactive); } if (InfoText.text == string.Empty && gameInfo.isAutoSave) { InfoText.text = UI.FRONTEND.LOADSCREEN.AUTOSAVEWARNING; } } catch (Exception obj) { Debug.LogWarning(obj); InfoText.text = string.Format(UI.FRONTEND.LOADSCREEN.CORRUPTEDSAVE, filename); if (loadButton.isInteractable) { loadButton.isInteractable = false; loadButton.GetComponent <ImageToggleState>().SetState(ImageToggleState.State.Disabled); } deleteButton.isInteractable = false; } try { Sprite sprite = RetireColonyUtility.LoadColonyPreview(selectedFileName, savename); Image component = previewImageRoot.GetComponent <Image>(); component.sprite = sprite; component.color = ((!(bool)sprite) ? Color.black : Color.white); } catch (Exception obj2) { Debug.Log(obj2); } } }