diff --git a/Zennysoft.Game.Abstractions/Save/ISaveFileManager.cs b/Zennysoft.Game.Abstractions/Save/ISaveFileManager.cs index a6651487..d193fd65 100644 --- a/Zennysoft.Game.Abstractions/Save/ISaveFileManager.cs +++ b/Zennysoft.Game.Abstractions/Save/ISaveFileManager.cs @@ -8,7 +8,7 @@ public interface ISaveFileManager public Task WriteToFile(T gameData, string filePath, params IJsonTypeInfoResolver?[] resolvers); - public Task ReadFromFile(params IJsonTypeInfoResolver?[] resolvers); + public Task ReadFromFile(params IJsonTypeInfoResolver?[] resolvers); - public Task ReadFromFile(string filePath, params IJsonTypeInfoResolver?[] resolvers); + public Task ReadFromFile(string filePath, params IJsonTypeInfoResolver?[] resolvers); } diff --git a/Zennysoft.Game.Godot.Implementation/Save/SaveFileManager.cs b/Zennysoft.Game.Godot.Implementation/Save/SaveFileManager.cs index 03ea774e..12bd0fc9 100644 --- a/Zennysoft.Game.Godot.Implementation/Save/SaveFileManager.cs +++ b/Zennysoft.Game.Godot.Implementation/Save/SaveFileManager.cs @@ -12,7 +12,6 @@ namespace Zennysoft.Game.Implementation; public class SaveFileManager : ISaveFileManager { private readonly IFileSystem _fileSystem; - private readonly JsonSerializerOptions _jsonOptions; private string _defaultSaveLocation; public const string DEFAULT_SAVE_FILE_NAME = "game.json"; @@ -23,27 +22,17 @@ public class SaveFileManager : ISaveFileManager GodotSerialization.Setup(); Serializer.AddConverter(new Texture2DConverter()); - - var upgradeDependencies = new Blackboard(); - - _jsonOptions = new JsonSerializerOptions - { - Converters = { - new SerializableTypeConverter(upgradeDependencies) - }, - WriteIndented = true - }; } - public Task ReadFromFile(params IJsonTypeInfoResolver?[] resolvers) + public Task ReadFromFile(params IJsonTypeInfoResolver?[] resolvers) { if (!_fileSystem.File.Exists(_defaultSaveLocation)) throw new FileNotFoundException(); - return ReadFromFile(_defaultSaveLocation, resolvers); + return ReadFromFile(_defaultSaveLocation, resolvers); } - public async Task ReadFromFile(string filePath, params IJsonTypeInfoResolver?[] resolvers) + public async Task ReadFromFile(string filePath, params IJsonTypeInfoResolver?[] resolvers) { if (!_fileSystem.File.Exists(filePath)) throw new FileNotFoundException(); @@ -51,8 +40,17 @@ public class SaveFileManager : ISaveFileManager var json = await _fileSystem.File.ReadAllTextAsync(filePath); var resolver = new SerializableTypeResolver(); - _jsonOptions.TypeInfoResolver = JsonTypeInfoResolver.Combine([resolver, .. resolvers]); - return JsonSerializer.Deserialize(json, _jsonOptions); + 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) @@ -63,8 +61,17 @@ public class SaveFileManager : ISaveFileManager public async Task WriteToFile(T gameData, string filePath, params IJsonTypeInfoResolver?[] resolvers) { var resolver = new SerializableTypeResolver(); - _jsonOptions.TypeInfoResolver = JsonTypeInfoResolver.Combine([resolver, .. resolvers]); - var json = JsonSerializer.Serialize(gameData, _jsonOptions); + 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); } } diff --git a/Zennysoft.Game.Ma.Implementation/Components/IHealthComponent.cs b/Zennysoft.Game.Ma.Implementation/Components/IHealthComponent.cs index fa1f2e5b..b202ad2b 100644 --- a/Zennysoft.Game.Ma.Implementation/Components/IHealthComponent.cs +++ b/Zennysoft.Game.Ma.Implementation/Components/IHealthComponent.cs @@ -1,14 +1,11 @@ using Chickensoft.Collections; -using Chickensoft.Serialization; namespace Zennysoft.Ma.Adapter; public interface IHealthComponent { - [Save("current_hp")] public IAutoProp CurrentHP { get; } - [Save("maximum_hp")] public IAutoProp MaximumHP { get; } public event Action? HealthReachedZero; diff --git a/Zennysoft.Game.Ma.Implementation/Entity/ElementalResistanceSet.cs b/Zennysoft.Game.Ma.Implementation/Entity/ElementalResistanceSet.cs index 6a076275..fa497dab 100644 --- a/Zennysoft.Game.Ma.Implementation/Entity/ElementalResistanceSet.cs +++ b/Zennysoft.Game.Ma.Implementation/Entity/ElementalResistanceSet.cs @@ -1,7 +1,10 @@ -namespace Zennysoft.Ma.Adapter.Entity +using Chickensoft.Serialization; + +namespace Zennysoft.Ma.Adapter.Entity { public record ElementalResistanceSet { + [Save("elemental_resist_set")] public Dictionary ElementalResistance { get; } public static ElementalResistanceSet None => new ElementalResistanceSet(0, 0, 0, 0, 0); diff --git a/Zennysoft.Game.Ma.Implementation/Equipment/EquipableItem.cs b/Zennysoft.Game.Ma.Implementation/Equipment/EquipableItem.cs index a97cb8d4..a4d9bf26 100644 --- a/Zennysoft.Game.Ma.Implementation/Equipment/EquipableItem.cs +++ b/Zennysoft.Game.Ma.Implementation/Equipment/EquipableItem.cs @@ -1,4 +1,5 @@ using Chickensoft.Introspection; +using Chickensoft.Serialization; using Zennysoft.Ma.Adapter.Entity; namespace Zennysoft.Ma.Adapter; @@ -6,15 +7,16 @@ namespace Zennysoft.Ma.Adapter; [Meta, Id("equipable_item")] public abstract partial class EquipableItem : InventoryItem { + [Save("bonus_attack_stats")] public virtual int BonusAttack { get; } - + [Save("bonus_defense_stats")] public virtual int BonusDefense { get; } - + [Save("bonus_hp_stats")] public virtual int BonusHP { get; } - + [Save("bonus_vt_stats")] public virtual int BonusVT { get; } - + [Save("bonus_luck_stats")] public virtual int BonusLuck { get; } - + [Save("bonus_elemental_resist_stats")] public virtual ElementalResistanceSet ElementalResistance { get; } = new ElementalResistanceSet(0, 0, 0, 0, 0); } diff --git a/Zennysoft.Game.Ma.Implementation/Item/RescuedItemDatabase.cs b/Zennysoft.Game.Ma.Implementation/Item/RescuedItemDatabase.cs index 4967ab36..17864dae 100644 --- a/Zennysoft.Game.Ma.Implementation/Item/RescuedItemDatabase.cs +++ b/Zennysoft.Game.Ma.Implementation/Item/RescuedItemDatabase.cs @@ -1,7 +1,5 @@ using Chickensoft.Introspection; using Chickensoft.Serialization; -using Zennysoft.Game.Abstractions; -using Zennysoft.Game.Implementation; namespace Zennysoft.Ma.Adapter; diff --git a/Zennysoft.Game.Ma.Implementation/JsonConverters/EnumConverters.cs b/Zennysoft.Game.Ma.Implementation/JsonConverters/EnumConverters.cs index 251f2e40..5732f1d9 100644 --- a/Zennysoft.Game.Ma.Implementation/JsonConverters/EnumConverters.cs +++ b/Zennysoft.Game.Ma.Implementation/JsonConverters/EnumConverters.cs @@ -21,25 +21,4 @@ public partial class UsableItemTagEnumContext : JsonSerializerContext; public partial class BoxItemTagEnumContext : JsonSerializerContext; [JsonSerializable(typeof(ElementType))] -public partial class ElementTypeEnumContext : JsonSerializerContext; - -[JsonSerializable(typeof(IHealthComponent))] -public partial class HealthComponentContext : JsonSerializerContext; - -[JsonSerializable(typeof(IVTComponent))] -public partial class VTComponentContext : JsonSerializerContext; - -[JsonSerializable(typeof(IAttackComponent))] -public partial class AttackComponentContext : JsonSerializerContext; - -[JsonSerializable(typeof(IDefenseComponent))] -public partial class DefenseComponentContext : JsonSerializerContext; - -[JsonSerializable(typeof(IExperiencePointsComponent))] -public partial class ExperiencePointsComponentContext : JsonSerializerContext; - -[JsonSerializable(typeof(ILuckComponent))] -public partial class LuckComponentContext : JsonSerializerContext; - -[JsonSerializable(typeof(IEquipmentComponent))] -public partial class EquipmentComponentContext : JsonSerializerContext; \ No newline at end of file +public partial class ElementTypeEnumContext : JsonSerializerContext; \ No newline at end of file diff --git a/Zennysoft.Game.Ma.Implementation/Quest/QuestData.cs b/Zennysoft.Game.Ma.Implementation/Quest/QuestData.cs new file mode 100644 index 00000000..b139076b --- /dev/null +++ b/Zennysoft.Game.Ma.Implementation/Quest/QuestData.cs @@ -0,0 +1,11 @@ +using Chickensoft.Introspection; +using Chickensoft.Serialization; + +namespace Zennysoft.Ma.Adapter; + +[Meta, Id("quest_data")] +public partial record QuestData +{ + [Save("quest_data_1")] + public bool QuestMarker1 { get; set; } = false; +} diff --git a/Zennysoft.Game.Ma.Implementation/Save/MaSaveFileManager.cs b/Zennysoft.Game.Ma.Implementation/Save/MaSaveFileManager.cs index df7af0d8..71e33a25 100644 --- a/Zennysoft.Game.Ma.Implementation/Save/MaSaveFileManager.cs +++ b/Zennysoft.Game.Ma.Implementation/Save/MaSaveFileManager.cs @@ -8,7 +8,7 @@ public interface IMaSaveFileManager { Task Save(T gameData); - Task Load(); + Task Load(); } public sealed class MaSaveFileManager : IMaSaveFileManager @@ -19,7 +19,7 @@ public sealed class MaSaveFileManager : IMaSaveFileManager public MaSaveFileManager(ISaveFileManager saveFileManager) { _saveFileManager = saveFileManager; - _converters = [HealthComponentContext.Default, WeaponTagEnumContext.Default, ItemTagEnumContext.Default, ElementTypeEnumContext.Default, AccessoryTagEnumContext.Default, ThrowableItemTagEnumContext.Default, UsableItemTagEnumContext.Default, BoxItemTagEnumContext.Default]; + _converters = [WeaponTagEnumContext.Default, ItemTagEnumContext.Default, ElementTypeEnumContext.Default, AccessoryTagEnumContext.Default, ThrowableItemTagEnumContext.Default, UsableItemTagEnumContext.Default, BoxItemTagEnumContext.Default]; } public async Task Save(T gameData) @@ -27,5 +27,5 @@ public sealed class MaSaveFileManager : IMaSaveFileManager await _saveFileManager.WriteToFile(gameData, [.. _converters]); } - public async Task Load() => await _saveFileManager.ReadFromFile([.. _converters]); + public async Task Load() => await _saveFileManager.ReadFromFile([.. _converters]); } diff --git a/Zennysoft.Game.Ma/addons/dungeon_floor_layout/DungeonFloorLayout.cs b/Zennysoft.Game.Ma/addons/dungeon_floor_layout/DungeonFloorLayout.cs deleted file mode 100644 index 32727212..00000000 --- a/Zennysoft.Game.Ma/addons/dungeon_floor_layout/DungeonFloorLayout.cs +++ /dev/null @@ -1,68 +0,0 @@ -using Godot; -using Godot.Collections; -using System.Linq; -using Zennysoft.Game.Ma; - -[Tool] -public partial class DungeonFloorLayout : LayoutType -{ - [Export] - public DungeonFloorSetType SetType - { - get => _setType; - set - { - _setType = value; - LayoutWithSpawnRate = []; - NotifyPropertyListChanged(); - } - } - - [ExportToolButton("Populate Map Data")] - public Callable PopulateMapList => Callable.From(() => PopulateDictionary(SetType)); - - [Export] - public Dictionary LayoutWithSpawnRate; - - [Export] - public Dictionary EnemySpawnRates; - - private string _floorPath = "res://src/map/dungeon/floors/"; - private DungeonFloorSetType _setType; - - private void PopulateDictionary(DungeonFloorSetType setType) - { - var floorPath = _floorPath; - var floorType = string.Empty; - if (setType == DungeonFloorSetType.SetA) - floorType = "SetAFloors"; - else if (setType == DungeonFloorSetType.SetB) - floorType = "SetBFloors"; - - var pathToScenes = $"{floorPath}/{floorType}"; - - var files = DirAccess.GetFilesAt(pathToScenes).Where(x => x.EndsWith(".tscn")); - - var newMaps = new Dictionary(); - foreach (var file in files) - { - if (LayoutWithSpawnRate.ContainsKey($"{floorType}/{file}")) - { - var spawnRate = LayoutWithSpawnRate.TryGetValue($"{floorType}/{file}", out var currentSpawnRate); - newMaps.Add($"{floorType}/{file}", currentSpawnRate); - } - else - newMaps.Add($"{floorType}/{file}", 1.0f); - } - - LayoutWithSpawnRate = newMaps; - - NotifyPropertyListChanged(); - } - - public enum DungeonFloorSetType - { - SetA, - SetB - } -} diff --git a/Zennysoft.Game.Ma/addons/dungeon_floor_layout/DungeonFloorLayout.cs.uid b/Zennysoft.Game.Ma/addons/dungeon_floor_layout/DungeonFloorLayout.cs.uid deleted file mode 100644 index d70e47ef..00000000 --- a/Zennysoft.Game.Ma/addons/dungeon_floor_layout/DungeonFloorLayout.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ci7o3nn4mdo8o diff --git a/Zennysoft.Game.Ma/addons/dungeon_floor_layout/DungeonFloorLayoutNode.cs b/Zennysoft.Game.Ma/addons/dungeon_floor_layout/DungeonFloorLayoutNode.cs deleted file mode 100644 index 82849e80..00000000 --- a/Zennysoft.Game.Ma/addons/dungeon_floor_layout/DungeonFloorLayoutNode.cs +++ /dev/null @@ -1,22 +0,0 @@ -#if TOOLS -using Godot; -using Zennysoft.Game.Ma; - -[Tool] -public partial class DungeonFloorLayoutNode : EditorPlugin -{ - public override void _EnterTree() - { - // Initialization of the plugin goes here. - var script = GD.Load