using System.Threading; using System.Threading.Tasks; using Godot; namespace Babushka.scripts.CSharp.Common.CharacterControls; public partial class Player2D : CharacterBody2D { [Export] private float _speed = 100f; [Export] private AnimatedSprite2D _sprite; // -1 means no tool. private int _toolID = -1; private string _toolString; private bool anyActionPressed; private bool _wateringInProgress; private Vector2 _lastDirection = Vector2.Zero; public override void _Process(double delta) { anyActionPressed = false; if (Input.IsActionPressed("move_right")) { Velocity = new Vector2(_speed, 0); MoveAndSlide(); _sprite.FlipH = false; _sprite.Animation = "side walking" + _toolString; anyActionPressed = true; _lastDirection = Vector2.Right; } if (Input.IsActionPressed("move_left")) { Velocity = new Vector2(-_speed, 0); MoveAndSlide(); _sprite.FlipH = true; _sprite.Animation = "side walking" + _toolString; anyActionPressed = true; _lastDirection = Vector2.Left; } if (Input.IsActionPressed("move_up")) { Velocity = new Vector2(0, -_speed); MoveAndSlide(); _sprite.Animation = "back walking" + _toolString; anyActionPressed = true; _lastDirection = Vector2.Up; } if (Input.IsActionPressed("move_down")) { Velocity = new Vector2(0, _speed); MoveAndSlide(); _sprite.Animation = "front walking" + _toolString; anyActionPressed = true; _lastDirection = Vector2.Down; } if (anyActionPressed) { _sprite.Play(); } else { if (_wateringInProgress) return; //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; } } public void PlayWateringAnimation() { if (_toolID == 1 && !_wateringInProgress) { _sprite.Animation = "diagonal wateringcan"; _sprite.Play(); _wateringInProgress = true; Task.Run(DelayedWateringCanReset); } } private async Task DelayedWateringCanReset() { await Task.Delay(1000); _wateringInProgress = false; } }