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 onready var black_screen = $BlackScreen onready var control_indicator = $MarginContainer/VBoxContainer/ControlIndicator 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) assert(black_screen != null) $MarginContainer.hide() func start_dialogue(dialog_path : String) -> DialogueAction: var dialogue = DialogueAction.new() dialogue.dialogue_file_path = dialog_path dialogue.dialogue_box = self dialogue.start() return dialogue 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(): $MarginContainer.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 var upside_down = line.get('upside_down', false) if upside_down: $MarginContainer/VBoxContainer.alignment = BoxContainer.ALIGN_BEGIN $MarginContainer/VBoxContainer.add_child_below_node($MarginContainer/VBoxContainer/TextContainer, $MarginContainer/VBoxContainer/NameContainer) else: $MarginContainer/VBoxContainer.alignment = BoxContainer.ALIGN_END $MarginContainer/VBoxContainer.add_child_below_node($MarginContainer/VBoxContainer/NameContainer, $MarginContainer/VBoxContainer/TextContainer) if text != '': 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 character_name == '': $MarginContainer/VBoxContainer/NameContainer.hide() else: $MarginContainer/VBoxContainer/NameContainer.show() if text == "": $MarginContainer.hide() else: $MarginContainer.show() emit_signal('update') # Animation var animation = line.get('animation', null) if animation != null: print('animate!' + animation) black_screen.animate(animation, timer) elif expression == 'black': black_screen.animate('black', 0) else: black_screen.animate(null, timer) 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 control_indicator.hide() 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 var c = text_label.text[text_label.visible_characters - 1] if $MarginContainer.visible: if "abcdefghijklmnoprstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZÀàéÉçÇÈèùÙ.".rfind(c) >= 0: if character_name == 'Ely': $GibberishPlayer2.play() else: $GibberishPlayer1.play() yield(get_tree().create_timer(0.4 if c == '.' else 0.05), 'timeout') if !Globals.ui_accept_tip: control_indicator.show_press('ui_accept') Globals.ui_accept_tip = true func stop_waiting(): waiting = false if auto_advance: next()