Savesystem rework

pull/32/head
kziolkowski 2 months ago
parent 4bbaab1a2a
commit fda2b95b38

@ -1,12 +1,20 @@
using System.Linq; using System.Linq;
using Babushka.scripts.CSharp.Common.Savegame;
using Babushka.scripts.CSharp.Common.Services; using Babushka.scripts.CSharp.Common.Services;
using Babushka.scripts.CSharp.Low_Code.Variables;
using Godot; using Godot;
using Godot.Collections;
namespace Babushka.scripts.CSharp.Common.CharacterControls; namespace Babushka.scripts.CSharp.Common.CharacterControls;
public partial class InteractionArea2D : Node2D public partial class InteractionArea2D : Node2D, ISaveable
{ {
[ExportGroup("Persistence")]
[Export] public string SaveId = "";
[Export] private VariableNode _sceneID;
[Export] public VariableResource _sceneKeyProvider;
[ExportGroup("Settings")]
[Export] private Area2D _area; [Export] private Area2D _area;
[Export] private Label _label; [Export] private Label _label;
[Export] private bool _active = true; [Export] private bool _active = true;
@ -17,6 +25,7 @@ public partial class InteractionArea2D : Node2D
[Export] private int _id = -1; // TODO: remove [Export] private int _id = -1; // TODO: remove
private Material[] _backupMaterials; private Material[] _backupMaterials;
private int _interactionCounter;
[Signal] public delegate void InteractedToolEventHandler(int id); // TODO: remove [Signal] public delegate void InteractedToolEventHandler(int id); // TODO: remove
@ -106,6 +115,7 @@ public partial class InteractionArea2D : Node2D
EmitSignal(SignalName.InteractedTool, _id); EmitSignal(SignalName.InteractedTool, _id);
EmitSignal(SignalName.Interacted); EmitSignal(SignalName.Interacted);
_interactionCounter++;
} }
} }
@ -120,4 +130,26 @@ public partial class InteractionArea2D : Node2D
_active = !_active; _active = !_active;
_label.Hide(); _label.Hide();
} }
#region SAVE AND LOAD
public void UpdateSaveData()
{
var payloadData = new Dictionary<string, Variant>
{
{ "interaction counter", _interactionCounter }
};
SavegameService.AppendDataToSave(_sceneKeyProvider.Payload.AsString(), SaveId + _sceneID.Payload.AsString(), payloadData);
}
public void LoadFromSaveData()
{
var sceneName = _sceneKeyProvider.Payload.AsString();
var id = SaveId + _sceneID.Payload.AsString();
Dictionary<string, Variant> save = SavegameService.GetSaveData(sceneName, id);
}
#endregion
} }

