a game about throwing hammers made for the github game off
Diffstat (limited to 'levels/LevelManager.gd')
-rw-r--r--levels/LevelManager.gd78
1 files changed, 56 insertions, 22 deletions
diff --git a/levels/LevelManager.gd b/levels/LevelManager.gd
index d7c905c..2d55d36 100644
--- a/levels/LevelManager.gd
+++ b/levels/LevelManager.gd
@@ -3,35 +3,75 @@ class_name LevelManager
signal world_generated(maze: Maze)
+## One map to rule them all
var map := []
-const lvl_path_fmt := "res://levels/rand/%s.tscn"
-@export var levels: Array[PackedScene]
+## The maze the map is generated from
+var maze: Maze = null
+
+## Stores the levels that the player has completed--killed all enemys--
+## so that we can spawn the level without enemys when the palyer goes back
+var completed_levels: Array[Vector2i] = []
+
+## Maze size
@export var size := Vector2i(6, 6)
-@export var current_level: TileMap # ASSIGN TO START
+
+## ASSIGN TO Start.tscn
+@export var current_level: TileMap
+@export var start: PackedScene
@export var player: Player
-@onready var main := get_parent()
+@onready var main := get_parent() as Node2D
var lvl_position := Vector2i(-1, -1)
+
+## Timer used for debouncing multiple door enters. (some kind of physics bug there is probably a tracker for but i havent found it)
var t: SceneTreeTimer
-var sorted := [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]] # Array[PackedSceneArray] [[0..][1..]...[15..]]
+@export var levels: Array[PackedScene]
+
+## type: PackedScene[15][∞]
+var sorted := [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
+
+func _init() -> void:
+ Globals.levelmanager = self
+
+func _exit_tree() -> void:
+ Globals.levelmanager = null
+func _ready() -> void:
+ gen_map()
+ lvl_position = size / 2
+ Events.change_level.connect(go)
+ print_map_pretty()
+## Goes to the next room in [param to] direction.
func go(to: Vector2i) -> void:
+ completed_levels.append(lvl_position)
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()
+ current_level = map[lvl_position.y][lvl_position.x].instantiate() as TileMap
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)
+ if lvl_position in completed_levels:
+ current_level.completed = true
+ prints("welcome back to", current_level.name)
+ else:
+ prints("welcome to", current_level.name)
-
+## Prints out the map prettily.
+## eg: [codeblock]
+## 14 16 04 08 08 10
+## 15 04 07 04 04 06
+## 12 09 12 05 11 05
+## 15 08 07 St 05 13
+## 12 08 06 15 02 05
+## 15 08 07 08 07 09
+## [/codeblock]
func print_map_pretty() -> void:
var string := ""
for row in map:
@@ -40,25 +80,19 @@ func print_map_pretty() -> void:
string += "\n"
print(string)
-
-# split levels into https://kidscancode.org/blog/img/cells_4bit.png
+## Split levels into [url=https://kidscancode.org/blog/img/cells_4bit.png]4bit wall[/url] groups.
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)
+ # property idx 1 is the enabled walls
+ # if prop is not overriden, default to 0
+ 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)
-
-func _ready() -> void:
- gen_map()
- lvl_position = size / 2
- Events.change_level.connect(go)
- print_map_pretty()
-
-
+## Generates the maze.
func gen_map() -> void:
sort_levels()
- var maze := Maze.new(size)
- maze.image().save_png("res://maze.png")
+ maze = Maze.new(size)
+ maze.image.save_png("res://maze.png")
lvl_position = size / 2
map.clear()
for row in maze.maze:
@@ -66,5 +100,5 @@ func gen_map() -> void:
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")
+ map[lvl_position.x][lvl_position.y] = start
world_generated.emit(maze)