You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.5 KiB
90 lines
2.5 KiB
6 months ago
|
extends DialogicSubsystem
|
||
|
|
||
|
## Subsystem that allows setting and getting settings that are automatically saved slot independent.
|
||
|
## All settings that are stored in the project settings dialogic/settings section are supported.
|
||
|
## For example the text_speed setting is stored there.
|
||
|
## Thus it can be acessed like this:
|
||
|
## Dialogic.Settings.text_speed = 0.05
|
||
|
##
|
||
|
## Settings stored there can also be changed with the Settings event.
|
||
|
|
||
|
var settings := {}
|
||
|
var _connections := {}
|
||
|
|
||
|
|
||
|
#region MAIN METHODS
|
||
|
####################################################################################################
|
||
|
|
||
|
## Built-in, called by DialogicGameHandler.
|
||
|
func clear_game_state(clear_flag:=DialogicGameHandler.ClearFlags.FULL_CLEAR):
|
||
|
_reload_settings()
|
||
|
|
||
|
|
||
|
func _reload_settings() -> void:
|
||
|
settings = {}
|
||
|
for prop in ProjectSettings.get_property_list():
|
||
|
if prop.name.begins_with('dialogic/settings'):
|
||
|
settings[prop.name.trim_prefix('dialogic/settings/')] = ProjectSettings.get_setting(prop.name)
|
||
|
|
||
|
if dialogic.has_subsystem('Save'):
|
||
|
for i in settings:
|
||
|
settings[i] = dialogic.Save.get_global_info(i, settings[i])
|
||
|
|
||
|
|
||
|
func _set(property:StringName, value:Variant) -> bool:
|
||
|
if not settings.has(property) or settings[property] != value:
|
||
|
_setting_changed(property, value)
|
||
|
settings[property] = value
|
||
|
if dialogic.has_subsystem('Save'):
|
||
|
dialogic.Save.set_global_info(property, value)
|
||
|
return true
|
||
|
|
||
|
|
||
|
func _get(property:StringName) -> Variant:
|
||
|
if property in settings:
|
||
|
return settings[property]
|
||
|
return null
|
||
|
|
||
|
|
||
|
func _setting_changed(property:StringName, value:Variant) -> void:
|
||
|
if !property in _connections:
|
||
|
return
|
||
|
|
||
|
for i in _connections[property]:
|
||
|
i.call(value)
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
|
||
|
#region HANDY METHODS
|
||
|
####################################################################################################
|
||
|
|
||
|
func get_setting(property:StringName, default:Variant) -> Variant:
|
||
|
return _get(property) if _get(property) != null else default
|
||
|
|
||
|
|
||
|
func has_setting(property:StringName) -> bool:
|
||
|
return property in settings
|
||
|
|
||
|
|
||
|
func reset_all() -> void:
|
||
|
for setting in settings:
|
||
|
reset_setting(setting)
|
||
|
|
||
|
|
||
|
func reset_setting(property:StringName) -> void:
|
||
|
if ProjectSettings.has_setting('dialogic/settings/'+property):
|
||
|
settings[property] = ProjectSettings.get_setting('dialogic/settings/'+property)
|
||
|
_setting_changed(property, settings[property])
|
||
|
else:
|
||
|
settings.erase(property)
|
||
|
_setting_changed(property, null)
|
||
|
|
||
|
|
||
|
func connect_to_change(setting:StringName, callable:Callable) -> void:
|
||
|
if !setting in _connections:
|
||
|
_connections[setting] = []
|
||
|
_connections[setting].append(callable)
|
||
|
|
||
|
#endregion
|