xiandie/scene/settings/settings.gd

161 lines
5.2 KiB
GDScript

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()