tool extends Control var text_speed = 0.05 var theme_text_max_height = 0 var commands = [] var regex = RegEx.new() var bbcoderemoverregex = RegEx.new() var windowSize:Vector2; onready var text_container = $TextContainer onready var text_label = $TextContainer / RichTextLabel onready var name_label = $NameLabel onready var next_indicator = $NextIndicatorContainer / NextIndicator var _finished: = false var _theme signal text_completed() signal letter_written() signal signal_request(arg) var charNameTr = { "Аманда":"Amanda", "Линда":"Linda", "Эмилия":"Emilia", "Дана":"Dana", "Рената":"Renata", "Агата":"Agatha", "Сестра":"Sister", "Дженни":"Jenny", "Генри":"Henry", "Александр":"Alexander", "Роберт":"Robert", "Мартин":"Martin", "Джастин":"Justin", "Хью":"Hugh", "Старик":"Oldman", } func update_name(name:String, color:Color = Color.white, autocolor:bool = false)->void : var name_is_hidden = _theme.get_value("name", "is_hidden", false) if name_is_hidden: name_label.visible = false return if not name.empty(): name_label.visible = true name_label.rect_min_size = Vector2(0, 0) name_label.rect_size = Vector2( - 1, 40) var charName = name; var charNameTr = LanguageLocalization.GetDialogicNames(); charName = tr(charNameTr[charName]); if name == "Дженни" and Dialogic.get_variable("SeenFisher") == "0": charName = tr("ui_name_fisher"); name_label.text = charName; call_deferred("align_name_label") if autocolor: name_label.set("custom_colors/font_color", color) $NameLabel / TextureRect.rect_global_position = Vector2($NameLabel.rect_global_position.x + 20, $NameLabel.rect_global_position.y - 3); var textWidth = $NameLabel.get_font("font").get_string_size($NameLabel.text); var textureWidth = $NameLabel / TextureRect.rect_size.x; var scaleX = textWidth.x / textureWidth; $NameLabel / TextureRect.rect_size = $NameLabel.rect_size else : name_label.visible = false func clear(): text_label.bbcode_text = "" name_label.text = "" $WritingTimer.stop() func set_text_label_size(): if windowSize.y == 360: text_container.rect_size = Vector2(text_container.rect_size.x, text_container.rect_size.y + 20) return text_container.rect_size = Vector2(windowSize.x * 0.6, text_container.rect_size.y); text_container.set("margin_left", 0) text_container.set("margin_right", 0) text_label.margin_right = 0; text_container.set("margin_top", 0) text_container.rect_global_position = Vector2(windowSize.x * 0.2, text_container.rect_global_position.y) func update_text(text:String, seen:bool): var orig_text = text text_label.bbcode_text = text var text_bbcodefree = text_label.text var result:RegExMatch = null if seen and SettingsSingleton.GetSkipSeen(): text_speed = float(0.0001); commands = [] result = regex.search(text_bbcodefree) while result: if result.get_string(1) == "nw" or result.get_string(2) == "nw": pass else : commands.append([result.get_start() - 1, result.get_string(2).strip_edges(), result.get_string(3).strip_edges()]) text_bbcodefree = text_bbcodefree.substr(0, result.get_start()) + text_bbcodefree.substr(result.get_end()) text = text.replace(result.get_string(), "") result = regex.search(text_bbcodefree) text_label.bbcode_text = text text_label.visible_characters = 0 text_label.size_flags_vertical = 0 text_label.rect_clip_content = 0 text_label.fit_content_height = true call_deferred("update_sizing") text_label.grab_focus() start_text_timer() return true func DeferredCharCount(): var totalChars = text_label.get_total_character_count() print("totalChars=" + str(totalChars)) return totalChars func update_sizing(): theme_text_max_height = text_container.rect_size.y if text_label.rect_size.y >= theme_text_max_height: text_label.fit_content_height = false text_label.size_flags_vertical = Control.SIZE_EXPAND_FILL else : text_label.fit_content_height = true text_label.size_flags_vertical = 0 func SetNewTextSpeed(value): text_speed = (0.0005 * (value - 1) - 0.01) * (value - 10) + 0.01; $WritingTimer.stop() start_text_timer() $WritingTimer.stop() func handle_command(command:Array): if (command[1] == "speed"): text_speed = float(command[2]) * 0.01 $WritingTimer.stop() start_text_timer() elif (command[1] == "signal"): emit_signal("signal_request", command[2]) elif (command[1] == "play"): var path = "res://dialogic/sounds/" + command[2] if ResourceLoader.exists(path, "AudioStream"): var audio:AudioStream = ResourceLoader.load(path, "AudioStream") $sounds.stream = audio $sounds.play() elif (command[1] == "pause"): $WritingTimer.stop() var x = text_label.visible_characters get_parent().get_node("DialogicTimer").start(float(command[2])) yield (get_parent().get_node("DialogicTimer"), "timeout") if text_label.visible_characters == x: start_text_timer() func skip(): text_label.visible_characters = - 1 _handle_text_completed() func reset(): name_label.text = "" name_label.visible = false func ThemeColorChanged(): var text_color:Color if SettingsSingleton.GetDefaultTheme(): text_color = Color("#ffffffff") $TextureRect.texture = load("res://resources/graphics/GUI/kadark.webp") $TextureRect.modulate = Color("#ffffffff") else : var newcolor = SettingsSingleton.GetTextColor() text_color = Color(newcolor) $TextureRect.texture = load("res://resources/graphics/GUI/ExampleBorder.webp") $TextureRect.modulate = Color(SettingsSingleton.GetBackgroundColor()) if text_label != null: text_label.set("custom_colors/default_color", text_color) if name_label != null: name_label.set("custom_colors/font_color", text_color) func load_theme(theme:ConfigFile): windowSize = Vector2(1920, 1080) var font = name_label.get_font("font"); var fontSize = round(0.0333333 * windowSize.y - 0.333333); font.size = fontSize; name_label.add_font_override("font", font); name_label.rect_position = Vector2(windowSize.x * 0.15, name_label.rect_position.y) text_label.get("custom_fonts/normal_font/").set_size(fontSize); text_label.get("custom_fonts/bold_font/").set_size(fontSize); text_label.get("custom_fonts/italics_font/").set_size(fontSize); var alignment = theme.get_value("text", "alignment", 0) if alignment <= 2: text_container.alignment = BoxContainer.ALIGN_BEGIN elif alignment <= 5: text_container.alignment = BoxContainer.ALIGN_CENTER elif alignment <= 8: text_container.alignment = BoxContainer.ALIGN_END var text_color:Color if SettingsSingleton.GetDefaultTheme(): text_color = Color(theme.get_value("text", "color", "#ffffffff")) else : var newcolor = SettingsSingleton.GetTextColor() text_color = Color(newcolor) 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) var speed = SettingsSingleton.GetTextSpeed(); text_speed = (0.0005 * (speed - 1) - 0.01) * (speed - 10) + 0.01; if SettingsSingleton.GetDefaultTheme(): $TextureRect.texture = DialogicUtil.path_fixer_load(theme.get_value("background", "image", "res://addons/dialogic/Example Assets/backgrounds/background-2.png")) else : $TextureRect.texture = load("res://resources/graphics/GUI/ExampleBorder.webp") $ColorRect.color = Color(theme.get_value("background", "color", "#ff000000")) if not SettingsSingleton.GetDefaultTheme(): $TextureRect.modulate = Color(SettingsSingleton.GetBackgroundColor()) else : $TextureRect.modulate = Color("#ffffffff") $ColorRect.visible = theme.get_value("background", "use_color", false) $TextureRect.visible = theme.get_value("background", "use_image", true) $TextureRect.visible = theme.get_value("background", "use_image", true) $TextureRect.patch_margin_left = theme.get_value("ninepatch", "ninepatch_margin_left", 0) $TextureRect.patch_margin_right = theme.get_value("ninepatch", "ninepatch_margin_right", 0) $TextureRect.patch_margin_top = theme.get_value("ninepatch", "ninepatch_margin_top", 0) $TextureRect.patch_margin_bottom = theme.get_value("ninepatch", "ninepatch_margin_bottom", 0) $NextIndicatorContainer.rect_position = Vector2(0, 0) next_indicator.texture = DialogicUtil.path_fixer_load(theme.get_value("next_indicator", "image", "res://addons/dialogic/Example Assets/next-indicator/next-indicator.png")) next_indicator.margin_top = 0 next_indicator.margin_bottom = 0 next_indicator.margin_left = 0 next_indicator.margin_right = 0 var indicator_scale = theme.get_value("next_indicator", "scale", 0.4) var ind_scale = float(windowSize.y / 720) next_indicator.rect_scale = Vector2(indicator_scale * ind_scale, indicator_scale * ind_scale) var offset = theme.get_value("next_indicator", "offset", Vector2(13, 10)) next_indicator.rect_position = text_container.rect_position; var indicatorOffset = Vector2(windowSize.x * 0.1, windowSize.y * 0.05) next_indicator.rect_global_position = Vector2( next_indicator.rect_global_position.x + windowSize.x * 0.8, next_indicator.rect_global_position.y + windowSize.y * 0.15) $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_padding = theme.get_value("name", "name_padding", Vector2(10, 0)) var name_style = name_label.get("custom_styles/normal") name_style.set("content_margin_left", name_padding.x) name_style.set("content_margin_right", name_padding.x) name_style.set("content_margin_bottom", name_padding.y) name_style.set("content_margin_top", name_padding.y) 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 - (name_padding.y) 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") var blyaOffset = 0; if windowSize.y == 360: blyaOffset = - 10; var framePosition = $TextureRect.rect_global_position; name_label.rect_global_position = Vector2(framePosition.x, framePosition.y - windowSize.y * 0.05 + blyaOffset) next_indicator.self_modulate = Color("#ffffff") var animation = theme.get_value("next_indicator", "animation", "Up and down") next_indicator.get_node("AnimationPlayer").play(animation) _theme = theme func _on_writing_timer_timeout(): if _finished == false: text_label.visible_characters += 1 if (commands.size() > 0 and commands[0][0] <= text_label.visible_characters): handle_command(commands.pop_front()) if text_label.visible_characters > text_label.bbcode_text.length(): _handle_text_completed() elif ( text_label.visible_characters > 0 and text_label.text[text_label.visible_characters - 1] != " " ): emit_signal("letter_written") else : $WritingTimer.stop() func start_text_timer(): if text_speed == 0: text_label.visible_characters = - 1 _handle_text_completed() else : $WritingTimer.start(text_speed) _finished = false func _handle_text_completed(): $WritingTimer.stop() _finished = true emit_signal("text_completed") func align_name_label(): var name_padding = _theme.get_value("name", "name_padding", Vector2(10, 0)) var horizontal_offset = _theme.get_value("name", "horizontal_offset", 0) var name_label_position = _theme.get_value("name", "position", 0) var label_size = name_label.rect_size.x if name_label_position == 0: name_label.rect_global_position.x = rect_global_position.x + horizontal_offset elif name_label_position == 1: name_label.rect_global_position.x = rect_global_position.x + (rect_size.x / 2) - (label_size / 2) + horizontal_offset elif name_label_position == 2: name_label.rect_global_position.x = rect_global_position.x + rect_size.x - label_size + horizontal_offset func _ready(): windowSize = Vector2(1920, 1080) reset() $WritingTimer.connect("timeout", self, "_on_writing_timer_timeout") text_label.meta_underlined = false regex.compile("\\[\\s*(nw|(nw|speed|signal|play|pause)\\s*=\\s*(.+?)\\s*)\\](.*?)")