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