From 9be895e89f4888515eac27c6af4c7c1918f47ca5 Mon Sep 17 00:00:00 2001 From: derek Date: Thu, 24 Apr 2025 15:22:30 -0500 Subject: [PATCH] AI has better detection, committing before a larger rework --- GameModes/standard.tres | 2 +- ai_test_scene.tscn | 60 +++++++++++++++++++++++++++ ai_test_scene.tscn20492494429.tmp | 60 +++++++++++++++++++++++++++ assets/blunderbus.tscn | 4 +- assets/shotgun_pellet.tscn | 2 +- assets/spider2.tscn | 24 ++++++++++- levels/railyard1.tscn | 1 - project.godot | 2 +- respawn_enemies_button.tscn | 15 +++++++ scripts/EnemyAttack.gd | 44 ++++++++++---------- scripts/EnemyIdle.gd | 1 + scripts/EnemyReload.gd | 3 +- scripts/EnemyStates.gd | 20 +++++++++ scripts/bullet_enemy.gd | 7 ++-- scripts/enemy_stunned.gd | 11 ++++- scripts/respawn_enemies_button.gd | 7 ++++ scripts/respawn_enemies_button.gd.uid | 1 + scripts/room_manager.gd | 16 +++---- scripts/spider.gd | 8 +++- 19 files changed, 240 insertions(+), 48 deletions(-) create mode 100644 ai_test_scene.tscn create mode 100644 ai_test_scene.tscn20492494429.tmp create mode 100644 respawn_enemies_button.tscn create mode 100644 scripts/respawn_enemies_button.gd create mode 100644 scripts/respawn_enemies_button.gd.uid diff --git a/GameModes/standard.tres b/GameModes/standard.tres index c9b402d..10454be 100644 --- a/GameModes/standard.tres +++ b/GameModes/standard.tres @@ -10,7 +10,7 @@ win_conditions = 0 survival_time = 160.0 max_number_of_chests = 3 money_lost_multiplier = 0.5 -die_on_leaving_bounds = true +die_on_leaving_bounds = false weapon_penalty = 1 weapon_drop_percentage = 0.5 ammo_drop_percentage = 0.5 diff --git a/ai_test_scene.tscn b/ai_test_scene.tscn new file mode 100644 index 0000000..21c286f --- /dev/null +++ b/ai_test_scene.tscn @@ -0,0 +1,60 @@ +[gd_scene load_steps=12 format=3 uid="uid://cfaydhd6u5bmb"] + +[ext_resource type="Script" uid="uid://bkii8jwf0k7tq" path="res://scripts/LevelManager.gd" id="1_wa46b"] +[ext_resource type="PackedScene" uid="uid://24slv0pyxcd5" path="res://assets/level_bounds.tscn" id="2_a2a5u"] +[ext_resource type="PackedScene" uid="uid://cwy8iv8nlwqrc" path="res://assets/realtime_day_night_cycle.tscn" id="2_i7wgr"] +[ext_resource type="PackedScene" uid="uid://bj1y0fbjtul4a" path="res://post_processing.tscn" id="3_a2a5u"] +[ext_resource type="Material" uid="uid://br2pyyyl2n3cx" path="res://assets/materials/prototype/prototype1.tres" id="4_t6ubg"] +[ext_resource type="Script" uid="uid://12l74jckdnpl" path="res://scripts/room_manager.gd" id="5_sdike"] +[ext_resource type="PackedScene" uid="uid://c7dhavrt11u55" path="res://enemy_spawner.tscn" id="6_5u3xe"] +[ext_resource type="PackedScene" uid="uid://drwae3loscbw7" path="res://assets/player.tscn" id="7_540vx"] +[ext_resource type="PackedScene" uid="uid://dvmqvjrnt4sgh" path="res://respawn_enemies_button.tscn" id="7_i7wgr"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_t6ubg"] +size = Vector3(92.25, 82.386, 76.6396) + +[sub_resource type="NavigationMesh" id="NavigationMesh_wa46b"] +vertices = PackedVector3Array(-2.62451, 1, 8.13086, -2.62451, 1, 1.63086, -4.87451, 1, 1.38086, -18.1245, 1, 8.13086, -4.87451, 1, -1.36914, -2.62451, 1, -1.61914, -2.62451, 1, -8.11914, -18.1245, 1, -8.11914, 2.62549, 1, -1.61914, 2.62549, 1, -8.11914, 4.87549, 1, 1.38086, 2.62549, 1, 1.63086, 2.62549, 1, 8.13086, 18.1255, 1, 8.13086, 4.87549, 1, -1.36914, 18.1255, 1, -8.11914, -3.87451, 4.5, -0.619141, -3.87451, 4.5, 0.630859, 3.87549, 4.5, 0.630859, 3.87549, 4.5, -0.619141, -3.62451, 1, -0.369141, -3.62451, 1, 0.380859, 3.62549, 1, 0.380859, 3.62549, 1, -0.369141) +polygons = [PackedInt32Array(1, 0, 2), PackedInt32Array(2, 0, 3), PackedInt32Array(5, 4, 6), PackedInt32Array(6, 4, 7), PackedInt32Array(2, 3, 4), PackedInt32Array(4, 3, 7), PackedInt32Array(6, 9, 5), PackedInt32Array(5, 9, 8), PackedInt32Array(11, 10, 12), PackedInt32Array(12, 10, 13), PackedInt32Array(8, 9, 14), PackedInt32Array(14, 9, 15), PackedInt32Array(14, 15, 10), PackedInt32Array(10, 15, 13), PackedInt32Array(19, 18, 16), PackedInt32Array(16, 18, 17), PackedInt32Array(23, 22, 20), PackedInt32Array(20, 22, 21), PackedInt32Array(1, 11, 0), PackedInt32Array(0, 11, 12)] + +[node name="AI Test Scene" type="Node3D"] +script = ExtResource("1_wa46b") + +[node name="LevelBounds" parent="." instance=ExtResource("2_a2a5u")] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="LevelBounds"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -16.9679, 0) +shape = SubResource("BoxShape3D_t6ubg") + +[node name="Player" parent="." instance=ExtResource("7_540vx")] +transform = Transform3D(-0.691652, 0, -0.722231, 0, 1, 0, 0.722231, 0, -0.691652, 0.224148, 1.46383, -4.4728) + +[node name="Realtime Day Night Cycle" parent="." instance=ExtResource("2_i7wgr")] + +[node name="PostProcessing" parent="." instance=ExtResource("3_a2a5u")] + +[node name="NavigationRegion3D" type="NavigationRegion3D" parent="."] +navigation_mesh = SubResource("NavigationMesh_wa46b") + +[node name="CSGBox3D" type="CSGBox3D" parent="NavigationRegion3D"] +material_override = ExtResource("4_t6ubg") +use_collision = true +size = Vector3(37.249, 1, 17.2383) +material = ExtResource("4_t6ubg") + +[node name="CSGBox3D2" type="CSGBox3D" parent="NavigationRegion3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.84595, 0) +material_override = ExtResource("4_t6ubg") +use_collision = true +size = Vector3(8.57251, 4.69189, 1.95508) +material = ExtResource("4_t6ubg") + +[node name="Level" type="Node3D" parent="."] +script = ExtResource("5_sdike") +start_enemies = 1 + +[node name="RespawnEnemies" parent="Level" instance=ExtResource("7_i7wgr")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.28023, 1.45981, -1.07754) + +[node name="EnemySpawner" parent="Level" instance=ExtResource("6_5u3xe")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.291284, 1, 3.32874) diff --git a/ai_test_scene.tscn20492494429.tmp b/ai_test_scene.tscn20492494429.tmp new file mode 100644 index 0000000..21c286f --- /dev/null +++ b/ai_test_scene.tscn20492494429.tmp @@ -0,0 +1,60 @@ +[gd_scene load_steps=12 format=3 uid="uid://cfaydhd6u5bmb"] + +[ext_resource type="Script" uid="uid://bkii8jwf0k7tq" path="res://scripts/LevelManager.gd" id="1_wa46b"] +[ext_resource type="PackedScene" uid="uid://24slv0pyxcd5" path="res://assets/level_bounds.tscn" id="2_a2a5u"] +[ext_resource type="PackedScene" uid="uid://cwy8iv8nlwqrc" path="res://assets/realtime_day_night_cycle.tscn" id="2_i7wgr"] +[ext_resource type="PackedScene" uid="uid://bj1y0fbjtul4a" path="res://post_processing.tscn" id="3_a2a5u"] +[ext_resource type="Material" uid="uid://br2pyyyl2n3cx" path="res://assets/materials/prototype/prototype1.tres" id="4_t6ubg"] +[ext_resource type="Script" uid="uid://12l74jckdnpl" path="res://scripts/room_manager.gd" id="5_sdike"] +[ext_resource type="PackedScene" uid="uid://c7dhavrt11u55" path="res://enemy_spawner.tscn" id="6_5u3xe"] +[ext_resource type="PackedScene" uid="uid://drwae3loscbw7" path="res://assets/player.tscn" id="7_540vx"] +[ext_resource type="PackedScene" uid="uid://dvmqvjrnt4sgh" path="res://respawn_enemies_button.tscn" id="7_i7wgr"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_t6ubg"] +size = Vector3(92.25, 82.386, 76.6396) + +[sub_resource type="NavigationMesh" id="NavigationMesh_wa46b"] +vertices = PackedVector3Array(-2.62451, 1, 8.13086, -2.62451, 1, 1.63086, -4.87451, 1, 1.38086, -18.1245, 1, 8.13086, -4.87451, 1, -1.36914, -2.62451, 1, -1.61914, -2.62451, 1, -8.11914, -18.1245, 1, -8.11914, 2.62549, 1, -1.61914, 2.62549, 1, -8.11914, 4.87549, 1, 1.38086, 2.62549, 1, 1.63086, 2.62549, 1, 8.13086, 18.1255, 1, 8.13086, 4.87549, 1, -1.36914, 18.1255, 1, -8.11914, -3.87451, 4.5, -0.619141, -3.87451, 4.5, 0.630859, 3.87549, 4.5, 0.630859, 3.87549, 4.5, -0.619141, -3.62451, 1, -0.369141, -3.62451, 1, 0.380859, 3.62549, 1, 0.380859, 3.62549, 1, -0.369141) +polygons = [PackedInt32Array(1, 0, 2), PackedInt32Array(2, 0, 3), PackedInt32Array(5, 4, 6), PackedInt32Array(6, 4, 7), PackedInt32Array(2, 3, 4), PackedInt32Array(4, 3, 7), PackedInt32Array(6, 9, 5), PackedInt32Array(5, 9, 8), PackedInt32Array(11, 10, 12), PackedInt32Array(12, 10, 13), PackedInt32Array(8, 9, 14), PackedInt32Array(14, 9, 15), PackedInt32Array(14, 15, 10), PackedInt32Array(10, 15, 13), PackedInt32Array(19, 18, 16), PackedInt32Array(16, 18, 17), PackedInt32Array(23, 22, 20), PackedInt32Array(20, 22, 21), PackedInt32Array(1, 11, 0), PackedInt32Array(0, 11, 12)] + +[node name="AI Test Scene" type="Node3D"] +script = ExtResource("1_wa46b") + +[node name="LevelBounds" parent="." instance=ExtResource("2_a2a5u")] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="LevelBounds"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -16.9679, 0) +shape = SubResource("BoxShape3D_t6ubg") + +[node name="Player" parent="." instance=ExtResource("7_540vx")] +transform = Transform3D(-0.691652, 0, -0.722231, 0, 1, 0, 0.722231, 0, -0.691652, 0.224148, 1.46383, -4.4728) + +[node name="Realtime Day Night Cycle" parent="." instance=ExtResource("2_i7wgr")] + +[node name="PostProcessing" parent="." instance=ExtResource("3_a2a5u")] + +[node name="NavigationRegion3D" type="NavigationRegion3D" parent="."] +navigation_mesh = SubResource("NavigationMesh_wa46b") + +[node name="CSGBox3D" type="CSGBox3D" parent="NavigationRegion3D"] +material_override = ExtResource("4_t6ubg") +use_collision = true +size = Vector3(37.249, 1, 17.2383) +material = ExtResource("4_t6ubg") + +[node name="CSGBox3D2" type="CSGBox3D" parent="NavigationRegion3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.84595, 0) +material_override = ExtResource("4_t6ubg") +use_collision = true +size = Vector3(8.57251, 4.69189, 1.95508) +material = ExtResource("4_t6ubg") + +[node name="Level" type="Node3D" parent="."] +script = ExtResource("5_sdike") +start_enemies = 1 + +[node name="RespawnEnemies" parent="Level" instance=ExtResource("7_i7wgr")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.28023, 1.45981, -1.07754) + +[node name="EnemySpawner" parent="Level" instance=ExtResource("6_5u3xe")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.291284, 1, 3.32874) diff --git a/assets/blunderbus.tscn b/assets/blunderbus.tscn index 3d8998f..c2ffca5 100644 --- a/assets/blunderbus.tscn +++ b/assets/blunderbus.tscn @@ -45,12 +45,12 @@ start_mags = 10 bullet_damage = 1 smoke_enabled = false bullet_force_mod = 5.0 -bullet_speed = 600 +bullet_speed = 150 vibration_weak_magnitude = 0.1 vibration_strong_magnitude = 0.5 vibration_duration = 0.1 chamber_rot_amount = 60.0 -shotgun_spread = Vector3(180, 180, 180) +shotgun_spread = Vector3(45, 45, 45) pellets_per_shot = 50 blast_power = 50.0 hitscan_range = 100.0 diff --git a/assets/shotgun_pellet.tscn b/assets/shotgun_pellet.tscn index a259b0b..6236d59 100644 --- a/assets/shotgun_pellet.tscn +++ b/assets/shotgun_pellet.tscn @@ -34,7 +34,7 @@ mass = 0.01 physics_material_override = SubResource("PhysicsMaterial_0ewk3") continuous_cd = true contact_monitor = true -max_contacts_reported = 1 +max_contacts_reported = 10 script = ExtResource("1_1v1ju") collision_shape = NodePath("CollisionShape3D") mesh = NodePath("MeshInstance3D") diff --git a/assets/spider2.tscn b/assets/spider2.tscn index 549bf10..818d82f 100644 --- a/assets/spider2.tscn +++ b/assets/spider2.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=87 format=4 uid="uid://djr7vnr1hcx82"] +[gd_scene load_steps=88 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"] @@ -29,6 +29,9 @@ [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"] +[sub_resource type="SphereShape3D" id="SphereShape3D_fborx"] +radius = 15.0 + [sub_resource type="ViewportTexture" id="ViewportTexture_87l3v"] viewport_path = NodePath("SubViewport") @@ -821,12 +824,14 @@ random_pitch = 1.1 streams_count = 1 stream_0/stream = ExtResource("25_lr3lm") -[node name="spider" type="CharacterBody3D" node_paths=PackedStringArray("nav_agent") groups=["enemy", "persist"]] +[node name="spider" type="CharacterBody3D" node_paths=PackedStringArray("nav_agent", "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") +visibility_areas = [NodePath("VisibilityArea")] +line_of_sight_ray = NodePath("LineOfSight") bullet = ExtResource("2_aew5r") casing = ExtResource("3_e5ft5") bullet_speed = 75 @@ -843,6 +848,7 @@ initial_state = NodePath("Idle") 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")] script = ExtResource("8_wpql0") @@ -859,6 +865,7 @@ metadata/_custom_type_script = "uid://dhxolagi0b5s1" script = ExtResource("10_gicen") 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")] script = ExtResource("11_ekglj") @@ -866,6 +873,14 @@ reload_sound = NodePath("../../AUIDO/Reload") enemy = NodePath("../..") enemy_targets = [NodePath("../../body/backTarget")] +[node name="VisibilityArea" type="Area3D" parent="."] +collision_layer = 0 +collision_mask = 4 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="VisibilityArea"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -14.4461) +shape = SubResource("SphereShape3D_fborx") + [node name="HealthBarSprite" parent="." node_paths=PackedStringArray("character") instance=ExtResource("7_87l3v")] transform = Transform3D(0.254412, 0, 0, 0, 0.561068, 0, 0, 0, 1, 0, 2.41498, 0) billboard = 2 @@ -937,6 +952,11 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00161432, 1.62046, 0.001342 target_position = Vector3(0, 0, -50) collision_mask = 5 +[node name="LineOfSight" type="RayCast3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00161432, 1.62046, 0.00134204) +target_position = Vector3(0, 0, -50) +collision_mask = 5 + [node name="SpiderLookNext" type="RayCast3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00161432, 1.62046, 0.00134204) target_position = Vector3(0, 0, -50) diff --git a/levels/railyard1.tscn b/levels/railyard1.tscn index 44fa8cb..da2c885 100644 --- a/levels/railyard1.tscn +++ b/levels/railyard1.tscn @@ -82,7 +82,6 @@ transform = Transform3D(-0.35127, 0, 0.936274, 0, 1, 0, -0.936274, 0, -0.35127, [node name="Enemies" type="Node3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.104294, 0.338203, -0.0832825) script = ExtResource("8_mayil") -number_of_enemies = 30 [node name="EnemySpawner" parent="Enemies" instance=ExtResource("12_qbq7k")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -115.723, 9.32938, 68.5121) diff --git a/project.godot b/project.godot index bdaed21..2ea5981 100644 --- a/project.godot +++ b/project.godot @@ -12,7 +12,7 @@ config_version=5 config/name="First Person Test" config/tags=PackedStringArray("fps") -run/main_scene="uid://bk4pn4k7n51ux" +run/main_scene="uid://cfaydhd6u5bmb" config/features=PackedStringArray("4.4", "Forward Plus") config/icon="uid://6svuq1l83al5" diff --git a/respawn_enemies_button.tscn b/respawn_enemies_button.tscn new file mode 100644 index 0000000..33719f5 --- /dev/null +++ b/respawn_enemies_button.tscn @@ -0,0 +1,15 @@ +[gd_scene load_steps=3 format=3 uid="uid://dvmqvjrnt4sgh"] + +[ext_resource type="PackedScene" uid="uid://h05qay3qri4e" path="res://assets/switch_1.tscn" id="1_oi2lf"] +[ext_resource type="Script" uid="uid://bi1rvqju6nwh7" path="res://scripts/respawn_enemies_button.gd" id="1_wrpub"] + +[node name="RespawnEnemies" type="Node3D"] +script = ExtResource("1_wrpub") + +[node name="Respawn Enemies" type="Label3D" parent="."] +transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0.573406, 0) +text = "Respawn Enemies" + +[node name="Switch1" parent="." instance=ExtResource("1_oi2lf")] + +[connection signal="switch_changed" from="Switch1" to="." method="_on_switch_1_switch_changed"] diff --git a/scripts/EnemyAttack.gd b/scripts/EnemyAttack.gd index efdf4f2..0be3f57 100644 --- a/scripts/EnemyAttack.gd +++ b/scripts/EnemyAttack.gd @@ -3,45 +3,50 @@ 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 -@onready var player = get_tree().current_scene.player - var ammo +var initial_timer var shot_timer = 0.0 func Enter(): super() update_waypoint() ammo = enemy.max_ammo + enemy.turret_material.emission_enabled = true + initial_timer = initial_wait_time func update_waypoint(): - enemy.nav_agent.set_target_position(player.global_position) + enemy.nav_agent.set_target_position(enemy.character_follow.global_position) func Update(delta): if heartbeat > 0: heartbeat -= delta else: update_waypoint() - #fire if player in view - if 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) - ammo -= 2 - enemy.turret_material.emission_enabled = true - await get_tree().create_timer(.1).timeout - attack() + #Initial wait time + if initial_timer > 0: + initial_timer -= delta else: - await get_tree().create_timer(.5).timeout - Transitioned.emit(self,"reload") + #fire if player in view + if 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_next.look_at(player.global_position) + enemy.turret_look_next.look_at(enemy.character_follow.global_position) 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() @@ -61,11 +66,8 @@ func attack(): enemy.smoke_2.emitting = true enemy.turret_material.emission_enabled = false -func reload(): - await get_tree().create_timer(reload_time).timeout - ammo = enemy.max_ammo - func fire(barrel): + ammo -= 1 var instance_bullet = enemy.bullet.instantiate() instance_bullet.position = barrel.global_position instance_bullet.transform.basis = barrel.global_transform.basis diff --git a/scripts/EnemyIdle.gd b/scripts/EnemyIdle.gd index 0afbe55..4a30730 100644 --- a/scripts/EnemyIdle.gd +++ b/scripts/EnemyIdle.gd @@ -31,6 +31,7 @@ func Enter(): scan_direction = deg_to_rad(TURRET_TURN_AMT) func Update(delta: float): + super(delta) if wander_time > 0: wander_time -= delta else: diff --git a/scripts/EnemyReload.gd b/scripts/EnemyReload.gd index 6997713..33f67d3 100644 --- a/scripts/EnemyReload.gd +++ b/scripts/EnemyReload.gd @@ -3,6 +3,7 @@ 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 @@ -47,7 +48,7 @@ func Physics_Update(delta): enemy.velocity = direction * move_speed enemy.spider_look_next.look_at(player.global_position) var look_target = enemy.spider_look_next.global_rotation.y - enemy.global_rotation.y = lerp(enemy.global_rotation.y,look_target,delta * 3) + enemy.global_rotation.y = lerp(enemy.global_rotation.y,look_target,delta * body_turn_speed) func finished_reload(): if enemy.turret_look_next.is_colliding(): diff --git a/scripts/EnemyStates.gd b/scripts/EnemyStates.gd index bf28071..e924581 100644 --- a/scripts/EnemyStates.gd +++ b/scripts/EnemyStates.gd @@ -4,12 +4,32 @@ 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 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: + for area in enemy.visibility_areas: + var bodies = area.get_overlapping_bodies() + if bodies != null: + for i in bodies: + enemy.point_of_interest = i.global_position + else: + enemy.point_of_interest = 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") + + func take_damage(dam,bullet_damage): SignalBus.emit_signal("enemy_hit") enemy.health -= dam * bullet_damage diff --git a/scripts/bullet_enemy.gd b/scripts/bullet_enemy.gd index 75b5969..2f14184 100644 --- a/scripts/bullet_enemy.gd +++ b/scripts/bullet_enemy.gd @@ -20,7 +20,6 @@ var target_type @export var bullethole : Resource @onready var level_control = get_tree().current_scene -var rng = RandomNumberGenerator.new() var av_x var av_y var av_z @@ -28,9 +27,9 @@ var av_z # Called when the node enters the scene tree for the first time. func _ready(): #apply random rotation - av_x = deg_to_rad(rng.randf_range(-random_spread_amt,random_spread_amt)) - av_y = deg_to_rad(rng.randf_range(-random_spread_amt,random_spread_amt)) - av_z = deg_to_rad(rng.randf_range(-random_spread_amt,random_spread_amt)) + av_x = deg_to_rad(randf_range(-random_spread_amt,random_spread_amt)) + av_y = deg_to_rad(randf_range(-random_spread_amt,random_spread_amt)) + av_z = deg_to_rad(randf_range(-random_spread_amt,random_spread_amt)) rotation += Vector3(av_x,av_y,av_z) timer.start() diff --git a/scripts/enemy_stunned.gd b/scripts/enemy_stunned.gd index be6f216..a27b155 100644 --- a/scripts/enemy_stunned.gd +++ b/scripts/enemy_stunned.gd @@ -2,12 +2,14 @@ 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 @@ -18,6 +20,7 @@ func Enter(): if stunned_stars: stunned_stars.visible = true randomize_wander() + stun_time = stun_time_start func _Exit(): if stunned_stars: @@ -28,6 +31,12 @@ func Update(delta): 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: @@ -36,7 +45,7 @@ func Physics_Update(delta : float): var direction = local_destination.normalized() if enemy.global_position.distance_to(local_destination) > 1: enemy.velocity = direction * move_speed - enemy.global_rotation.y += delta + enemy.global_rotation.y += delta * 4 func randomize_wander(): var x = randf_range(-WANDER_AMT,WANDER_AMT) diff --git a/scripts/respawn_enemies_button.gd b/scripts/respawn_enemies_button.gd new file mode 100644 index 0000000..187eed8 --- /dev/null +++ b/scripts/respawn_enemies_button.gd @@ -0,0 +1,7 @@ +extends Node3D + + +func _on_switch_1_switch_changed() -> void: + var parent = get_parent() + parent.number_of_enemies = 1 + parent.spawn_enemies() diff --git a/scripts/respawn_enemies_button.gd.uid b/scripts/respawn_enemies_button.gd.uid new file mode 100644 index 0000000..2ac6afa --- /dev/null +++ b/scripts/respawn_enemies_button.gd.uid @@ -0,0 +1 @@ +uid://bi1rvqju6nwh7 diff --git a/scripts/room_manager.gd b/scripts/room_manager.gd index 2b8e796..06e759a 100644 --- a/scripts/room_manager.gd +++ b/scripts/room_manager.gd @@ -2,7 +2,7 @@ extends Node @export_group("Main") @export var room_lockdown : bool = false -@export var number_of_enemies : int = 20 +@export var start_enemies : int = 20 @export var spawnable_enemies = preload("res://assets/spider2.tscn") @export_group("Key") @export var key_drop : bool = false @@ -11,13 +11,13 @@ extends Node @export_group("Item Drops") @export var number_of_drops = 5 -var enemies = [] var doors = [] var room_checks = [] var enemy_spawners = [] -var number_enemies : int +@onready var number_of_enemies : int = start_enemies var rot_amount : float + # Called when the node enters the scene tree for the first time. func _ready(): SignalBus.enemy_killed.connect(enemy_in_room_killed) @@ -29,9 +29,7 @@ func _process(delta): pass func assign_elements(): - for i in self.get_children(): - if i is Enemy: - enemies.append(i) + for i in get_children(): if i.is_in_group("door"): doors.append(i) if i.is_in_group("room_check"): @@ -71,7 +69,7 @@ func room_exited(): i.open() func spawn_enemies(): - while number_of_enemies >= 0: + while number_of_enemies > 0: number_of_enemies -= 1 var random_spawner = enemy_spawners.pick_random() @@ -81,7 +79,3 @@ func spawn_enemies(): add_child(enemy) enemy.global_position = set_pos - await number_enemies == 0 - for i in self.get_children(): - if i is Enemy: - enemies.append(i) diff --git a/scripts/spider.gd b/scripts/spider.gd index d8b8aae..b7f53df 100644 --- a/scripts/spider.gd +++ b/scripts/spider.gd @@ -11,11 +11,13 @@ var last_enemy : bool = false @export var max_ammo = 10 @export var loot_amount = 2 @export var nav_agent : NavigationAgent3D +@export var visibility_areas : Array[Area3D] +@export var line_of_sight_ray : RayCast3D @export_enum("Enemy", "Trap") var enemy_type: int @export var bullet : Resource @export var casing : Resource -@export var bullet_speed = 150 +@export var bullet_speed = 10 @export var bullet_drop = .1 @export var random_spread_amt = .01 @export var bullet_damage = 1 @@ -74,7 +76,9 @@ var player_last_seen var knocked = false var stunned = false var health -var turret_current_moving_speed + +var point_of_interest +var character_follow func _ready(): health = start_health