65 lines
1.5 KiB
GDScript
65 lines
1.5 KiB
GDScript
class_name Dialog
|
|
extends Control
|
|
|
|
@export var char_delay := 0.02
|
|
|
|
var message_queue : Array[String] = []
|
|
var is_printing := false
|
|
var skip_requested := false
|
|
@export var dialogue_label : RichTextLabel
|
|
|
|
func _ready() -> void:
|
|
dialogue_label.bbcode_enabled = true
|
|
dialogue_label.visible_characters = 0
|
|
|
|
EventBus.dialogue_requested.connect(add_to_queue)
|
|
|
|
|
|
func add_to_queue(msg: String) -> void:
|
|
message_queue.append(msg)
|
|
if not is_printing:
|
|
visible = true
|
|
is_printing = true
|
|
get_tree().paused = true
|
|
_show_messages()
|
|
|
|
func _show_messages() -> void:
|
|
while not message_queue.is_empty():
|
|
var next_msg : String = message_queue.pop_front()
|
|
await _type_text(next_msg)
|
|
|
|
_finish_dialogue()
|
|
|
|
|
|
func _type_text(msg: String) -> void:
|
|
|
|
dialogue_label.text = msg
|
|
dialogue_label.visible_characters = 0
|
|
skip_requested = false
|
|
|
|
for i in msg.length():
|
|
if skip_requested:
|
|
break
|
|
|
|
dialogue_label.visible_characters = i + 1
|
|
await get_tree().create_timer(char_delay, true, false, true).timeout
|
|
|
|
dialogue_label.visible_characters = -1
|
|
await _wait_for_input()
|
|
|
|
func _wait_for_input() -> void:
|
|
skip_requested = false
|
|
while not skip_requested:
|
|
await get_tree().process_frame
|
|
|
|
func _finish_dialogue() -> void:
|
|
dialogue_label.visible_characters = 0
|
|
dialogue_label.text = ""
|
|
visible = false
|
|
is_printing = false
|
|
get_tree().paused = false
|
|
EventBus.dialogue_finished.emit()
|
|
|
|
func _input(event: InputEvent) -> void:
|
|
if event.is_action_pressed("ui_accept") or (event is InputEventMouseButton and event.pressed):
|
|
skip_requested = true
|