143 lines
3.8 KiB
GDScript
143 lines
3.8 KiB
GDScript
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 != '' and character_name != '':
|
|
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 == "": $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
|
|
yield(get_tree().create_timer(0.4 if text_label.text[text_label.visible_characters - 1] == '.' 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()
|
|
|