2024-04-25 15:27:00 -04:00
|
|
|
extends Node2D
|
2024-04-16 20:29:45 -04:00
|
|
|
|
2024-04-25 15:27:00 -04:00
|
|
|
@export var waves: Array[Wave]
|
2024-04-26 16:32:56 -04:00
|
|
|
@export var wave_label: Label
|
2024-04-22 07:51:43 -04:00
|
|
|
var portal = preload("res://portal.tscn")
|
2024-04-25 15:27:00 -04:00
|
|
|
var enemies_previous = false
|
2024-05-06 10:05:42 -04:00
|
|
|
@export var start_wave = 0
|
|
|
|
var wave_count = start_wave
|
2024-04-16 20:29:45 -04:00
|
|
|
|
2024-04-25 15:27:00 -04:00
|
|
|
func _ready():
|
2025-02-05 17:58:47 -05:00
|
|
|
if start_wave != 0:
|
2025-02-05 21:15:12 -05:00
|
|
|
await get_tree().create_timer(2).timeout
|
2025-02-05 17:58:47 -05:00
|
|
|
waves = waves.slice(start_wave)
|
2024-04-25 15:27:00 -04:00
|
|
|
spawn_loop()
|
2024-04-23 14:38:44 -04:00
|
|
|
|
2024-04-25 15:27:00 -04:00
|
|
|
signal all_enemies_perished
|
2024-04-30 22:07:02 -04:00
|
|
|
signal wave_complete
|
2024-04-25 15:27:00 -04:00
|
|
|
|
|
|
|
func check_enemies_loop():
|
|
|
|
var has_enemies = len(get_tree().get_nodes_in_group("enemy")) > 0
|
|
|
|
if enemies_previous and not has_enemies:
|
|
|
|
all_enemies_perished.emit()
|
|
|
|
enemies_previous = has_enemies
|
|
|
|
|
|
|
|
func spawn_loop():
|
2025-02-05 17:58:47 -05:00
|
|
|
for wave in waves:
|
2024-04-26 16:32:56 -04:00
|
|
|
wave_count += 1
|
|
|
|
wave_label.text = "Wave %d" % wave_count
|
2024-04-25 15:27:00 -04:00
|
|
|
print("Starting Next Wave")
|
|
|
|
for i in range(len(wave.enemies)):
|
|
|
|
spawn_enemies(wave.quantities[i], wave.spawning_duration, wave.enemies[i])
|
2024-05-06 10:05:42 -04:00
|
|
|
await get_tree().create_timer(wave.spawning_duration).timeout
|
2024-04-25 15:27:00 -04:00
|
|
|
if wave.wait_for_killed:
|
2024-05-06 10:05:42 -04:00
|
|
|
enemies_previous = true
|
2024-04-25 15:27:00 -04:00
|
|
|
await all_enemies_perished
|
2024-05-06 10:05:42 -04:00
|
|
|
print("all enemies perished")
|
2024-04-25 20:56:12 -04:00
|
|
|
await get_tree().create_timer(wave.wait).timeout
|
2024-04-30 22:07:02 -04:00
|
|
|
wave_complete.emit()
|
2024-04-25 15:27:00 -04:00
|
|
|
|
2024-05-06 10:05:42 -04:00
|
|
|
|
|
|
|
wave_count += 1
|
2024-04-26 16:32:56 -04:00
|
|
|
$"../GameOver".text = "YOU WIN!"
|
|
|
|
$"../Player".destroy()
|
|
|
|
|
2024-04-25 15:27:00 -04:00
|
|
|
func spawn_enemies(count: int, duration: float, enemy: WaveEnemy):
|
|
|
|
var delay = duration / count
|
|
|
|
for i in range(count):
|
|
|
|
spawn(enemy)
|
2024-05-06 10:05:42 -04:00
|
|
|
await get_tree().create_timer(delay).timeout
|
2024-04-25 15:27:00 -04:00
|
|
|
|
|
|
|
func spawn(item: WaveEnemy):
|
2024-04-23 14:38:44 -04:00
|
|
|
|
2024-04-20 09:45:17 -04:00
|
|
|
var spawn_loc = Vector2.ZERO
|
2024-04-25 15:27:00 -04:00
|
|
|
|
2024-04-30 15:37:00 -04:00
|
|
|
if item.boss:
|
2024-05-06 10:05:42 -04:00
|
|
|
print("Spawning Boss!")
|
2024-04-30 15:37:00 -04:00
|
|
|
spawn_loc = Vector2(1920/2, 1080/2)
|
|
|
|
else:
|
2025-02-06 14:49:13 -05:00
|
|
|
for i in range(1000):
|
2024-04-30 15:37:00 -04:00
|
|
|
var test_pos = Vector2(randf(), randf()) * Vector2(1920, 1080)
|
|
|
|
if not $"../CollisionCheck".is_clear(test_pos, item.check_distance):
|
|
|
|
continue
|
|
|
|
spawn_loc = test_pos
|
|
|
|
break
|
2024-05-06 10:05:42 -04:00
|
|
|
|
|
|
|
if spawn_loc == Vector2.ZERO:
|
2025-02-05 17:58:47 -05:00
|
|
|
print("Error! Failed to spawn enemy")
|
2024-05-06 10:05:42 -04:00
|
|
|
return
|
2024-04-23 14:38:44 -04:00
|
|
|
|
2024-04-30 15:37:00 -04:00
|
|
|
if not item.boss:
|
|
|
|
var portal_effect = portal.instantiate()
|
|
|
|
portal_effect.global_position = spawn_loc
|
|
|
|
portal_effect.sprite_frames = item.portal_texture
|
2024-05-07 16:02:28 -04:00
|
|
|
$/root/Node2D.add_child.call_deferred(portal_effect)
|
2024-05-06 10:05:42 -04:00
|
|
|
await get_tree().create_timer((item.portal_texture.get_frame_count("default") / 2) * (1 / item.portal_texture.get_animation_speed("default"))).timeout
|
2024-04-25 15:27:00 -04:00
|
|
|
var node = item.enemy.instantiate()
|
|
|
|
node.global_position = spawn_loc
|
2024-04-30 15:37:00 -04:00
|
|
|
if not item.boss:
|
|
|
|
node.rotation_degrees = 360 * randf()
|
2024-04-25 15:27:00 -04:00
|
|
|
$/root/Node2D.add_child(node)
|