extends EnemyState class_name EnemyAttack @export var initial_wait_time : float = 1.0 @export var time_to_lose_target : float = 4.0 @export var between_shot_time : Vector2 = Vector2(.5,2.0) @export var alert_sound : AudioStreamPlayer3D var initial_timer var lost_target_timer var shot_timer = 0.0 func Enter(): initial_timer = initial_wait_time lost_target_timer = time_to_lose_target alert_sound.play() clear_points_of_interest() func Physics_Update(delta): update_minimap(0,2.0,ColorSwatch.RED_COLOR) if enemy.is_player_visible(): #reset lost target timer lost_target_timer = time_to_lose_target #get player location enemy.cache_player_pos() #set player location as target update_player_target() #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: attack_sequence(delta) else: await get_tree().create_timer(.5).timeout Transitioned.emit(self,"reload") else: if lost_target_timer > 0: lost_target_timer -= delta #move and look at location move_to_nav_point(delta) turret_look3D(delta) else: Transitioned.emit(self,"search") func attack_sequence(delta): 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() 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 SignalBus.emit_signal("engaging_target",enemy,enemy.player_last_seen) 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)