147 lines
3.1 KiB
GDScript
147 lines
3.1 KiB
GDScript
extends Node2D
|
|
|
|
class_name Level
|
|
|
|
class Spawn:
|
|
var delay : float
|
|
var enemy : Enemy
|
|
func _init(delay : float, enemy : Enemy):
|
|
self.delay = delay
|
|
self.enemy = enemy
|
|
|
|
@export var spawn_points : Array[Marker2D]
|
|
@export var levels : Array[TileMapLayer]
|
|
@export var enemies : Array[PackedScene]
|
|
|
|
@onready var areas = [$Top,$Right,$Bottom,$Left]
|
|
|
|
@onready var borders = [$"World Border/Top",$"World Border/Right",$"World Border/Bottom",$"World Border/Left"]
|
|
|
|
@export var player : CharacterBody2D
|
|
|
|
@onready var shop = $Shop
|
|
|
|
var difficulty = 4
|
|
|
|
var levels_until_shop = 1
|
|
|
|
var last_direction = null
|
|
|
|
var enemies_alive = true
|
|
|
|
func _ready() -> void:
|
|
for level in levels:
|
|
level.enabled = false
|
|
level.navigation_enabled = false
|
|
|
|
var level = levels.pick_random()
|
|
level.enabled = true
|
|
level.navigation_enabled = true
|
|
|
|
make_spawns()
|
|
|
|
func _process(delta: float) -> void:
|
|
if Engine.get_process_frames() % 10 == 0:
|
|
if get_tree().get_nodes_in_group("enemy") != []:
|
|
enemies_alive = true
|
|
else:
|
|
var currently_alive = false
|
|
for spawn in spawn_points:
|
|
if spawn.spawns != []:
|
|
currently_alive = true
|
|
break
|
|
enemies_alive = currently_alive
|
|
|
|
for i in range(4):
|
|
if not enemies_alive and last_direction != i:
|
|
borders[i].set_deferred("disabled",true)
|
|
else:
|
|
borders[i].set_deferred("disabled",false)
|
|
if last_direction == i:
|
|
areas[i].show()
|
|
else:
|
|
areas[i].hide()
|
|
|
|
func make_spawns():
|
|
for spawn_point in spawn_points:
|
|
spawn_point.spawns.clear()
|
|
|
|
var difficulty_left = difficulty
|
|
while difficulty_left > 0:
|
|
var direction = randi_range(0,3)
|
|
while direction == last_direction:
|
|
direction = randi_range(0,3)
|
|
var enemy = enemies.pick_random().instantiate()
|
|
var delay = 100*(1/(difficulty+100))
|
|
enemy.speed *= 1 + (difficulty/100)
|
|
enemy.health *= 1 + (difficulty/100)
|
|
spawn_points[direction].add_spawn(Spawn.new(delay,enemy))
|
|
difficulty_left -= enemy.difficulty
|
|
|
|
func change_level():
|
|
if player.inventory.in_shop:
|
|
shop.stop()
|
|
player.inventory.in_shop = false
|
|
player.score += 20
|
|
player.inventory.update_stats()
|
|
difficulty += 2
|
|
for level in levels:
|
|
level.enabled = false
|
|
level.navigation_enabled = false
|
|
|
|
levels_until_shop -= 1
|
|
if levels_until_shop <= 0:
|
|
shop.start()
|
|
player.inventory.in_shop = true
|
|
levels_until_shop = 3
|
|
return
|
|
|
|
var level = levels.pick_random()
|
|
level.enabled = true
|
|
level.navigation_enabled = true
|
|
|
|
make_spawns()
|
|
|
|
|
|
|
|
func _on_top_body_entered(body: Node2D) -> void:
|
|
if not body is Player:
|
|
return
|
|
last_direction = 2
|
|
print("top")
|
|
change_level()
|
|
player.position = Vector2(128,256-player.scale.x*32)
|
|
|
|
|
|
|
|
|
|
func _on_bottom_body_entered(body: Node2D) -> void:
|
|
if not body is Player:
|
|
return
|
|
last_direction = 0
|
|
change_level()
|
|
print("bottom")
|
|
player.position = Vector2(128,0+player.scale.x*32)
|
|
|
|
|
|
|
|
func _on_left_body_entered(body: Node2D) -> void:
|
|
if not body is Player:
|
|
return
|
|
last_direction = 1
|
|
change_level()
|
|
print("left")
|
|
player.position = Vector2(256-player.scale.x*32,128)
|
|
|
|
|
|
|
|
|
|
func _on_right_body_entered(body: Node2D) -> void:
|
|
if not body is Player:
|
|
return
|
|
last_direction = 3
|
|
change_level()
|
|
print("right")
|
|
player.position = Vector2(0+player.scale.x*32,128)
|
|
|