Enemy Hivemind became Room Manager, will probably pull out the actual enemy script at some point

This commit is contained in:
derek
2024-11-07 11:21:21 -06:00
parent fa054ad3ed
commit 168963163a
25 changed files with 283 additions and 121 deletions

View File

@@ -1,39 +0,0 @@
extends Node
var minions = []
var minion_nav_point = []
var number_minions : int
var rot_amount : float
# Called when the node enters the scene tree for the first time.
func _ready():
minions = self.get_children()
add_to_group("enemy_hivemind")
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
#calculate move position for each child
for i in minions:
if i.player_in_view == true:
#by number of minions determine the amount they should rotate around the player to be evenly distributed
number_minions = minions.size()
#return current array index
var minion_rot_amount = minions.find(i) * deg_to_rad(360 / number_minions)
var player_pos = i.player.global_transform.origin
var minion_pos = player_pos + Vector3(4,0,0)
var nav_pos : Vector3
nav_pos.x = player_pos.x + (minion_pos.x-player_pos.x)*cos(minion_rot_amount) - (minion_pos.z-player_pos.z)*sin(minion_rot_amount)
nav_pos.z = player_pos.z + (minion_pos.x-player_pos.x)*sin(minion_rot_amount) - (minion_pos.z-player_pos.z)*cos(minion_rot_amount)
i.nav_agent.set_target_position(nav_pos)
var next_nav_point = i.nav_agent.get_next_path_position()
i.hive_velocity = (next_nav_point - i.global_transform.origin).normalized() * i.SPEED
elif i.player_in_view != true and i.player_last_seen != null:
i.nav_agent.set_target_position(i.player_last_seen)
var next_nav_point = i.nav_agent.get_next_path_position()
i.hive_velocity = (next_nav_point - i.global_transform.origin).normalized() * i.SPEED

View File

@@ -34,6 +34,7 @@ var particle_number = 0
var enemy_hiveminds = []
var remaining_enemies
var last_hit : Node
var target_type
var respawn_position
var respawn_cam_rotation
var respawn_rot
@@ -65,10 +66,11 @@ func _ready():
if player:
#Set up starting guns and ammo
held_guns = [gun_1]
var instance_gun = held_guns[0].instantiate()
ammo_current[0] = instance_gun.max_ammo
ammo_reserve[0] = instance_gun.max_ammo * instance_gun.start_mags
if gun_1 != null:
held_guns = [gun_1]
var instance_gun = held_guns[0].instantiate()
ammo_current[0] = instance_gun.max_ammo
ammo_reserve[0] = instance_gun.max_ammo * instance_gun.start_mags
if gun_2 != null:
held_guns.append(gun_2)
@@ -77,9 +79,10 @@ func _ready():
ammo_reserve.append(instance_gun_2.max_ammo * instance_gun_2.start_mags)
# Spawn first gun
current_gun_index = 0
gun_spawn(0)
if gun_1 != null:
current_gun_index = 0
gun_spawn(0)
#find enemy hiveminds
for node in get_tree().get_nodes_in_group("enemy_hivemind"):
enemy_hiveminds.append(node)
@@ -118,7 +121,7 @@ func gun_spawn(index):
func enemy_count():
var sum = 0
for i in enemy_hiveminds:
sum += i.minions.size()
sum += i.enemies.size()
print("enemies: " + str(sum))
if sum == 0:
cleared()
@@ -135,8 +138,8 @@ func die():
var instance_dead = dead_player.instantiate()
instance_dead.global_position = player.camera.global_position
instance_dead.transform.basis = player.global_transform.basis
#instance_dead.camera.rotation = player.camera.rotation
instance_dead.target = last_hit
instance_dead.target_type = target_type
instance_dead.respawn_position = respawn_position
instance_dead.respawn_rotation = respawn_cam_rotation
instance_dead.respawn_fov = player.camera.fov

View File

