120 lines
3.6 KiB
GDScript
120 lines
3.6 KiB
GDScript
extends Node
|
|
|
|
@export_group("Main")
|
|
@export var room_lockdown : bool = false
|
|
@export var number_of_enemies : int = 20
|
|
@export var spawnable_enemies = preload("res://assets/spider2.tscn")
|
|
@export_group("Key")
|
|
@export var key_drop : bool = false
|
|
@export_enum("Silver", "Gold", "Special") var key_type: int
|
|
@export var special_key_name : String
|
|
@export_group("Item Drops")
|
|
@export var number_of_drops = 5
|
|
|
|
var enemies = []
|
|
var doors = []
|
|
var room_checks = []
|
|
var enemy_spawners = []
|
|
var number_enemies : int
|
|
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)
|
|
SignalBus.game_loaded.connect(assign_elements)
|
|
assign_elements()
|
|
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
func _process(delta):
|
|
if GameGlobals.game_loaded:
|
|
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 = number_of_drops #assign loot to the last enemy drop from this section
|
|
i.last_enemy = true
|
|
else:
|
|
enemy_in_room_killed()
|
|
|
|
func assign_elements():
|
|
for i in self.get_children():
|
|
if i is Enemy:
|
|
enemies.append(i)
|
|
if i.is_in_group("door"):
|
|
doors.append(i)
|
|
if i.is_in_group("room_check"):
|
|
room_checks.append(i)
|
|
i.room_entered.connect(room_entered)
|
|
i.room_exited.connect(room_exited)
|
|
if i is EnemySpawner:
|
|
enemy_spawners.append(i)
|
|
|
|
if enemy_spawners.size() > 0:
|
|
spawn_enemies()
|
|
|
|
func enemy_in_room_killed():
|
|
var enemy_count = 0
|
|
for i in self.get_children():
|
|
if i.is_in_group("enemy") and i.health > 0:
|
|
enemy_count += 1
|
|
|
|
if enemy_count <= 0:
|
|
if room_lockdown:
|
|
room_lockdown = false
|
|
|
|
for i in doors:
|
|
if !i.door_open:
|
|
i.open()
|
|
|
|
func room_entered():
|
|
if room_lockdown:
|
|
for i in doors:
|
|
if i.door_open:
|
|
i.close()
|
|
|
|
func room_exited():
|
|
if room_lockdown:
|
|
for i in doors:
|
|
if !i.door_open:
|
|
i.open()
|
|
|
|
func spawn_enemies():
|
|
while number_of_enemies >= 0:
|
|
number_of_enemies -= 1
|
|
|
|
var random_spawner = enemy_spawners.pick_random()
|
|
var spawn_offset = random_spawner.random_box_pos()
|
|
var set_pos = random_spawner.global_position + spawn_offset
|
|
var enemy = spawnable_enemies.instantiate() #turn into an array of available enemies later
|
|
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)
|