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:
committed by
Duncan Brown
parent
4ef86c6cc3
commit
04348147b9
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
)
|
||||
Reference in New Issue
Block a user