@@ -8,6 +8,7 @@ var bullet_force_mod = 1.0
var distance_from_player
var player
var fired_by
var target_type
@onready var mesh = $gunbullet1
@onready var ray = $RayCast3D
@@ -41,7 +42,7 @@ func _process(delta):
if ray.is_colliding() and ray.get_collider() != null:
if ray.get_collider().is_in_group("player"):
ray.get_collider().hit(bullet_damage,fired_by)
ray.get_collider().hit(bullet_damage,fired_by,target_type)
queue_free()
if ray.is_colliding() and ray.get_collider() != null:

View File

@@ -20,6 +20,7 @@ const DEAD_CAM_FOV = 50.0
var focus_dist
var target : Node
var target_type
var respawn_position
var respawn_rotation
var taunt_node
@@ -90,16 +91,19 @@ func _process(delta):
camera.fov = lerp(camera.fov, 40.0, delta * 5)
1:
#aim at player from enemy
focus_on_target(level_control.player)
Engine.time_scale = .05
AudioServer.set_bus_effect_enabled(0,0,true)
taunt_node.visible = false
var target_pos_adjusted = Vector3(target.global_position.x,target.global_position.y + 2.1,target.global_position.z)
cam_target.global_position = lerp(cam_target.global_position,target_pos_adjusted,delta * MOVE_SPEED)
look_ray.global_position = target.global_position
look_ray.look_at(Vector3(level_control.player.global_position), Vector3.UP)
camera.rotation = lerp(camera.rotation,look_ray.rotation,delta * CAMERA_LOOK_SPEED)
camera.fov = lerp(camera.fov, 100.0, delta * 75)
if target_type != 1:
focus_on_target(level_control.player)
Engine.time_scale = .05
AudioServer.set_bus_effect_enabled(0,0,true)
taunt_node.visible = false
var target_pos_adjusted = Vector3(target.global_position.x,target.global_position.y + 2.1,target.global_position.z)
cam_target.global_position = lerp(cam_target.global_position,target_pos_adjusted,delta * MOVE_SPEED)
look_ray.global_position = target.global_position
look_ray.look_at(Vector3(level_control.player.global_position), Vector3.UP)
camera.rotation = lerp(camera.rotation,look_ray.rotation,delta * CAMERA_LOOK_SPEED)
camera.fov = lerp(camera.fov, 100.0, delta * 75)
else:
_on_timer_timeout()
2:
var target_pos_adjusted = Vector3(target.global_position.x,target.global_position.y + 2.1,target.global_position.z)
cam_target.global_position = lerp(cam_target.global_position,target_pos_adjusted,delta * MOVE_SPEED)

View File

@@ -10,7 +10,8 @@ var taunts = ["hows your gut now you big cup of dumdum juice?",
"schwing!",
"hee hee",
"stop trying",
"you got hit with my bullet",
"you're on my shitlist",
"you like that?? you want more???",
"try dodging it next time",
"yowza!"]

View File

@@ -22,8 +22,6 @@ var moving_fast = false
var moving_fast_top_speed = 0.0
var mouse_input : Vector2
var rng = RandomNumberGenerator.new()
@export_group("Game Settings")
@export var AUDIO = true
@export_group("Player Movement")
@@ -472,8 +470,12 @@ func release_moveable():
held_item.set_constant_force(Vector3(0,0,0))
held_item = null
func hit(damage,fired_by):
func hit(damage, fired_by, target_type):
level_control.health -= damage
level_control.last_hit = fired_by
level_control.target_type = target_type
recoil.add_recoil(Vector3(.5,.1,.1),10,10)
hurt_audio.play()
health_indicator.color = Color(0.471, 0, 0, .25)
await get_tree().create_timer(.15).timeout
health_indicator.color = Color(0.471, 0, 0, 0)

20
scripts/room_check.gd Normal file
View File

@@ -0,0 +1,20 @@
extends Node
signal player_entered_room()
signal player_left_room()
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
add_to_group("room_check")
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
func _on_body_entered(body: Node3D) -> void:
if body.is_in_group("player"):
emit_signal("player_entered_room")
func _on_body_exited(body: Node3D) -> void:
if body.is_in_group("player"):
emit_signal("player_left_room")

