xiandie/scene/settings/settings.gd

129 lines
4.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 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
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"))
)
dialog_bus_slider.value = db_to_linear(
AudioServer.get_bus_volume_db(AudioServer.get_bus_index("dialog"))
)
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)
# 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:
var db_value = linear_to_db(value)
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)
GlobalConfigManager.config.db_dialog = db_value
AudioServer.set_bus_volume_db(AudioServer.get_bus_index("dialog"), db_value)
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()
if seconds < 0:
seconds = 0
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:
ArchiveManager.save_all()
SceneManager.checkout_index_page()
func _on_diary_btn_pressed() -> void:
pass # Replace with function body.
func _unhandled_key_input(event: InputEvent) -> void:
if not visible:
return
if event.is_action_pressed("escape"):
exit_settings()
# block the event
get_viewport().set_input_as_handled()