xiandie/scene/settings/settings.gd

221 lines
8.2 KiB
GDScript

class_name Settings
extends CanvasLayer
# 音量 DB 偏移
const sfx_db_offset := 6.0
const dialog_db_offset := -10.0
@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 lang_label = %LangLabel as Label
@onready var lang_left_btn = %LangLeft as Button
@onready var lang_right_btn = %LangRight as Button
@onready var caption_box = %CaptionBox as BoxContainer
@onready var caption_label = %CaptionLabel as Label
@onready var caption_left_btn = %CaptionLeft as Button
@onready var caption_right_btn = %CaptionRight as Button
@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
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 & caption
lang_left_btn.pressed.connect(_on_lang_left_btn_pressed)
lang_right_btn.pressed.connect(_on_lang_right_btn_pressed)
caption_left_btn.pressed.connect(_on_caption_left_btn_pressed)
caption_right_btn.pressed.connect(_on_caption_right_btn_pressed)
# setup language & caption
lang_label.text = GlobalConfigManager.get_locale_language_name()
caption_label.text = GlobalConfigManager.get_locale_caption_name()
caption_box.visible = caption_label.text != ""
# 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, "settings")
# 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_lang_left_btn_pressed() -> void:
GlobalConfigManager.update_locale(
GlobalConfigManager.config.language - 1, GlobalConfigManager.config.caption
)
lang_label.text = GlobalConfigManager.get_locale_language_name()
caption_label.text = GlobalConfigManager.get_locale_caption_name()
caption_box.visible = caption_label.text != ""
func _on_lang_right_btn_pressed() -> void:
GlobalConfigManager.update_locale(
GlobalConfigManager.config.language + 1, GlobalConfigManager.config.caption
)
lang_label.text = GlobalConfigManager.get_locale_language_name()
caption_label.text = GlobalConfigManager.get_locale_caption_name()
caption_box.visible = caption_label.text != ""
func _on_caption_left_btn_pressed() -> void:
GlobalConfigManager.update_locale(
GlobalConfigManager.config.language, GlobalConfigManager.config.caption - 1
)
caption_label.text = GlobalConfigManager.get_locale_caption_name()
func _on_caption_right_btn_pressed() -> void:
GlobalConfigManager.update_locale(
GlobalConfigManager.config.language, GlobalConfigManager.config.caption + 1
)
caption_label.text = GlobalConfigManager.get_locale_caption_name()
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, "settings")
queue_free()