@ -185,10 +185,6 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable
public void UpdateSaveData() public void UpdateSaveData()
{ {
var saveData = new SaveData();
saveData.SceneName = _sceneKeyProvider.Payload.AsString();
saveData.Id = SaveId + _fieldIndex.Payload.AsString();
var payloadData = new Dictionary<string, Variant> var payloadData = new Dictionary<string, Variant>
{ {
{ "field_state", (int)FieldState } { "field_state", (int)FieldState }
@ -206,20 +202,15 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable
); );
} }
saveData.JsonPayload = Json.Stringify(payloadData, indent: "\t"); SavegameService.AppendDataToSave(_sceneKeyProvider.Payload.AsString(), SaveId + _fieldIndex.Payload.AsString(), payloadData);
SavegameService.AppendSave(saveData);
} }
public void LoadFromSaveData() public void LoadFromSaveData()
{ {
var sceneName = _sceneKeyProvider.Payload.AsString(); var sceneName = _sceneKeyProvider.Payload.AsString();
var id = SaveId + _fieldIndex.Payload.AsString(); var id = SaveId + _fieldIndex.Payload.AsString();
string jsonPayload = SavegameService.GetSaveData(sceneName, id);
if (string.IsNullOrEmpty(jsonPayload))
return;
Dictionary<string, Variant> save = Json.ParseString(jsonPayload).AsGodotDictionary<string, Variant>(); Dictionary<string, Variant> save = SavegameService.GetSaveData(sceneName, id);
if (save.Count > 0) if (save.Count > 0)
{ {

@ -178,10 +178,6 @@ public partial class InventoryInstance : Node, ISaveable
public void UpdateSaveData() public void UpdateSaveData()
{ {
var saveData = new SaveData();
saveData.SceneName = SCENE_NAME;
saveData.Id = ID;
var payloadData = new Godot.Collections.Dictionary<string, Variant>(); var payloadData = new Godot.Collections.Dictionary<string, Variant>();
for (int i = 0; i < _slots.Count; i++) for (int i = 0; i < _slots.Count; i++)
@ -196,20 +192,15 @@ public partial class InventoryInstance : Node, ISaveable
} }
} }
saveData.JsonPayload = Json.Stringify(payloadData, indent: "\t"); SavegameService.AppendDataToSave(SCENE_NAME, ID, payloadData);
SavegameService.AppendSave(saveData);
} }
public void LoadFromSaveData() public void LoadFromSaveData()
{ {
var sceneName = SCENE_NAME; var sceneName = SCENE_NAME;
var id = ID; var id = ID;
string jsonPayload = SavegameService.GetSaveData(sceneName, id);
if (string.IsNullOrEmpty(jsonPayload))
return;
Godot.Collections.Dictionary<string, Variant> save = Json.ParseString(jsonPayload).AsGodotDictionary<string, Variant>(); Godot.Collections.Dictionary<string, Variant> save = SavegameService.GetSaveData(sceneName, id);
if (save.Count > 0) if (save.Count > 0)
{ {

@ -18,13 +18,23 @@ public static class SavegameService
public static Dictionary<string, string> SaveDatas = new (); public static Dictionary<string, string> SaveDatas = new ();
public static bool _loaded = false; public static bool _loaded = false;
public static void AppendDataToSave(string scenename, string id, Dictionary<string, Variant> payload)
{
var saveData = new SaveData();
saveData.SceneName = scenename;
saveData.Id = id;
saveData.JsonPayload = Json.Stringify(payload, indent: "\t");
AppendSave(saveData);
}
/// <summary> /// <summary>
/// Adds or overwrites an entry in the SaveData dictionary. /// Adds or overwrites an entry in the SaveData dictionary.
/// </summary> /// </summary>
/// <param name="saveData"></param> /// <param name="saveData"></param>
public static void AppendSave(SaveData saveData) private static void AppendSave(SaveData saveData)
{ {
string key = string.Concat(saveData.SceneName, "_", saveData.Id); string key = string.Concat(saveData.SceneName, "_", saveData.Id);
@ -46,21 +56,23 @@ public static class SavegameService
/// <param name="sceneName"></param> /// <param name="sceneName"></param>
/// <param name="id"></param> /// <param name="id"></param>
/// <returns></returns> /// <returns></returns>
public static string GetSaveData(string sceneName, string id) public static Dictionary<string, Variant> GetSaveData(string sceneName, string id)
{ {
string saveData = ""; Dictionary<string, Variant> saveData = new();
string key = string.Concat(sceneName, "_", id); string key = string.Concat(sceneName, "_", id);
string saveDataString = "";
if (!_loaded) if (!_loaded)
{ {
GD.Print("SavegameService: SaveFile not loaded."); GD.Print("SavegameService: SaveFile not loaded.");
return saveData; return saveData;
} }
if (SaveDatas.ContainsKey(key)) if (SaveDatas.ContainsKey(key))
{ {
saveData = SaveDatas[key]; saveDataString = SaveDatas[key];
saveData = Json.ParseString(saveDataString).AsGodotDictionary<string, Variant>();
} }
return saveData; return saveData;

Loading…
Cancel
Save