157 lines
5.6 KiB
GDScript
157 lines
5.6 KiB
GDScript
tool
|
|
extends Control
|
|
|
|
var text_speed := 0.02 # Higher = lower speed
|
|
|
|
onready var text_label = $RichTextLabel
|
|
onready var name_label = $NameLabel
|
|
onready var tween = $Tween
|
|
|
|
var _finished := false
|
|
|
|
signal text_completed()
|
|
|
|
|
|
## *****************************************************************************
|
|
## PUBLIC METHODS
|
|
## *****************************************************************************
|
|
|
|
|
|
func update_name(name: String, color: Color = Color.white, autocolor: bool=false) -> void:
|
|
if not name.empty():
|
|
name_label.visible = true
|
|
# Hack to reset the size
|
|
name_label.rect_min_size = Vector2(0, 0)
|
|
name_label.rect_size = Vector2(-1, 40)
|
|
# Setting the color and text
|
|
name_label.text = name
|
|
if autocolor:
|
|
name_label.set('custom_colors/font_color', color)
|
|
else:
|
|
name_label.visible = false
|
|
|
|
|
|
func update_text(text):
|
|
# Updating the text and starting the animation from 0
|
|
text_label.bbcode_text = text
|
|
text_label.percent_visible = 0
|
|
|
|
# The call to this function needs to be deferred.
|
|
# More info: https://github.com/godotengine/godot/issues/36381
|
|
call_deferred("_start_text_tween")
|
|
return true
|
|
|
|
|
|
func is_finished():
|
|
return _finished
|
|
|
|
|
|
func skip():
|
|
tween.seek(999)
|
|
_on_Tween_tween_completed(null, null)
|
|
|
|
|
|
func reset():
|
|
name_label.text = ''
|
|
name_label.visible = false
|
|
|
|
|
|
func load_theme(theme: ConfigFile):
|
|
# Text
|
|
var theme_font = DialogicUtil.path_fixer_load(theme.get_value('text', 'font', 'res://addons/dialogic/Example Assets/Fonts/DefaultFont.tres'))
|
|
text_label.set('custom_fonts/normal_font', theme_font)
|
|
name_label.set('custom_fonts/font', theme_font)
|
|
|
|
var text_color = Color(theme.get_value('text', 'color', '#ffffffff'))
|
|
text_label.set('custom_colors/default_color', text_color)
|
|
name_label.set('custom_colors/font_color', text_color)
|
|
|
|
text_label.set('custom_colors/font_color_shadow', Color('#00ffffff'))
|
|
name_label.set('custom_colors/font_color_shadow', Color('#00ffffff'))
|
|
|
|
if theme.get_value('text', 'shadow', false):
|
|
var text_shadow_color = Color(theme.get_value('text', 'shadow_color', '#9e000000'))
|
|
text_label.set('custom_colors/font_color_shadow', text_shadow_color)
|
|
|
|
var shadow_offset = theme.get_value('text', 'shadow_offset', Vector2(2,2))
|
|
text_label.set('custom_constants/shadow_offset_x', shadow_offset.x)
|
|
text_label.set('custom_constants/shadow_offset_y', shadow_offset.y)
|
|
|
|
|
|
# Text speed
|
|
text_speed = theme.get_value('text','speed', 2) * 0.01
|
|
|
|
# Margin
|
|
var text_margin = theme.get_value('text', 'margin', Vector2(20, 10))
|
|
text_label.set('margin_left', text_margin.x)
|
|
text_label.set('margin_right', text_margin.x * -1)
|
|
text_label.set('margin_top', text_margin.y)
|
|
text_label.set('margin_bottom', text_margin.y * -1)
|
|
|
|
# Backgrounds
|
|
$TextureRect.texture = DialogicUtil.path_fixer_load(theme.get_value('background','image', "res://addons/dialogic/Example Assets/backgrounds/background-2.png"))
|
|
$ColorRect.color = Color(theme.get_value('background','color', "#ff000000"))
|
|
|
|
if theme.get_value('background', 'modulation', false) == true:
|
|
$TextureRect.modulate = Color(theme.get_value('background', 'modulation_color', '#ffffffff'))
|
|
else:
|
|
$TextureRect.modulate = Color('#ffffffff')
|
|
|
|
$ColorRect.visible = theme.get_value('background', 'use_color', false)
|
|
$TextureRect.visible = theme.get_value('background', 'use_image', true)
|
|
|
|
# Next image
|
|
$NextIndicator.texture = DialogicUtil.path_fixer_load(theme.get_value('next_indicator', 'image', 'res://addons/dialogic/Example Assets/next-indicator/next-indicator.png'))
|
|
|
|
# Character Name
|
|
$NameLabel/ColorRect.visible = theme.get_value('name', 'background_visible', false)
|
|
$NameLabel/ColorRect.color = Color(theme.get_value('name', 'background', '#282828'))
|
|
$NameLabel/TextureRect.visible = theme.get_value('name', 'image_visible', false)
|
|
$NameLabel/TextureRect.texture = DialogicUtil.path_fixer_load(theme.get_value('name','image', "res://addons/dialogic/Example Assets/backgrounds/background-2.png"))
|
|
var name_shadow_offset = theme.get_value('name', 'shadow_offset', Vector2(2,2))
|
|
if theme.get_value('name', 'shadow_visible', true):
|
|
name_label.set('custom_colors/font_color_shadow', Color(theme.get_value('name', 'shadow', '#9e000000')))
|
|
name_label.set('custom_constants/shadow_offset_x', name_shadow_offset.x)
|
|
name_label.set('custom_constants/shadow_offset_y', name_shadow_offset.y)
|
|
name_label.rect_position.y = theme.get_value('name', 'bottom_gap', 48) * -1
|
|
if theme.get_value('name', 'modulation', false) == true:
|
|
$NameLabel/TextureRect.modulate = Color(theme.get_value('name', 'modulation_color', '#ffffffff'))
|
|
else:
|
|
$NameLabel/TextureRect.modulate = Color('#ffffffff')
|
|
|
|
# Setting next indicator animation
|
|
$NextIndicator.self_modulate = Color('#ffffff')
|
|
$NextIndicator/AnimationPlayer.play(
|
|
theme.get_value('next_indicator', 'animation', 'Up and down')
|
|
)
|
|
|
|
## *****************************************************************************
|
|
## PRIVATE METHODS
|
|
## *****************************************************************************
|
|
|
|
|
|
func _on_Tween_tween_completed(object, key):
|
|
_finished = true
|
|
emit_signal("text_completed")
|
|
|
|
|
|
func _start_text_tween():
|
|
# This will start the animation that makes the text appear letter by letter
|
|
var tween_duration = text_speed * text_label.get_total_character_count()
|
|
tween.interpolate_property(
|
|
text_label, "percent_visible", 0, 1, tween_duration,
|
|
Tween.TRANS_LINEAR, Tween.EASE_IN_OUT
|
|
)
|
|
_finished = false
|
|
tween.start()
|
|
|
|
|
|
## *****************************************************************************
|
|
## OVERRIDES
|
|
## *****************************************************************************
|
|
|
|
|
|
func _ready():
|
|
reset()
|
|
tween.connect("tween_completed", self, '_on_Tween_tween_completed')
|
|
text_label.meta_underlined = false
|