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 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 # 音量 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 ) %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 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() # 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) # 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_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() language_options.focus_neighbor_bottom = os_auto_end.get_path() os_auto_end.focus_neighbor_top = language_options.get_path() else: caption_box.show() language_options.focus_neighbor_bottom = caption_options.get_path() os_auto_end.focus_neighbor_top = caption_options.get_path() GlobalConfigManager.update_locale(lang_id, caption_id) 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) queue_free()