108 lines
3.3 KiB
GDScript
108 lines
3.3 KiB
GDScript
extends VBoxContainer
|
|
|
|
|
|
@export var dialogue_gdscript : GDScript = null
|
|
var dialogue_engine : DialogueEngine = null
|
|
|
|
@onready var progress_bar : ProgressBar = $ProgressBar
|
|
@onready var vbox : VBoxContainer = $VBox
|
|
|
|
|
|
func _ready() -> void:
|
|
dialogue_engine = dialogue_gdscript.new()
|
|
dialogue_engine.dialogue_started.connect(__on_dialogue_started)
|
|
dialogue_engine.dialogue_continued.connect(__on_dialogue_continued)
|
|
dialogue_engine.dialogue_finished.connect(__on_dialogue_finished)
|
|
dialogue_engine.dialogue_cancelled.connect(__on_dialogue_cancelled)
|
|
|
|
|
|
func _input(p_input_event : InputEvent) -> void:
|
|
if p_input_event.is_action_pressed(&"ui_accept"):
|
|
dialogue_engine.advance()
|
|
accept_event() # to avoid hidding an button due to the input event travelling through the children
|
|
|
|
|
|
func __on_dialogue_started() -> void:
|
|
print("Dialogue Started!")
|
|
|
|
|
|
var enabled_buttons : Array[Button] = []
|
|
|
|
|
|
func __on_dialogue_continued(p_dialogue_entry : DialogueEntry) -> void:
|
|
var label : RichTextLabel = RichTextLabel.new()
|
|
label.set_use_bbcode(true)
|
|
label.set_fit_content(true)
|
|
label.set_text(" > " + p_dialogue_entry.get_text())
|
|
vbox.add_child(label)
|
|
|
|
if p_dialogue_entry.has_options():
|
|
var dont_show_options : Array = p_dialogue_entry.get_metadata("dont_show_options", [])
|
|
for option_id : int in range(0, p_dialogue_entry.get_option_count()):
|
|
if option_id in dont_show_options:
|
|
continue
|
|
var option_text : String = p_dialogue_entry.get_option_text(option_id)
|
|
var button : Button = Button.new()
|
|
button.set_text(option_text)
|
|
vbox.add_child(button)
|
|
var tween: Tween = create_tween()
|
|
if option_id == 0:
|
|
button.grab_focus()
|
|
tween.tween_property(button, "modulate", Color.TRANSPARENT, 3.0)
|
|
tween.tween_callback(button.hide)
|
|
else:
|
|
# Only show other buttons after the tween finishes
|
|
button.hide()
|
|
tween.tween_callback(button.show).set_delay(5.0)
|
|
|
|
if option_id == 1:
|
|
tween.tween_callback(button.grab_focus)
|
|
tween.tween_callback(progress_bar.show)
|
|
tween.tween_method(progress_bar.set_value, 1.0, 0.0, 2.0)
|
|
|
|
# The timer has just finished
|
|
tween.tween_callback(progress_bar.hide)
|
|
tween.tween_callback(advance_dialogue_no_answer)
|
|
button.pressed.connect(__advance_dialogue_with_chosen_option.bind(option_id))
|
|
enabled_buttons.push_back(button)
|
|
set_process_input(false)
|
|
|
|
|
|
func advance_dialogue_no_answer() -> void:
|
|
for button : Button in enabled_buttons:
|
|
button.set_disabled(true)
|
|
|
|
var entry : DialogueEntry = dialogue_engine.get_current_entry()
|
|
var option_id : int = entry.get_metadata("auto_choose")
|
|
entry.choose_option(option_id)
|
|
dialogue_engine.advance()
|
|
set_process_input(true)
|
|
|
|
|
|
func __advance_dialogue_with_chosen_option(p_option_id : int) -> void:
|
|
# Kill all tweens from processing further
|
|
for tween: Tween in get_tree().get_processed_tweens():
|
|
tween.kill()
|
|
for button : Button in enabled_buttons:
|
|
button.set_disabled(true)
|
|
# Reset modulate of vanishing button
|
|
button.modulate = Color.WHITE
|
|
enabled_buttons.clear()
|
|
progress_bar.hide()
|
|
|
|
var current_entry : DialogueEntry = dialogue_engine.get_current_entry()
|
|
current_entry.choose_option(p_option_id)
|
|
dialogue_engine.advance()
|
|
|
|
set_process_input(true)
|
|
|
|
|
|
func __on_dialogue_finished() -> void:
|
|
print("Dialogue Finished! Exiting...")
|
|
get_tree().quit()
|
|
|
|
|
|
func __on_dialogue_cancelled() -> void:
|
|
print("Dialogue Cancelled! Exiting...")
|
|
get_tree().quit()
|