Reworked existing save system for user data: Made path steam-compatible, added Versioning and try/catch to save

pull/32/head
kziolkowski 2 months ago
parent ce29711614
commit 4ed6f4e7d9

@ -9,6 +9,15 @@ namespace Babushka.scripts.CSharp.Common.Savegame;
[Serializable]
public class SaveData
{
// for future use in case the structure changes.
public const int VERSION = 1;
public int version { get; set; } = VERSION;
public bool IsVersionValid()
{
return VERSION == version;
}
public string SceneName;
public string Id;
public string JsonPayload;

@ -7,12 +7,15 @@ namespace Babushka.scripts.CSharp.Common.Savegame;
/// </summary>
public partial class SaveGameManager : Node
{
public static string USER_DATA_FILE_PATH = "user://save_data/userData.json";
public static SaveGameManager? Instance { get; private set; } = null!;
public override void _EnterTree()
{
Instance = this;
USER_DATA_FILE_PATH = ProjectSettings.GlobalizePath(USER_DATA_FILE_PATH);
SavegameService.SavePath = USER_DATA_FILE_PATH;
SavegameService.Load();
}

@ -9,10 +9,11 @@ namespace Babushka.scripts.CSharp.Common.Savegame;
/// Handles the saving and loading of game states.
/// Holds the central SaveData object that serves as a temporary SaveFile.
/// Automatically writes to disk on every scene change.
/// Uses the Godot Json Serializer, which may implicitly convert integers to floats, so be careful when extending!
/// </summary>
public static class SavegameService
{
public static readonly string SavePath = "user://babushka_savegame.json";
public static string SavePath = "";
public static Dictionary<string, string> SaveDatas = new ();
@ -72,8 +73,20 @@ public static class SavegameService
public static void Save()
{
string json = Json.Stringify(SaveDatas, indent: "\t");
using var file = FileAccess.Open(SavePath, FileAccess.ModeFlags.Write);
file.StoreString(json);
GD.Print(SavePath);
// create cloud directory
System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(SavePath) ?? "");
try
{
using var file = FileAccess.Open(SavePath, FileAccess.ModeFlags.Write);
file.StoreString(json);
}
catch (Exception e)
{
GD.Print(e.Message);
}
}
/// <summary>
@ -83,8 +96,15 @@ public static class SavegameService
{
try
{
if (!System.IO.File.Exists(SavePath))
{
SaveDatas = new();
return;
}
string saveDataJson = FileAccess.GetFileAsString(SavePath);
SaveDatas = Json.ParseString(saveDataJson).AsGodotDictionary<string, string>();
}
catch(Exception e)
{

Loading…
Cancel
Save