69 lines
2.3 KiB
GDScript
69 lines
2.3 KiB
GDScript
extends CharacterState
|
|
class_name EnemyState
|
|
|
|
@export var turret_speed : float = 6.0
|
|
|
|
func enemy_has_target():
|
|
if character.player_last_seen != null:
|
|
return true
|
|
if character.point_of_interest != null:
|
|
return true
|
|
return false
|
|
|
|
func attack_on_sight():
|
|
if can_see:
|
|
if character.is_player_in_area() and character.is_player_visible():
|
|
character.cache_player_pos()
|
|
Transitioned.emit(self,"attack")
|
|
if character.turret_look.is_colliding():
|
|
if character.turret_look.get_collider() is Player:
|
|
character.cache_player_pos()
|
|
Transitioned.emit(self,"attack")
|
|
|
|
func turret_look2D(delta):
|
|
character.turret_look.global_rotation.y = rotate_to_face2D(character.turret_look,look_target,0,delta,turret_speed)
|
|
|
|
func turret_scan(target_offset : Vector3,delta):
|
|
rotate_to_face3D(character.turret_look,look_target,target_offset,delta,turret_speed)
|
|
|
|
func turret_look3D(delta):
|
|
rotate_to_face3D(character.turret_look,look_target,Vector3.ZERO,delta,turret_speed)
|
|
|
|
func turret_scan_look(target,scan_direction,delta):
|
|
character.turret_look.global_rotation.y = rotate_to_face2D(character.turret_look,target,scan_direction,delta,turret_speed)
|
|
|
|
func investigate_points_of_interest(point,loudness,max_distance):
|
|
if poi_investigate:
|
|
var distance_to_point = character.global_position.distance_to(point)
|
|
if distance_to_point <= max_distance:
|
|
var perceived_loudness = 1/distance_to_point * loudness
|
|
var add_point = {"point" : point, "loudness" : perceived_loudness}
|
|
character.points_of_interest.append(add_point)
|
|
|
|
if poi_change_to_search:
|
|
Transitioned.emit(self,"search")
|
|
|
|
if poi_update_waypoint_immediately:
|
|
get_new_point_of_interest()
|
|
|
|
func has_points_to_investigate():
|
|
if character.player_last_seen != null:
|
|
return true
|
|
elif character.points_of_interest.size() > 0:
|
|
return true
|
|
else:
|
|
return false
|
|
|
|
func get_new_point_of_interest():
|
|
if character.player_last_seen != null:
|
|
move_target = character.player_last_seen
|
|
character.player_last_seen = null
|
|
character.nav_agent.set_target_position(move_target)
|
|
elif character.points_of_interest.size() > 0:
|
|
var point_of_interest = character.points_of_interest.pop_back()
|
|
move_target = point_of_interest["point"]
|
|
character.nav_agent.set_target_position(move_target)
|
|
|
|
func clear_points_of_interest():
|
|
character.points_of_interest = []
|