using Godot; namespace Babushka.scripts.CSharp.Common.CharacterControls; /// /// Tracks where an interactable object is with regards to the player. /// public partial class DetectionCross : Node2D { [Export] private Detector _left; [Export] private Detector _right; [Export] private Detector _up; [Export] private Detector _down; [Export] private bool _active = true; [Signal] public delegate void InteractableDetectedLeftEventHandler(bool flag); [Signal] public delegate void InteractableDetectedRightEventHandler(bool flag); [Signal] public delegate void InteractableDetectedUpEventHandler(bool flag); [Signal] public delegate void InteractableDetectedDownEventHandler(bool flag); private bool _leftOccupied; private bool _rightOccupied; private bool _upOccupied; private bool _downOccupied; public bool LeftOccupied { get { return _leftOccupied; } private set { EmitSignal(SignalName.InteractableDetectedLeft, value); _leftOccupied = value; } } public bool RightOccupied { get { return _rightOccupied; } private set { EmitSignal(SignalName.InteractableDetectedRight, value); _rightOccupied = value; } } public bool UpOccupied { get { return _upOccupied; } private set { EmitSignal(SignalName.InteractableDetectedUp, value); _upOccupied = value; } } public bool DownOccupied { get { return _downOccupied; } private set { EmitSignal(SignalName.InteractableDetectedDown, value); _downOccupied = value; } } public bool IsActive { get => _active; set => _active = value; } public override void _Ready() { _right.InteractableEntered += () => RightOccupied = true; _right.InteractableExited += () => RightOccupied = false; _left.InteractableEntered += () => LeftOccupied = true; _left.InteractableExited += () => LeftOccupied = false; _up.InteractableEntered += () => UpOccupied = true; _up.InteractableExited += () => UpOccupied = false; _down.InteractableEntered += () => DownOccupied = true; _down.InteractableExited += () => DownOccupied = false; } public void ActivateUp() { _up.IsActive = true; _down.IsActive = false; _left.IsActive = false; _right.IsActive = false; } public void ActivateDown() { _up.IsActive = false; _down.IsActive = true; _left.IsActive = false; _right.IsActive = false; } public void ActivateRight() { _up.IsActive = false; _down.IsActive = false; _left.IsActive = false; _right.IsActive = true; } public void ActivateLeft() { _up.IsActive = false; _down.IsActive = false; _left.IsActive = true; _right.IsActive = false; } }