예제 #1
0
    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);
                }
            }
        }
    }
예제 #2
0
        /// <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);
        }
예제 #3
0
    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);
        }
    }
예제 #4
0
 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);
 }
예제 #5
0
    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();
        }
    }
예제 #6
0
    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?");
        }
    }
예제 #8
0
 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);
             }
         }
     }
 }
예제 #9
0
 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);
 }
예제 #10
0
    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);
    }
예제 #11
0
 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);
         }
     }
 }