From b002dd469aed962bcd27e1f4d9adf13d2371144b Mon Sep 17 00:00:00 2001 From: Syntriax Date: Fri, 25 Apr 2025 21:23:31 +0300 Subject: [PATCH] feat: behaviour & behaviour controller converters added --- .../BehaviourControllerConverter.cs | 76 +++++++++++++++++++ .../Converters/BehaviourConverter.cs | 73 ++++++++++++++++++ .../Converters/UniverseObjectConverter.cs | 5 +- 3 files changed, 151 insertions(+), 3 deletions(-) create mode 100644 Engine.Serialization/Converters/BehaviourControllerConverter.cs create mode 100644 Engine.Serialization/Converters/BehaviourConverter.cs diff --git a/Engine.Serialization/Converters/BehaviourControllerConverter.cs b/Engine.Serialization/Converters/BehaviourControllerConverter.cs new file mode 100644 index 0000000..4ac0f45 --- /dev/null +++ b/Engine.Serialization/Converters/BehaviourControllerConverter.cs @@ -0,0 +1,76 @@ +using Syntriax.Engine.Core; + +using YamlDotNet.Core; +using YamlDotNet.Core.Events; +using YamlDotNet.Serialization; + +namespace Syntriax.Engine.Serialization; + +public class BehaviourControllerConverter : IEngineTypeYamlConverter +{ + private const string SERIALIZED_SCALAR_NAME = "Properties"; + private const string BEHAVIOURS_SCALAR_NAME = "Behaviours"; + + public bool Accepts(Type type) => typeof(IBehaviourController).IsAssignableFrom(type); + + public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + { + string id; + + IBehaviourController behaviourController; + IStateEnable stateEnable; + List behaviours; + + parser.Consume(); + + if (parser.Consume().Value.CompareTo(nameof(IBehaviourController.Id)) != 0) + throw new(); + id = parser.Consume().Value; + + if (parser.Consume().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0) + throw new(); + SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!; + behaviourController = (IBehaviourController)instanceSerializedClass.CreateInstance(); + + if (parser.Consume().Value.CompareTo(nameof(IBehaviourController.StateEnable)) != 0) + throw new(); + stateEnable = (IStateEnable)rootDeserializer(typeof(IStateEnable))!; + + if (parser.Consume().Value.CompareTo(BEHAVIOURS_SCALAR_NAME) != 0) + throw new(); + behaviours = (List)rootDeserializer(typeof(List))!; + + parser.Consume(); + + behaviourController.Id = id; + + stateEnable.Assign(behaviourController); + behaviourController.Assign(stateEnable); + + foreach (IBehaviour behaviour in behaviours) + behaviourController.AddBehaviour(behaviour); + + return behaviourController; + } + + public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + { + IBehaviourController behaviourController = (IBehaviourController)value!; + + emitter.Emit(new MappingStart()); + + emitter.Emit(new Scalar(nameof(IBehaviourController.Id))); + emitter.Emit(new Scalar(behaviourController.Id)); + + emitter.Emit(new Scalar(SERIALIZED_SCALAR_NAME)); + serializer(new SerializedClass(behaviourController)); + + emitter.Emit(new Scalar(nameof(IBehaviourController.StateEnable))); + serializer(behaviourController.StateEnable); + + emitter.Emit(new Scalar(BEHAVIOURS_SCALAR_NAME)); + serializer(behaviourController.GetBehaviours()); + + emitter.Emit(new MappingEnd()); + } +} diff --git a/Engine.Serialization/Converters/BehaviourConverter.cs b/Engine.Serialization/Converters/BehaviourConverter.cs new file mode 100644 index 0000000..c600330 --- /dev/null +++ b/Engine.Serialization/Converters/BehaviourConverter.cs @@ -0,0 +1,73 @@ +using Syntriax.Engine.Core; + +using YamlDotNet.Core; +using YamlDotNet.Core.Events; +using YamlDotNet.Serialization; + +namespace Syntriax.Engine.Serialization; + +public class BehaviourConverter : IEngineTypeYamlConverter +{ + private const string SERIALIZED_SCALAR_NAME = "Properties"; + + public bool Accepts(Type type) => typeof(IBehaviour).IsAssignableFrom(type); + + public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + { + string id; + int priority; + + IBehaviour behaviour; + IStateEnable stateEnable; + + parser.Consume(); + + if (parser.Consume().Value.CompareTo(nameof(IBehaviour.Id)) != 0) + throw new(); + id = parser.Consume().Value; + + if (parser.Consume().Value.CompareTo(nameof(IBehaviour.Priority)) != 0) + throw new(); + priority = int.Parse(parser.Consume().Value); + + if (parser.Consume().Value.CompareTo(SERIALIZED_SCALAR_NAME) != 0) + throw new(); + SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!; + behaviour = (IBehaviour)instanceSerializedClass.CreateInstance(); + + if (parser.Consume().Value.CompareTo(nameof(IBehaviour.StateEnable)) != 0) + throw new(); + stateEnable = (IStateEnable)rootDeserializer(typeof(IStateEnable))!; + + parser.Consume(); + + behaviour.Id = id; + behaviour.Priority = priority; + + stateEnable.Assign(behaviour); + behaviour.Assign(stateEnable); + + return behaviour; + } + + public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + { + IBehaviour behaviour = (IBehaviour)value!; + + emitter.Emit(new MappingStart()); + + emitter.Emit(new Scalar(nameof(IBehaviour.Id))); + emitter.Emit(new Scalar(behaviour.Id)); + + emitter.Emit(new Scalar(nameof(IBehaviour.Priority))); + emitter.Emit(new Scalar(behaviour.Priority.ToString())); + + emitter.Emit(new Scalar(SERIALIZED_SCALAR_NAME)); + serializer(new SerializedClass(behaviour)); + + emitter.Emit(new Scalar(nameof(IBehaviour.StateEnable))); + serializer(behaviour.StateEnable); + + emitter.Emit(new MappingEnd()); + } +} diff --git a/Engine.Serialization/Converters/UniverseObjectConverter.cs b/Engine.Serialization/Converters/UniverseObjectConverter.cs index 69b2d5f..8a5bc30 100644 --- a/Engine.Serialization/Converters/UniverseObjectConverter.cs +++ b/Engine.Serialization/Converters/UniverseObjectConverter.cs @@ -43,8 +43,7 @@ public class UniverseObjectConverter : IEngineTypeYamlConverter if (parser.Consume().Value.CompareTo(nameof(IUniverseObject.BehaviourController)) != 0) throw new(); - SerializedClass behaviourControllerSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!; - behaviourController = (IBehaviourController)behaviourControllerSerializedClass.CreateInstance(); + behaviourController = (IBehaviourController)rootDeserializer(typeof(IBehaviourController))!; if (parser.Consume().Value.CompareTo(nameof(IUniverseObject.Children)) != 0) throw new(); @@ -86,7 +85,7 @@ public class UniverseObjectConverter : IEngineTypeYamlConverter serializer(universeObject.StateEnable); emitter.Emit(new Scalar(nameof(IUniverseObject.BehaviourController))); - serializer(new SerializedClass(universeObject.BehaviourController)); + serializer(universeObject.BehaviourController); emitter.Emit(new Scalar(nameof(IUniverseObject.Children))); serializer(universeObject.Children);