diff --git a/addons/escoria-core/game/core-scripts/esc/commands/say.gd b/addons/escoria-core/game/core-scripts/esc/commands/say.gd index a737c378..6d35a4c4 100644 --- a/addons/escoria-core/game/core-scripts/esc/commands/say.gd +++ b/addons/escoria-core/game/core-scripts/esc/commands/say.gd @@ -25,7 +25,7 @@ func configure() -> ESCCommandArgumentDescriptor: [ null, null, - ProjectSettings.get_setting("escoria/ui/default_dialog_type") + "" ] ) diff --git a/addons/escoria-core/game/scenes/dialogs/esc_dialog_player.gd b/addons/escoria-core/game/scenes/dialogs/esc_dialog_player.gd index d5c9f9ed..d6b59e7e 100644 --- a/addons/escoria-core/game/scenes/dialogs/esc_dialog_player.gd +++ b/addons/escoria-core/game/scenes/dialogs/esc_dialog_player.gd @@ -3,6 +3,10 @@ extends Node class_name ESCDialogPlayer +# A regular expression that separates the translation key from the text +const KEYTEXT_REGEX = "^((?[^:]+):)?(?.+)" + + # Emitted when an answer as chosem # # ##### Parameters @@ -22,8 +26,13 @@ var is_speaking: bool = false var _dialog_manager: ESCDialogManager = null +# Regular expression object for the separation of key and text +var _keytext_regex: RegEx = RegEx.new() + + # Register the dialog player and load the dialog resources func _ready(): + _keytext_regex.compile(KEYTEXT_REGEX) if !Engine.is_editor_hint(): escoria.dialog_player = self @@ -81,6 +90,8 @@ func _get_voice_file(key: String, start: String = "") -> String: # - type: UI to use for the dialog # - text: Text to say func say(character: String, type: String, text: String) -> void: + if type == "": + type = ProjectSettings.get_setting("escoria/ui/default_dialog_type") is_speaking = true for _manager_class in ProjectSettings.get_setting( "escoria/ui/dialog_managers" @@ -92,22 +103,32 @@ func say(character: String, type: String, text: String) -> void: if _dialog_manager == null: escoria.logger.report_errors( - "esc_dialog_player.gd: Unknown type", + "esc_dialog_player.gd:say", [ "No dialog manager supports the type %s" % type ] ) - var _key_text = text.split(":") - if _key_text.size() == 1: - text = _key_text[0] - elif _key_text.size() >= 2: - var _speech_resource = _get_voice_file(_key_text[0]) + var matches = _keytext_regex.search(text) + if not matches: + escoria.logger.report_errors( + "esc_dialog_player.gd:say", + [ + "Unexpected text encountered %s" % text + ] + ) + var key = matches.get_string("key") + if matches.get_string("key") != "": + var _speech_resource = _get_voice_file( + matches.get_string("key") + ) if _speech_resource != "": ( escoria.object_manager.get_object("_speech").node\ as ESCSpeechPlayer ).set_state(_speech_resource) - text = tr(_key_text[0]) + text = tr(matches.get_string("key")) + else: + text = matches.get_string("text") _dialog_manager.say(self, character, text, type) yield(_dialog_manager, "say_finished") diff --git a/addons/escoria-dialog-simple/types/floating.gd b/addons/escoria-dialog-simple/types/floating.gd index 0c204585..9bd9943b 100644 --- a/addons/escoria-dialog-simple/types/floating.gd +++ b/addons/escoria-dialog-simple/types/floating.gd @@ -46,11 +46,22 @@ func _ready(): func _process(delta): - # Position the RichTextLabel on the character's dialog position, if any. - rect_position = _current_character.get_node("dialog_position") \ - .get_global_transform_with_canvas().origin - rect_position.x -= rect_size.x / 2 - + if _current_character.is_inside_tree() and \ + _current_character.has_node("dialog_position"): + # Position the RichTextLabel on the character's dialog position, if any. + rect_position = _current_character.get_node("dialog_position") \ + .get_global_transform_with_canvas().origin + rect_position.x -= rect_size.x / 2 + + if rect_position.x < 0: + rect_position.x = 0 + + var screen_margin = rect_position.x + rect_size.x - \ + ProjectSettings.get("display/window/size/width") + + if screen_margin > 0: + rect_position.x -= screen_margin + # Make a character say something # @@ -81,7 +92,16 @@ func say(character: String, line: String) : else: rect_position.x = 0 rect_size.x = ProjectSettings.get_setting("display/window/size/width") - + + if rect_position.x < 0: + rect_position.x = 0 + + var screen_margin = rect_position.x + rect_size.x - \ + ProjectSettings.get("display/window/size/width") + + if screen_margin > 0: + rect_position.x -= screen_margin + _current_character.start_talking() text_node.percent_visible = 0.0 diff --git a/game/rooms/room15/esc/say_long.esc b/game/rooms/room15/esc/say_long.esc new file mode 100644 index 00000000..bd6b8948 --- /dev/null +++ b/game/rooms/room15/esc/say_long.esc @@ -0,0 +1,3 @@ +:use + +say player "This is a very long text: it will most likely span over the border of the screen if not handled well. Let's see" floating diff --git a/game/rooms/room15/room15.tscn b/game/rooms/room15/room15.tscn index 71348edb..ae033586 100644 --- a/game/rooms/room15/room15.tscn +++ b/game/rooms/room15/room15.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=10 format=2] +[gd_scene load_steps=11 format=2] [ext_resource path="res://addons/escoria-core/game/core-scripts/esc_terrain.gd" type="Script" id=1] [ext_resource path="res://game/rooms/room15/background.tscn" type="PackedScene" id=2] @@ -8,6 +8,7 @@ [ext_resource path="res://addons/escoria-core/game/core-scripts/esc_room.gd" type="Script" id=6] [ext_resource path="res://addons/escoria-core/game/core-scripts/esc_item.gd" type="Script" id=7] [ext_resource path="res://game/rooms/room15/r_door.tscn" type="PackedScene" id=8] +[ext_resource path="res://game/items/escitems/button.tscn" type="PackedScene" id=9] [sub_resource type="NavigationPolygon" id=1] vertices = PoolVector2Array( 1168.92, 640.557, 1182.53, 588.863, 1269.59, 622.872, 1275.03, 799.721, 864.626, 613.518, 1143.08, 613.35, -9.16094, 803.802, 386.666, 618.012, 129.634, 615.792, 84.5821, 654.06, -6.44019, 711.297, 3.15687, 646.051, 59.2201, 628.698 ) @@ -94,3 +95,21 @@ script = ExtResource( 5 ) global_id = "start" is_start_location = true interaction_direction = 180 + +[node name="say_long" parent="Hotspots" instance=ExtResource( 9 )] +position = Vector2( 675.509, 0.950089 ) +global_id = "say_long" +esc_script = "res://game/rooms/room15/esc/say_long.esc" +tooltip_name = "Say long test right" + +[node name="Position2D" type="Position2D" parent="Hotspots/say_long"] +position = Vector2( 362.457, 358.656 ) + +[node name="say_long_left" parent="Hotspots" instance=ExtResource( 9 )] +position = Vector2( -205.218, 2.85024 ) +global_id = "say_long_left" +esc_script = "res://game/rooms/room15/esc/say_long.esc" +tooltip_name = "Say long test left" + +[node name="Position2D" type="Position2D" parent="Hotspots/say_long_left"] +position = Vector2( 362.457, 358.656 ) diff --git a/project.godot b/project.godot index 019282a2..525fa468 100644 --- a/project.godot +++ b/project.godot @@ -714,6 +714,10 @@ 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 +debug/log_file_path="user://" +debug/crash_message="We're sorry, but the game crashed. Please send us the following files: + +%s" [input]