sunoku/scenes/world/level.gd

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)