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; /// /// Emits the last look direction of the player to other scripts. /// [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; } } /// /// Called by FarmingControls Signal. /// 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); } }