extends State class_name EnemyState @export var enemy : CharacterBody3D @export var move_speed : float = 3 @export var turret_speed : float = 6.0 @export var can_see : bool = true # indicates whether the enemy is able to see things in the state @export var time_to_lose_target = 1.0 @onready var target_lost_timer = time_to_lose_target func Update(delta): pass func move_target(): if enemy.player_last_seen != null: return enemy.player_last_seen elif enemy.points_of_interest != null: var move_point = {"loudness" : 0.0,"point" : Vector3.ZERO} for point in enemy.points_of_interest: if point["loudness"] > move_point["loudness"]: move_point = point return move_point["point"] else: Transitioned.emit(self,"idle") func attack_on_sight(): if can_see: if enemy.is_player_in_area() and enemy.is_player_visible(): Transitioned.emit(self,"attack") if enemy.turret_look.is_colliding(): if enemy.turret_look.get_collider() is Player: Transitioned.emit(self,"attack") func search_on_lost_target(delta): if !enemy.is_player_visible(): Transitioned.emit(self,"attack") func move_target_adj(): var position = move_target() return Vector3(position.x,enemy.global_position.y,position.z) func search_for_suspicious_sounds(): if enemy.points_of_interest != [] and enemy.points_of_interest != null: Transitioned.emit(self,"search") func rotate_to_face2D(object,target,delta,turn_speed): #to allow both nodes and positions to be passed to this function, test the target and use Vector3 coords var target_transformed if target == null: target_transformed = object.global_position elif target is Vector3: target_transformed = target elif target is Node3D: target_transformed = target.global_position var pos2d = Vector2(object.global_position.x,object.global_position.z) var target_pos2d = Vector2(target_transformed.x,target_transformed.z) var direction = (pos2d - target_pos2d) return lerp_angle(object.rotation.y,atan2(direction.x,direction.y),delta * turn_speed)