tool extends Control export (PackedScene) var HistoryRow = load("res://addons/dialogic/Example Assets/History/HistoryRow.tscn") export (PackedScene) var HistoryDefaultBackground = load("res://addons/dialogic/Example Assets/History/HistoryBackground.tscn") export (PackedScene) var HistoryOpenButton = load("res://addons/dialogic/Example Assets/History/HistoryButton.tscn") export (PackedScene) var HistoryCloseButton = load("res://addons/dialogic/Example Assets/History/HistoryButton.tscn") export (int) var Vertical_Separation = 16 onready var HistoryTimeline = $HistoryPopup / ScrollHistoryContainer / MarginContainer / HistoryTimeline onready var scrollbar = $HistoryPopup / ScrollHistoryContainer.get_v_scrollbar() onready var ScrollHistoryContainer = $HistoryPopup / ScrollHistoryContainer onready var HistoryPopup = $HistoryPopup onready var HistoryAudio = $HistoryPopup / HistoryAudio var HistoryButton var CloseButton var HistoryBackground var is_history_open = false var is_mouse_on_button = false var block_dialog_advance = false setget , history_advance_block var lastQuestionNode = null var curTheme = null var prevState var eventsToLog = ["dialogic_001", "dialogic_010"] var logArrivals = false var logExits = false var scrollToBottom = true var reverseTimeline = false var characterNameColorOn = true var lineBreakAfterName = true var scrollToggle = false func _ready(): var testHistoryRow = HistoryRow.instance() assert (testHistoryRow.has_method("add_history"), "HistoryRow Scene must implement add_history(string, string) method.") testHistoryRow.queue_free() HistoryBackground = HistoryDefaultBackground.instance() HistoryPopup.add_child(HistoryBackground) HistoryPopup.move_child(HistoryBackground, 0) if scrollbar.is_connected("changed", self, "handle_scrollbar_changed"): scrollbar.connect("changed", self, "handle_scrollbar_changed") func handle_scrollbar_changed(): if (scrollToggle): scrollToggle = false if (scrollToBottom): ScrollHistoryContainer.scroll_vertical = scrollbar.max_value else : ScrollHistoryContainer.scroll_vertical = 0 func initalize_history(): if get_parent().settings.get_value("history", "enable_open_button", true): HistoryButton = HistoryOpenButton.instance() if get_parent().settings.get_value("history", "enable_close_button", true): CloseButton = HistoryCloseButton.instance() logArrivals = get_parent().settings.get_value("history", "log_arrivals", true) logExits = get_parent().settings.get_value("history", "log_exits", true) if logExits or logArrivals: eventsToLog.push_back("dialogic_002") scrollToBottom = get_parent().settings.get_value("history", "history_scroll_to_bottom", true) reverseTimeline = get_parent().settings.get_value("history", "history_reverse_timeline", false) characterNameColorOn = get_parent().settings.get_value("history", "history_name_color_on", true) lineBreakAfterName = get_parent().settings.get_value("history", "history_break_after_name", false) var button_anchor = int(get_parent().settings.get_value("history", "history_button_position", 2)) var screen_margin_x = get_parent().settings.get_value("history", "history_screen_margin_x", 0) var screen_margin_y = get_parent().settings.get_value("history", "history_screen_margin_y", 0) var container_margin_X = get_parent().settings.get_value("history", "history_container_margin_x", 0) var container_margin_y = get_parent().settings.get_value("history", "history_container_margin_y", 0) HistoryPopup.margin_left = screen_margin_x HistoryPopup.margin_right = - screen_margin_x HistoryPopup.margin_top = screen_margin_y HistoryPopup.margin_bottom = - screen_margin_y - 50 ScrollHistoryContainer.margin_left = container_margin_X ScrollHistoryContainer.margin_right = - container_margin_X ScrollHistoryContainer.margin_top = container_margin_y ScrollHistoryContainer.margin_bottom = - container_margin_y for button in [HistoryButton, CloseButton]: if button == null: continue continue; var reference = button.get_parent().rect_size button.connect("focus_entered", get_parent(), "_on_option_hovered", [button]) button.connect("mouse_entered", get_parent(), "_on_option_focused") var anchor_values = [0, 0, 1, 1] var position_offset = Vector2(0, 0) if button_anchor == 0: anchor_values = [0, 0, 0, 0] position_offset.x = 0 position_offset.y = 0 elif button_anchor == 1: anchor_values = [0.5, 0, 0.5, 0] position_offset.x = reference.x / 2 - button.rect_size.x position_offset.y = 0 elif button_anchor == 2: anchor_values = [1, 0, 1, 0] position_offset.x = reference.x - button.rect_size.x position_offset.y = 0 elif button_anchor == 4: anchor_values = [0, 0.5, 0, 0.5] position_offset.x = 0 position_offset.y = reference.y / 2 - button.rect_size.y elif button_anchor == 5: anchor_values = [0.5, 0.5, 0.5, 0.5] position_offset.x = reference.x / 2 - button.rect_size.x position_offset.y = reference.y / 2 - button.rect_size.y elif button_anchor == 6: anchor_values = [1, 0.5, 1, 0.5] position_offset.x = reference.x - button.rect_size.x position_offset.y = reference.y / 2 - button.rect_size.y elif button_anchor == 8: anchor_values = [0, 1, 0, 1] position_offset.x = 0 position_offset.y = reference.y - button.rect_size.y elif button_anchor == 9: anchor_values = [0.5, 1, 0.5, 1] position_offset.x = reference.x / 2 - button.rect_size.x position_offset.y = reference.y - button.rect_size.y elif button_anchor == 10: anchor_values = [1, 1, 1, 1] position_offset.x = reference.x - button.rect_size.x position_offset.y = reference.y - button.rect_size.y button.anchor_left = anchor_values[0] button.anchor_top = anchor_values[1] button.anchor_right = anchor_values[2] button.anchor_bottom = anchor_values[3] button.rect_global_position = button.get_parent().rect_global_position + position_offset func add_history_row_event(eventData, DialogNode, historyContainer): if not eventsToLog.has(eventData.event_id) or (eventData.event_id == "dialogic_002" and eventData.get("type") == 2): return if eventData.event_id == "dialogic_002": return var newHistoryRow = HistoryRow.instance() HistoryTimeline.add_child(newHistoryRow) if (reverseTimeline): HistoryTimeline.move_child(newHistoryRow, 0) if newHistoryRow.has_method("load_theme") and get_parent().settings.get_value("history", "enable_dynamic_theme", false) == true: newHistoryRow.load_theme(curTheme) if not SettingsSingleton.GetDefaultTheme(): var textColor = Color(SettingsSingleton.GetTextColor()); newHistoryRow.get_node("HBoxContainer/RichTextLabel").set("custom_colors/default_color", textColor); var characterPrefix = "" if eventData.has("character") and eventData.character != "": var characterData = DialogicUtil.get_character(eventData.character) var characterName = characterData.get("name", "") if eventData.has("character") and eventData.character == "[All]": characterPrefix = str("Everyone") elif characterData.data.get("display_name_bool", false) == true: characterName = characterData.data.get("display_name", "") if characterName != "": var charDelimiter = get_parent().settings.get_value("history", "history_character_delimiter", "") var parsed_name = DialogicParser.parse_definitions(get_parent(), characterName, true, false) var charNameTr = LanguageLocalization.GetDialogicNames(); parsed_name = tr(charNameTr[parsed_name]); var characterColor = characterData.data.get("color", Color.white) if ( not characterNameColorOn): characterColor = Color.white if characterColor == "#ff0f0a0a": characterColor = "#ff8f8f8f" var lineBreak = "" if (lineBreakAfterName): lineBreak = "\n" characterPrefix = str("[color=", characterColor, "]", parsed_name, "[/color]", charDelimiter, " ", lineBreak) var audioData = "" if eventData.event_id == "dialogic_001": var parsedDefinitions = DialogicParser._insert_variable_definitions(DialogNode, eventData.text) if parsedDefinitions != "": if not AlreadyInHistory(parsedDefinitions, historyContainer): newHistoryRow.add_history(str(characterPrefix, parsedDefinitions), audioData) else : HistoryTimeline.remove_child(newHistoryRow); elif eventData.event_id == "dialogic_002": return ; elif eventData.event_id == "dialogic_010": var choiceString = "" if eventData.question != "": eventData.question = tr(eventData.question); newHistoryRow.add_history(str(characterPrefix, eventData.question), audioData) choiceString += "\n"; if eventData.has("options") and get_parent().settings.get_value("history", "log_choices", true): choiceString += " " for choice in eventData["options"]: if ShouldAddChoice(choice, DialogNode): choiceString = str(choiceString, "[", choice.label, "] ") newHistoryRow.add_history(choiceString, audioData) lastQuestionNode = newHistoryRow func ShouldAddChoice(option:Dictionary, DialogNode): if not option["definition"].empty(): var def_value = null for d in DialogNode.definitions["variables"]: if d["id"] == option["definition"]: def_value = d["value"] return def_value != null and DialogicUtil.compare_definitions(def_value, option["value"], option["condition"]); else : return true func AlreadyInHistory(text:String, historyContainer): for i in historyContainer.get_children(): var lol = i.get_node("HBoxContainer/RichTextLabel").text; if lol == text: return true; return false; func add_answer_to_question(stringData): if lastQuestionNode != null: lastQuestionNode.add_history(str("\n ", stringData), lastQuestionNode.audioPath) lastQuestionNode = null func change_theme(newTheme:ConfigFile): if get_parent().settings.get_value("history", "enable_dynamic_theme", false): curTheme = newTheme func load_theme(theme:ConfigFile): curTheme = theme func _on_audio_trigger(audioFilepath): HistoryAudio.stream = load(audioFilepath) HistoryAudio.play() func _on_HistoryPopup_popup_hide(): HistoryAudio.stop() func _on_HistoryPopup_about_to_show(): if HistoryButton != null: scrollToggle = true HistoryButton.hide() func _on_HistoryButton_mouse_entered(): is_mouse_on_button = true func _on_HistoryButton_mouse_exited(): is_mouse_on_button = false func history_advance_block()->bool: return is_mouse_on_button or is_history_open func _on_toggle_history(): var textColor = Color.white var backColor = Color.black var backNode = get_node("HistoryPopup/ScrollHistoryContainer/MarginContainer/HistoryTimeline") if SettingsSingleton.GetDefaultTheme(): for i in backNode.get_children(): i.get_child(1).texture = load("res://addons/dialogic/Example Assets/backgrounds/background-2.png") i.get_child(1).modulate = Color.white else : textColor = SettingsSingleton.GetTextColor() backColor = SettingsSingleton.GetBackgroundColor() for i in backNode.get_children(): i.get_child(1).texture = load("res://addons/dialogic/Example Assets/backgrounds/background-white.png") i.get_child(1).modulate = backColor if HistoryPopup.visible == false: _on_HistoryPopup_about_to_show() HistoryPopup.show() $HistoryButton.show(); is_history_open = true is_mouse_on_button = false else : _on_HistoryPopup_popup_hide() HistoryPopup.hide() $HistoryButton.hide(); is_history_open = false is_mouse_on_button = false