57
scripts/room_manager.gd Normal file
View File

@@ -0,0 +1,57 @@
extends Node
var enemies = []
var doors = []
var room_checks = []
var number_enemies : int
var rot_amount : float
# Called when the node enters the scene tree for the first time.
func _ready():
for i in self.get_children():
if i.is_in_group("enemy"):
enemies.append(i)
i.last_enemy_dead.connect(last_enemy_dead)
if i.is_in_group("door"):
doors.append(i)
if i.is_in_group("room_check"):
room_checks.append(i)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
if enemies.size() > 0:
#calculate move position for each child
for i in enemies:
if i.player_in_view == true:
#by number of minions determine the amount they should rotate around the player to be evenly distributed
number_enemies = enemies.size()
#return current array index
var enemy_rot_amount = enemies.find(i) * deg_to_rad(360 / number_enemies)
var player_pos = i.player.global_transform.origin
var enemy_pos = player_pos + Vector3(4,0,0)
var nav_pos : Vector3
nav_pos.x = player_pos.x + (enemy_pos.x-player_pos.x)*cos(enemy_rot_amount) - (enemy_pos.z-player_pos.z)*sin(enemy_rot_amount)
nav_pos.z = player_pos.z + (enemy_pos.x-player_pos.x)*sin(enemy_rot_amount) - (enemy_pos.z-player_pos.z)*cos(enemy_rot_amount)
i.nav_agent.set_target_position(nav_pos)
var next_nav_point = i.nav_agent.get_next_path_position()
i.hive_velocity = (next_nav_point - i.global_transform.origin).normalized() * i.SPEED
elif i.player_in_view != true and i.player_last_seen != null:
i.nav_agent.set_target_position(i.player_last_seen)
var next_nav_point = i.nav_agent.get_next_path_position()
i.hive_velocity = (next_nav_point - i.global_transform.origin).normalized() * i.SPEED
# loot on last enemy
if enemies.size() == 1:
for i in enemies:
i.loot_amount = 30 #later get this number from level manager
i.last_enemy = true
func last_enemy_dead():
for i in doors:
i.open()

View File

