extends CanvasLayer signal exited @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 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 index_btn = %IndexBtn as Button @onready var exit_btn = %ExitBtn as Button @onready var diary_btn = %DiaryBtn as Button # 音量 DB 偏移 var sfx_db_offset := 0.0 var dialog_db_offset := 0.0 func _ready(): layer = GlobalConfig.CANVAS_LAYER_SETTINGS visibility_changed.connect(_on_visibility_changed) # 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 _on_language_options_selected(language_options.selected) language_options.item_selected.connect(_on_language_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 exit_btn.pressed.connect(_on_exit_btn_pressed) index_btn.pressed.connect(_on_index_btn_pressed) diary_btn.pressed.connect(_on_diary_btn_pressed) func _on_visibility_changed() -> void: if visible: $"Sfx打开".play() get_tree().paused = true SceneManager.lock_player() else: $"Sfx关闭".play() get_tree().paused = false SceneManager.unlock_player() func exit_settings(): visible = false exited.emit() 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_options_selected(id: int) -> void: # -1 null; 0 zh_CN; 1 zh_SH; 2 en var lang = "" match id: 0: lang = "zh_CN" 1: lang = "zh_SH" 2: lang = "en" _: lang = "zh_CN" printerr("Unknown language id: ", id) GlobalConfigManager.config.language = id if GlobalConfig.DEBUG: print("set language to: ", lang) TranslationServer.set_locale(lang) 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_exit_btn_pressed() -> void: SceneManager.quit_game() func _on_index_btn_pressed() -> void: # 防止游戏卡死 get_tree().paused = false ArchiveManager.save_all() SceneManager.checkout_index_page() func _on_diary_btn_pressed() -> void: SceneManager.show_bag() exit_settings() func _unhandled_key_input(event: InputEvent) -> void: if not visible: return # settings 界面接受所有输入事件 get_viewport().set_input_as_handled() if event.is_action_pressed("escape"): exit_settings()