You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Babushka/scripts/CSharp/Common/Animation/VesnaAnimations.cs

193 lines
4.6 KiB

using System.Threading.Tasks;
using Babushka.scripts.CSharp.Common.Inventory;
using Babushka.scripts.CSharp.Common.Services;
using Godot;
namespace Babushka.scripts.CSharp.Common.Animation;
public partial class VesnaAnimations : Node
{
[Export] private AnimatedSprite2D _sprite;
private bool anyActionPressed;
private string _toolString;
private int _toolID = -1; // -1 means no tool.
private Vector2 _lastDirection = Vector2.Zero;
/// <summary>
/// Emits the last look direction of the player to other scripts.
/// </summary>
[Signal] public delegate void LookDirectionEventHandler(Vector2 direction);
public override void _EnterTree()
{
// calling with a 1-frame delay to avoid race conditions.
CallDeferred(nameof(SetupSubscriptions));
}
private void SetupSubscriptions()
{
InventoryManager.Instance.playerInventory.InventoryContentsChanged += HandleNewItemInInventory;
}
public override void _ExitTree()
{
InventoryManager.Instance.playerInventory.InventoryContentsChanged -= HandleNewItemInInventory;
}
private void HandleNewItemInInventory()
{
// for future Kathi: this does not, in fact, check if an item has been added only, but triggers on every content change!
PlayPickUpAnimation();
}
public override void _Process(double delta)
{
anyActionPressed = false;
if (!InputService.Instance.InputEnabled)
return;
bool right = Input.IsActionPressed("move_right");
bool left = Input.IsActionPressed("move_left");
bool up = Input.IsActionPressed("move_up");
bool down = Input.IsActionPressed("move_down");
bool walkingAnimationPicked = false;
if (up)
{
_sprite.Animation = "back walking" + _toolString;
anyActionPressed = true;
_lastDirection = Vector2.Up;
walkingAnimationPicked = true;
}
if (down && !walkingAnimationPicked)
{
_sprite.Animation = "front walking" + _toolString;
anyActionPressed = true;
_lastDirection = Vector2.Down;
walkingAnimationPicked = true;
}
if (right && !walkingAnimationPicked)
{
_sprite.FlipH = false;
_sprite.Animation = "side walking" + _toolString;
anyActionPressed = true;
_lastDirection = Vector2.Right;
walkingAnimationPicked = true;
}
if (left && !walkingAnimationPicked)
{
_sprite.FlipH = true;
_sprite.Animation = "side walking" + _toolString;
anyActionPressed = true;
_lastDirection = Vector2.Left;
walkingAnimationPicked = true;
}
if (Input.IsActionPressed("interact2"))
{
_sprite.Animation = "back interact";
anyActionPressed = true;
_lastDirection = Vector2.Up;
}
/*
if (Input.IsActionPressed("item"))
{
_sprite.Animation = "diagonal item";
anyActionPressed = true;
_lastDirection = Vector2.Right;
}
*/
EmitSignal(SignalName.LookDirection, _lastDirection);
if (anyActionPressed)
{
_sprite.Play();
}
else
{
//idle
if(_lastDirection == Vector2.Zero || _lastDirection == Vector2.Down)
_sprite.Animation = "front idle" + _toolString;
else if(_lastDirection == Vector2.Left || _lastDirection == Vector2.Right)
_sprite.Animation = "side idle" + _toolString;
else if(_lastDirection == Vector2.Up)
_sprite.Animation = "back idle" + _toolString;
}
}
public void ActivateTool(bool success, int id)
{
if (success)
{
_toolID = id;
}
else _toolID = -1;
switch (_toolID)
{
case 0:
_toolString = " rake";
break;
case 1:
_toolString = " wateringcan";
break;
default:
_toolString = "";
break;
}
}
/// <summary>
/// Called by FarmingControls Signal.
/// </summary>
public void PlayWateringAnimation()
{
if (_toolID == 1 && InputService.Instance.InputEnabled)
{
_sprite.Animation = "diagonal wateringcan";
_sprite.Play();
InputService.Instance.InputEnabled = false;
Task.Run(DelayedInputHandlerReset);
}
}
private async Task DelayedInputHandlerReset()
{
await Task.Delay(1000);
InputService.Instance.InputEnabled = true;
}
public void PlayPickUpAnimation()
{
_sprite.Animation = "side pickup";
_sprite.Play();
InputService.Instance.InputEnabled = false;
Task.Run(DelayedInputHandlerReset);
}
public void PlayFarmingAnimation()
{
_sprite.Animation = "diagonal farming";
_sprite.Play();
InputService.Instance.InputEnabled = false;
Task.Run(DelayedInputHandlerReset);
}
public void PlayWateringCanFillupAnimation()
{
_sprite.Animation = "back interact";
_sprite.Play();
_lastDirection = Vector2.Up;
InputService.Instance.InputEnabled = false;
Task.Run(DelayedInputHandlerReset);
}
}