Idle state is simplified and looking good

This commit is contained in:
derek
2025-04-30 10:49:53 -05:00
parent d65e362539
commit d9ab3a82a7
11 changed files with 63 additions and 343 deletions

View File

@@ -851,6 +851,7 @@ collision_layer = 8
collision_mask = 521 collision_mask = 521
up_direction = Vector3(0.0449994, 0.998987, 0) up_direction = Vector3(0.0449994, 0.998987, 0)
script = ExtResource("1_7e7fe") script = ExtResource("1_7e7fe")
debug_tools = true
nav_agent = NodePath("NavigationAgent3D") nav_agent = NodePath("NavigationAgent3D")
hit_targets = [NodePath("body/backTarget")] hit_targets = [NodePath("body/backTarget")]
visibility_areas = [NodePath("VisibilityArea")] visibility_areas = [NodePath("VisibilityArea")]
@@ -870,10 +871,10 @@ initial_state = NodePath("Idle")
[node name="Idle" type="Node" parent="StateMachine" node_paths=PackedStringArray("enemy")] [node name="Idle" type="Node" parent="StateMachine" node_paths=PackedStringArray("enemy")]
script = ExtResource("7_cwyr0") script = ExtResource("7_cwyr0")
enemy = NodePath("../..") enemy = NodePath("../..")
move_speed = 1.5
[node name="Stunned" type="Node" parent="StateMachine" node_paths=PackedStringArray("stunned_stars", "enemy")] [node name="Stunned" type="Node" parent="StateMachine" node_paths=PackedStringArray("enemy")]
script = ExtResource("8_wpql0") script = ExtResource("8_wpql0")
stunned_stars = NodePath("../../body/StunnedStars")
enemy = NodePath("../..") enemy = NodePath("../..")
[node name="Die" type="Node" parent="StateMachine" node_paths=PackedStringArray("enemy")] [node name="Die" type="Node" parent="StateMachine" node_paths=PackedStringArray("enemy")]
@@ -881,14 +882,12 @@ script = ExtResource("9_6mvds")
enemy = NodePath("../..") enemy = NodePath("../..")
metadata/_custom_type_script = "uid://dhxolagi0b5s1" metadata/_custom_type_script = "uid://dhxolagi0b5s1"
[node name="Attack" type="Node" parent="StateMachine" node_paths=PackedStringArray("alarm_sound", "enemy")] [node name="Attack" type="Node" parent="StateMachine" node_paths=PackedStringArray("enemy")]
script = ExtResource("10_gicen") script = ExtResource("10_gicen")
alarm_sound = NodePath("../../AUIDO/Alarm")
enemy = NodePath("../..") enemy = NodePath("../..")
[node name="Reload" type="Node" parent="StateMachine" node_paths=PackedStringArray("reload_sound", "enemy")] [node name="Reload" type="Node" parent="StateMachine" node_paths=PackedStringArray("enemy")]
script = ExtResource("11_ekglj") script = ExtResource("11_ekglj")
reload_sound = NodePath("../../AUIDO/Reload")
enemy = NodePath("../..") enemy = NodePath("../..")
[node name="Search" type="Node" parent="StateMachine" node_paths=PackedStringArray("enemy")] [node name="Search" type="Node" parent="StateMachine" node_paths=PackedStringArray("enemy")]
@@ -1099,6 +1098,8 @@ shape = SubResource("CylinderShape3D_gicen")
[node name="NavigationAgent3D" type="NavigationAgent3D" parent="."] [node name="NavigationAgent3D" type="NavigationAgent3D" parent="."]
path_height_offset = 0.5 path_height_offset = 0.5
avoidance_enabled = true avoidance_enabled = true
radius = 2.0
use_3d_avoidance = true
[node name="Timers" type="Node" parent="."] [node name="Timers" type="Node" parent="."]

View File

