using Chickensoft.Collections; using Chickensoft.Serialization.Godot; using Chickensoft.Serialization; using Godot; using System.IO.Abstractions; using System.Text.Json; using System.Text.Json.Serialization.Metadata; using Zennysoft.Game.Abstractions; namespace Zennysoft.Game.Implementation; public class SaveFileManager : ISaveFileManager { private readonly IFileSystem _fileSystem; private string _defaultSaveLocation; public const string DEFAULT_SAVE_FILE_NAME = "game.json"; public SaveFileManager(IFileSystem fileSystem) { _fileSystem = fileSystem; _defaultSaveLocation = _fileSystem.Path.Join(OS.GetUserDataDir(), DEFAULT_SAVE_FILE_NAME); GodotSerialization.Setup(); Serializer.AddConverter(new Texture2DConverter()); } public Task ReadFromFile(params IJsonTypeInfoResolver?[] resolvers) { if (!_fileSystem.File.Exists(_defaultSaveLocation)) throw new FileNotFoundException(); return ReadFromFile(_defaultSaveLocation, resolvers); } public async Task ReadFromFile(string filePath, params IJsonTypeInfoResolver?[] resolvers) { if (!_fileSystem.File.Exists(filePath)) throw new FileNotFoundException(); var json = await _fileSystem.File.ReadAllTextAsync(filePath); var resolver = new SerializableTypeResolver(); var upgradeDependencies = new Blackboard(); var jsonOptions = new JsonSerializerOptions { Converters = { new SerializableTypeConverter(upgradeDependencies) }, WriteIndented = true }; jsonOptions.TypeInfoResolver = JsonTypeInfoResolver.Combine([resolver, .. resolvers]); return JsonSerializer.Deserialize(json, jsonOptions); } public Task WriteToFile(T gameData, params IJsonTypeInfoResolver?[] resolvers) { return WriteToFile(gameData, _defaultSaveLocation, resolvers); } public async Task WriteToFile(T gameData, string filePath, params IJsonTypeInfoResolver?[] resolvers) { var resolver = new SerializableTypeResolver(); var upgradeDependencies = new Blackboard(); var jsonOptions = new JsonSerializerOptions { Converters = { new SerializableTypeConverter(upgradeDependencies) }, WriteIndented = true }; jsonOptions.TypeInfoResolver = JsonTypeInfoResolver.Combine([resolver, .. resolvers]); var json = JsonSerializer.Serialize(gameData, jsonOptions); await _fileSystem.File.WriteAllTextAsync(filePath, json); } public void DeleteSaveData() => DeleteSaveData(_defaultSaveLocation); public void DeleteSaveData(string filePath) => _fileSystem.File.Delete(filePath); }