Files
fps_project_1/scripts/EnemyStates.gd
2025-04-30 16:35:45 -05:00

106 lines
3.4 KiB
GDScript

extends State
class_name EnemyState
@export var enemy : CharacterBody3D
@export var move_speed : float = 3
@export var body_turn_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
var move_target
var look_target
func enemy_has_target():
if enemy.player_last_seen != null:
return true
if enemy.point_of_interest != null:
return true
return false
func update_move_target():
if enemy.player_last_seen != null:
return enemy.player_last_seen
elif enemy.point_of_interest != null:
return enemy.point_of_interest["point"]
else:
return enemy.global_position
func attack_on_sight():
if can_see:
if enemy.is_player_in_area() and enemy.is_player_visible():
enemy.cache_player_pos()
Transitioned.emit(self,"attack")
if enemy.turret_look.is_colliding():
if enemy.turret_look.get_collider() is Player:
enemy.cache_player_pos()
Transitioned.emit(self,"attack")
func search_on_lost_target():
if !enemy.is_player_visible():
Transitioned.emit(self,"attack")
func move_target_adj(position):
return Vector3(position.x,enemy.global_position.y,position.z)
func search_for_suspicious_sounds():
if enemy.point_of_interest != null:
enemy.player_last_seen = null
Transitioned.emit(self,"search")
func rotate_to_face2D(object,target,target_offset_angle,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.global_rotation.y,atan2(direction.x,direction.y) + deg_to_rad(target_offset_angle),delta * turn_speed)
func rotate_to_face3D(object,target,target_offset_angle,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
func move_to_nav_point(delta):
var destination = enemy.nav_agent.get_next_path_position()
var local_destination = destination - enemy.global_position
var new_velocity = local_destination.normalized() * move_speed
enemy.nav_agent.set_velocity(new_velocity)
enemy.global_rotation.y = rotate_to_face2D(enemy,destination,0,delta,body_turn_speed)
func velocity_computed(safe_velocity):
enemy.velocity = enemy.velocity.move_toward(safe_velocity,.25)
func turret_look2D(delta):
enemy.turret_look.global_rotation.y = rotate_to_face2D(enemy.turret_look,look_target,0,delta,turret_speed)
func turret_scan_look(target,scan_direction,delta):
enemy.turret_look.global_rotation.y = rotate_to_face2D(enemy.turret_look,target,scan_direction,delta,turret_speed)
func debug_marker(target_pos):
if enemy.debug_tools:
enemy.debug_tracker.visible = true
enemy.debug_tracker.global_position = target_pos
else:
enemy.debug_tracker.visible = false