@@ -27,6 +27,8 @@ bullet_damage = 2
smoke_enabled = false smoke_enabled = false
bullet_force_mod = 5.0 bullet_force_mod = 5.0
bullet_speed = 600 bullet_speed = 600
decibels_of_gunfire_sound = 160.0
max_distance_heard = 100
casing = ExtResource("2_7wxcs") casing = ExtResource("2_7wxcs")
mag = ExtResource("4_fiujt") mag = ExtResource("4_fiujt")
vibration_weak_magnitude = 0.1 vibration_weak_magnitude = 0.1

View File

@@ -23,6 +23,8 @@ bullet_damage = 5
smoke_enabled = false smoke_enabled = false
bullet_force_mod = 5.0 bullet_force_mod = 5.0
bullet_speed = 600 bullet_speed = 600
decibels_of_gunfire_sound = 160.0
max_distance_heard = 100
vibration_weak_magnitude = 0.1 vibration_weak_magnitude = 0.1
vibration_strong_magnitude = 0.5 vibration_strong_magnitude = 0.5
vibration_duration = 0.1 vibration_duration = 0.1

View File

@@ -27,6 +27,8 @@ bullet_damage = 1
smoke_enabled = false smoke_enabled = false
bullet_force_mod = 5.0 bullet_force_mod = 5.0
bullet_speed = 600 bullet_speed = 600
decibels_of_gunfire_sound = 160.0
max_distance_heard = 100
casing = ExtResource("2_g6owq") casing = ExtResource("2_g6owq")
mag = ExtResource("4_xovdq") mag = ExtResource("4_xovdq")
vibration_weak_magnitude = 0.1 vibration_weak_magnitude = 0.1

View File

@@ -1,115 +1,2 @@
extends EnemyState extends EnemyState
class_name EnemyAttack class_name EnemyAttack
var heartbeat : float = 3.0
@export var initial_wait_time : float = 1.0
@export var between_shot_time : Vector2 = Vector2(.5,2.0)
@export var reload_time : float = 7.0
@export var alarm_sound : AudioStreamPlayer3D
@export var time_before_losing_visual : float = 1.0
var move_target
var look_target
var initial_timer
var shot_timer = 0.0
var visibility_timer
func Enter():
super()
enemy.cache_player_pos()
clear_point_of_interest()
visibility_timer = time_before_losing_visual
enemy.turret_material.emission_enabled = true
initial_timer = initial_wait_time
move_target = update_waypoint_or_idle()
look_target = update_waypoint_or_idle()
alarm_sound.play()
func current_target():
if enemy.is_player_visible():
return enemy.character_follow.global_position
else:
return enemy.point_of_interest
func Update(delta):
enemy.cache_player_pos()
if !enemy.is_player_visible():
if visibility_timer > 0:
visibility_timer -= delta
else:
if enemy.ammo <= 4:
Transitioned.emit(self,"reload")
else:
enemy.player_last_seen = null
Transitioned.emit(self,"search")
else:
visibility_timer = time_before_losing_visual
if heartbeat > 0:
heartbeat -= delta
else:
move_target = update_waypoint_or_idle()
look_target = update_waypoint_or_idle()
#Initial wait time
if initial_timer > 0:
initial_timer -= delta
else:
#fire if player in view
if enemy.ammo > 0:
if shot_timer > 0:
shot_timer -= delta
else:
if enemy.turret_look_next.is_colliding() and enemy.turret_look_next.get_collider().is_in_group("player"):
shot_timer = randf_range(between_shot_time.x,between_shot_time.y)
enemy.turret_material.emission_enabled = true
await get_tree().create_timer(.1).timeout
attack()
else:
await get_tree().create_timer(.5).timeout
Transitioned.emit(self,"reload")
func Physics_Update(delta):
enemy.turret_look.rotation = lerp(enemy.turret_look.rotation,enemy.turret_look_next.rotation,delta * enemy.turret_look_speed)
var destination = enemy.nav_agent.get_next_path_position()
var local_destination = destination - enemy.global_position
var direction = local_destination.normalized()
if enemy.global_position.distance_to(local_destination) > 1:
enemy.velocity = direction * move_speed
enemy.global_rotation.y = rotate_to_face2D(enemy,move_target,delta,turret_speed)
func attack():
fire(enemy.barrel_1)
enemy.smoke.emitting = true
await get_tree().create_timer(.1).timeout
fire(enemy.barrel_2)
enemy.smoke_2.emitting = true
enemy.turret_material.emission_enabled = false
func fire(barrel):
enemy.ammo -= 1
var instance_bullet = enemy.bullet.instantiate()
instance_bullet.position = barrel.global_position
instance_bullet.transform.basis = barrel.global_transform.basis
instance_bullet.bullet_speed = enemy.bullet_speed
instance_bullet.bullet_drop = enemy.bullet_drop
instance_bullet.random_spread_amt = enemy.random_spread_amt
instance_bullet.bullet_damage = enemy.bullet_damage
instance_bullet.fired_by = enemy
instance_bullet.target_type = enemy.enemy_type
get_tree().get_root().add_child(instance_bullet)
enemy.audio_fire.play()
spawn_casing()
func spawn_casing():
var instance_casing = enemy.casing.instantiate()
instance_casing.position = enemy.casing_ejector.global_position
instance_casing.transform.basis = enemy.casing_ejector.global_transform.basis
instance_casing.player_velocity = enemy.velocity * enemy.transform.basis
get_tree().get_root().add_child(instance_casing)

