diff --git a/scripts/CSharp/Common/Inventory/InventoryInstance.cs b/scripts/CSharp/Common/Inventory/InventoryInstance.cs index a548af1..b0014b8 100644 --- a/scripts/CSharp/Common/Inventory/InventoryInstance.cs +++ b/scripts/CSharp/Common/Inventory/InventoryInstance.cs @@ -4,10 +4,12 @@ using Godot; using System.Collections.Generic; using System.Linq; using Babushka.scripts.CSharp.Common.Savegame; +using Babushka.scripts.CSharp.GameEntity.LoadSave; +using Newtonsoft.Json.Linq; namespace Babushka.scripts.CSharp.Common.Inventory; -public partial class InventoryInstance +public partial class InventoryInstance : IJsonSerializable { private readonly List _slots; public IReadOnlyList Slots => _slots; @@ -138,7 +140,7 @@ public partial class InventoryInstance if (hasItemsCount < items.amount) return InventoryActionResult.SourceDoesNotExist; - var amountToRemove = items.amount; + var amountToRemove = items.amount; foreach (var s in _slots) { if (s.IsEmpty() || s.itemInstance!.blueprint != items.blueprint) @@ -159,7 +161,7 @@ public partial class InventoryInstance if (amountToRemove == 0) break; } - + InventoryContentsChanged?.Invoke(); return InventoryActionResult.Success; } @@ -193,4 +195,27 @@ public partial class InventoryInstance { return items.All(HasItems); } + + public void LoadFromJson(JObject json) + { + var itemsArray = (JArray?)json["items"]; + if (itemsArray == null) return; + + foreach (var (itemToken, slot) in itemsArray.Zip(_slots)) + { + var itemObj = (JObject?)itemToken; + if (itemObj == null) continue; + slot.LoadFromJson(itemObj); + } + + InventoryContentsChanged?.Invoke(); + } + + public JObject SaveToJson() + { + return new JObject + { + ["items"] = new JArray(_slots.Select(s => s.SaveToJson())) + }; + } } \ No newline at end of file diff --git a/scripts/CSharp/Common/Inventory/InventorySlot.cs b/scripts/CSharp/Common/Inventory/InventorySlot.cs index fec8f36..90e6537 100644 --- a/scripts/CSharp/Common/Inventory/InventorySlot.cs +++ b/scripts/CSharp/Common/Inventory/InventorySlot.cs @@ -1,11 +1,14 @@ #nullable enable +using Babushka.scripts.CSharp.GameEntity.LoadSave; +using Newtonsoft.Json.Linq; + namespace Babushka.scripts.CSharp.Common.Inventory; /// /// Represents a virtual object wrapper for an item instance. /// Can return the containing item or null. /// -public class InventorySlot +public class InventorySlot: IJsonSerializable { /// /// The inventory item instance that may or may not be bound to this slot. @@ -20,5 +23,27 @@ public class InventorySlot { return itemInstance == null; } + + public void LoadFromJson(JObject json) + { + var itemJson = json.Value("item"); + if (itemJson != null) + { + itemInstance = new ItemInstance(); + itemInstance.LoadFromJson(itemJson); + } + else + { + itemInstance = null; + } + } + + public JObject SaveToJson() + { + return new JObject() + { + ["item"] = itemInstance?.SaveToJson() + }; + } } diff --git a/scripts/CSharp/Common/Inventory/ItemInstance.cs b/scripts/CSharp/Common/Inventory/ItemInstance.cs index 6dd2ff7..b83d597 100644 --- a/scripts/CSharp/Common/Inventory/ItemInstance.cs +++ b/scripts/CSharp/Common/Inventory/ItemInstance.cs @@ -9,7 +9,7 @@ namespace Babushka.scripts.CSharp.Common.Inventory; [GlobalClass] public partial class ItemInstance : Resource, IJsonSerializable { - [Export] public required ItemResource blueprint; + [Export] public ItemResource blueprint; [Export] public int amount = 1; public ItemInstance Clone() diff --git a/scripts/CSharp/GameEntity/Entities/VesnaEntity.cs b/scripts/CSharp/GameEntity/Entities/VesnaEntity.cs index 0772287..1f219e5 100644 --- a/scripts/CSharp/GameEntity/Entities/VesnaEntity.cs +++ b/scripts/CSharp/GameEntity/Entities/VesnaEntity.cs @@ -3,6 +3,7 @@ using Babushka.scripts.CSharp.Common.Farming; using Babushka.scripts.CSharp.Common.Inventory; using Babushka.scripts.CSharp.GameEntity.Management; using Godot; +using Newtonsoft.Json.Linq; namespace Babushka.scripts.CSharp.GameEntity.Entities; @@ -33,4 +34,18 @@ public class VesnaEntity : PositionalEntity node.player2d.Initialize(this); parent.AddChild(node); } + + public override void SaveEntity(JObject json) + { + base.SaveEntity(json); + json["slot"] = CurrentSelectedSlotIndex; + json["inventory"] = inventory.SaveToJson(); + } + + public override void LoadEntity(JObject json) + { + base.LoadEntity(json); + CurrentSelectedSlotIndex = json.Value("slot"); + inventory.LoadFromJson(json.Value("inventory")!); + } } \ No newline at end of file