feat: add SceneManager autoload with scene registry

This commit is contained in:
2026-04-14 01:20:54 +02:00
parent 6d749fddb3
commit 9813a6d02f
2 changed files with 59 additions and 0 deletions

View File

@@ -19,6 +19,7 @@ config/icon="res://icon.svg"
MCPGameBridge="res://addons/godot_mcp/game_bridge/mcp_game_bridge.gd"
NetworkManager="*res://scripts/network_manager.gd"
SceneManager="*res://scripts/scene_manager.gd"
[editor_plugins]

View File

@@ -0,0 +1,58 @@
extends Node
const SCENES := {
"tavern": "res://scenes/tavern.tscn",
"chamber": "res://scenes/chamber.tscn",
"entrance_hall": "res://scenes/entrance_hall.tscn",
"refectory": "res://scenes/refectory.tscn",
"library": "res://scenes/library.tscn",
"chapel": "res://scenes/chapel.tscn",
"cloister": "res://scenes/cloister.tscn",
"sanctum": "res://scenes/sanctum.tscn",
}
var _current_scene_node: Node = null
func _ready() -> void:
NetworkManager.game_started.connect(_on_game_started)
# Defer until main.tscn and its CurrentScene node are in the tree.
# call_deferred is not sufficient here — autoloads init before the main
# scene. Connect to root.ready (fires once, after main scene is ready).
get_tree().root.ready.connect(_on_root_ready, CONNECT_ONE_SHOT)
func _on_root_ready() -> void:
var args := OS.get_cmdline_args() + OS.get_cmdline_user_args()
var is_server := OS.has_feature("dedicated_server") or "--server" in args
if not is_server:
transition_to("tavern")
func transition_to(scene_name: String) -> void:
var path: String = SCENES.get(scene_name, "")
var packed: PackedScene = load(path) if path else null
if packed == null:
push_error("[SceneManager] Scene not found: %s" % scene_name)
return
var container := get_node_or_null("/root/Main/CurrentScene")
if container == null:
push_error("[SceneManager] CurrentScene node not found in main.tscn")
return
if _current_scene_node != null:
_current_scene_node.queue_free()
_current_scene_node = null
_current_scene_node = packed.instantiate()
container.add_child(_current_scene_node)
func _on_game_started() -> void:
print("[SceneManager] Spiel gestartet — chamber transition kommt im nächsten Feature")
func _load_for_role(scene_name: String) -> void:
# my_id is only valid after NetworkManager._on_connected_to_server fires.
# Do not call before game_started — my_id will be 0 before that.
var role: String = NetworkManager.players.get(NetworkManager.my_id, {}).get("role", "player")
# TODO next feature: load dm variant when role == "dm"
print("[SceneManager] Role %s%s (stub, not switching yet)" % [role, scene_name])