View File

@@ -1,58 +1,37 @@
extends EnemyState extends EnemyState
class_name EnemyIdle class_name EnemyIdle
@export var idle_speed : float = 1.5 @export var idle_time_range : Vector2 = Vector2(5,7)
@export var wander_distance_max : float = 30.0
var move_direction : Vector3 var idle_timer
var scan_direction : float
var wander_time : float
var scan_time : float
const WANDER_AMT = 50
const TURRET_TURN_AMT : float = 90.0
func randomize_wander():
var x = randf_range(-WANDER_AMT,WANDER_AMT)
var z = randf_range(-WANDER_AMT,WANDER_AMT)
move_direction = enemy.global_position + Vector3(x,0,z)
enemy.nav_agent.set_target_position(move_direction)
wander_time = randf_range(1,3)
func randomize_turret_scan():
scan_direction = -scan_direction
enemy.turret_look_next.rotation = Vector3(0,scan_direction,0)
scan_time = randf_range(5,10)
func Enter(): func Enter():
super() idle_timer = randf_range(idle_time_range.x,idle_time_range.y)
randomize_wander() get_new_wander_point()
scan_direction = deg_to_rad(TURRET_TURN_AMT)
func Update(delta: float): func Update(delta):
super(delta) #attack_on_sight()
if idle_timer > 0:
attack_on_sight() idle_timer -= delta
search_for_suspicious_sounds()
if wander_time > 0:
wander_time -= delta
else: else:
randomize_wander() get_new_wander_point()
if scan_time > 0: debug_marker(move_target)
scan_time -= delta move_to_nav_point(delta)
else: #turret_look(delta)
randomize_turret_scan()
func Physics_Update(delta : float): func get_new_wander_point():
if enemy: #reset timer
#turret transform idle_timer = randf_range(idle_time_range.x,idle_time_range.y)
enemy.turret_look.rotation = lerp(enemy.turret_look.rotation,enemy.turret_look_next.rotation,delta * enemy.turret_look_speed) var x = randf_range(-wander_distance_max,wander_distance_max)
var z = randf_range(-wander_distance_max,wander_distance_max)
var destination = enemy.nav_agent.get_next_path_position() move_target = enemy.global_position + Vector3(x,0,z)
var local_destination = destination - enemy.global_position enemy.nav_agent.set_target_position(move_target)
var direction = local_destination.normalized()
if enemy.global_position.distance_to(local_destination) > 1: print("MOVE TARGET : ",move_target)
enemy.velocity = direction * idle_speed
enemy.global_rotation.y = rotate_to_face2D(enemy,destination,delta,turret_speed) get_turret_look_destination()
func get_turret_look_destination():
look_target = move_target + Vector3(0,3,0)

View File

