feat: Add global interpolation for say command (#562)
Co-authored-by: Balloonpopper <balloonpopper@git.com>
This commit is contained in:
@@ -4,6 +4,10 @@
|
|||||||
# blocks further event execution until the dialog has finished being 'said'
|
# blocks further event execution until the dialog has finished being 'said'
|
||||||
# (either as displayed text or as audible speech from a file).
|
# (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**
|
# **Parameters**
|
||||||
#
|
#
|
||||||
# - *player*: Global ID of the `ESCPlayer` or `ESCItem` object that is active
|
# - *player*: Global ID of the `ESCPlayer` or `ESCItem` object that is active
|
||||||
@@ -21,6 +25,16 @@ extends ESCBaseCommand
|
|||||||
class_name SayCommand
|
class_name SayCommand
|
||||||
|
|
||||||
|
|
||||||
|
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
|
# Return the descriptor of the arguments of this command
|
||||||
func configure() -> ESCCommandArgumentDescriptor:
|
func configure() -> ESCCommandArgumentDescriptor:
|
||||||
return ESCCommandArgumentDescriptor.new(
|
return ESCCommandArgumentDescriptor.new(
|
||||||
@@ -78,6 +92,8 @@ func run(command_params: Array) -> int:
|
|||||||
)
|
)
|
||||||
return ESCExecution.RC_ERROR
|
return ESCExecution.RC_ERROR
|
||||||
|
|
||||||
|
command_params[1] = _replace_globals(command_params[1])
|
||||||
|
|
||||||
escoria.dialog_player.say(
|
escoria.dialog_player.say(
|
||||||
command_params[0],
|
command_params[0],
|
||||||
command_params[2],
|
command_params[2],
|
||||||
@@ -86,3 +102,16 @@ func run(command_params: Array) -> int:
|
|||||||
yield(escoria.dialog_player, "say_finished")
|
yield(escoria.dialog_player, "say_finished")
|
||||||
escoria.current_state = escoria.GAME_STATE.DEFAULT
|
escoria.current_state = escoria.GAME_STATE.DEFAULT
|
||||||
return ESCExecution.RC_OK
|
return ESCExecution.RC_OK
|
||||||
|
|
||||||
|
|
||||||
|
# Replaces terms in braces with the value of the matching global (or Null
|
||||||
|
# if none exists)
|
||||||
|
func _replace_globals(string: String):
|
||||||
|
for result in globals_regex.search_all(string):
|
||||||
|
var globresult = escoria.globals_manager.get_global(
|
||||||
|
str(result.get_string())
|
||||||
|
)
|
||||||
|
string = string.replace(
|
||||||
|
"{" + result.get_string() + "}", str(globresult)
|
||||||
|
)
|
||||||
|
return string
|
||||||
|
|||||||
@@ -1,2 +1,7 @@
|
|||||||
:exit_scene
|
:exit_scene
|
||||||
change_scene "res://game/rooms/room03/room03.tscn"
|
change_scene "res://game/rooms/room03/room03.tscn"
|
||||||
|
|
||||||
|
:look
|
||||||
|
# Test globals in say command
|
||||||
|
inc_global r4_door_look_count 1
|
||||||
|
say player "You have looked at the doorway {r4_door_look_count} times"
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
:setup
|
:setup
|
||||||
|
set_global r4_door_look_count 0
|
||||||
|
|
||||||
> [eq ESC_LAST_SCENE room3]
|
> [eq ESC_LAST_SCENE room3]
|
||||||
teleport player l_exit
|
teleport player l_exit
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ animations = null
|
|||||||
polygon = PoolVector2Array( 22, 633, 21, 328, 143, 276, 143, 565 )
|
polygon = PoolVector2Array( 22, 633, 21, 328, 143, 276, 143, 565 )
|
||||||
|
|
||||||
[node name="Position2D" type="Position2D" parent="Hotspots/l_door"]
|
[node name="Position2D" type="Position2D" parent="Hotspots/l_door"]
|
||||||
position = Vector2( 80, 589 )
|
position = Vector2( 92, 603 )
|
||||||
script = ExtResource( 9 )
|
script = ExtResource( 9 )
|
||||||
|
|
||||||
[node name="r_door" type="Area2D" parent="Hotspots"]
|
[node name="r_door" type="Area2D" parent="Hotspots"]
|
||||||
|
|||||||
Reference in New Issue
Block a user