@@ -1,13 +1,17 @@
extends CharacterBody3D
var player
@export var health = 3
@export var number_of_drops = 3
signal last_enemy_dead()
var player
var loot_amount = 0
var last_enemy : bool = false
@export var health = 3
@export var SPEED = 3.0
const MAX_LV = 20
const MAX_AV = 10
@export_enum("Enemy", "Trap") var enemy_type: int
@export var player_path : NodePath
@export var bullet : Resource
@export var casing : Resource
@@ -53,7 +57,6 @@ $body/bodyoutline]
var gravity = 9.8
var particlespawn
var rng = RandomNumberGenerator.new()
var rand_select
var rand_item
var body_look_to
@@ -70,7 +73,7 @@ func _ready():
turret_material.emission_enabled = false
#randomly start the postfire timer so enemy turrets aren't synced
var random_time = rng.randf_range(0,5)
var random_time = randf_range(0,5)
await get_tree().create_timer(random_time).timeout
postfire_timer.start()
@@ -107,33 +110,7 @@ func _on_area_3d_body_part_hit(dam,bullet_damage):
health -= dam * bullet_damage
print("health: " + str(health))
if health <= 0:
#remove from parent array
get_parent().minions.erase(self)
level_control.enemy_count()
particlespawn = die_particles.instantiate()
particlespawn.position = self.global_position
particlespawn.transform.basis = self.global_transform.basis
get_tree().get_root().add_child(particlespawn)
#pickup drop
while number_of_drops > 0:
var rand_item = level_control.pickup_spawn()
var lv_x = randf_range(-MAX_LV,MAX_LV)
var lv_y = randf_range(0,MAX_LV)
var lv_z = randf_range(-MAX_LV,MAX_LV)
var av_x = randf_range(-MAX_AV,MAX_AV)
var av_y = randf_range(-MAX_AV,MAX_AV)
var av_z = randf_range(-MAX_AV,MAX_AV)
# Random Item Drop
rand_item.position = self.global_position
rand_item.transform.basis = self.global_transform.basis
rand_item.linear_velocity += self.global_transform.basis * Vector3(lv_x,lv_y,lv_z)
rand_item.angular_velocity += self.global_transform.basis * Vector3(av_x,av_y,av_z)
get_tree().get_root().add_child(rand_item)
number_of_drops -= 1
queue_free()
die()
func _on_prefire_timer_timeout():
@@ -169,12 +146,13 @@ func _on_stunned_timer_timeout():
func fire(barrel):
var instance_bullet = bullet.instantiate()
instance_bullet.position = barrel.global_position
instance_bullet.transform.basis = barrel_1.global_transform.basis
instance_bullet.transform.basis = barrel.global_transform.basis
instance_bullet.bullet_speed = bullet_speed
instance_bullet.bullet_drop = bullet_drop
instance_bullet.random_spread_amt = random_spread_amt
instance_bullet.bullet_damage = bullet_damage
instance_bullet.fired_by = self
instance_bullet.target_type = enemy_type
get_tree().get_root().add_child(instance_bullet)
audio_fire.play()
spawn_casing()
@@ -184,3 +162,38 @@ func spawn_casing():
instance_casing.position = casing_ejector.global_position
instance_casing.transform.basis = casing_ejector.global_transform.basis
instance_casing.player_velocity = velocity * transform.basis
func die():
#remove from parent array
get_parent().enemies.erase(self)
level_control.enemy_count()
particlespawn = die_particles.instantiate()
particlespawn.position = self.global_position
particlespawn.transform.basis = self.global_transform.basis
get_tree().get_root().add_child(particlespawn)
drop_loot(loot_amount)
if last_enemy:
emit_signal("last_enemy_dead")
queue_free()
func drop_loot(number_of_drops):
#pickup drop
while number_of_drops > 0:
var rand_item = level_control.pickup_spawn()
var lv_x = randf_range(-MAX_LV,MAX_LV)
var lv_y = randf_range(0,MAX_LV)
var lv_z = randf_range(-MAX_LV,MAX_LV)
var av_x = randf_range(-MAX_AV,MAX_AV)
var av_y = randf_range(-MAX_AV,MAX_AV)
var av_z = randf_range(-MAX_AV,MAX_AV)
# Random Item Drop
rand_item.position = self.global_position
rand_item.transform.basis = self.global_transform.basis
rand_item.linear_velocity += self.global_transform.basis * Vector3(lv_x,lv_y,lv_z)
rand_item.angular_velocity += self.global_transform.basis * Vector3(av_x,av_y,av_z)
get_tree().get_root().add_child(rand_item)
number_of_drops -= 1

View File

@@ -1,5 +1,6 @@
extends Node3D
@export_enum("Enemy", "Trap") var enemy_type: int
@export var damage : float = 1
@export var pushback : float = 5
@onready var outline_meshes = [$Spikes1/MeshInstance3D]
@@ -17,5 +18,5 @@ func _process(delta: float) -> void:
func _on_area_3d_body_entered(body: Node3D) -> void:
if body.is_in_group("player"):
body.hit(damage,self)
body.hit(damage,self,enemy_type)
body.velocity = ray_cast.global_transform.basis * Vector3(0,0,-pushback)

View File

@@ -1,5 +1,6 @@
extends Node
@export var switch_override : bool = false
@export var start_on : bool = false
@export var toggle_enabled : bool = false
@export var bullet_enabled : bool = true

View File

@@ -1,4 +1,4 @@
extends MeshInstance3D
extends Node
@export var anim_player : Node
@export var door_open_start : bool = false
@@ -6,6 +6,7 @@ var door_open : bool
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
add_to_group("door")
door_open = door_open_start
if door_open: