class_name Settings extends CanvasLayer # 音量 DB 偏移 const sfx_db_offset := 6.0 const dialog_db_offset := -10.0 @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 lang_label = %LangLabel as Label @onready var lang_left_btn = %LangLeft as Button @onready var lang_right_btn = %LangRight as Button @onready var caption_box = %CaptionBox as BoxContainer @onready var caption_label = %CaptionLabel as Label @onready var caption_left_btn = %CaptionLeft as Button @onready var caption_right_btn = %CaptionRight as Button @onready var os_auto_end = %OSAutoEnd as CheckBox @onready var os_wait_time_box = %OSWaitTimeBox as BoxContainer @onready var h_slider_os_wait_time = %HSliderOSWaitTime as HSlider @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 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 ) %MainPercentage.text = str(int(master_bus_slider.value * 100)) %SfxPercentage.text = str(int(sfx_bus_slider.value * 100)) %DialogPercentage.text = str(int(dialog_bus_slider.value * 100)) 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 & caption lang_left_btn.pressed.connect(_on_lang_left_btn_pressed) lang_right_btn.pressed.connect(_on_lang_right_btn_pressed) caption_left_btn.pressed.connect(_on_caption_left_btn_pressed) caption_right_btn.pressed.connect(_on_caption_right_btn_pressed) # setup language & caption lang_label.text = GlobalConfigManager.get_locale_language_name() caption_label.text = GlobalConfigManager.get_locale_caption_name() caption_box.visible = caption_label.text != "" # os auto finish os_auto_end.button_pressed = GlobalConfigManager.config.os_auto_end os_auto_end.toggled.connect(_on_os_auto_end_toggled) # 使它生效 _on_os_auto_end_toggled(GlobalConfigManager.config.os_auto_end) # 最大范围为 10 秒,精度 0.1 h_slider_os_wait_time.value_changed.connect(_on_os_wait_time_slider_value_changed) h_slider_os_wait_time.value = clampf(GlobalConfigManager.config.os_wait_time / 10.0, 0, 1.0) # 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() SceneManager.toggle_pause_counter(true, "settings") # open $"Sfx打开".play() # # resize # $VBoxContainer.size = Vector2.ZERO func _on_master_bus_slider_value_changed(value: float) -> void: %MainPercentage.text = str(int(value * 100)) 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: %SfxPercentage.text = str(int(value * 100)) 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: %DialogPercentage.text = str(int(value * 100)) 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_lang_left_btn_pressed() -> void: GlobalConfigManager.update_locale( GlobalConfigManager.config.language - 1, GlobalConfigManager.config.caption ) lang_label.text = GlobalConfigManager.get_locale_language_name() caption_label.text = GlobalConfigManager.get_locale_caption_name() caption_box.visible = caption_label.text != "" func _on_lang_right_btn_pressed() -> void: GlobalConfigManager.update_locale( GlobalConfigManager.config.language + 1, GlobalConfigManager.config.caption ) lang_label.text = GlobalConfigManager.get_locale_language_name() caption_label.text = GlobalConfigManager.get_locale_caption_name() caption_box.visible = caption_label.text != "" func _on_caption_left_btn_pressed() -> void: GlobalConfigManager.update_locale( GlobalConfigManager.config.language, GlobalConfigManager.config.caption - 1 ) caption_label.text = GlobalConfigManager.get_locale_caption_name() func _on_caption_right_btn_pressed() -> void: GlobalConfigManager.update_locale( GlobalConfigManager.config.language, GlobalConfigManager.config.caption + 1 ) caption_label.text = GlobalConfigManager.get_locale_caption_name() func _on_os_auto_end_toggled(is_pressed: bool) -> void: GlobalConfigManager.config.os_auto_end = is_pressed os_wait_time_box.visible = is_pressed if not is_pressed: os_auto_end.focus_neighbor_bottom = autosave_box.get_path() autosave_box.focus_neighbor_top = os_auto_end.get_path() else: os_auto_end.focus_neighbor_bottom = h_slider_os_wait_time.get_path() autosave_box.focus_neighbor_top = h_slider_os_wait_time.get_path() func _on_os_wait_time_slider_value_changed(value: float) -> void: # 最大范围为 10 秒,精度 0.1 GlobalConfigManager.config.os_wait_time = int(value * 100.0) * 0.1 %OSWaitTimePercentage.text = str(GlobalConfigManager.config.os_wait_time) 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, "settings") queue_free()