Unified settings management and sound fixes

- fix: speech was not paused during pause menu
- fix: allow sound levels to reach min value 0.0 (=muted)
- fix: crash was happening when switch language during the game
This commit is contained in:
Julian Murgia
2022-08-11 22:59:21 +02:00
committed by Duncan Brown
parent 4ef86c6cc3
commit 04348147b9
18 changed files with 286 additions and 95 deletions

View File

@@ -564,6 +564,8 @@ func perform_inputevent_on_object(
# Manage exits
if obj.node.is_exit and current_action in ["", ACTION_WALK]:
escoria.event_manager.interrupt_running_event()
escoria.event_manager.clear_event_queue()
_activate(ACTION_EXIT_SCENE, obj)
else:
# Manage movements towards object before activating it

View File

@@ -89,7 +89,7 @@ func _exit_tree():
# Ready function
func _ready():
escoria.apply_settings(escoria.settings)
escoria.settings_manager.apply_settings()
connect("crash_popup_confirmed", escoria, "quit",
[], CONNECT_ONESHOT)

View File

@@ -42,7 +42,7 @@ export var speech_volume: float = ProjectSettings.get_setting(
export var fullscreen: bool = false
# True if skipping dialogs is allowed
export var skip_dialog: bool = true
export var skip_dialogs: bool = true
# Dictionary containing all user-defined settings.
export var custom_settings: Dictionary

View File

@@ -0,0 +1,181 @@
# Manages settings
class_name ESCSettingsManager
# Template for settings filename
const SETTINGS_TEMPLATE: String = "settings.tres"
# Variable containing the settings folder obtained from Project Settings
var settings_folder: String
# Dictionary containing specific settings that gamedev wants to save in settings
# This variable is access-free. Getting its content is gamedev's duty.
# It is saved with other Escoria settings data when save_settings() is called.
var custom_settings: Dictionary
# Constructor of ESCSaveManager object.
func _init():
# We leave the calls to ProjectSettings as-is since this constructor can be
# called from escoria.gd's own.
settings_folder = ProjectSettings.get_setting("escoria/main/settings_path")
# Apply the loaded settings
func apply_settings() -> void:
if not Engine.is_editor_hint():
escoria.logger.info(
self,
"******* settings loaded"
)
AudioServer.set_bus_volume_db(
AudioServer.get_bus_index(escoria.BUS_MASTER),
linear2db(
ESCProjectSettingsManager.get_setting(
ESCProjectSettingsManager.MASTER_VOLUME
)
)
)
AudioServer.set_bus_volume_db(
AudioServer.get_bus_index(escoria.BUS_SFX),
linear2db(
ESCProjectSettingsManager.get_setting(
ESCProjectSettingsManager.SFX_VOLUME
)
)
)
AudioServer.set_bus_volume_db(
AudioServer.get_bus_index(escoria.BUS_MUSIC),
linear2db(
ESCProjectSettingsManager.get_setting(
ESCProjectSettingsManager.MUSIC_VOLUME
)
)
)
AudioServer.set_bus_volume_db(
AudioServer.get_bus_index(escoria.BUS_SPEECH),
linear2db(
ESCProjectSettingsManager.get_setting(
ESCProjectSettingsManager.SPEECH_VOLUME
)
)
)
TranslationServer.set_locale(
ESCProjectSettingsManager.get_setting(
ESCProjectSettingsManager.TEXT_LANG
)
)
escoria.game_scene.apply_custom_settings(custom_settings)
func save_settings_resource_to_project_settings(settings: ESCSaveSettings):
ESCProjectSettingsManager.set_setting(
ESCProjectSettingsManager.TEXT_LANG,
settings.text_lang
)
ESCProjectSettingsManager.set_setting(
ESCProjectSettingsManager.VOICE_LANG,
settings.voice_lang
)
ESCProjectSettingsManager.set_setting(
ESCProjectSettingsManager.SPEECH_ENABLED,
settings.speech_enabled
)
ESCProjectSettingsManager.set_setting(
ESCProjectSettingsManager.MASTER_VOLUME,
settings.master_volume
)
ESCProjectSettingsManager.set_setting(
ESCProjectSettingsManager.MUSIC_VOLUME,
settings.music_volume
)
ESCProjectSettingsManager.set_setting(
ESCProjectSettingsManager.SFX_VOLUME,
settings.sfx_volume
)
ESCProjectSettingsManager.set_setting(
ESCProjectSettingsManager.SPEECH_VOLUME,
settings.speech_volume
)
ESCProjectSettingsManager.set_setting(
ESCProjectSettingsManager.FULLSCREEN,
settings.fullscreen
)
ESCProjectSettingsManager.set_setting(
ESCProjectSettingsManager.SKIP_DIALOGS,
settings.skip_dialogs
)
custom_settings = settings.custom_settings
# Load the game settings from the settings file
func load_settings():
var save_settings_path: String = \
settings_folder.plus_file(SETTINGS_TEMPLATE)
var file: File = File.new()
if not file.file_exists(save_settings_path):
escoria.logger.warn(
self,
"Settings file %s doesn't exist" % save_settings_path
+ "Setting default settings."
)
save_settings()
var settings: ESCSaveSettings = load(save_settings_path)
save_settings_resource_to_project_settings(settings)
func get_settings() -> ESCSaveSettings:
var settings: ESCSaveSettings = ESCSaveSettings.new()
var plugin_config = ConfigFile.new()
plugin_config.load("res://addons/escoria-core/plugin.cfg")
settings.escoria_version = plugin_config.get_value("plugin", "version")
settings.text_lang = ESCProjectSettingsManager.get_setting(
ESCProjectSettingsManager.TEXT_LANG
)
settings.voice_lang = ESCProjectSettingsManager.get_setting(
ESCProjectSettingsManager.VOICE_LANG
)
settings.speech_enabled = ESCProjectSettingsManager.get_setting(
ESCProjectSettingsManager.SPEECH_ENABLED
)
settings.master_volume = ESCProjectSettingsManager.get_setting(
ESCProjectSettingsManager.MASTER_VOLUME
)
settings.music_volume = ESCProjectSettingsManager.get_setting(
ESCProjectSettingsManager.MUSIC_VOLUME
)
settings.sfx_volume = ESCProjectSettingsManager.get_setting(
ESCProjectSettingsManager.SFX_VOLUME
)
settings.speech_volume = ESCProjectSettingsManager.get_setting(
ESCProjectSettingsManager.SPEECH_VOLUME
)
settings.fullscreen = ESCProjectSettingsManager.get_setting(
ESCProjectSettingsManager.FULLSCREEN
)
settings.skip_dialogs = ESCProjectSettingsManager.get_setting(
ESCProjectSettingsManager.SKIP_DIALOGS
)
settings.custom_settings = custom_settings
return settings
# Save the game settings in the settings file.
func save_settings():
var settings = get_settings()
var directory: Directory = Directory.new()
if not directory.dir_exists(settings_folder):
directory.make_dir_recursive(settings_folder)
var save_path = settings_folder.plus_file(SETTINGS_TEMPLATE)
var error: int = ResourceSaver.save(save_path, settings)
if error != OK:
escoria.logger.error(
self,
"There was an issue writing settings %s" % save_path
)