diff --git a/addons/escoria-ui-return-monkey-island-dialog-simple/commands/say_to_camera.gd b/addons/escoria-ui-return-monkey-island-dialog-simple/commands/say_to_camera.gd new file mode 100644 index 00000000..9e6e0ac6 --- /dev/null +++ b/addons/escoria-ui-return-monkey-island-dialog-simple/commands/say_to_camera.gd @@ -0,0 +1,139 @@ +# `say_to_camera player text [type]` +# +# Displays the specified string as dialog spoken by the player. This command +# blocks further event execution until the dialog has finished being 'said' +# (either as displayed text or as audible speech from a file). +# +# Global variables can be substituted into the text by wrapping the global +# name in braces. +# e.g. say player "I have {coin_count} coins remaining". +# +# **Parameters** +# +# - *player*: Global ID of the `ESCPlayer` or `ESCItem` object that is active. +# You can specify `current_player` in order to refer to the currently active +# player, e.g. in cases where multiple players are playable such as in games +# like Maniac Mansion or Day of the Tentacle. +# - *text*: Text to display. +# - *key*: Translation key (default: nil) +# - *type*: Dialog type to use. One of `floating` or `avatar`. +# (default: the value set in the setting "Escoria/UI/Default Dialog Type") +# +# The text supports translation keys by prepending the key followed by +# a colon (`:`) to the text. +# For more details see: https://docs.escoria-framework.org/en/devel/getting_started/dialogs.html#translations +# +# Playing an audio file while the text is being +# displayed is also supported by this mechanism. +# For more details see: https://docs.escoria-framework.org/en/devel/getting_started/dialogs.html#recorded_speech +# +# Example: `say(player, "Picture's looking good.", "ROOM1_PICTURE")` +# +# @ESC +extends ESCBaseCommand +class_name SayToCameraCommand + + +const CURRENT_PLAYER_KEYWORD = "CURRENT_PLAYER" + +const DEFAULT_CAMERA_DIRECTION = 4 + +var globals_regex : RegEx # Regex to match global variables in strings + + + +# Constructor +func _init() -> void: + globals_regex = RegEx.new() + # Use look-ahead/behind to capture the term (i.e. global) in braces + globals_regex.compile("(?<=\\{)(.*)(?=\\})") + + +# Return the descriptor of the arguments of this command +func configure() -> ESCCommandArgumentDescriptor: + return ESCCommandArgumentDescriptor.new( + 2, + [TYPE_STRING, TYPE_STRING, TYPE_STRING, TYPE_STRING], + [ + null, + null, + "", + "" + ], + [ + true, + false, + false, + true + ] + ) + + +# Validate whether the given arguments match the command descriptor +func validate(arguments: Array): + if not super.validate(arguments): + return false + + if arguments[0].to_upper() != CURRENT_PLAYER_KEYWORD \ + and not escoria.object_manager.has(arguments[0]): + raise_invalid_object_error(self, arguments[0]) + return false + + return true + + +# Run the command +func run(command_params: Array) -> int: + var dict: Dictionary + + escoria.current_state = escoria.GAME_STATE.DIALOG + + if !escoria.dialog_player: + raise_error( + self, + "No dialog player was registered and the 'say' command was encountered." + ) + escoria.current_state = escoria.GAME_STATE.DEFAULT + return ESCExecution.RC_ERROR + + if not escoria.main.current_scene.player: + escoria.logger.warn( + self, + "[%s]: No player item in the current scene was registered and the say command was encountered." + % get_command_name() + ) + escoria.current_state = escoria.GAME_STATE.DEFAULT + return ESCExecution.RC_CANCEL + + # Replace the names of any globals in "{ }" with their value + command_params[1] = escoria.globals_manager.replace_globals(command_params[1]) + + + + var speaking_character_global_id = escoria.main.current_scene.player.global_id \ + if command_params[0].to_upper() == CURRENT_PLAYER_KEYWORD \ + else command_params[0] + var node = escoria.object_manager.get_object(command_params[0]).node + + + escoria.object_manager.get_object(command_params[0]).node\ + .set_direction(DEFAULT_CAMERA_DIRECTION) + + escoria.dialog_player.say( + speaking_character_global_id, + command_params[3], + command_params[1], + command_params[2] + ) + await escoria.dialog_player.say_finished + escoria.current_state = escoria.GAME_STATE.DEFAULT + + return ESCExecution.RC_OK + + +# Function called when the command is interrupted. +func interrupt(): + escoria.logger.debug( + self, + "[%s] interrupt() function not implemented." % get_command_name() + ) diff --git a/addons/escoria-ui-return-monkey-island-dialog-simple/commands/say_to_camera.gd.uid b/addons/escoria-ui-return-monkey-island-dialog-simple/commands/say_to_camera.gd.uid new file mode 100644 index 00000000..be0144f1 --- /dev/null +++ b/addons/escoria-ui-return-monkey-island-dialog-simple/commands/say_to_camera.gd.uid @@ -0,0 +1 @@ +uid://d0sdlkjqr8f67 diff --git a/gymkhana/characters/oier/oier.tscn b/gymkhana/characters/oier/oier.tscn index 3c8857c5..7f5b9435 100644 --- a/gymkhana/characters/oier/oier.tscn +++ b/gymkhana/characters/oier/oier.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=38 format=3 uid="uid://cjmsexhyhi4vs"] +[gd_scene load_steps=37 format=3 uid="uid://cjmsexhyhi4vs"] [ext_resource type="Script" uid="uid://clg4yrj7v7eae" path="res://addons/escoria-ui-return-monkey-island/esc_player_with_tooltip.gd" id="1"] [ext_resource type="Texture2D" uid="uid://da1kd8lccd24" path="res://gymkhana/characters/oier/oier-mod.png" id="2"] @@ -50,10 +50,6 @@ region = Rect2(4368, 0, 273, 795) atlas = ExtResource("4") region = Rect2(5187, 0, 273, 795) -[sub_resource type="AtlasTexture" id="AtlasTexture_xnkj6"] -atlas = ExtResource("4") -region = Rect2(4914, 0, 273, 795) - [sub_resource type="AtlasTexture" id="AtlasTexture_obf0k"] atlas = ExtResource("4") region = Rect2(4641, 0, 273, 795) @@ -225,9 +221,6 @@ animations = [{ "texture": SubResource("26") }, { "duration": 1.0, -"texture": SubResource("AtlasTexture_xnkj6") -}, { -"duration": 1.0, "texture": SubResource("AtlasTexture_obf0k") }], "loop": true, @@ -331,7 +324,7 @@ animations = ExtResource("3") position = Vector2(0, -155) scale = Vector2(0.389246, 0.389247) sprite_frames = SubResource("20") -animation = &"speak_right" +animation = &"speak_down" [node name="CollisionShape2D" type="CollisionShape2D" parent="."] position = Vector2(5, -151) diff --git a/gymkhana/items/inventory/turno_cocina_mechero.esc b/gymkhana/items/inventory/turno_cocina_mechero.esc index 2da6c056..85296f63 100644 --- a/gymkhana/items/inventory/turno_cocina_mechero.esc +++ b/gymkhana/items/inventory/turno_cocina_mechero.esc @@ -1,20 +1,16 @@ :action1 - set_angle($player, 270) - say($player, "Mi mechero, que bien!!", "mechero_action1_say_1") - set_angle($player,270) - say($player, "Ayer lo dejé un segundo encima de la mesa y desapareció.", "mechero_action1_say_2") + say_to_camera($player, "Mi mechero, que bien!!", "mechero_action1_say_1") + say_to_camera($player, "Ayer lo dejé un segundo encima de la mesa y desapareció.", "mechero_action1_say_2") :action2 - set_angle($player,270) - say($player, "A la saca!", "mechero_action2_say") + say_to_camera($player, "A la saca!", "mechero_action2_say") set_active($turno_cocina_mechero, false) inventory_add("turno_cocina_mechero") :action3 say($player, "Parece que no tiene gas.", "mechero_action3_say_1") say($player, "Eso explica que lo hayan abandonado.", "mechero_action3_say_2") - set_angle($player, 180) - say($player, "Si vienes a Uli vigila tu mechero.", "mechero_action3_say_3") + say_to_camera($player, "Si vienes a Uli vigila tu mechero.", "mechero_action3_say_3") :action4 "turno_cocina_carton" say($player, "Fuego!", "mechero_action4") #ToDo: tiene sentido?