feat: add SceneManager autoload with scene registry
This commit is contained in:
@@ -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]
|
||||
|
||||
|
||||
58
ruf-der-pilze/scripts/scene_manager.gd
Normal file
58
ruf-der-pilze/scripts/scene_manager.gd
Normal 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])
|
||||
Reference in New Issue
Block a user