diff --git a/assets/spider2.tscn b/assets/spider2.tscn index 56761ef..481e366 100644 --- a/assets/spider2.tscn +++ b/assets/spider2.tscn @@ -883,13 +883,16 @@ script = ExtResource("9_6mvds") enemy = NodePath("../..") metadata/_custom_type_script = "uid://dhxolagi0b5s1" -[node name="Attack" type="Node" parent="StateMachine" node_paths=PackedStringArray("enemy")] +[node name="Attack" type="Node" parent="StateMachine" node_paths=PackedStringArray("alert_sound", "enemy")] script = ExtResource("10_gicen") +alert_sound = NodePath("../../AUIDO/Alarm") enemy = NodePath("../..") body_turn_speed = 1.0 -[node name="Reload" type="Node" parent="StateMachine" node_paths=PackedStringArray("enemy")] +[node name="Reload" type="Node" parent="StateMachine" node_paths=PackedStringArray("reload_sound", "servo_sound", "enemy")] script = ExtResource("11_ekglj") +reload_sound = NodePath("../../AUIDO/Reload") +servo_sound = NodePath("../../AUIDO/ServoSingle") enemy = NodePath("../..") [node name="Search" type="Node" parent="StateMachine" node_paths=PackedStringArray("enemy")] diff --git a/scripts/EnemyAttack.gd b/scripts/EnemyAttack.gd index 24fedff..c08d84f 100644 --- a/scripts/EnemyAttack.gd +++ b/scripts/EnemyAttack.gd @@ -1,6 +1,17 @@ extends EnemyState class_name EnemyAttack +@export var initial_wait_time : float = 1.0 +@export var between_shot_time : Vector2 = Vector2(.5,2.0) +@export var alert_sound : AudioStreamPlayer3D + +var initial_timer +var shot_timer = 0.0 + +func Enter(): + initial_timer = initial_wait_time + alert_sound.play() + func Physics_Update(delta): if enemy.is_player_visible(): #get player location @@ -10,10 +21,58 @@ func Physics_Update(delta): #move and look at location move_to_nav_point(delta) turret_look3D(delta) + + #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: + 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") + else: - Transitioned.emit(self,"idle") #when search is working make this search + Transitioned.emit(self,"search") func update_player_target(): move_target = enemy.player_last_seen look_target = enemy.player_last_seen + Vector3(0,.75,0) enemy.nav_agent.set_target_position(move_target) + +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/EnemyReload.gd b/scripts/EnemyReload.gd index 76208f0..6b6f493 100644 --- a/scripts/EnemyReload.gd +++ b/scripts/EnemyReload.gd @@ -1,2 +1,47 @@ extends EnemyState class_name EnemyReload + +@export var reload_sound : AudioStreamPlayer3D +@export var servo_sound : AudioStreamPlayer3D +@export var retreat_distance : float = 5.0 +@onready var player = get_tree().current_scene.player + + +func Enter(): + update_reload_move_target() + servo_sound.play() + +func Update(delta): + if enemy.ammo < enemy.max_ammo: + reload() + else: + finished_reload() + +func Physics_Update(delta): + if enemy.is_player_visible(): + #get player location + enemy.cache_player_pos() + update_reload_look_target() + move_to_nav_point(delta) + turret_look3D(delta) + + +func update_reload_look_target(): + look_target = enemy.global_position + Vector3(0,10,0) + +func update_reload_move_target(): + var direction = (enemy.player_last_seen - enemy.global_position).normalized() + move_target = direction * retreat_distance + enemy.nav_agent.set_target_position(move_target) + +func reload(): + if !reload_sound.is_playing(): + enemy.ammo += 1 + reload_sound.play() + +func finished_reload(): + servo_sound.play() + if enemy.is_player_visible(): + Transitioned.emit(self,"attack") + else: + Transitioned.emit(self,"search") #fix to search when it works diff --git a/scripts/EnemySearch.gd b/scripts/EnemySearch.gd index 48483ab..6de4c6c 100644 --- a/scripts/EnemySearch.gd +++ b/scripts/EnemySearch.gd @@ -1,2 +1,43 @@ extends EnemyState class_name EnemySearch + +@export var scan_time : float = 3 +@export var scan_cone_angle : float = 90 +var scan_timer +var scan_direction = scan_cone_angle/2 + +func Enter(): + scan_timer = scan_time + get_new_point_of_interest() + +func Update(delta): + attack_on_sight() + #on timeout change scan direction + if scan_timer > 0: + scan_timer -= delta + else: + change_scan_direction() + +func Physics_Update(delta): + #draw target for debug purposes + debug_marker(move_target) + + #if navigation is finished get new point, otherwise continue on path + if enemy.nav_agent.is_navigation_finished(): + get_new_point_of_interest() + else: + move_to_nav_point(delta) + + #do turret scan + turret_look3D(delta) + +func get_new_point_of_interest(): + if enemy.player_last_seen != null and enemy.player_last_seen != move_target: + move_target = enemy.player_last_seen + enemy.nav_agent.set_target_position(move_target) + else: + Transitioned.emit(self,"idle") + +func change_scan_direction(): + scan_timer = scan_time + scan_direction = -scan_direction