AI has better detection, committing before a larger rework

This commit is contained in:
derek
2025-04-24 15:22:30 -05:00
parent 53ce4e401f
commit 9be895e89f
19 changed files with 240 additions and 48 deletions

View File

@@ -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

View File

@@ -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:

View File

@@ -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():

View File

@@ -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

View File

@@ -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()

View File

@@ -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)

View File

@@ -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()

View File

@@ -0,0 +1 @@
uid://bi1rvqju6nwh7

View File

@@ -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)

View File

@@ -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