a game about throwing hammers made for the github game off
Diffstat (limited to 'levels/LevelManager.gd')
-rw-r--r--levels/LevelManager.gd71
1 files changed, 71 insertions, 0 deletions
diff --git a/levels/LevelManager.gd b/levels/LevelManager.gd
new file mode 100644
index 0000000..3c85b80
--- /dev/null
+++ b/levels/LevelManager.gd
@@ -0,0 +1,71 @@
+extends Node
+class_name LevelManager
+
+signal world_generated(maze: Maze)
+
+var map := []
+
+const lvl_path_fmt := "res://levels/rand/%s.tscn"
+@export var levels: Array[PackedScene]
+@export var size := Vector2i(6, 6)
+@export var current_level: TileMap # ASSIGN TO START
+@export var player: Player
+@onready var main := get_parent()
+var lvl_position := Vector2i(-1, -1)
+var t: SceneTreeTimer
+
+var sorted := [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]] # Array[Array[PackedScene]] [[0..][1..]...[15..]]
+
+
+func go(to: Vector2i) -> void:
+ if t and t.time_left > 0:
+ print("skipping door enter")
+ return
+ t = get_tree().create_timer(0.1)
+ lvl_position += to
+ current_level.queue_free()
+ current_level = map[lvl_position.y][lvl_position.x].instantiate()
+ var v := Vector2i(128, 128) # center
+ player.position = Vector2(v - (v * to)).move_toward(v, 24)
+ player.velocity = Vector2.ZERO
+ prints("welcome to", current_level.name)
+ main.call_deferred(&"add_child", current_level)
+
+
+func print_map_pretty() -> void:
+ var string := ""
+ for row in map:
+ for item in row:
+ string += str(item.get_state().get_node_name(0)).substr(0, 2) + " "
+ string += "\n"
+ print(string)
+
+
+# split levels into https://kidscancode.org/blog/img/cells_4bit.png
+func sort_levels():
+ for level in levels:
+ var n: int = 0 if level.get_state().get_node_property_count(0) == 1 else level.get_state().get_node_property_value(0,1)
+ sorted[n].append(level)
+ prints(level.get_state().get_node_name(0),"=>", n)
+
+
+func _ready() -> void:
+ gen_map()
+ lvl_position = size / 2
+ Events.connect(&"change_level", go)
+ print_map_pretty()
+
+
+func gen_map() -> void:
+ sort_levels()
+ var maze := Maze.new(size)
+ maze.image().save_png("res://maze.png")
+ lvl_position = size / 2
+ map.clear()
+ for row in maze.maze:
+ var map_row: Array[PackedScene] = []
+ for i in row:
+ map_row.append(sorted[i][randi() % len(sorted[i])])
+ map.append(map_row)
+ map[lvl_position.x][lvl_position.y] = preload("res://levels/Start.tscn")
+ emit_signal(&"world_generated", maze)