extends Node # SettingsManager - Global singleton for handling game settings persistence # Autoloaded as "SettingsManager" const SETTINGS_FILE = "user://game_settings.cfg" # Default values var settings = { "video": { "fullscreen": true, "vsync": true, "resolution_idx": 1 }, "audio": { "master_volume": 0.8, "music_volume": 0.7, "sfx_volume": 0.9 }, "controls": { "powerup_1": KEY_1, "powerup_2": KEY_2, "powerup_3": KEY_3, "powerup_4": KEY_4, "grab": KEY_SPACE, "put": KEY_R, "attack_mode": KEY_Q, "spawn_boost": KEY_E, "tekton_grab": KEY_G } } signal settings_applied signal control_remapped(action: String, key: int) func _ready(): load_settings() apply_all_settings() func load_settings(): var config = ConfigFile.new() var err = config.load(SETTINGS_FILE) if err == OK: for section in settings.keys(): for key in settings[section].keys(): settings[section][key] = config.get_value(section, key, settings[section][key]) print("[Settings] Loaded.") else: print("[Settings] Using defaults.") func save_settings(): var config = ConfigFile.new() for section in settings.keys(): for key in settings[section].keys(): config.set_value(section, key, settings[section][key]) config.save(SETTINGS_FILE) func apply_all_settings(): apply_video_settings() apply_audio_settings() emit_signal("settings_applied") func apply_video_settings(): var video = settings.video if video.fullscreen: DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) else: DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) if video.vsync: DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_ENABLED) else: DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED) func apply_audio_settings(): var audio = settings.audio set_bus_volume("Master", audio.master_volume) set_bus_volume("Music", audio.music_volume) set_bus_volume("SFX", audio.sfx_volume) func set_bus_volume(bus_name: String, volume_linear: float): var bus_idx = AudioServer.get_bus_index(bus_name) if bus_idx != -1: AudioServer.set_bus_volume_db(bus_idx, linear_to_db(volume_linear)) AudioServer.set_bus_mute(bus_idx, volume_linear <= 0.001) func set_control(action_name: String, keycode: int): if settings.controls.has(action_name): settings.controls[action_name] = keycode emit_signal("control_remapped", action_name, keycode) save_settings() func get_control_keycode(action_name: String) -> int: return settings.controls.get(action_name, -1) func get_control_text(action_name: String) -> String: var code = get_control_keycode(action_name) if code == -1: return "Unbound" return OS.get_keycode_string(code)