using System; using System.Collections.Generic; using System.Linq; using Syntriax.Engine.Core; using Syntriax.Engine.Core.Serialization; using YamlDotNet.Core; using YamlDotNet.Core.Events; using YamlDotNet.Serialization; namespace Syntriax.Engine.Serializers.Yaml; public class BehaviourControllerConverter : EngineTypeYamlSerializerBase { private const string BEHAVIOURS_SCALAR_NAME = "Behaviours"; public override IBehaviourController? Read(IParser parser, Type type, ObjectDeserializer rootDeserializer) { bool isTrackingController = ProgressionTracker.Progression.ApproximatelyEquals(0f); ProgressionTracker.Set(isTrackingController ? .25f : ProgressionTracker.Progression, $"Reading behaviour controller"); 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))!; ProgressionTracker.Set(isTrackingController ? .5f : ProgressionTracker.Progression, $"Creating {instanceSerializedClass.Type}"); behaviourController = (IBehaviourController)instanceSerializedClass.CreateInstance(EntityRegistry); string value = parser.Consume().Value; if (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); ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Created {instanceSerializedClass.Type}"); return behaviourController; } public override void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { IBehaviourController behaviourController = (IBehaviourController)value!; bool isTrackingController = ProgressionTracker.Progression.ApproximatelyEquals(0f); ProgressionTracker.Set(isTrackingController ? .25f : ProgressionTracker.Progression, $"Serializing behaviour controller"); 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().Where(b => !b.GetType().HasAttribute())); ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Serialized behaviour controller"); emitter.Emit(new MappingEnd()); } }