oier animation tweaks, say_to_camera command

This commit is contained in:
2025-09-07 20:01:39 +02:00
parent 2b7d57c802
commit 7c6d7f0729
4 changed files with 146 additions and 17 deletions

View File

@@ -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()
)

View File

@@ -0,0 +1 @@
uid://d0sdlkjqr8f67

View File

@@ -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)

View File

@@ -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?