Files
GGJ26/addons/maaacks_game_template/extras/scripts/level_loader.gd
minimata 44f251ed66
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 6s
Create tag and build when new code gets to main / Export (push) Successful in 1m1s
Basic game template addon
2026-01-30 19:45:56 +01:00

52 lines
1.5 KiB
GDScript

@tool
class_name LevelLoader
extends Node
## Loads scenes into a container.
signal level_load_started
signal level_loaded
signal level_ready
## Container where the level instance will be added.
@export var level_container : Node
## Optional reference to a loading screen in the scene.
## Requires Maaack's Scene Loader.
@export var level_loading_screen : Node
@export_group("Debugging")
@export var current_level : Node
## If Maaack's Scene Loader is installed, then it will be used to change scenes.
@onready var scene_loader_node = get_tree().root.get_node_or_null(^"SceneLoader")
var is_loading : bool = false
func _attach_level(level_resource : Resource):
assert(level_container != null, "level_container is null")
var instance = level_resource.instantiate()
level_container.call_deferred("add_child", instance)
return instance
func load_level(level_path : String):
if is_loading : return
if is_instance_valid(current_level):
current_level.queue_free()
await current_level.tree_exited
current_level = null
if scene_loader_node:
is_loading = true
scene_loader_node.load_scene(level_path, true)
if level_loading_screen:
level_loading_screen.reset()
level_load_started.emit()
await scene_loader_node.scene_loaded
is_loading = false
current_level = _attach_level(scene_loader_node.get_resource())
if level_loading_screen:
level_loading_screen.close()
else:
var level_scene = load(level_path)
current_level = _attach_level(level_scene)
level_loaded.emit()
await current_level.ready
level_ready.emit()