2025-01-16 12:24:21 +00:00
|
|
|
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
|
2025-06-10 04:04:24 +00:00
|
|
|
@onready var language_options = %OptionButtonLanguage 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
|
|
|
|
@onready var index_btn = %IndexBtn as Button
|
|
|
|
@onready var exit_btn = %ExitBtn as Button
|
|
|
|
@onready var diary_btn = %DiaryBtn as Button
|
|
|
|
|
2025-06-07 09:04:08 +00:00
|
|
|
# 音量 DB 偏移
|
|
|
|
var sfx_db_offset := 6.0
|
|
|
|
var dialog_db_offset := -20.0
|
2025-01-16 12:24:21 +00:00
|
|
|
|
|
|
|
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(
|
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
|
|
|
|
_on_language_options_selected(language_options.selected)
|
|
|
|
language_options.item_selected.connect(_on_language_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
|
|
|
|
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:
|
|
|
|
get_tree().paused = true
|
|
|
|
SceneManager.lock_player()
|
|
|
|
else:
|
|
|
|
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:
|
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-10 04:04:24 +00:00
|
|
|
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
|
|
|
|
TranslationServer.set_locale(lang)
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
func _on_exit_btn_pressed() -> void:
|
|
|
|
SceneManager.quit_game()
|
|
|
|
|
|
|
|
|
|
|
|
func _on_index_btn_pressed() -> void:
|
2025-04-20 13:35:13 +00:00
|
|
|
# 防止游戏卡死
|
|
|
|
get_tree().paused = false
|
2025-01-16 12:24:21 +00:00
|
|
|
ArchiveManager.save_all()
|
|
|
|
SceneManager.checkout_index_page()
|
|
|
|
|
|
|
|
|
|
|
|
func _on_diary_btn_pressed() -> void:
|
2025-06-10 04:04:24 +00:00
|
|
|
SceneManager.show_bag()
|
|
|
|
exit_settings()
|
2025-01-16 12:24:21 +00:00
|
|
|
|
|
|
|
|
|
|
|
func _unhandled_key_input(event: InputEvent) -> void:
|
|
|
|
if not visible:
|
|
|
|
return
|
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"):
|
|
|
|
exit_settings()
|