extends CanvasLayer @onready var master_bus_slider = %HSliderMasterBus as HSlider @onready var sfx_bus_slider = %HSliderSfxBus as HSlider @onready var dialog_bus_slider = %HSliderDialogBus as HSlider @onready var language_options = %OptionButtonLanguage as OptionButton @onready var caption_box = %"字幕" as BoxContainer @onready var caption_options = %OptionButtonCaption as OptionButton @onready var autosave_box = %AutoSaveCheckBox as CheckBox @onready var autosave_time_edit = %SaveTimeLineEdit as LineEdit @onready var fullscreen_box = %FullscreenBox as CheckBox @onready var top_box = %TopBox as CheckBox @onready var return_btn = %ReturnBtn as Button # 音量 DB 偏移 const sfx_db_offset := 6.0 const dialog_db_offset := -10.0 static func _init() -> void: if not GlobalConfigManager.config: return AudioServer.set_bus_volume_db( AudioServer.get_bus_index("Master"), GlobalConfigManager.config.db_master ) AudioServer.set_bus_volume_db( AudioServer.get_bus_index("game_sfx"), GlobalConfigManager.config.db_game_sfx ) AudioServer.set_bus_volume_db( AudioServer.get_bus_index("dialog"), GlobalConfigManager.config.db_dialog ) if GlobalConfig.DEBUG: prints( "_init setup volume_db (master, sfx, dialog): ", GlobalConfigManager.config.db_master, GlobalConfigManager.config.db_game_sfx, GlobalConfigManager.config.db_dialog ) func _ready(): layer = GlobalConfig.CANVAS_LAYER_SETTINGS # bus master_bus_slider.value = db_to_linear( AudioServer.get_bus_volume_db(AudioServer.get_bus_index("Master")) ) sfx_bus_slider.value = db_to_linear( AudioServer.get_bus_volume_db(AudioServer.get_bus_index("game_sfx")) - sfx_db_offset ) dialog_bus_slider.value = db_to_linear( AudioServer.get_bus_volume_db(AudioServer.get_bus_index("dialog")) - dialog_db_offset ) master_bus_slider.value_changed.connect(_on_master_bus_slider_value_changed) sfx_bus_slider.value_changed.connect(_on_sfx_bus_slider_value_changed) dialog_bus_slider.value_changed.connect(_on_dialog_bus_slider_value_changed) # language language_options.selected = GlobalConfigManager.config.language language_options.item_selected.connect(_on_language_or_caption_options_selected) # caption caption_options.selected = GlobalConfigManager.config.caption caption_options.item_selected.connect(_on_language_or_caption_options_selected) # setup language _on_language_or_caption_options_selected() # auto save autosave_box.button_pressed = GlobalConfigManager.config.auto_save_enabled autosave_time_edit.editable = GlobalConfigManager.config.auto_save_enabled autosave_time_edit.text = str(GlobalConfigManager.config.auto_save_seconds) autosave_box.toggled.connect(_on_autosave_box_toggled) autosave_time_edit.text_submitted.connect(_on_autosave_time_edit_text_submitted) autosave_time_edit.focus_exited.connect(_on_autosave_time_edit_text_submitted) # window fullscreen_box.button_pressed = GlobalConfigManager.config.window_fullscreen top_box.button_pressed = GlobalConfigManager.config.window_top fullscreen_box.toggled.connect(_on_fullscreen_box_toggled) top_box.toggled.connect(_on_top_box_toggled) # navigation return_btn.pressed.connect(_on_return_btn_pressed) return_btn.grab_focus() # open $"Sfx打开".play() SceneManager.toggle_pause_counter(true) func _on_master_bus_slider_value_changed(value: float) -> void: var db_value = linear_to_db(value) GlobalConfigManager.config.db_master = db_value AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Master"), db_value) func _on_sfx_bus_slider_value_changed(value: float) -> void: var db_value = linear_to_db(value) + sfx_db_offset GlobalConfigManager.config.db_game_sfx = db_value AudioServer.set_bus_volume_db(AudioServer.get_bus_index("game_sfx"), db_value) func _on_dialog_bus_slider_value_changed(value: float) -> void: var db_value = linear_to_db(value) + dialog_db_offset GlobalConfigManager.config.db_dialog = db_value AudioServer.set_bus_volume_db(AudioServer.get_bus_index("dialog"), db_value) func _on_language_or_caption_options_selected(_id = null) -> void: # -1 null; 0 zh; 2 en var lang_id = language_options.selected # zh: 0 _CN, _SH; en: [null]; var caption_id = caption_options.selected if lang_id != 0: caption_box.hide() else: caption_box.show() GlobalConfigManager.update_locale(lang_id, caption_id) func _on_autosave_box_toggled(is_pressed: bool) -> void: GlobalConfigManager.config.auto_save_enabled = is_pressed autosave_time_edit.editable = GlobalConfigManager.config.auto_save_enabled func _on_autosave_time_edit_text_submitted(_text = null) -> void: var seconds = autosave_time_edit.text.to_int() # limit the value, at least 10 seconds if seconds < 10: seconds = 10 autosave_time_edit.text = str(seconds) GlobalConfigManager.config.auto_save_seconds = seconds func _on_fullscreen_box_toggled(is_pressed: bool) -> void: if is_pressed: get_window().mode = Window.MODE_FULLSCREEN else: get_window().mode = Window.MODE_WINDOWED GlobalConfigManager.config.window_fullscreen = is_pressed func _on_top_box_toggled(is_pressed: bool) -> void: get_window().always_on_top = is_pressed GlobalConfigManager.config.window_top = is_pressed func _on_return_btn_pressed() -> void: exit_settings() func _unhandled_key_input(event: InputEvent) -> void: # settings 界面接受所有输入事件 get_viewport().set_input_as_handled() if event.is_action_pressed("escape"): exit_settings() func exit_settings() -> void: $"Sfx关闭".global_play() SceneManager.toggle_pause_counter(false) queue_free()