diff options
Diffstat (limited to 'addons/escoria-dialog-simple/states')
16 files changed, 364 insertions, 0 deletions
diff --git a/addons/escoria-dialog-simple/states/dialog_choices.gd b/addons/escoria-dialog-simple/states/dialog_choices.gd new file mode 100644 index 0000000..3779a6d --- /dev/null +++ b/addons/escoria-dialog-simple/states/dialog_choices.gd @@ -0,0 +1,44 @@ +extends State + + +# The owning dialog player. +var _dialog_player + +# The dialog to start. +var _dialog: ESCDialog +var _type: String = "simple" + +var _dialog_chooser_ui: ESCDialogManager = null + +var _ready_to_choose: bool + + +func initialize(dialog_player, dialog_chooser_ui: ESCDialogManager, dialog: ESCDialog, type: String) -> void: + _dialog_player = dialog_player + _dialog_chooser_ui = dialog_chooser_ui + _dialog = dialog + _type = type + + +func enter(): + escoria.logger.trace(self, "Dialog State Machine: Entered 'choices'.") + + if _dialog.options.is_empty(): + escoria.logger.error( + self, + "Received dialog options array was empty." + ) + + _ready_to_choose = true + + +func update(_delta): + if _ready_to_choose: + _ready_to_choose = false + _dialog_chooser_ui.do_choose(_dialog_player, _dialog, _type) + var option = await _dialog_chooser_ui.option_chosen + + escoria.logger.trace(self, "Dialog State Machine: 'choices' -> 'idle'") + + finished.emit("idle") + _dialog_player.option_chosen.emit(option) diff --git a/addons/escoria-dialog-simple/states/dialog_choices.gd.uid b/addons/escoria-dialog-simple/states/dialog_choices.gd.uid new file mode 100644 index 0000000..2e5d12c --- /dev/null +++ b/addons/escoria-dialog-simple/states/dialog_choices.gd.uid @@ -0,0 +1 @@ +uid://vmw64noavihm diff --git a/addons/escoria-dialog-simple/states/dialog_finish.gd b/addons/escoria-dialog-simple/states/dialog_finish.gd new file mode 100644 index 0000000..7dac600 --- /dev/null +++ b/addons/escoria-dialog-simple/states/dialog_finish.gd @@ -0,0 +1,19 @@ +extends State + + +# Owning dialog player +var _dialog_player + + +func initialize(dialog_player) -> void: + _dialog_player = dialog_player + + +func enter(): + escoria.logger.trace(self, "Dialog State Machine: Entered 'finish'.") + + +func update(_delta): + escoria.logger.trace(self, "Dialog State Machine: 'finish' -> 'idle'") + finished.emit("idle") + _dialog_player.say_finished.emit() diff --git a/addons/escoria-dialog-simple/states/dialog_finish.gd.uid b/addons/escoria-dialog-simple/states/dialog_finish.gd.uid new file mode 100644 index 0000000..e9cc6da --- /dev/null +++ b/addons/escoria-dialog-simple/states/dialog_finish.gd.uid @@ -0,0 +1 @@ +uid://drpcjgaq0gd8j diff --git a/addons/escoria-dialog-simple/states/dialog_idle.gd b/addons/escoria-dialog-simple/states/dialog_idle.gd new file mode 100644 index 0000000..d53d89e --- /dev/null +++ b/addons/escoria-dialog-simple/states/dialog_idle.gd @@ -0,0 +1,5 @@ +extends State + + +func enter(): + escoria.logger.trace(self, "Dialog State Machine: Entered 'idle'.") diff --git a/addons/escoria-dialog-simple/states/dialog_idle.gd.uid b/addons/escoria-dialog-simple/states/dialog_idle.gd.uid new file mode 100644 index 0000000..1a0adf1 --- /dev/null +++ b/addons/escoria-dialog-simple/states/dialog_idle.gd.uid @@ -0,0 +1 @@ +uid://3huotinfsd51 diff --git a/addons/escoria-dialog-simple/states/dialog_interrupt.gd b/addons/escoria-dialog-simple/states/dialog_interrupt.gd new file mode 100644 index 0000000..83fb707 --- /dev/null +++ b/addons/escoria-dialog-simple/states/dialog_interrupt.gd @@ -0,0 +1,24 @@ +extends State + + +# Reference to the currently playing dialog manager +var _dialog_manager: ESCDialogManager = null + + +func initialize(dialog_manager: ESCDialogManager) -> void: + _dialog_manager = dialog_manager + + +func enter(): + escoria.logger.trace(self, "Dialog State Machine: Entered 'interrupt'.") + + if _dialog_manager != null: + if not _dialog_manager.say_finished.is_connected(_on_say_finished): + _dialog_manager.say_finished.connect(_on_say_finished) + + _dialog_manager.interrupt() + + +func _on_say_finished() -> void: + escoria.logger.trace(self, "Dialog State Machine: 'interrupt' -> 'finish'") + finished.emit("finish") diff --git a/addons/escoria-dialog-simple/states/dialog_interrupt.gd.uid b/addons/escoria-dialog-simple/states/dialog_interrupt.gd.uid new file mode 100644 index 0000000..3cce4b7 --- /dev/null +++ b/addons/escoria-dialog-simple/states/dialog_interrupt.gd.uid @@ -0,0 +1 @@ +uid://cicognkh6ct0i diff --git a/addons/escoria-dialog-simple/states/dialog_say.gd b/addons/escoria-dialog-simple/states/dialog_say.gd new file mode 100644 index 0000000..c46aea0 --- /dev/null +++ b/addons/escoria-dialog-simple/states/dialog_say.gd @@ -0,0 +1,172 @@ +extends State + + +# Reference to the currently playing dialog manager +var _dialog_manager: ESCDialogManager = null + +# Character that is talking +var _character: String + +# UI to use for the dialog +var _type: String + +# Translation key +var _key: String = "" + +# Text to say +var _text: String + +var _ready_to_say: bool + +# flag for whether the dialog manager has started to "say" to ensure that it has +# prior to exiting this state as other states need this to happen to continue +# (other states rely on the setup that the dialog manager does) +var _say_started: bool + +var _stop_talking_animation_on_option: String + + +func initialize(dialog_manager: ESCDialogManager, character: String, text: String, type: String, key: String) -> void: + _dialog_manager = dialog_manager + _character = character + _text = text + _type = type + _key = key + _stop_talking_animation_on_option = \ + ESCProjectSettingsManager.get_setting(SimpleDialogSettings.STOP_TALKING_ANIMATION_ON) + + +func handle_input(_event): + if _event is InputEventMouseButton and _event.pressed: + if escoria.inputs_manager.input_mode != \ + escoria.inputs_manager.INPUT_NONE and \ + _dialog_manager != null: + + var left_click_action = ESCProjectSettingsManager.get_setting(SimpleDialogSettings.LEFT_CLICK_ACTION) + + _handle_left_click_action(left_click_action) + + +func _handle_left_click_action(left_click_action: String) -> void: + match left_click_action: + SimpleDialogSettings.LEFT_CLICK_ACTION_SPEED_UP: + if _dialog_manager.say_visible.is_connected(_on_say_visible): + _dialog_manager.say_visible.disconnect(_on_say_visible) + + escoria.logger.trace(self, "Dialog State Machine: 'say' -> 'say_fast'") + finished.emit("say_fast") + SimpleDialogSettings.LEFT_CLICK_ACTION_INSTANT_FINISH: + if _dialog_manager.say_visible.is_connected(_on_say_visible): + _dialog_manager.say_visible.disconnect(_on_say_visible) + + escoria.logger.trace(self, "Dialog State Machine: 'say' -> 'say_finish'") + finished.emit("say_finish") + + get_viewport().set_input_as_handled() + + +func enter(): + escoria.logger.trace(self, "Dialog State Machine: Entered 'say'.") + + _say_started = false + + if not _dialog_manager.say_visible.is_connected(_on_say_visible): + _dialog_manager.say_visible.connect(_on_say_visible) + + if _key and not _key.is_empty(): + var _speech_resource = _get_voice_file(_key) + + if _speech_resource == "": + escoria.logger.warn( + self, + "Unable to find voice file with key '%s'." % _key + ) + else: + ( + escoria.object_manager.get_object(escoria.object_manager.SPEECH).node\ + as ESCSpeechPlayer + ).set_state(_speech_resource) + + if _stop_talking_animation_on_option == SimpleDialogSettings.STOP_TALKING_ANIMATION_ON_END_OF_AUDIO: + if not ( + escoria.object_manager.get_object(escoria.object_manager.SPEECH).node\ + as ESCSpeechPlayer + ).stream.finished.is_connected(_on_audio_finished): + + ( + escoria.object_manager.get_object(escoria.object_manager.SPEECH).node\ + as ESCSpeechPlayer + ).stream.finished.connect(_on_audio_finished) + + var translated_text: String = tr(_key) + + # Only update the text if the translated text was found; otherwise, raise + # a warning and use the original, untranslated text. + if translated_text == _key: + escoria.logger.warn( + self, + "Unable to find translation key '%s'. Using untranslated text." % _key + ) + else: + _text = translated_text + + _ready_to_say = true + + +func exit() -> void: + if not _say_started: + _dialog_manager.do_say(_character, _text) + _say_started = true + + +func update(_delta): + if _ready_to_say: + _dialog_manager.do_say(_character, _text) + _say_started = true + _ready_to_say = false + + +# Find the matching voice output file for the given key +# +# #### Parameters +# +# - key: Text key provided +# - start: Starting folder to search for voices +# +# **Returns** The path to the matching voice file +func _get_voice_file(key: String, start: String = "") -> String: + if start == "": + start = ESCProjectSettingsManager.get_setting( + ESCProjectSettingsManager.SPEECH_FOLDER + ) + var _dir = DirAccess.open(start) + if _dir != null: + _dir.list_dir_begin() # TODOConverter3To4 fill missing arguments https://github.com/godotengine/godot/pull/40547 + var file_name = _dir.get_next() + while file_name != "": + if _dir.current_is_dir(): + var _voice_file = _get_voice_file( + key, + start.path_join(file_name) + ) + if _voice_file != "": + return _voice_file + else: + if file_name == "%s.%s.import" % [ + key, + ESCProjectSettingsManager.get_setting( + ESCProjectSettingsManager.SPEECH_EXTENSION + ) + ]: + return start.path_join(file_name.trim_suffix(".import")) + file_name = _dir.get_next() + return "" + + +func _on_say_visible() -> void: + escoria.logger.trace(self, "Dialog State Machine: 'say' -> 'visible'") + finished.emit("visible") + + +func _on_audio_finished() -> void: + _dialog_manager.voice_audio_finished() diff --git a/addons/escoria-dialog-simple/states/dialog_say.gd.uid b/addons/escoria-dialog-simple/states/dialog_say.gd.uid new file mode 100644 index 0000000..c51fafb --- /dev/null +++ b/addons/escoria-dialog-simple/states/dialog_say.gd.uid @@ -0,0 +1 @@ +uid://u44euoojg2al diff --git a/addons/escoria-dialog-simple/states/dialog_say_fast.gd b/addons/escoria-dialog-simple/states/dialog_say_fast.gd new file mode 100644 index 0000000..14d9f05 --- /dev/null +++ b/addons/escoria-dialog-simple/states/dialog_say_fast.gd @@ -0,0 +1,29 @@ +extends State + + +# Reference to the currently playing dialog manager +var _dialog_manager: ESCDialogManager = null + + +func initialize(dialog_manager: ESCDialogManager) -> void: + _dialog_manager = dialog_manager + + +func enter(): + escoria.logger.trace(self, "Dialog State Machine: Entered 'say_fast'.") + + if escoria.inputs_manager.input_mode != \ + escoria.inputs_manager.INPUT_NONE and \ + _dialog_manager != null: + + if not _dialog_manager.say_visible.is_connected(_on_say_visible): + _dialog_manager.say_visible.connect(_on_say_visible) + + _dialog_manager.speedup() + else: + escoria.logger.error(self, "Illegal state.") + + +func _on_say_visible() -> void: + escoria.logger.trace(self, "Dialog State Machine: 'say_fast' -> 'visible'") + finished.emit("visible") diff --git a/addons/escoria-dialog-simple/states/dialog_say_fast.gd.uid b/addons/escoria-dialog-simple/states/dialog_say_fast.gd.uid new file mode 100644 index 0000000..5954fcd --- /dev/null +++ b/addons/escoria-dialog-simple/states/dialog_say_fast.gd.uid @@ -0,0 +1 @@ +uid://cqeelw42dgxp8 diff --git a/addons/escoria-dialog-simple/states/dialog_say_finish.gd b/addons/escoria-dialog-simple/states/dialog_say_finish.gd new file mode 100644 index 0000000..0e5d8aa --- /dev/null +++ b/addons/escoria-dialog-simple/states/dialog_say_finish.gd @@ -0,0 +1,29 @@ +extends State + + +# Reference to the currently playing dialog manager +var _dialog_manager: ESCDialogManager = null + + +func initialize(dialog_manager: ESCDialogManager) -> void: + _dialog_manager = dialog_manager + + +func enter(): + escoria.logger.trace(self, "Dialog State Machine: Entered 'say_finish'.") + + if escoria.inputs_manager.input_mode != \ + escoria.inputs_manager.INPUT_NONE and \ + _dialog_manager != null: + + if not _dialog_manager.say_visible.is_connected(_on_say_visible): + _dialog_manager.say_visible.connect(_on_say_visible) + + _dialog_manager.finish() + else: + escoria.logger.error(self, "Illegal state.") + + +func _on_say_visible() -> void: + escoria.logger.trace(self, "Dialog State Machine: 'say_finish' -> 'visible'") + finished.emit("visible") diff --git a/addons/escoria-dialog-simple/states/dialog_say_finish.gd.uid b/addons/escoria-dialog-simple/states/dialog_say_finish.gd.uid new file mode 100644 index 0000000..c2bf455 --- /dev/null +++ b/addons/escoria-dialog-simple/states/dialog_say_finish.gd.uid @@ -0,0 +1 @@ +uid://cckwcr7x1kao diff --git a/addons/escoria-dialog-simple/states/dialog_visible.gd b/addons/escoria-dialog-simple/states/dialog_visible.gd new file mode 100644 index 0000000..d885cb3 --- /dev/null +++ b/addons/escoria-dialog-simple/states/dialog_visible.gd @@ -0,0 +1,34 @@ +extends State + + +# Reference to the currently playing dialog manager +var _dialog_manager: ESCDialogManager = null + + +func initialize(dialog_manager: ESCDialogManager) -> void: + _dialog_manager = dialog_manager + + +func enter(): + escoria.logger.trace(self, "Dialog State Machine: Entered 'visible'.") + + if not _dialog_manager.say_finished.is_connected(_on_say_finished): + _dialog_manager.say_finished.connect(_on_say_finished) + + +func handle_input(_event): + if _event is InputEventMouseButton and _event.pressed: + if escoria.inputs_manager.input_mode != \ + escoria.inputs_manager.INPUT_NONE: + + if _dialog_manager.say_finished.is_connected(_on_say_finished): + _dialog_manager.say_finished.disconnect(_on_say_finished) + + finished.emit("interrupt") + get_viewport().set_input_as_handled() + + +# Handles the end of a say function after it has emitted say_finished. +func _on_say_finished(): + escoria.logger.trace(self, "Dialog State Machine: 'visible' -> 'finish'") + finished.emit("finish") diff --git a/addons/escoria-dialog-simple/states/dialog_visible.gd.uid b/addons/escoria-dialog-simple/states/dialog_visible.gd.uid new file mode 100644 index 0000000..860ace8 --- /dev/null +++ b/addons/escoria-dialog-simple/states/dialog_visible.gd.uid @@ -0,0 +1 @@ +uid://b7hcll3bfcp8u |
