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)