diff --git a/addons/escoria-core/game/esc_project_settings_manager.gd b/addons/escoria-core/game/esc_project_settings_manager.gd index 1668eaa3..8996f849 100644 --- a/addons/escoria-core/game/esc_project_settings_manager.gd +++ b/addons/escoria-core/game/esc_project_settings_manager.gd @@ -67,7 +67,8 @@ const _SIMPLE_DIALOG_ROOT = "dialog_simple" const AVATARS_PATH = "%s/%s/avatars_path" % [_ESCORIA_SETTINGS_ROOT, _SIMPLE_DIALOG_ROOT] const TEXT_SPEED_PER_CHARACTER = "%s/%s/text_speed_per_character" % [_ESCORIA_SETTINGS_ROOT, _SIMPLE_DIALOG_ROOT] const FAST_TEXT_SPEED_PER_CHARACTER = "%s/%s/fast_text_speed_per_character" % [_ESCORIA_SETTINGS_ROOT, _SIMPLE_DIALOG_ROOT] -const MAX_TIME_TO_DISAPPEAR = "%s/%s/max_time_to_disappear" % [_ESCORIA_SETTINGS_ROOT, _SIMPLE_DIALOG_ROOT] +const READING_SPEED_IN_WPM = "%s/%s/reading_speed_in_wpm" % [_ESCORIA_SETTINGS_ROOT, _SIMPLE_DIALOG_ROOT] + # Godot Windows project settings const DISPLAY = "display" diff --git a/addons/escoria-dialog-simple/plugin.gd b/addons/escoria-dialog-simple/plugin.gd index 7dbe15e9..310d2345 100644 --- a/addons/escoria-dialog-simple/plugin.gd +++ b/addons/escoria-dialog-simple/plugin.gd @@ -37,7 +37,7 @@ func disable_plugin(): ) ESCProjectSettingsManager.register_setting( - ESCProjectSettingsManager.MAX_TIME_TO_DISAPPEAR, + ESCProjectSettingsManager.READING_SPEED_IN_WPM, null, {} ) @@ -83,10 +83,10 @@ func enable_plugin(): ) ESCProjectSettingsManager.register_setting( - ESCProjectSettingsManager.MAX_TIME_TO_DISAPPEAR, - 1.0, + ESCProjectSettingsManager.READING_SPEED_IN_WPM, + 200, { - "type": TYPE_REAL + "type": TYPE_INT } ) else: diff --git a/addons/escoria-dialog-simple/types/avatar.gd b/addons/escoria-dialog-simple/types/avatar.gd index c4ed278c..ada8581a 100644 --- a/addons/escoria-dialog-simple/types/avatar.gd +++ b/addons/escoria-dialog-simple/types/avatar.gd @@ -12,8 +12,12 @@ var _text_speed_per_character # The text speed per character if the dialog line is skipped var _fast_text_speed_per_character -# The time to wait before the dialog is finished -var _max_time_to_text_disappear +# The reading speed to be used in determining the length of time text remains +# on the screen. +var _reading_speed_in_wpm: int + +# Used to extract words from lines of text. +var _word_regex: RegEx = RegEx.new() # Whether the current dialog is speeding up var _is_speeding_up: bool = false @@ -42,9 +46,12 @@ func _ready(): _fast_text_speed_per_character = ProjectSettings.get_setting( "escoria/dialog_simple/fast_text_speed_per_character" ) - _max_time_to_text_disappear = ProjectSettings.get_setting( - "escoria/dialog_simple/max_time_to_disappear" + _reading_speed_in_wpm = ProjectSettings.get_setting( + "escoria/dialog_simple/reading_speed_in_wpm" ) + + _word_regex.compile("\\S+") + text_node.bbcode_enabled = true tween.connect( "tween_completed", @@ -111,11 +118,20 @@ func speedup(): # The dialog line was printed, start the waiting time and then finish # the dialog func _on_dialog_line_typed(object, key): + var time_to_disappear: float = _calculate_time_to_disappear() text_node.visible_characters = -1 - $Timer.start(_max_time_to_text_disappear) + $Timer.start(time_to_disappear) $Timer.connect("timeout", self, "_on_dialog_finished") +func _calculate_time_to_disappear() -> float: + return (_get_number_of_words() / _reading_speed_in_wpm as float) * 60 + + +func _get_number_of_words() -> int: + return _word_regex.search_all(text_node.get_text()).size() + + # Ending the dialog func _on_dialog_finished(): emit_signal("say_finished") diff --git a/addons/escoria-dialog-simple/types/floating.gd b/addons/escoria-dialog-simple/types/floating.gd index 600f3ba3..c8ee7c8f 100644 --- a/addons/escoria-dialog-simple/types/floating.gd +++ b/addons/escoria-dialog-simple/types/floating.gd @@ -12,8 +12,12 @@ var _text_speed_per_character # The text speed per character if the dialog line is skipped var _fast_text_speed_per_character -# The time to wait before the dialog is finished -var _max_time_to_text_disappear +# The reading speed to be used in determining the length of time text remains +# on the screen. +var _reading_speed_in_wpm: int + +# Used to extract words from lines of text. +var _word_regex: RegEx = RegEx.new() # Current character speaking, to keep track of reference for animation purposes @@ -41,9 +45,12 @@ func _ready(): _fast_text_speed_per_character = ProjectSettings.get_setting( "escoria/dialog_simple/fast_text_speed_per_character" ) - _max_time_to_text_disappear = ProjectSettings.get_setting( - "escoria/dialog_simple/max_time_to_disappear" + _reading_speed_in_wpm = ProjectSettings.get_setting( + "escoria/dialog_simple/reading_speed_in_wpm" ) + + _word_regex.compile("\\S+") + bbcode_enabled = true $Tween.connect("tween_completed", self, "_on_dialog_line_typed") @@ -134,11 +141,20 @@ func speedup(): # The dialog line was printed, start the waiting time and then finish # the dialog func _on_dialog_line_typed(object, key): + var time_to_disappear: float = _calculate_time_to_disappear() text_node.visible_characters = -1 - $Timer.start(_max_time_to_text_disappear) + $Timer.start(time_to_disappear) $Timer.connect("timeout", self, "_on_dialog_finished") +func _calculate_time_to_disappear() -> float: + return (_get_number_of_words() / _reading_speed_in_wpm as float) * 60 + + +func _get_number_of_words() -> int: + return _word_regex.search_all(text_node.get_text()).size() + + # Ending the dialog func _on_dialog_finished(): # Make the speaking item animation stop talking, if it is still alive diff --git a/project.godot b/project.godot index e96c60e1..72bab792 100644 --- a/project.godot +++ b/project.godot @@ -24,27 +24,27 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://addons/escoria-core/game/core-scripts/esc/commands/anim.gd" }, { -"base": "ESCBaseCommand", +"base": "ESCCameraBaseCommand", "class": "CameraPushCommand", "language": "GDScript", "path": "res://addons/escoria-core/game/core-scripts/esc/commands/camera_push.gd" }, { -"base": "ESCBaseCommand", +"base": "ESCCameraBaseCommand", "class": "CameraSetLimitsCommand", "language": "GDScript", "path": "res://addons/escoria-core/game/core-scripts/esc/commands/camera_set_limits.gd" }, { -"base": "ESCBaseCommand", +"base": "ESCCameraBaseCommand", "class": "CameraSetPosCommand", "language": "GDScript", "path": "res://addons/escoria-core/game/core-scripts/esc/commands/camera_set_pos.gd" }, { -"base": "ESCBaseCommand", +"base": "ESCCameraBaseCommand", "class": "CameraSetTargetCommand", "language": "GDScript", "path": "res://addons/escoria-core/game/core-scripts/esc/commands/camera_set_target.gd" }, { -"base": "ESCBaseCommand", +"base": "ESCCameraBaseCommand", "class": "CameraSetZoomCommand", "language": "GDScript", "path": "res://addons/escoria-core/game/core-scripts/esc/commands/camera_set_zoom.gd" @@ -54,7 +54,7 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://addons/escoria-core/game/core-scripts/esc/commands/camera_set_zoom_height.gd" }, { -"base": "ESCBaseCommand", +"base": "ESCCameraBaseCommand", "class": "CameraShiftCommand", "language": "GDScript", "path": "res://addons/escoria-core/game/core-scripts/esc/commands/camera_shift.gd" @@ -109,6 +109,11 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://addons/escoria-core/game/scenes/camera_player/esc_camera.gd" }, { +"base": "ESCBaseCommand", +"class": "ESCCameraBaseCommand", +"language": "GDScript", +"path": "res://addons/escoria-core/game/core-scripts/esc/types/esc_camera_base_command.gd" +}, { "base": "Reference", "class": "ESCCameraLimits", "language": "GDScript", @@ -615,6 +620,7 @@ _global_script_class_icons={ "ESCBackground": "res://addons/escoria-core/design/esc_background.svg", "ESCBaseCommand": "", "ESCCamera": "", +"ESCCameraBaseCommand": "", "ESCCameraLimits": "", "ESCCommand": "", "ESCCommandArgumentDescriptor": "", @@ -745,7 +751,7 @@ search_in_file_extensions=PoolStringArray( "gd", "shader", "esc" ) [editor_plugins] -enabled=PoolStringArray( "res://addons/escoria-core/plugin.cfg", "res://addons/escoria-dialog-simple/plugin.cfg", "res://addons/escoria-ui-9verbs/plugin.cfg", "res://addons/escoria-wizard/plugin.cfg", "res://addons/godot-plugin-refresher/plugin.cfg" ) +enabled=PoolStringArray( "res://addons/escoria-core/plugin.cfg", "res://addons/escoria-dialog-simple/plugin.cfg", "res://addons/escoria-ui-9verbs/plugin.cfg", "res://addons/escoria-wizard/plugin.cfg" ) [escoria] @@ -788,11 +794,11 @@ ui/tooltip_follows_mouse=false main/escoria_version="" ui/dialogs_chooser="res://addons/escoria-core/ui_library/dialogs/text_dialog_chooser.tscn" ui/default_dialog_scene="res://addons/escoria-core/ui_library/dialogs/floating_dialog_player.tscn" +main/action_default_script="res://action_defaults.esc" dialog_simple/avatars_path="res://game/dialog_avatars/" dialog_simple/text_speed_per_character=0.1 dialog_simple/fast_text_speed_per_character=0.25 -dialog_simple/max_time_to_disappear=1.0 -main/action_default_script="res://action_defaults.esc" +dialog_simple/reading_speed_in_wpm=200 [input]