using System; using System.IO; using KitsuneCafe.ItemSystem; using KitsuneCafe.Sys; using MessagePack; using MessagePack.Resolvers; using UnityEngine; namespace KitsuneCafe.Serialization { [MessagePackObject] public struct SaveData { [Key(0)] public Inventory Inventory; [Key(1)] public Blackboard Blackboard; public SaveData(Inventory inventory, Blackboard blackboard) { Inventory = inventory; Blackboard = blackboard; } } [CreateAssetMenu(menuName = KitsuneCafeMenu.Soap + "Data Serializer")] public partial class DataSerializer : ScriptableObject { [SerializeField] private Inventory inventory; [SerializeField] private Blackboard blackboard; private readonly Lazy options = new(() => MessagePackSerializer.DefaultOptions.WithResolver( CompositeResolver.Create( StandardResolver.Instance, ItemSystemResolver.Instance ) )); public byte[] Serialize() { return MessagePackSerializer.Serialize(new SaveData(inventory, blackboard), options.Value); } public void DeserializeOvewrite(byte[] bytes) { var data = MessagePackSerializer.Deserialize(bytes, options.Value); inventory.Load(data.Inventory); throw new NotImplementedException(); // blackboard.Load(data.Blackboard); } public SaveData Deserialize(byte[] bytes) { return MessagePackSerializer.Deserialize(bytes, options.Value); } private string GetSavePath(string path) { return Path.Combine(Application.persistentDataPath, path); } public void SaveAs(string path) { var bytes = Serialize(); File.WriteAllBytes(GetSavePath(path), bytes); } public SaveData ReadFrom(string path) { return Deserialize(File.ReadAllBytes(GetSavePath(path))); } public void OverwriteFrom(string path) { try { DeserializeOvewrite(File.ReadAllBytes(GetSavePath(path))); } catch (Exception) { } } } }