diff --git a/assets/spider2.tscn b/assets/spider2.tscn index fe47a8b..e4be130 100644 --- a/assets/spider2.tscn +++ b/assets/spider2.tscn @@ -851,6 +851,7 @@ collision_layer = 8 collision_mask = 521 up_direction = Vector3(0.0449994, 0.998987, 0) script = ExtResource("1_7e7fe") +debug_tools = true nav_agent = NodePath("NavigationAgent3D") hit_targets = [NodePath("body/backTarget")] visibility_areas = [NodePath("VisibilityArea")] @@ -870,10 +871,10 @@ initial_state = NodePath("Idle") [node name="Idle" type="Node" parent="StateMachine" node_paths=PackedStringArray("enemy")] script = ExtResource("7_cwyr0") 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") -stunned_stars = NodePath("../../body/StunnedStars") enemy = NodePath("../..") [node name="Die" type="Node" parent="StateMachine" node_paths=PackedStringArray("enemy")] @@ -881,14 +882,12 @@ script = ExtResource("9_6mvds") enemy = NodePath("../..") 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") -alarm_sound = NodePath("../../AUIDO/Alarm") 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") -reload_sound = NodePath("../../AUIDO/Reload") enemy = NodePath("../..") [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="."] path_height_offset = 0.5 avoidance_enabled = true +radius = 2.0 +use_3d_avoidance = true [node name="Timers" type="Node" parent="."] diff --git a/assets/weaponresources/mac10_uberresource.tres b/assets/weaponresources/mac10_uberresource.tres index d3d4f53..bbb09b8 100644 --- a/assets/weaponresources/mac10_uberresource.tres +++ b/assets/weaponresources/mac10_uberresource.tres @@ -27,6 +27,8 @@ bullet_damage = 2 smoke_enabled = false bullet_force_mod = 5.0 bullet_speed = 600 +decibels_of_gunfire_sound = 160.0 +max_distance_heard = 100 casing = ExtResource("2_7wxcs") mag = ExtResource("4_fiujt") vibration_weak_magnitude = 0.1 diff --git a/assets/weaponresources/machete.tres b/assets/weaponresources/machete.tres index 94050fb..dbce1fe 100644 --- a/assets/weaponresources/machete.tres +++ b/assets/weaponresources/machete.tres @@ -23,6 +23,8 @@ bullet_damage = 5 smoke_enabled = false bullet_force_mod = 5.0 bullet_speed = 600 +decibels_of_gunfire_sound = 160.0 +max_distance_heard = 100 vibration_weak_magnitude = 0.1 vibration_strong_magnitude = 0.5 vibration_duration = 0.1 diff --git a/assets/weaponresources/pistol1.tres b/assets/weaponresources/pistol1.tres index 2bd6ac9..70f7d1e 100644 --- a/assets/weaponresources/pistol1.tres +++ b/assets/weaponresources/pistol1.tres @@ -27,6 +27,8 @@ bullet_damage = 1 smoke_enabled = false bullet_force_mod = 5.0 bullet_speed = 600 +decibels_of_gunfire_sound = 160.0 +max_distance_heard = 100 casing = ExtResource("2_g6owq") mag = ExtResource("4_xovdq") vibration_weak_magnitude = 0.1 diff --git a/scripts/EnemyAttack.gd b/scripts/EnemyAttack.gd index edd8296..c87d4ea 100644 --- a/scripts/EnemyAttack.gd +++ b/scripts/EnemyAttack.gd @@ -1,115 +1,2 @@ extends EnemyState 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) diff --git a/scripts/EnemyIdle.gd b/scripts/EnemyIdle.gd index 18ef134..3bf338a 100644 --- a/scripts/EnemyIdle.gd +++ b/scripts/EnemyIdle.gd @@ -1,58 +1,37 @@ extends EnemyState 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 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) +var idle_timer func Enter(): - super() - randomize_wander() - scan_direction = deg_to_rad(TURRET_TURN_AMT) + idle_timer = randf_range(idle_time_range.x,idle_time_range.y) + get_new_wander_point() -func Update(delta: float): - super(delta) - - attack_on_sight() - search_for_suspicious_sounds() - - if wander_time > 0: - wander_time -= delta +func Update(delta): + #attack_on_sight() + if idle_timer > 0: + idle_timer -= delta else: - randomize_wander() + get_new_wander_point() - if scan_time > 0: - scan_time -= delta - else: - randomize_turret_scan() + debug_marker(move_target) + move_to_nav_point(delta) + #turret_look(delta) -func Physics_Update(delta : float): - if enemy: - #turret transform - 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 * idle_speed - enemy.global_rotation.y = rotate_to_face2D(enemy,destination,delta,turret_speed) +func get_new_wander_point(): + #reset timer + idle_timer = randf_range(idle_time_range.x,idle_time_range.y) + var x = randf_range(-wander_distance_max,wander_distance_max) + var z = randf_range(-wander_distance_max,wander_distance_max) + move_target = enemy.global_position + Vector3(x,0,z) + enemy.nav_agent.set_target_position(move_target) + + print("MOVE TARGET : ",move_target) + + get_turret_look_destination() + +func get_turret_look_destination(): + look_target = move_target + Vector3(0,3,0) diff --git a/scripts/EnemyReload.gd b/scripts/EnemyReload.gd index 68ea680..76208f0 100644 --- a/scripts/EnemyReload.gd +++ b/scripts/EnemyReload.gd @@ -1,58 +1,2 @@ extends EnemyState 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") diff --git a/scripts/EnemySearch.gd b/scripts/EnemySearch.gd index fd14efb..48483ab 100644 --- a/scripts/EnemySearch.gd +++ b/scripts/EnemySearch.gd @@ -1,53 +1,2 @@ extends EnemyState 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) diff --git a/scripts/EnemyStates.gd b/scripts/EnemyStates.gd index b5b704d..aec3614 100644 --- a/scripts/EnemyStates.gd +++ b/scripts/EnemyStates.gd @@ -3,12 +3,16 @@ 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 @@ -21,12 +25,8 @@ func update_move_target(): return enemy.player_last_seen elif enemy.point_of_interest != null: return enemy.point_of_interest["point"] - -func update_waypoint_or_idle(): - if enemy_has_target(): - update_move_target() else: - Transitioned.emit(self,"idle") + return enemy.global_position func attack_on_sight(): if can_see: @@ -65,3 +65,21 @@ func rotate_to_face2D(object,target,delta,turn_speed): func clear_point_of_interest(): 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 diff --git a/scripts/enemy_stunned.gd b/scripts/enemy_stunned.gd index a27b155..10ae2f4 100644 --- a/scripts/enemy_stunned.gd +++ b/scripts/enemy_stunned.gd @@ -1,55 +1,2 @@ extends EnemyState 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) diff --git a/scripts/spider.gd b/scripts/spider.gd index e96091f..a3ad34d 100644 --- a/scripts/spider.gd +++ b/scripts/spider.gd @@ -7,8 +7,6 @@ var player var last_enemy : bool = false @export var debug_tools : bool = false @export var start_health = 3 -@export var SPEED = 3.0 -@export var turret_look_speed = 6 @export var max_ammo = 10 @export var loot_amount = 2 @export var nav_agent : NavigationAgent3D @@ -104,8 +102,6 @@ func _process(delta): move_and_slide() look_at_player() - if debug_tools: - debug_marker() func stun(): change_state_to("stunned") @@ -155,13 +151,6 @@ func cache_player_pos(): if line_of_sight_ray.get_collider() is Player: 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): var distance_to_point = global_position.distance_to(point) if distance_to_point <= max_distance: