🚧 WIP first setup completed (still buggy!)

This commit is contained in:
2025-10-22 19:30:33 +02:00
parent b1335d4b00
commit 0e55394699
12 changed files with 272 additions and 5 deletions
@@ -14,6 +14,11 @@ public partial class VesnaAnimations : Node
private string _toolString;
private int _toolID = -1; // -1 means no tool.
private Vector2 _lastDirection = Vector2.Zero;
[Signal] public delegate void LookingRightEventHandler();
[Signal] public delegate void LookingLeftEventHandler();
[Signal] public delegate void LookingUpEventHandler();
[Signal] public delegate void LookingDownEventHandler();
public override void _Ready()
{
@@ -44,6 +49,7 @@ public partial class VesnaAnimations : Node
_sprite.Animation = "back walking" + _toolString;
anyActionPressed = true;
_lastDirection = Vector2.Up;
EmitSignal(SignalName.LookingUp);
walkingAnimationPicked = true;
}
@@ -52,6 +58,7 @@ public partial class VesnaAnimations : Node
_sprite.Animation = "front walking" + _toolString;
anyActionPressed = true;
_lastDirection = Vector2.Down;
EmitSignal(SignalName.LookingDown);
walkingAnimationPicked = true;
}
@@ -61,6 +68,7 @@ public partial class VesnaAnimations : Node
_sprite.Animation = "side walking" + _toolString;
anyActionPressed = true;
_lastDirection = Vector2.Right;
EmitSignal(SignalName.LookingRight);
walkingAnimationPicked = true;
}
@@ -70,6 +78,7 @@ public partial class VesnaAnimations : Node
_sprite.Animation = "side walking" + _toolString;
anyActionPressed = true;
_lastDirection = Vector2.Left;
EmitSignal(SignalName.LookingLeft);
walkingAnimationPicked = true;
}
@@ -0,0 +1,14 @@
using Godot;
namespace Babushka.scripts.CSharp.Common.CharacterControls;
public partial class DetectableInteractionArea : Area2D
{
[Export] private InteractionArea2D _interactionArea2D;
public void ActivateInteractionArea(bool activate)
{
_interactionArea2D.IsActive = activate;
}
}
@@ -0,0 +1 @@
uid://cp2q4k62sjo6h
@@ -0,0 +1,125 @@
using Godot;
namespace Babushka.scripts.CSharp.Common.CharacterControls;
/// <summary>
/// Tracks where an interactable object is with regards to the player.
/// </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;
[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;
}
}
@@ -0,0 +1 @@
uid://ccc6m6c5khd2x
@@ -0,0 +1,63 @@
using Babushka.scripts.CSharp.Common.Services;
using Godot;
namespace Babushka.scripts.CSharp.Common.CharacterControls;
public partial class Detector : Area2D
{
[Export] private bool _active = true;
[Export] private bool _oneAtATime = true;
[Signal] public delegate void InteractableEnteredEventHandler();
[Signal] public delegate void InteractableExitedEventHandler();
private DetectableInteractionArea? _currentInteractionArea;
public bool IsActive
{
get => _active;
set => _active = value;
}
public override void _Ready()
{
AreaEntered += OnEnteredInteractable;
AreaExited += OnExitedInteractable;
}
public void OnEnteredInteractable(Node body)
{
if (!_active || !InputService.Instance.InputEnabled)
return;
GD.Print("Entered Node2D.");
if (body is DetectableInteractionArea interactionArea2D)
{
GD.Print("Entered interactable.");
_currentInteractionArea = interactionArea2D;
interactionArea2D.ActivateInteractionArea(true);
EmitSignal(SignalName.InteractableEntered);
if (_oneAtATime)
_active = false;
}
}
public void OnExitedInteractable(Node body)
{
GD.Print("Exited Node2D.");
if (body is DetectableInteractionArea interactionArea2D)
{
GD.Print("Exited interactable.");
if (_oneAtATime && _currentInteractionArea != interactionArea2D)
return;
interactionArea2D.ActivateInteractionArea(false);
_currentInteractionArea = null;
EmitSignal(SignalName.InteractableExited);
_active = true;
}
}
}
@@ -0,0 +1 @@
uid://c3pd60biootsx