canto/Assets/Scripts/Serialization/DataSerializer.cs
2025-10-02 15:28:03 -04:00

90 lines
2 KiB
C#

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<MessagePackSerializerOptions> 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<SaveData>(bytes, options.Value);
inventory.Load(data.Inventory);
throw new NotImplementedException();
// blackboard.Load(data.Blackboard);
}
public SaveData Deserialize(byte[] bytes)
{
return MessagePackSerializer.Deserialize<SaveData>(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)
{
}
}
}
}