using System.Collections.Generic; using System.Linq; using Cirno.Scripts.Components.Actors; using Godot; public abstract partial class MovementHandler : ActorModule { protected Actor _parent; public abstract Vector2 MovementDirection { get; set; } public abstract Vector2 FacingDirection { get; set; } protected readonly List _inputProviders = new(); public override void Init(Actor parent) { _parent = parent; var children = GetChildren(); foreach (var child in children) { if (child is InputProvider inputProvider) { _inputProviders.Add(inputProvider); } } } public virtual Vector2 AggregateInputProviders() { return _inputProviders.Aggregate(Vector2.Zero, (current, inputProvider) => current + inputProvider.GetMovementInput()); } public virtual Vector2 GetAimingDirection() { return _inputProviders.Aggregate(Vector2.Zero, (current, inputProvider) => current + inputProvider.GetAimInput()); } public virtual bool GetStrafing() { return _inputProviders.Aggregate(false, (current, inputProvider) => current && inputProvider.GetStrafing()); } }