diff --git a/assets/Audio/Enemy SFX/alarm Mixdown 1.mp3 b/assets/Audio/Enemy SFX/alarm Mixdown 1.mp3 new file mode 100644 index 0000000..11593bb Binary files /dev/null and b/assets/Audio/Enemy SFX/alarm Mixdown 1.mp3 differ diff --git a/assets/Audio/Enemy SFX/alarm Mixdown 1.mp3.import b/assets/Audio/Enemy SFX/alarm Mixdown 1.mp3.import new file mode 100644 index 0000000..f26970f --- /dev/null +++ b/assets/Audio/Enemy SFX/alarm Mixdown 1.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://chl8fl1ywr0bd" +path="res://.godot/imported/alarm Mixdown 1.mp3-bf454c731c69ae79d784c786c945fab8.mp3str" + +[deps] + +source_file="res://assets/Audio/Enemy SFX/alarm Mixdown 1.mp3" +dest_files=["res://.godot/imported/alarm Mixdown 1.mp3-bf454c731c69ae79d784c786c945fab8.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/Audio/Enemy SFX/alarm Mixdown 5.mp3 b/assets/Audio/Enemy SFX/alarm Mixdown 5.mp3 new file mode 100644 index 0000000..69b4f37 Binary files /dev/null and b/assets/Audio/Enemy SFX/alarm Mixdown 5.mp3 differ diff --git a/assets/Audio/Enemy SFX/alarm Mixdown 5.mp3.import b/assets/Audio/Enemy SFX/alarm Mixdown 5.mp3.import new file mode 100644 index 0000000..9cfafdb --- /dev/null +++ b/assets/Audio/Enemy SFX/alarm Mixdown 5.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://b2vhaokheg264" +path="res://.godot/imported/alarm Mixdown 5.mp3-13dd84b6e2f3416bc4b272542c5daca4.mp3str" + +[deps] + +source_file="res://assets/Audio/Enemy SFX/alarm Mixdown 5.mp3" +dest_files=["res://.godot/imported/alarm Mixdown 5.mp3-13dd84b6e2f3416bc4b272542c5daca4.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/Audio/Enemy SFX/alarm Mixdown 6.mp3 b/assets/Audio/Enemy SFX/alarm Mixdown 6.mp3 new file mode 100644 index 0000000..4d37b5b Binary files /dev/null and b/assets/Audio/Enemy SFX/alarm Mixdown 6.mp3 differ diff --git a/assets/Audio/Enemy SFX/alarm Mixdown 6.mp3.import b/assets/Audio/Enemy SFX/alarm Mixdown 6.mp3.import new file mode 100644 index 0000000..18b1cb9 --- /dev/null +++ b/assets/Audio/Enemy SFX/alarm Mixdown 6.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://dm2dmk23oxf5e" +path="res://.godot/imported/alarm Mixdown 6.mp3-ec9c1f82b9a3dd83f9647806821d21a3.mp3str" + +[deps] + +source_file="res://assets/Audio/Enemy SFX/alarm Mixdown 6.mp3" +dest_files=["res://.godot/imported/alarm Mixdown 6.mp3-ec9c1f82b9a3dd83f9647806821d21a3.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/Audio/Enemy SFX/low-battery-alarm-beeps-2-SBA-300420705.mp3 b/assets/Audio/Enemy SFX/low-battery-alarm-beeps-2-SBA-300420705.mp3 new file mode 100644 index 0000000..5ff7f97 Binary files /dev/null and b/assets/Audio/Enemy SFX/low-battery-alarm-beeps-2-SBA-300420705.mp3 differ diff --git a/assets/Audio/Enemy SFX/low-battery-alarm-beeps-2-SBA-300420705.mp3.import b/assets/Audio/Enemy SFX/low-battery-alarm-beeps-2-SBA-300420705.mp3.import new file mode 100644 index 0000000..1620e3c --- /dev/null +++ b/assets/Audio/Enemy SFX/low-battery-alarm-beeps-2-SBA-300420705.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://cigt88qjvuvxg" +path="res://.godot/imported/low-battery-alarm-beeps-2-SBA-300420705.mp3-dbb44829397d5251f1687ba46d057a0e.mp3str" + +[deps] + +source_file="res://assets/Audio/Enemy SFX/low-battery-alarm-beeps-2-SBA-300420705.mp3" +dest_files=["res://.godot/imported/low-battery-alarm-beeps-2-SBA-300420705.mp3-dbb44829397d5251f1687ba46d057a0e.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/assets/spider2.tscn b/assets/spider2.tscn index 818d82f..5d426a1 100644 --- a/assets/spider2.tscn +++ b/assets/spider2.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=88 format=4 uid="uid://djr7vnr1hcx82"] +[gd_scene load_steps=90 format=4 uid="uid://djr7vnr1hcx82"] [ext_resource type="Script" uid="uid://cdofgtwevbray" path="res://scripts/spider.gd" id="1_7e7fe"] [ext_resource type="PackedScene" uid="uid://h5ojldugfyyu" path="res://assets/bullet_enemy.tscn" id="2_aew5r"] @@ -28,6 +28,7 @@ [ext_resource type="AudioStream" uid="uid://bsfhh126bteon" path="res://assets/Audio/Weapons/7Mag Bolt Action Rifle/Gunshots/7Mag Bolt Action Rifle - Gunshot A 003.wav" id="25_aasxo"] [ext_resource type="AudioStream" uid="uid://d0n46ursprjjs" path="res://assets/Audio/Enemy SFX/servo-motor-SBA-300109173.mp3" id="25_lr3lm"] [ext_resource type="AudioStream" uid="uid://br3tyu6cmgyy2" path="res://assets/Audio/Weapons/7Mag Bolt Action Rifle/Gunshots/7Mag Bolt Action Rifle - Gunshot A 004.wav" id="26_1b3cb"] +[ext_resource type="AudioStream" uid="uid://chl8fl1ywr0bd" path="res://assets/Audio/Enemy SFX/alarm Mixdown 1.mp3" id="29_nhal8"] [sub_resource type="SphereShape3D" id="SphereShape3D_fborx"] radius = 15.0 @@ -824,12 +825,19 @@ random_pitch = 1.1 streams_count = 1 stream_0/stream = ExtResource("25_lr3lm") -[node name="spider" type="CharacterBody3D" node_paths=PackedStringArray("nav_agent", "visibility_areas", "line_of_sight_ray") groups=["enemy", "persist"]] +[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_aasxo"] +streams_count = 3 +stream_0/stream = ExtResource("29_nhal8") +stream_1/stream = ExtResource("29_nhal8") +stream_2/stream = ExtResource("29_nhal8") + +[node name="spider" type="CharacterBody3D" node_paths=PackedStringArray("nav_agent", "hit_targets", "visibility_areas", "line_of_sight_ray") groups=["enemy", "persist"]] collision_layer = 8 collision_mask = 521 up_direction = Vector3(0.0449994, 0.998987, 0) script = ExtResource("1_7e7fe") nav_agent = NodePath("NavigationAgent3D") +hit_targets = [NodePath("body/backTarget")] visibility_areas = [NodePath("VisibilityArea")] line_of_sight_ray = NodePath("LineOfSight") bullet = ExtResource("2_aew5r") @@ -844,34 +852,31 @@ taunts = Array[String](["did i do that?", "you've been on my shitlist", "you lik script = ExtResource("6_87l3v") initial_state = NodePath("Idle") -[node name="Idle" type="Node" parent="StateMachine" node_paths=PackedStringArray("enemy", "enemy_targets")] +[node name="Idle" type="Node" parent="StateMachine" node_paths=PackedStringArray("enemy")] script = ExtResource("7_cwyr0") enemy = NodePath("../..") -enemy_targets = [NodePath("../../body/backTarget")] can_see = true -[node name="Stunned" type="Node" parent="StateMachine" node_paths=PackedStringArray("stunned_stars", "enemy", "enemy_targets")] +[node name="Stunned" type="Node" parent="StateMachine" node_paths=PackedStringArray("stunned_stars", "enemy")] script = ExtResource("8_wpql0") stunned_stars = NodePath("../../body/StunnedStars") enemy = NodePath("../..") -enemy_targets = [NodePath("../../body/backTarget")] [node name="Die" type="Node" parent="StateMachine" node_paths=PackedStringArray("enemy")] script = ExtResource("9_6mvds") enemy = NodePath("../..") metadata/_custom_type_script = "uid://dhxolagi0b5s1" -[node name="Attack" type="Node" parent="StateMachine" node_paths=PackedStringArray("enemy", "enemy_targets")] +[node name="Attack" type="Node" parent="StateMachine" node_paths=PackedStringArray("alarm_sound", "enemy")] script = ExtResource("10_gicen") +alarm_sound = NodePath("../../AUIDO/Alarm") enemy = NodePath("../..") -enemy_targets = [NodePath("../../body/backTarget")] can_see = true -[node name="Reload" type="Node" parent="StateMachine" node_paths=PackedStringArray("reload_sound", "enemy", "enemy_targets")] +[node name="Reload" type="Node" parent="StateMachine" node_paths=PackedStringArray("reload_sound", "enemy")] script = ExtResource("11_ekglj") reload_sound = NodePath("../../AUIDO/Reload") enemy = NodePath("../..") -enemy_targets = [NodePath("../../body/backTarget")] [node name="VisibilityArea" type="Area3D" parent="."] collision_layer = 0 @@ -1115,6 +1120,9 @@ stream = SubResource("AudioStreamRandomizer_fborx") volume_db = -2.5 unit_size = 5.0 +[node name="Alarm" type="AudioStreamPlayer3D" parent="AUIDO"] +stream = SubResource("AudioStreamRandomizer_aasxo") + [connection signal="body_entered" from="body/backTarget" to="body/backTarget" method="_on_body_entered"] [connection signal="body_part_hit" from="body/backTarget" to="." method="_on_area_3d_body_part_hit"] [connection signal="timeout" from="Timers/prefire_timer" to="." method="_on_prefire_timer_timeout"] diff --git a/scripts/EnemyAttack.gd b/scripts/EnemyAttack.gd index 0be3f57..9bccd03 100644 --- a/scripts/EnemyAttack.gd +++ b/scripts/EnemyAttack.gd @@ -6,6 +6,7 @@ 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 var ammo @@ -18,9 +19,10 @@ func Enter(): ammo = enemy.max_ammo enemy.turret_material.emission_enabled = true initial_timer = initial_wait_time + alarm_sound.play() func update_waypoint(): - enemy.nav_agent.set_target_position(enemy.character_follow.global_position) + enemy.nav_agent.set_target_position(enemy.point_of_interest) func Update(delta): if heartbeat > 0: @@ -46,7 +48,7 @@ func Update(delta): Transitioned.emit(self,"reload") func Physics_Update(delta): - enemy.turret_look_next.look_at(enemy.character_follow.global_position) + enemy.turret_look_next.look_at(enemy.point_of_interest) 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() diff --git a/scripts/EnemyStates.gd b/scripts/EnemyStates.gd index e924581..44ab1f1 100644 --- a/scripts/EnemyStates.gd +++ b/scripts/EnemyStates.gd @@ -2,14 +2,9 @@ extends State class_name EnemyState @export var enemy : CharacterBody3D -@export var enemy_targets : Array[Area3D] @export var move_speed : float = 3 -@export var can_see : bool = false +@export var can_see : bool = false # indicates whether the enemy is able to see things in the state -func Enter(): - if enemy_targets != null: - for target in enemy_targets: - target.body_part_hit.connect(take_damage) func Update(delta): if enemy.visibility_areas != null: @@ -17,28 +12,15 @@ func Update(delta): var bodies = area.get_overlapping_bodies() if bodies != null: for i in bodies: - enemy.point_of_interest = i.global_position + if i is Player: + enemy.character_follow = i else: - enemy.point_of_interest = null + enemy.character_follow = null - if enemy.point_of_interest != null: - enemy.line_of_sight_ray.look_at(enemy.point_of_interest) - if enemy.line_of_sight_ray.is_colliding(): - if enemy.line_of_sight_ray.get_collider() is Player: - if can_see: - enemy.character_follow = enemy.line_of_sight_ray.get_collider() - Transitioned.emit(self,"attack") + if enemy.character_follow != null: + if can_see: + if enemy.is_player_visible(): + print("PLAYER SPOTTED") + enemy.cache_player_pos() + Transitioned.emit(self,"attack") - -func take_damage(dam,bullet_damage): - SignalBus.emit_signal("enemy_hit") - enemy.health -= dam * bullet_damage - enemy.health_bar_sprite.visible = true - enemy.health_bar_sprite.health_update() - var number_spawn = enemy.damage_number.instantiate() - number_spawn.damage_amt = bullet_damage * dam - number_spawn.position = enemy.global_position + Vector3(0,2,0) - get_tree().get_root().add_child(number_spawn) - - if enemy.health <= 0: - Transitioned.emit(self,"die") diff --git a/scripts/EnemyTarget.gd b/scripts/EnemyTarget.gd index c58b375..a02f4a8 100644 --- a/scripts/EnemyTarget.gd +++ b/scripts/EnemyTarget.gd @@ -7,5 +7,5 @@ signal body_part_hit(dam,bullet_damage) func hit(bullet_damage): emit_signal("body_part_hit", damage, bullet_damage) -func _on_body_entered(body: Node3D) -> void: - hit(body.bullet_damage) +#func _on_body_entered(body: Node3D) -> void: + #hit(body.bullet_damage) diff --git a/scripts/projectile.gd b/scripts/projectile.gd index 9a9dd6c..18a711d 100644 --- a/scripts/projectile.gd +++ b/scripts/projectile.gd @@ -34,6 +34,7 @@ func _physics_process(delta: float) -> void: collision_ray_length_adj() func damage(body): + print("BODY HIT : ",body) if body != null and !body.is_in_group("player"): if collision_raycast_3d != null: diff --git a/scripts/spider.gd b/scripts/spider.gd index b7f53df..399484e 100644 --- a/scripts/spider.gd +++ b/scripts/spider.gd @@ -11,6 +11,7 @@ var last_enemy : bool = false @export var max_ammo = 10 @export var loot_amount = 2 @export var nav_agent : NavigationAgent3D +@export var hit_targets : Array[Area3D] @export var visibility_areas : Array[Area3D] @export var line_of_sight_ray : RayCast3D @@ -71,14 +72,14 @@ var hive_velocity var hive_nav_point var dying var can_die : bool = false -var player_in_view = false -var player_last_seen var knocked = false var stunned = false var health + var point_of_interest var character_follow +var player_last_seen func _ready(): health = start_health @@ -90,12 +91,49 @@ func _ready(): await get_tree().create_timer(random_time).timeout postfire_timer.start() + if hit_targets != null: + for target in hit_targets: + target.body_part_hit.connect(take_damage) func _process(delta): move_and_slide() + look_at_player() + cache_player_pos() func stun(): - state_machine.on_child_transition(state_machine.current_state,"stunned") + change_state_to("stunned") + +func take_damage(dam,bullet_damage): + SignalBus.emit_signal("enemy_hit") + health -= dam * bullet_damage + health_bar_sprite.visible = true + health_bar_sprite.health_update() + var number_spawn = damage_number.instantiate() + number_spawn.damage_amt = bullet_damage * dam + number_spawn.position = global_position + Vector3(0,2,0) + get_tree().get_root().add_child(number_spawn) + + if health <= 0: + change_state_to("die") + +func change_state_to(set_state): + state_machine.on_child_transition(state_machine.current_state,set_state) + +func look_at_player(): + if character_follow != null: + line_of_sight_ray.look_at(character_follow.global_position) + +func is_player_visible(): + if line_of_sight_ray.is_colliding(): + if line_of_sight_ray.get_collider() is Player: + return true + + return false + +func cache_player_pos(): + if line_of_sight_ray.is_colliding(): + if line_of_sight_ray.get_collider() is Player: + point_of_interest = line_of_sight_ray.get_collision_point() func save(): var save_dict = {