From aaa3953b9c0ab4f329bf725388ec2e4dcb0bc772 Mon Sep 17 00:00:00 2001 From: Eneko Nieto Date: Sun, 26 Jan 2025 23:38:25 +0100 Subject: [PATCH] fix(rtmi-dialog-simple): say command was blocking game state --- .../plugin.gd | 10 +-- .../rtmi_dialog_simple.gd | 62 ++++++++++++++++++- .../rtmi_dialog_simple_settings.gd | 3 + .../escoria-ui-return-monkey-island/game.gd | 7 ++- .../overrides/esc_inventory_item.gd | 4 +- .../items/inventory/turno_cocina_carton.esc | 4 +- .../cocina_delante/esc/cocina_delante.esc | 2 +- 7 files changed, 76 insertions(+), 16 deletions(-) diff --git a/addons/escoria-ui-return-monkey-island-dialog-simple/plugin.gd b/addons/escoria-ui-return-monkey-island-dialog-simple/plugin.gd index 06fd41e2..bcdd09f1 100644 --- a/addons/escoria-ui-return-monkey-island-dialog-simple/plugin.gd +++ b/addons/escoria-ui-return-monkey-island-dialog-simple/plugin.gd @@ -6,10 +6,6 @@ extends EditorPlugin const MANAGER_CLASS="res://addons/escoria-ui-return-monkey-island-dialog-simple/rtmi_dialog_simple.gd" const SETTINGS_ROOT="escoria/rtmi_dialog_simple" -const READING_SPEED_IN_WPM_DEFAULT_VALUE = 200 -const TEXT_TIME_PER_LETTER_MS_DEFAULT_VALUE = 100 -const TEXT_TIME_PER_LETTER_MS_FAST_DEFAULT_VALUE = 25 - var left_click_actions: PackedStringArray = [ RTMISimpleDialogSettings.LEFT_CLICK_ACTION_SPEED_UP, RTMISimpleDialogSettings.LEFT_CLICK_ACTION_INSTANT_FINISH, @@ -87,7 +83,7 @@ func _enable_plugin(): ESCProjectSettingsManager.register_setting( RTMISimpleDialogSettings.TEXT_TIME_PER_LETTER_MS, - TEXT_TIME_PER_LETTER_MS_DEFAULT_VALUE, + RTMISimpleDialogSettings.TEXT_TIME_PER_LETTER_MS_DEFAULT_VALUE, { "type": TYPE_FLOAT } @@ -95,7 +91,7 @@ func _enable_plugin(): ESCProjectSettingsManager.register_setting( RTMISimpleDialogSettings.TEXT_TIME_PER_LETTER_MS_FAST, - TEXT_TIME_PER_LETTER_MS_FAST_DEFAULT_VALUE, + RTMISimpleDialogSettings.TEXT_TIME_PER_LETTER_MS_FAST_DEFAULT_VALUE, { "type": TYPE_FLOAT } @@ -111,7 +107,7 @@ func _enable_plugin(): ESCProjectSettingsManager.register_setting( RTMISimpleDialogSettings.READING_SPEED_IN_WPM, - READING_SPEED_IN_WPM_DEFAULT_VALUE, + RTMISimpleDialogSettings.READING_SPEED_IN_WPM_DEFAULT_VALUE, { "type": TYPE_INT } diff --git a/addons/escoria-ui-return-monkey-island-dialog-simple/rtmi_dialog_simple.gd b/addons/escoria-ui-return-monkey-island-dialog-simple/rtmi_dialog_simple.gd index f07d011d..c7fe6f79 100644 --- a/addons/escoria-ui-return-monkey-island-dialog-simple/rtmi_dialog_simple.gd +++ b/addons/escoria-ui-return-monkey-island-dialog-simple/rtmi_dialog_simple.gd @@ -39,6 +39,26 @@ func has_type(type: String) -> bool: return true if type in ["floating"] else false +# Check whether a specific chooser type is supported by the +# dialog plugin +# +# #### Parameters +# - type: required chooser type +# *Returns* Whether the type is supported or not +func has_chooser_type(type: String) -> bool: + return true if type == "simple" else false + + +# Instructs the dialog manager to preserve the next dialog box used by a `say` +# command until a call to `disable_preserve_dialog_box` is made. +# +# This method should be idempotent, i.e. if called after the first time and +# prior to `disable_preserve_dialog_box` being called, the result should be the +# same. +func enable_preserve_dialog_box() -> void: + _should_preserve_dialog_box = true + + # Instructs the dialog manager to no longer preserve the currently-preserved # dialog box or to not preserve the next dialog box used by a `say` command # (this is the default state). @@ -52,7 +72,38 @@ func disable_preserve_dialog_box() -> void: if is_instance_valid(_dialog_player) and _dialog_player.get_children().has(_type_player): _dialog_player.remove_child(_type_player) _preserved_type_player_type = "" - _dialog_player.remove_child(_dialog_tip) + + +# Output a text said by the item specified by the global id. Emit +# `say_finished` after finishing displaying the text. +# +# #### Parameters +# - dialog_player: Node of the dialog player in the UI +# - global_id: Global id of the item that is speaking +# - text: Text to say, optional prefixed by a translation key separated +# by a ":" +# - type: Type of dialog box to use +# - *key*: Translation key +func say(dialog_player: Node, global_id: String, text: String, type: String, key: String): + _dialog_player = dialog_player + + _initialize_say_states(global_id, text, type, key) + + if _should_preserve_dialog_box: + # If the dialog box type doesn't match what's currently being reused (if anything), + # we want to remove the old one (if it exists) and then initialize and add the new dialog + # box type to the dialog player + if type != _preserved_type_player_type: + if _dialog_player.get_children().has(_type_player): + _dialog_player.remove_child(_type_player) + + _init_type_player(type) + + _preserved_type_player_type = type + else: + _init_type_player(type) + + state_machine._change_state("say") func do_say(global_id: String, text: String) -> void: @@ -83,6 +134,15 @@ func _init_type_player(type: String) -> void: _type_player.say_visible.connect(_on_say_visible) +func _initialize_say_states(global_id: String, text: String, type: String, key: String) -> void: + state_machine.states_map["say"].initialize(self, global_id, text, type, key) + state_machine.states_map["finish"].initialize(_dialog_player) + state_machine.states_map["say_fast"].initialize(self) + state_machine.states_map["say_finish"].initialize(self) + state_machine.states_map["visible"].initialize(self) + state_machine.states_map["interrupt"].initialize(self) + + func _on_say_finished(): if not _should_preserve_dialog_box and _dialog_player.get_children().has(_type_player): _dialog_player.remove_child(_type_player) diff --git a/addons/escoria-ui-return-monkey-island-dialog-simple/rtmi_dialog_simple_settings.gd b/addons/escoria-ui-return-monkey-island-dialog-simple/rtmi_dialog_simple_settings.gd index f6199010..14a63556 100644 --- a/addons/escoria-ui-return-monkey-island-dialog-simple/rtmi_dialog_simple_settings.gd +++ b/addons/escoria-ui-return-monkey-island-dialog-simple/rtmi_dialog_simple_settings.gd @@ -5,8 +5,11 @@ const SETTINGS_ROOT = "escoria/rtmi_dialog_simple" const AVATARS_PATH = "%s/avatars_path" % SETTINGS_ROOT const TEXT_TIME_PER_LETTER_MS = "%s/text_time_per_letter_ms" % SETTINGS_ROOT +const TEXT_TIME_PER_LETTER_MS_DEFAULT_VALUE = 100 const TEXT_TIME_PER_LETTER_MS_FAST = "%s/text_time_per_fast_letter_ms" % SETTINGS_ROOT +const TEXT_TIME_PER_LETTER_MS_FAST_DEFAULT_VALUE = 25 const READING_SPEED_IN_WPM = "%s/reading_speed_in_wpm" % SETTINGS_ROOT +const READING_SPEED_IN_WPM_DEFAULT_VALUE = 200 const CLEAR_TEXT_BY_CLICK_ONLY = "%s/clear_text_by_click_only" % SETTINGS_ROOT const LEFT_CLICK_ACTION = "%s/left_click_action" % SETTINGS_ROOT diff --git a/addons/escoria-ui-return-monkey-island/game.gd b/addons/escoria-ui-return-monkey-island/game.gd index 0b90f81a..802b5364 100644 --- a/addons/escoria-ui-return-monkey-island/game.gd +++ b/addons/escoria-ui-return-monkey-island/game.gd @@ -272,9 +272,10 @@ func element_focused(element_id: String) -> void: if is_instance_valid(last_target): last_target.get_component('outline').highlight(false) - if(escoria.action_manager.has_actions(target_obj)): - target_obj.get_component('outline').highlight(true) - last_target = target_obj + if escoria.action_manager.has_actions(target_obj): + if target_obj is ESCItemWithTooltip: + target_obj.get_component('outline').highlight(true) + last_target = target_obj func element_unfocused() -> void: diff --git a/addons/escoria-ui-return-monkey-island/overrides/esc_inventory_item.gd b/addons/escoria-ui-return-monkey-island/overrides/esc_inventory_item.gd index 97bb5486..b5dd3ce4 100644 --- a/addons/escoria-ui-return-monkey-island/overrides/esc_inventory_item.gd +++ b/addons/escoria-ui-return-monkey-island/overrides/esc_inventory_item.gd @@ -11,5 +11,5 @@ var texture: Texture2D = null func _init(p_item: ESCItem) -> void: global_id = p_item.global_id texture = p_item._get_inventory_texture() - p_item.register_components() - + if p_item is ESCItemWithTooltip: + p_item.register_components() diff --git a/gymkhana/items/inventory/turno_cocina_carton.esc b/gymkhana/items/inventory/turno_cocina_carton.esc index 07f632f6..73010dc2 100644 --- a/gymkhana/items/inventory/turno_cocina_carton.esc +++ b/gymkhana/items/inventory/turno_cocina_carton.esc @@ -3,8 +3,8 @@ :action2 say($player, "Cartón pa la saca!", "TODO_I18N") - set_active(turno_cocina_carton, false) - inventory_add(turno_cocina_carton) + set_active($turno_cocina_carton, false) + inventory_add($turno_cocina_carton) :action3 say($player, "Es una caja de cartón vacía.", "TODO_I18N") diff --git a/gymkhana/rooms/turno_cocina/cocina_delante/esc/cocina_delante.esc b/gymkhana/rooms/turno_cocina/cocina_delante/esc/cocina_delante.esc index 6e97ad28..28c5968c 100644 --- a/gymkhana/rooms/turno_cocina/cocina_delante/esc/cocina_delante.esc +++ b/gymkhana/rooms/turno_cocina/cocina_delante/esc/cocina_delante.esc @@ -10,7 +10,7 @@ if not cocina_delante_intro_played: accept_input("SKIP") stop_snd() - play_video("res://gymkhana/videos/turno_cocina/intro.ogv") + play_video("res://gymkhana/videos/turno_cocina/intro.ogv") if not turno_cocina_frontal_entregado: inventory_add("turno_cocina_frontal")