diff --git a/ruf-der-pilze/project.godot b/ruf-der-pilze/project.godot index ce42067..305a9ff 100644 --- a/ruf-der-pilze/project.godot +++ b/ruf-der-pilze/project.godot @@ -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] diff --git a/ruf-der-pilze/scripts/scene_manager.gd b/ruf-der-pilze/scripts/scene_manager.gd new file mode 100644 index 0000000..2d06640 --- /dev/null +++ b/ruf-der-pilze/scripts/scene_manager.gd @@ -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])