Enemy Hivemind became Room Manager, will probably pull out the actual enemy script at some point
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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!"]
|
||||
|
||||
|
||||
@@ -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
20
scripts/room_check.gd
Normal 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
57
scripts/room_manager.gd
Normal 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()
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user