@@ -1,58 +1,2 @@
extends EnemyState extends EnemyState
class_name EnemyReload class_name EnemyReload
@export var reload_sound : AudioStreamPlayer3D
@export var run_distance : float = 3
@export var body_turn_speed : float = 1
@onready var player = get_tree().current_scene.player
var move_target
var look_target
var heartbeat : float = 3.0
var remaining_bullets
func Enter():
super()
remaining_bullets = enemy.max_ammo
enemy.servo_single.play()
func Exit():
super()
enemy.ammo = enemy.max_ammo
enemy.servo_single.play()
func Update(delta):
if heartbeat > 0:
heartbeat -= delta
else:
update_waypoint_or_idle()
if remaining_bullets > 0:
if !reload_sound.is_playing():
remaining_bullets -= 1
reload_sound.play()
else:
finished_reload()
func Physics_Update(delta):
enemy.turret_look_next.look_at(look_target)
enemy.turret_look.rotation = lerp(enemy.turret_look.rotation,Vector3(deg_to_rad(90),0,0),delta * enemy.turret_look_speed)
var destination = enemy.nav_agent.get_next_path_position()
var local_destination = destination - enemy.global_position
var direction = local_destination.normalized()
if enemy.global_position.distance_to(local_destination) > 1:
enemy.velocity = direction * move_speed
enemy.global_rotation.y = rotate_to_face2D(enemy,move_target,delta,turret_speed)
func finished_reload():
if enemy.turret_look_next.is_colliding():
if enemy.turret_look_next.get_collider() is Player:
Transitioned.emit(self,"attack")
else:
Transitioned.emit(self,"search")
else:
Transitioned.emit(self,"search")

View File

@@ -1,53 +1,2 @@
extends EnemyState extends EnemyState
class_name EnemySearch class_name EnemySearch
var search_timer
var update_target_timer
var move_target
var look_target
const UPDATE_TARGET_TIME_MAX : float = 1.0
const SEARCH_TIME_MAX : float = 10.0 #only searches for anything for 10 seconds before returning to idle
func Enter():
super()
search_timer = SEARCH_TIME_MAX
update_target_timer = UPDATE_TARGET_TIME_MAX
move_target = update_waypoint_or_idle()
look_target = update_waypoint_or_idle()
func Exit():
pass
func Update(delta: float):
super(delta)
if search_timer > 0:
search_timer -= delta
else:
Transitioned.emit(self,"idle")
if update_target_timer > 0:
update_target_timer -= delta
else:
move_target = update_waypoint_or_idle()
look_target = update_waypoint_or_idle()
attack_on_sight()
search_for_suspicious_sounds()
if enemy.global_position.distance_to(move_target_adj(move_target)) < 1:
Transitioned.emit(self,"idle")
func Physics_Update(delta : float):
#turret transform
enemy.turret_look.rotation = lerp(enemy.turret_look.rotation,enemy.turret_look_next.rotation,delta * turret_speed)
var destination = enemy.nav_agent.get_next_path_position()
var local_destination = destination - enemy.global_position
var direction = local_destination.normalized()
enemy.velocity = direction * move_speed
enemy.global_rotation.y = rotate_to_face2D(enemy,move_target,delta,2)

View File

@@ -3,12 +3,16 @@ class_name EnemyState
@export var enemy : CharacterBody3D @export var enemy : CharacterBody3D
@export var move_speed : float = 3 @export var move_speed : float = 3
@export var body_turn_speed : float = 3
@export var turret_speed : float = 6.0 @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 can_see : bool = true # indicates whether the enemy is able to see things in the state
@export var time_to_lose_target = 1.0 @export var time_to_lose_target = 1.0
@onready var target_lost_timer = time_to_lose_target @onready var target_lost_timer = time_to_lose_target
var move_target
var look_target
func enemy_has_target(): func enemy_has_target():
if enemy.player_last_seen != null: if enemy.player_last_seen != null:
return true return true
@@ -21,12 +25,8 @@ func update_move_target():
return enemy.player_last_seen return enemy.player_last_seen
elif enemy.point_of_interest != null: elif enemy.point_of_interest != null:
return enemy.point_of_interest["point"] return enemy.point_of_interest["point"]
func update_waypoint_or_idle():
if enemy_has_target():
update_move_target()
else: else:
Transitioned.emit(self,"idle") return enemy.global_position
func attack_on_sight(): func attack_on_sight():
if can_see: if can_see:
@@ -65,3 +65,21 @@ func rotate_to_face2D(object,target,delta,turn_speed):
func clear_point_of_interest(): func clear_point_of_interest():
enemy.point_of_interest = null enemy.point_of_interest = null
func move_to_nav_point(delta):
var destination = enemy.nav_agent.get_next_path_position()
var local_destination = destination - enemy.global_position
var direction = local_destination.normalized()
if enemy.global_position.distance_to(destination) > 1:
enemy.velocity = direction * move_speed
enemy.global_rotation.y = rotate_to_face2D(enemy,destination,delta,body_turn_speed)
func turret_look(delta):
enemy.turret_look.global_rotation.y = rotate_to_face2D(enemy.turret_look,move_target,delta,50)
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

View File

@@ -1,55 +1,2 @@
extends EnemyState extends EnemyState
class_name EnemyStunned class_name EnemyStunned
@export var stunned_stars : Node
@export var stun_time_start : float = 5.0
var move_direction : Vector3
var scan_direction : float
var wander_time : float
var scan_time : float
var stun_time
const WANDER_AMT = 50
const TURRET_TURN_AMT : float = 180.0
func Enter():
super()
print("ENEMY STUNNED")
if stunned_stars:
stunned_stars.visible = true
randomize_wander()
stun_time = stun_time_start
func _Exit():
if stunned_stars:
stunned_stars.visible = false
func Update(delta):
if wander_time > 0:
wander_time -= delta
else:
randomize_wander()
if stun_time > 0:
stun_time -= delta
else:
stunned_stars.visible = false
Transitioned.emit(self,"idle")
func Physics_Update(delta : float):
if enemy:
var destination = enemy.nav_agent.get_next_path_position()
var local_destination = destination - enemy.global_position
var direction = local_destination.normalized()
if enemy.global_position.distance_to(local_destination) > 1:
enemy.velocity = direction * move_speed
enemy.global_rotation.y += delta * 4
func randomize_wander():
var x = randf_range(-WANDER_AMT,WANDER_AMT)
var z = randf_range(-WANDER_AMT,WANDER_AMT)
move_direction = enemy.global_position + Vector3(x,0,z)
enemy.nav_agent.set_target_position(move_direction)
wander_time = randf_range(1,3)

View File

@@ -7,8 +7,6 @@ var player
var last_enemy : bool = false var last_enemy : bool = false
@export var debug_tools : bool = false @export var debug_tools : bool = false
@export var start_health = 3 @export var start_health = 3
@export var SPEED = 3.0
@export var turret_look_speed = 6
@export var max_ammo = 10 @export var max_ammo = 10
@export var loot_amount = 2 @export var loot_amount = 2
@export var nav_agent : NavigationAgent3D @export var nav_agent : NavigationAgent3D
@@ -104,8 +102,6 @@ func _process(delta):
move_and_slide() move_and_slide()
look_at_player() look_at_player()
if debug_tools:
debug_marker()
func stun(): func stun():
change_state_to("stunned") change_state_to("stunned")
@@ -155,13 +151,6 @@ func cache_player_pos():
if line_of_sight_ray.get_collider() is Player: if line_of_sight_ray.get_collider() is Player:
player_last_seen = line_of_sight_ray.get_collision_point() player_last_seen = line_of_sight_ray.get_collision_point()
func debug_marker():
if player_last_seen != null:
debug_tracker.visible = true
debug_tracker.global_position = player_last_seen
else:
debug_tracker.visible = false
func add_point_of_interest(point,loudness,max_distance): func add_point_of_interest(point,loudness,max_distance):
var distance_to_point = global_position.distance_to(point) var distance_to_point = global_position.distance_to(point)
if distance_to_point <= max_distance: if distance_to_point <= max_distance: