Example #1
0
        private static void PopulateSavesMetadata()
        {
            if (!Directory.Exists(SavesDirectory))
            {
                Directory.CreateDirectory(SavesDirectory);
                return;
            }
            var path = $"{SavesDirectory}\\SavesMetadata.json";

            if (!File.Exists(path))
            {
                return;
            }

            try
            {
                var json     = File.ReadAllText(path);
                var metadata = JSONParser.FromJson <SaveFileMeta[]>(json);

                SavesMetadata.AddRange(metadata);
            }
            catch (Exception e)
            {
                Debug.LogWarning("[ProperSave] SavesMetadata file corrupted.");
            }
        }
Example #2
0
        private static void SaveGame()
        {
            Save = new SaveData();
            var metadata      = SaveFileMeta.CreateCurrentMetadata();
            var foundMetadata = GetLobbySaveMetadata();

            Save.SaveFileMeta = foundMetadata ?? metadata;
            if (string.IsNullOrEmpty(Save.SaveFileMeta.FileName))
            {
                do
                {
                    Save.SaveFileMeta.FileName = Guid.NewGuid().ToString();
                }while (File.Exists(Save.SaveFileMeta.FilePath));
            }

            try
            {
                var json = JSONWriter.ToJson(Save);
                File.WriteAllText(Save.SaveFileMeta.FilePath, json);
                if (ReferenceEquals(Save.SaveFileMeta, metadata))
                {
                    SavesMetadata.Add(metadata);
                    UpdateSavesMetadata();
                }
                Chat.AddMessage(Language.GetString(LanguageConsts.PS_CHAT_SAVE));
            }
            catch (Exception e)
            {
                Debug.LogWarning("[ProperSave] Couldn't save game");
            }
        }
Example #3
0
        private static SaveFileMeta GetLobbySaveMetadata(NetworkUser exceptUser = null)
        {
            var users = NetworkUser.readOnlyInstancesList.Select(el => el.Network_id.steamId.value).ToList();

            if (exceptUser != null)
            {
                users.Remove(exceptUser.Network_id.steamId.value);
            }
            var usersCount = users.Count();

            if (usersCount == 0)
            {
                return(null);
            }
            var gameMode = PreGameController.instance ? PreGameController.instance.gameModeIndex : Run.instance ? Run.instance.gameModeIndex : GameModeIndex.Invalid;

            if (gameMode == GameModeIndex.Invalid)
            {
                return(null);
            }
            if (usersCount == 1)
            {
                var profile = LocalUserManager.readOnlyLocalUsersList[0].userProfile.fileName.Replace(".xml", "");
                return(SavesMetadata.FirstOrDefault(el => el.UserProfileId == profile && el.SteamIds.Length == 1 && el.GameMode == gameMode));
            }
            return(SavesMetadata.FirstOrDefault(el => el.SteamIds.DifferenceCount(users) == 0 && el.GameMode == gameMode));
        }
Example #4
0
        private void RegisterGameSaving()
        {
            //Save game after stage is loaded
            On.RoR2.Stage.Start += (orig, self) =>
            {
                orig(self);

                if (FirstRunStage)
                {
                    FirstRunStage = false;
                    return;
                }

                SaveGame();
            };

            //Delete save file when run is over
            On.RoR2.GameOverController.Awake += (orig, self) =>
            {
                orig(self);

                try
                {
                    var metadata = Save?.SaveFileMeta;
                    if (metadata != null)
                    {
                        File.Delete(metadata.FilePath);
                        SavesMetadata.Remove(metadata);
                        UpdateSavesMetadata();
                        Save = null;
                    }
                }
                catch (Exception e)
                {
                    Debug.LogError(e);
                }
            };

            //Save stage RNG before it changed
            On.RoR2.Run.GenerateStageRNG += (orig, self) =>
            {
                PreStageRng = new RunRngData(Run.instance);
                orig(self);
            };
        }