# smgr.gd # Scene Manager # # This file is part of StarOpenSource CORE (SOSCORE) # Made by the StarOpenSource Project and Contributers # Licensed under GNU GPLv3 extends Node @onready var core = get_node(NodePath("/root/core")) var ccr = null var ccr_game = null var ccr_game_inuse = false var ccr_menu = null var ccr_menu_names = [] var ccr_cutscene = null var ccr_cutscene_inuse = false var ccr_debug = null var ccr_debug_names = [] func initialize() -> void: if core.protection_mode: return Logger.diag("smgr","Constructing CORE Scene Root (CCR)") ccr = Control.new() ccr.name = "ccr" Logger.diag("smgr","Adding CCR to /root/") get_tree().root.add_child(ccr) Logger.diag("smgr","Migrating COREBackground to CCR") var corebg = get_tree().current_scene Logger.diag("smgr","Reconstructing COREBackground to CCR") var corebg_log = corebg.get_node(NodePath("Background/Log")).text corebg.get_node(NodePath("Background/Log")).rmconnect() get_tree().current_scene.queue_free() var corebg_new = ResourceLoader.load("res://CORE/background.tscn").instantiate() ccr.add_child(corebg_new) corebg_new.get_node(NodePath("Background/Log")).text = corebg_log Logger.diag("smgr","COREBackground migration complete.") Logger.diag("smgr","Adding overlays") add_overlays() core.setready() func add_game(resname:String) -> bool: if core.protection_mode: return false Logger.diag("smgr","Adding game scene") if ccr_game_inuse: Logger.error("smgr","Failed adding game scene: Only one game scene is allowed") return false var res = core.resmgr.getres(resname) if res == null or res.get_class() != "PackedScene": Logger.error("smgr","Resource is not type of PackedScene") return false ccr_game.add_child(res.instantiate()) ccr_game_inuse = true Logger.diag("smgr","Added game scene") return true func remove_game() -> bool: if core.protection_mode: return false Logger.diag("smgr","Removing game scene") if !ccr_game_inuse: Logger.error("smgr","Failed removing game scene: No game scene is active") return false ccr_game.remove_child(ccr_game.get_child(0)) ccr_game_inuse = false Logger.diag("smgr","Removed game scene") return true func add_menu(resname:String) -> bool: if core.protection_mode: return false Logger.diag("smgr","Adding menu scene \"" + resname + "\"") if ccr_menu_names.has(resname): Logger.error("smgr","Failed adding menu scene: Menu scene with name \"" + resname + "\" already exists") return false var res = core.resmgr.getres(resname) if res == null or res.get_class() != "PackedScene": Logger.error("smgr","Resource is not type of PackedScene") return false ccr_menu.add_child(res.instantiate()) ccr_menu_names.append(resname) Logger.diag("smgr","Added menu scene \"" + resname + "\"") return true func remove_menu(scene_name:String) -> bool: if core.protection_mode: return false Logger.diag("smgr","Removing menu scene \"" + scene_name + "\"") if !ccr_menu_names.has(scene_name): Logger.error("smgr","Failed removing menu scene: Menu scene with name \"" + scene_name + "\" does not exist") return false for i in ccr_menu.get_children(): if i.name == scene_name: ccr_menu.remove_child(i) break ccr_menu_names.erase(scene_name) Logger.diag("smgr","Removed menu scene \"" + scene_name + "\"") return true func add_cutscene(resname:String) -> bool: if core.protection_mode: return false Logger.diag("smgr","Adding cutscene scene") if ccr_cutscene_inuse: Logger.error("smgr","Failed adding cutscene scene: Only one cutscene scene is allowed") return false var res = core.resmgr.getres(resname) if res == null or res.get_class() != "PackedScene": Logger.error("smgr","Resource is not type of PackedScene") return false ccr_cutscene.add_child(res.instantiate()) ccr_cutscene_inuse = true Logger.diag("smgr","Added cutscene scene") return true func remove_cutscene() -> bool: if core.protection_mode: return false Logger.diag("smgr","Removing cutscene scene") if !ccr_cutscene_inuse: Logger.error("smgr","Failed removing cutscene scene: No cutscene scene is active") return false ccr_cutscene.remove_child(ccr_cutscene.get_child(0)) ccr_cutscene_inuse = false Logger.diag("smgr","Removed cutscene scene") return true func add_debug(resname:String) -> bool: if core.protection_mode: return false Logger.diag("smgr","Adding debug scene \"" + resname + "\"") if ccr_debug_names.has(resname): Logger.error("smgr","Failed adding debug scene: Debug scene with name \"" + resname + "\" already exists") return false var res = core.resmgr.getres(resname) if res == null or res.get_class() != "PackedScene": Logger.error("smgr","Resource is not type of PackedScene") return false ccr_debug.add_child(res.instantiate()) ccr_debug_names.append(resname) Logger.diag("smgr","Added debug scene \"" + resname + "\"") return true func remove_debug(scene_name:String) -> bool: if core.protection_mode: return false Logger.diag("smgr","Removing debug scene \"" + scene_name + "\"") if !ccr_menu_names.has(scene_name): Logger.error("smgr","Failed removing debug scene: Debug scene with name \"" + scene_name + "\" does not exist") return false for i in ccr_debug.get_children(): if i.name == scene_name: ccr_debug.remove_child(i) break ccr_debug_names.erase(scene_name) Logger.diag("smgr","Removed debug scene \"" + scene_name + "\"") return true func add_overlays() -> void: if core.protection_mode: return Logger.diag("smgr","Adding game overlay") ccr_game = Control.new() ccr_game.name = "GameOverlay" ccr.add_child(ccr_game) Logger.diag("smgr","Adding menu overlay") ccr_menu = Control.new() ccr_menu.name = "MenuOverlay" ccr.add_child(ccr_menu) Logger.diag("smgr","Adding cutscene overlay") ccr_cutscene = Control.new() ccr_cutscene.name = "CutsceneOverlay" ccr.add_child(ccr_cutscene) Logger.diag("smgr","Adding debug overlay") ccr_debug = Control.new() ccr_debug.name = "DebugOverlay" ccr.add_child(ccr_debug)