extends Control class_name DialogueBox signal end signal update export (NodePath) var name_label_path onready var name_label = get_node(name_label_path) as RichTextLabel export (NodePath) var text_label_path onready var text_label = get_node(text_label_path) as RichTextLabel export (NodePath) var expression_node_path onready var expression_node = get_node(expression_node_path) as RichTextLabel onready var music_player = get_node('/root/MusicPlayer') as MusicPlayer var dialogue : Array var index : int var character_name : String = "" var text : String = "" var expression : String = "" var waiting = false var auto_advance = false func _ready(): assert(name_label != null) assert(text_label != null) assert(music_player != null) func start(_dialogue : Array): dialogue = _dialogue index = 0 update() func _input(event): if !waiting and event.is_action_pressed("ui_accept"): if text_label.visible_characters < text_label.text.length(): text_label.visible_characters = text_label.text.length() else: next() func next() -> void: index += 1 if index >= dialogue.size(): hide() emit_signal('end') return update() func update() -> void: var line = dialogue[index] # Self properties character_name = line.get('name', '') text = line.get('text', '') expression = line.get('expression', '') # Flow waiting = line.get('wait', false) auto_advance = line.get('auto', false) # Timer var timer = line.get('timer', 0) if timer > 0: waiting = true # Audio var audio = line.get('audio', null) if audio != null: if audio == '': music_player.fade_out() else: music_player.play(audio) # UI name_label.bbcode_text = character_name name_label.rect_min_size.x = name_label.get_font('normal_font').get_string_size(name_label.text).x text_label.bbcode_text = text if text == "": hide() else: show() emit_signal('update') animate_text() if timer > 0: yield(get_tree().create_timer(timer), 'timeout') stop_waiting() func animate_text(): var animated = index text_label.visible_characters = 0 while animated == index && text_label.visible_characters < text_label.text.length(): if text_label.text[text_label.visible_characters] == ' ': text_label.visible_characters += 1 text_label.visible_characters += 1 yield(get_tree().create_timer(0.05), 'timeout') func stop_waiting(): waiting = false if auto_advance: next()