diff --git a/scripts/CSharp/Common/CharacterControls/InteractionArea2D.cs b/scripts/CSharp/Common/CharacterControls/InteractionArea2D.cs index 08aab4d..fc3769a 100644 --- a/scripts/CSharp/Common/CharacterControls/InteractionArea2D.cs +++ b/scripts/CSharp/Common/CharacterControls/InteractionArea2D.cs @@ -1,12 +1,20 @@ using System.Linq; +using Babushka.scripts.CSharp.Common.Savegame; using Babushka.scripts.CSharp.Common.Services; +using Babushka.scripts.CSharp.Low_Code.Variables; using Godot; +using Godot.Collections; 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 Label _label; [Export] private bool _active = true; @@ -17,6 +25,7 @@ public partial class InteractionArea2D : Node2D [Export] private int _id = -1; // TODO: remove private Material[] _backupMaterials; + private int _interactionCounter; [Signal] public delegate void InteractedToolEventHandler(int id); // TODO: remove @@ -106,6 +115,7 @@ public partial class InteractionArea2D : Node2D EmitSignal(SignalName.InteractedTool, _id); EmitSignal(SignalName.Interacted); + _interactionCounter++; } } @@ -120,4 +130,26 @@ public partial class InteractionArea2D : Node2D _active = !_active; _label.Hide(); } + + #region SAVE AND LOAD + + public void UpdateSaveData() + { + var payloadData = new Dictionary + { + { "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 save = SavegameService.GetSaveData(sceneName, id); + } + + #endregion } \ No newline at end of file diff --git a/scripts/CSharp/Common/Farming/FieldBehaviour2D.cs b/scripts/CSharp/Common/Farming/FieldBehaviour2D.cs index 7abbb81..ad422da 100644 --- a/scripts/CSharp/Common/Farming/FieldBehaviour2D.cs +++ b/scripts/CSharp/Common/Farming/FieldBehaviour2D.cs @@ -185,10 +185,6 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable public void UpdateSaveData() { - var saveData = new SaveData(); - - saveData.SceneName = _sceneKeyProvider.Payload.AsString(); - saveData.Id = SaveId + _fieldIndex.Payload.AsString(); var payloadData = new Dictionary { { "field_state", (int)FieldState } @@ -206,20 +202,15 @@ public partial class FieldBehaviour2D : Sprite2D, ISaveable ); } - saveData.JsonPayload = Json.Stringify(payloadData, indent: "\t"); - - SavegameService.AppendSave(saveData); + SavegameService.AppendDataToSave(_sceneKeyProvider.Payload.AsString(), SaveId + _fieldIndex.Payload.AsString(), payloadData); } public void LoadFromSaveData() { var sceneName = _sceneKeyProvider.Payload.AsString(); var id = SaveId + _fieldIndex.Payload.AsString(); - string jsonPayload = SavegameService.GetSaveData(sceneName, id); - if (string.IsNullOrEmpty(jsonPayload)) - return; - Dictionary save = Json.ParseString(jsonPayload).AsGodotDictionary(); + Dictionary save = SavegameService.GetSaveData(sceneName, id); if (save.Count > 0) { diff --git a/scripts/CSharp/Common/Inventory/InventoryInstance.cs b/scripts/CSharp/Common/Inventory/InventoryInstance.cs index 61f45fe..8d235da 100644 --- a/scripts/CSharp/Common/Inventory/InventoryInstance.cs +++ b/scripts/CSharp/Common/Inventory/InventoryInstance.cs @@ -178,10 +178,6 @@ public partial class InventoryInstance : Node, ISaveable public void UpdateSaveData() { - var saveData = new SaveData(); - - saveData.SceneName = SCENE_NAME; - saveData.Id = ID; var payloadData = new Godot.Collections.Dictionary(); 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.AppendSave(saveData); + SavegameService.AppendDataToSave(SCENE_NAME, ID, payloadData); } public void LoadFromSaveData() { var sceneName = SCENE_NAME; var id = ID; - string jsonPayload = SavegameService.GetSaveData(sceneName, id); - if (string.IsNullOrEmpty(jsonPayload)) - return; - Godot.Collections.Dictionary save = Json.ParseString(jsonPayload).AsGodotDictionary(); + Godot.Collections.Dictionary save = SavegameService.GetSaveData(sceneName, id); if (save.Count > 0) { diff --git a/scripts/CSharp/Common/Savegame/ISaveable.cs.uid b/scripts/CSharp/Common/Savegame/ISaveable.cs.uid new file mode 100644 index 0000000..cccea3d --- /dev/null +++ b/scripts/CSharp/Common/Savegame/ISaveable.cs.uid @@ -0,0 +1 @@ +uid://bqapxuprxuj20 diff --git a/scripts/CSharp/Common/Savegame/SavegameService.cs b/scripts/CSharp/Common/Savegame/SavegameService.cs index b733da7..c8504e5 100644 --- a/scripts/CSharp/Common/Savegame/SavegameService.cs +++ b/scripts/CSharp/Common/Savegame/SavegameService.cs @@ -18,13 +18,23 @@ public static class SavegameService public static Dictionary SaveDatas = new (); public static bool _loaded = false; - + + + public static void AppendDataToSave(string scenename, string id, Dictionary payload) + { + var saveData = new SaveData(); + + saveData.SceneName = scenename; + saveData.Id = id; + saveData.JsonPayload = Json.Stringify(payload, indent: "\t"); + AppendSave(saveData); + } /// /// Adds or overwrites an entry in the SaveData dictionary. /// /// - public static void AppendSave(SaveData saveData) + private static void AppendSave(SaveData saveData) { string key = string.Concat(saveData.SceneName, "_", saveData.Id); @@ -46,21 +56,23 @@ public static class SavegameService /// /// /// - public static string GetSaveData(string sceneName, string id) + public static Dictionary GetSaveData(string sceneName, string id) { - string saveData = ""; + Dictionary saveData = new(); string key = string.Concat(sceneName, "_", id); + string saveDataString = ""; if (!_loaded) { GD.Print("SavegameService: SaveFile not loaded."); return saveData; } - + if (SaveDatas.ContainsKey(key)) { - saveData = SaveDatas[key]; + saveDataString = SaveDatas[key]; + saveData = Json.ParseString(saveDataString).AsGodotDictionary(); } return saveData;