2025-01-16 12:24:21 +00:00
|
|
|
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
|
2025-06-10 04:04:24 +00:00
|
|
|
@onready var language_options = %OptionButtonLanguage as OptionButton
|
2025-06-27 18:41:37 +00:00
|
|
|
@onready var caption_box = %"字幕" as BoxContainer
|
|
|
|
@onready var caption_options = %OptionButtonCaption as OptionButton
|
2025-01-16 12:24:21 +00:00
|
|
|
@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
|
2025-06-27 18:41:37 +00:00
|
|
|
@onready var return_btn = %ReturnBtn as Button
|
2025-01-16 12:24:21 +00:00
|
|
|
|
2025-06-07 09:04:08 +00:00
|
|
|
# 音量 DB 偏移
|
2025-06-25 23:55:47 +00:00
|
|
|
const sfx_db_offset := 6.0
|
|
|
|
const dialog_db_offset := -10.0
|
|
|
|
|
|
|
|
|
|
|
|
static func _init() -> void:
|
2025-06-27 18:41:37 +00:00
|
|
|
if not GlobalConfigManager.config:
|
|
|
|
return
|
2025-06-25 23:55:47 +00:00
|
|
|
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
|
|
|
|
)
|
2025-06-24 10:40:43 +00:00
|
|
|
|
2025-01-16 12:24:21 +00:00
|
|
|
|
|
|
|
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(
|
2025-06-07 09:04:08 +00:00
|
|
|
AudioServer.get_bus_volume_db(AudioServer.get_bus_index("game_sfx")) - sfx_db_offset
|
2025-01-16 12:24:21 +00:00
|
|
|
)
|
|
|
|
dialog_bus_slider.value = db_to_linear(
|
2025-06-07 09:04:08 +00:00
|
|
|
AudioServer.get_bus_volume_db(AudioServer.get_bus_index("dialog")) - dialog_db_offset
|
2025-01-16 12:24:21 +00:00
|
|
|
)
|
|
|
|
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)
|
2025-06-10 04:04:24 +00:00
|
|
|
# language
|
|
|
|
language_options.selected = GlobalConfigManager.config.language
|
2025-06-27 18:41:37 +00:00
|
|
|
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()
|
2025-01-16 12:24:21 +00:00
|
|
|
# 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
|
2025-06-27 18:41:37 +00:00
|
|
|
return_btn.pressed.connect(_on_return_btn_pressed)
|
|
|
|
return_btn.grab_focus()
|
2025-06-24 10:40:43 +00:00
|
|
|
# open
|
|
|
|
$"Sfx打开".play()
|
|
|
|
SceneManager.toggle_pause_counter(true)
|
2025-06-23 15:07:00 +00:00
|
|
|
|
|
|
|
|
2025-01-16 12:24:21 +00:00
|
|
|
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:
|
2025-06-07 09:04:08 +00:00
|
|
|
var db_value = linear_to_db(value) + sfx_db_offset
|
2025-01-16 12:24:21 +00:00
|
|
|
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:
|
2025-06-07 09:04:08 +00:00
|
|
|
var db_value = linear_to_db(value) + dialog_db_offset
|
2025-01-16 12:24:21 +00:00
|
|
|
GlobalConfigManager.config.db_dialog = db_value
|
|
|
|
AudioServer.set_bus_volume_db(AudioServer.get_bus_index("dialog"), db_value)
|
|
|
|
|
2025-06-24 10:40:43 +00:00
|
|
|
|
2025-06-27 18:41:37 +00:00
|
|
|
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)
|
2025-06-10 04:04:24 +00:00
|
|
|
|
2025-01-16 12:24:21 +00:00
|
|
|
|
|
|
|
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()
|
2025-01-21 12:41:24 +00:00
|
|
|
# limit the value, at least 10 seconds
|
|
|
|
if seconds < 10:
|
|
|
|
seconds = 10
|
2025-01-16 12:24:21 +00:00
|
|
|
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
|
|
|
|
|
|
|
|
|
2025-06-27 18:41:37 +00:00
|
|
|
func _on_return_btn_pressed() -> void:
|
2025-06-24 17:52:30 +00:00
|
|
|
exit_settings()
|
2025-01-16 12:24:21 +00:00
|
|
|
|
|
|
|
|
|
|
|
func _unhandled_key_input(event: InputEvent) -> void:
|
2025-03-20 10:00:53 +00:00
|
|
|
# settings 界面接受所有输入事件
|
|
|
|
get_viewport().set_input_as_handled()
|
2025-01-16 12:24:21 +00:00
|
|
|
if event.is_action_pressed("escape"):
|
2025-06-24 17:52:30 +00:00
|
|
|
exit_settings()
|
|
|
|
|
|
|
|
|
|
|
|
func exit_settings() -> void:
|
|
|
|
$"Sfx关闭".global_play()
|
|
|
|
SceneManager.toggle_pause_counter(false)
|
|
|
|
queue_free()
|