|
|
|
|
@ -3,123 +3,20 @@ using Godot;
|
|
|
|
|
namespace Babushka.scripts.CSharp.Common.CharacterControls;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Tracks where an interactable object is with regards to the player.
|
|
|
|
|
/// Moves the Detector to the position in accordance with the player view to limit the player's range of actions to the ones in front of them.
|
|
|
|
|
/// </summary>
|
|
|
|
|
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;
|
|
|
|
|
[Export] private Detector _detector;
|
|
|
|
|
[Export] private float _xOffset;
|
|
|
|
|
[Export] private float _yOffset;
|
|
|
|
|
|
|
|
|
|
[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()
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets the current look direction of the player and moves the detection shape with it.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="direction"></param>
|
|
|
|
|
public void SetDirection(Vector2 direction)
|
|
|
|
|
{
|
|
|
|
|
_up.IsActive = false;
|
|
|
|
|
_down.IsActive = false;
|
|
|
|
|
_left.IsActive = true;
|
|
|
|
|
_right.IsActive = false;
|
|
|
|
|
_detector.Position = new Vector2(direction.X * _xOffset, direction.Y * _yOffset);
|
|
|
|
|
}
|
|
|
|
|
}
|