Files
aarpg/enemies/scripts/states/enemy_state_chase.gd
Andriy Yednarovych e877c5f058 init
2026-02-22 19:26:26 +01:00

59 lines
1.5 KiB
GDScript

class_name EnemyChaseWander extends EnemyState
@export var animation_name: String = "chase"
@export var chase_speed: float = 20.0
@export var turn_rate: float = 0.25
@export_category("AI")
@export var vision_area: VisionArea
@export var attack_area: Hurtbox
@export var state_aggro_duration: float = 0.5
@export var next_state: EnemyState
var timer: float = 0.0
var direction: Vector2
var can_see_player := false
func init() -> void:
if vision_area:
vision_area.player_entered.connect(on_player_entered)
vision_area.player_exited.connect(on_player_exited)
func enter() -> void:
timer = state_aggro_duration
enemy.update_animation(animation_name)
if attack_area:
attack_area.monitoring = true
func exit() -> void:
if attack_area:
attack_area.monitoring = true
can_see_player = false
func process(delta : float) -> EnemyState:
var new_dir: Vector2 = enemy.global_position.direction_to(PlayerManager.player.global_position)
direction = lerp(direction, new_dir, turn_rate)
enemy.velocity = direction * chase_speed
if enemy.set_direction(direction):
enemy.update_animation(animation_name)
if !can_see_player:
timer -= delta
if timer <= 0:
return next_state
else:
timer = state_aggro_duration
return null
func physics(_delta : float) -> EnemyState:
return null
func on_player_entered() -> void:
can_see_player = true
if state_machine.current_state is EnemyStateStun:
return
state_machine.change_state(self)
func on_player_exited() -> void:
can_see_player = false