summaryrefslogtreecommitdiff
path: root/addons/escoria-dialog-simple/states
diff options
context:
space:
mode:
Diffstat (limited to 'addons/escoria-dialog-simple/states')
-rw-r--r--addons/escoria-dialog-simple/states/dialog_choices.gd44
-rw-r--r--addons/escoria-dialog-simple/states/dialog_choices.gd.uid1
-rw-r--r--addons/escoria-dialog-simple/states/dialog_finish.gd19
-rw-r--r--addons/escoria-dialog-simple/states/dialog_finish.gd.uid1
-rw-r--r--addons/escoria-dialog-simple/states/dialog_idle.gd5
-rw-r--r--addons/escoria-dialog-simple/states/dialog_idle.gd.uid1
-rw-r--r--addons/escoria-dialog-simple/states/dialog_interrupt.gd24
-rw-r--r--addons/escoria-dialog-simple/states/dialog_interrupt.gd.uid1
-rw-r--r--addons/escoria-dialog-simple/states/dialog_say.gd172
-rw-r--r--addons/escoria-dialog-simple/states/dialog_say.gd.uid1
-rw-r--r--addons/escoria-dialog-simple/states/dialog_say_fast.gd29
-rw-r--r--addons/escoria-dialog-simple/states/dialog_say_fast.gd.uid1
-rw-r--r--addons/escoria-dialog-simple/states/dialog_say_finish.gd29
-rw-r--r--addons/escoria-dialog-simple/states/dialog_say_finish.gd.uid1
-rw-r--r--addons/escoria-dialog-simple/states/dialog_visible.gd34
-rw-r--r--addons/escoria-dialog-simple/states/dialog_visible.gd.uid1
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