using Godot; using System; using System.Collections.Generic; using System.Linq; public partial class Enemy : StaticBody2D { [Signal] public delegate void DeathEventHandler(Enemy THIS); [Signal] public delegate void ClickedEventHandler(Enemy THIS); [Signal] public delegate void RightClickedEventHandler(Enemy THIS); public bool _hovered = false, _track = false, _warp = false; public int _damage = 1, _health = 2, _stamina, _staminaRemaining, _visibilityRange = 4, _hitRange, _priority = 1; public Vector2I _address = -Vector2I.One, _range = Vector2I.Up; public List _path = new(); public float _movement = 0; public EnemyController _enemyController; public override void _Ready() { base._Ready(); } public override void _Process(double delta) { base._Process(delta); if (_hovered) { if (Input.IsActionJustPressed("leftClick")) { EmitSignal(SignalName.Clicked, this); } if (Input.IsActionJustPressed("rightClick")) { EmitSignal(SignalName.RightClicked, this); } } } public override void _PhysicsProcess(double delta) { base._PhysicsProcess(delta); } public void Attack(PlayerController PLAYER) { PLAYER.ChangeHealth(-1, this); } public bool CanAttack() { return _address.Y <= _hitRange; } public void CounterAttack(Commander COMMANDER) { } public virtual List GetGoals(Map MAP) { List firstOpenRow = [.. MAP._cells.Where(c => c.Y == MAP.GetFirstOpenRow() && !MAP._astar.IsPointSolid(c))]; return firstOpenRow; } public virtual List GetBestPath(Map MAP) { List goals = GetGoals(MAP); List> paths = new(); for (int i = 0; i < goals.Count; i++) { paths.Add(MAP.GetPath(_address, goals[i])); } List bestPath = paths.OrderBy(p => p.Count).ThenBy(p => p.Last().X % 2).ToList()[0]; return bestPath; } public void GetRemainingStamina(Map MAP) { _staminaRemaining = _address.Y <= MAP.GetFirstOpenRow() ? 0 : _stamina; } public void RemainInPlace() { if (_path.Count <= 0) { _path.Add(_address); } else { _path.Add(_path.LastOrDefault()); } } public void TakeDamage(int DAMAGE, Commander ATTACKER) { _health -= DAMAGE; CounterAttack(ATTACKER); if (_health <= 0) { EmitSignal(SignalName.Death, this); } } public void OnMouseEntered(){ _hovered = true; } public void OnMouseExited(){ _hovered = false; } }