From 64454482e8ea1353f3e78c3d01fc8e27231a4753 Mon Sep 17 00:00:00 2001 From: thebardsrc Date: Wed, 26 Oct 2022 21:54:37 -0600 Subject: [PATCH 01/54] implement dynamic cache for event parts --- addons/dialogic/Editor/EditorView.gd | 3 +++ addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd | 8 +++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/addons/dialogic/Editor/EditorView.gd b/addons/dialogic/Editor/EditorView.gd index bead11495..35defc02a 100644 --- a/addons/dialogic/Editor/EditorView.gd +++ b/addons/dialogic/Editor/EditorView.gd @@ -10,6 +10,9 @@ var dialogicTranslator = load("res://addons/dialogic/Localization/translation_se # this is set when the plugins main-view is instanced in dialogic.gd var editor_interface = null +#runtime cache of all .tscn's loaded by Dialogic, to speed it up +var editor_scene_cache = {} + func _ready(): # Adding file dialog to get used by Events editor_file_dialog = EditorFileDialog.new() diff --git a/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd b/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd index 4c9cc9d86..25d4a6dc6 100644 --- a/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd +++ b/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd @@ -803,7 +803,13 @@ func create_event(event_id: String, data: Dictionary = {'no-data': true} , inden piece = load(custom_events[event_id]['event_block_scene']).instance() # check if it's a builtin event elif event_id in id_to_scene_name.keys(): - piece = load("res://addons/dialogic/Editor/Events/" + id_to_scene_name[event_id] + ".tscn").instance() + var piece_name = "res://addons/dialogic/Editor/Events/" + id_to_scene_name[event_id] + ".tscn" + if piece_name in editor_reference.editor_scene_cache: + piece = editor_reference.editor_scene_cache[piece_name].instance() + else: + var scene_piece = load("res://addons/dialogic/Editor/Events/" + id_to_scene_name[event_id] + ".tscn") + editor_reference.editor_scene_cache[piece_name] = scene_piece + piece = scene_piece.instance() # else use dummy event else: piece = load("res://addons/dialogic/Editor/Events/DummyEvent.tscn").instance() From bedc434ea777cf5a564b6f424c79765bb5efc08f Mon Sep 17 00:00:00 2001 From: thebardsrc Date: Wed, 26 Oct 2022 23:22:08 -0600 Subject: [PATCH 02/54] template functions for converting the layout --- addons/dialogic/Other/DialogicResources.gd | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/addons/dialogic/Other/DialogicResources.gd b/addons/dialogic/Other/DialogicResources.gd index 9d86a61e5..a58d7aabe 100644 --- a/addons/dialogic/Other/DialogicResources.gd +++ b/addons/dialogic/Other/DialogicResources.gd @@ -507,3 +507,11 @@ static func get_resource_folder_structure() -> Dictionary: static func save_resource_folder_structure(data): set_json(get_config_files_paths()['FOLDER_STRUCTURE_FILE'], data) + +static func folder_structure_to_flat_tree(folder_structure) -> Dictionary: + # Convert the folder structure from the JSON file into a simpler one that doesn't require recursive loops + return {} + +static func flat_tree_to_folder_structure(flat_tree) -> Dictionary: + # Convert the flat folder structure back into the nested dictionary to be able to save to JSON + return {} From e4fd9f56a6eed6c4cc2aab4ede401b1d2a88bd37 Mon Sep 17 00:00:00 2001 From: thebardsrc Date: Sun, 30 Oct 2022 21:13:06 -0600 Subject: [PATCH 03/54] changing their function names, and copied the actual recursive flattener routine from the 1.x Converter in Dialogic 2 --- addons/dialogic/Other/DialogicResources.gd | 28 +++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/addons/dialogic/Other/DialogicResources.gd b/addons/dialogic/Other/DialogicResources.gd index a58d7aabe..aed4f2030 100644 --- a/addons/dialogic/Other/DialogicResources.gd +++ b/addons/dialogic/Other/DialogicResources.gd @@ -508,10 +508,32 @@ static func get_resource_folder_structure() -> Dictionary: static func save_resource_folder_structure(data): set_json(get_config_files_paths()['FOLDER_STRUCTURE_FILE'], data) -static func folder_structure_to_flat_tree(folder_structure) -> Dictionary: +static func get_resource_folder_flat_structure() -> Dictionary: # Convert the folder structure from the JSON file into a simpler one that doesn't require recursive loops - return {} + var flat_structure = {} + + var json_structure = get_resource_folder_structure() + + flat_structure = recursive_search("Timeline", json_structure["folders"]["Timelines"], "/", flat_structure) + flat_structure = recursive_search("Character", json_structure["folders"]["Characters"], "/", flat_structure) + flat_structure = recursive_search("Definition", json_structure["folders"]["Definitions"], "/", flat_structure) + flat_structure = recursive_search("Theme", json_structure["folders"]["Themes"], "/", flat_structure) + + return flat_structure -static func flat_tree_to_folder_structure(flat_tree) -> Dictionary: +static func save_resource_folder_flat_structure(flat_tree) -> Dictionary: # Convert the flat folder structure back into the nested dictionary to be able to save to JSON return {} + +static func recursive_search(currentCheck, currentDictionary, currentFolder, structure_dictionary): + for structureFile in currentDictionary["files"]: + match currentCheck: + "Timeline": structure_dictionary['Timeline'][structureFile] = currentFolder + "Character": structure_dictionary['Character'][structureFile] = currentFolder + "Definition": structure_dictionary['Definition'][structureFile] = currentFolder + "Theme": structure_dictionary['Theme'][structureFile] = currentFolder + + for structureFolder in currentDictionary["folders"]: + recursive_search(currentCheck, currentDictionary["folders"][structureFolder], currentFolder + structureFolder + "/", structure_dictionary) + + return structure_dictionary From bf9e5418b4fb4cc290be497873208c7842377cfb Mon Sep 17 00:00:00 2001 From: thebardsrc Date: Sat, 3 Dec 2022 17:10:42 -0700 Subject: [PATCH 04/54] starting with the flat structure in game loop before moving it to editor --- addons/dialogic/Other/DialogicClass.gd | 60 +++++++++++++++++++++- addons/dialogic/Other/DialogicResources.gd | 5 ++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/addons/dialogic/Other/DialogicClass.gd b/addons/dialogic/Other/DialogicClass.gd index 501976d88..50c56face 100644 --- a/addons/dialogic/Other/DialogicClass.gd +++ b/addons/dialogic/Other/DialogicClass.gd @@ -10,8 +10,63 @@ extends Node ## Trying to follow this documentation convention: https://github.com/godotengine/godot/pull/41095 class_name Dialogic +## Preloader function, loads and prepares the tree into the Engine meta +## Not necessary to run separately, it will be run by Dialogic.start() the first time if it's not present +## But useful to speed up loading +## This might be slower than the older way, though, so best to do with some other loading +## If for any reason during game runtime this needs to be rebuilt, Engine.get_main_loop().remove_meta('dialogic_tree_loaded') will make it run on next Dialogic.start() + +static func prepare(): + var timeline_folder_breakdown = {} + var character_folder_breakdown = {} + var definition_folder_breakdown = {} + var theme_folder_breakdown = {} + + # load the main folder strucutre, and then use the DialogicUtils to match their names + var structure = DialogicResources.get_resource_folder_flat_structure() + var timeline_list = DialogicUtil.get_timeline_list() + var character_list = DialogicUtil.get_character_list() + var definition_list = DialogicUtil.get_default_definitions_list() + var theme_list = DialogicUtil.get_theme_list() + + + # populate the data from the resources + for timeline in timeline_list: + timeline['path'] = structure['Timeline'][timeline['file']] + timeline['name'] + structure['Timeline'][timeline['file']]= timeline + + for character in character_list: + character['path'] = structure['Character'][character['file']] + character['name'] + structure['Character'][character['file']]= character + + for definition in definition_list: + definition['path'] = structure['Definition'][definition['id']] + definition['name'] + structure['Definition'][definition['id']]= definition + + for theme in theme_list: + theme['path'] = structure['Theme'][theme['file']] + theme['name'] + structure['Theme'][theme['file']]= theme + + # After that we put them in the order we need to make the folder paths easiest to use + for timeline in structure['Timeline'].keys(): + timeline_folder_breakdown[structure['Timeline'][timeline]['path']] = structure['Timeline'][timeline] -## Refactor the start function for 2.0 there should be a cleaner way to do it :) + for character in structure['Character'].keys(): + character_folder_breakdown[structure['Character'][character]['path']] = structure['Character'][character] + + for definition in structure['Definition'].keys(): + definition_folder_breakdown[structure['Definition'][definition]['path']] = structure['Definition'][definition] + + for theme in structure['Theme'].keys(): + theme_folder_breakdown[structure['Theme'][theme]['path']] = structure['Theme'][theme] + + Engine.set_meta('dialogic_tree_loaded',true) + Engine.set_meta('dialogic_timeline_tree', timeline_folder_breakdown) + Engine.set_meta('dialogic_character_tree', character_folder_breakdown) + Engine.set_meta('dialogic_definition_tree', definition_folder_breakdown) + Engine.set_meta('dialogic_theme_tree', theme_folder_breakdown) + + print("loaded") ## Starts the dialog for the given timeline and returns a Dialog node. ## You must then add it manually to the scene to display the dialog. @@ -37,6 +92,9 @@ static func start(timeline: String = '', default_timeline: String ='', dialog_sc var canvas_dialog_node = null var returned_dialog_node = null + if !Engine.get_main_loop().has_meta('dialogic_tree_loaded'): + prepare() + if use_canvas_instead: var canvas_dialog_script = load("res://addons/dialogic/Nodes/canvas_dialog_node.gd") canvas_dialog_node = canvas_dialog_script.new() diff --git a/addons/dialogic/Other/DialogicResources.gd b/addons/dialogic/Other/DialogicResources.gd index aed4f2030..52ee74773 100644 --- a/addons/dialogic/Other/DialogicResources.gd +++ b/addons/dialogic/Other/DialogicResources.gd @@ -511,6 +511,11 @@ static func save_resource_folder_structure(data): static func get_resource_folder_flat_structure() -> Dictionary: # Convert the folder structure from the JSON file into a simpler one that doesn't require recursive loops var flat_structure = {} + flat_structure['Timeline'] = {} + flat_structure['Character'] = {} + flat_structure['Definition'] = {} + flat_structure['Theme'] = {} + var json_structure = get_resource_folder_structure() From 46817f36642c5f549f9efd6e6c22e844b7748a73 Mon Sep 17 00:00:00 2001 From: thebardsrc Date: Fri, 23 Dec 2022 22:23:14 -0700 Subject: [PATCH 05/54] ok id better commit the recursion functions before they vanish --- addons/dialogic/Other/DialogicClass.gd | 37 ++++++++++++++++++---- addons/dialogic/Other/DialogicResources.gd | 29 +++++++++++++++++ 2 files changed, 59 insertions(+), 7 deletions(-) diff --git a/addons/dialogic/Other/DialogicClass.gd b/addons/dialogic/Other/DialogicClass.gd index 50c56face..33f58545d 100644 --- a/addons/dialogic/Other/DialogicClass.gd +++ b/addons/dialogic/Other/DialogicClass.gd @@ -49,17 +49,32 @@ static func prepare(): # After that we put them in the order we need to make the folder paths easiest to use for timeline in structure['Timeline'].keys(): - timeline_folder_breakdown[structure['Timeline'][timeline]['path']] = structure['Timeline'][timeline] + if ".json" in timeline: + timeline_folder_breakdown[structure['Timeline'][timeline]['path']] = structure['Timeline'][timeline] + else: + timeline_folder_breakdown[timeline] = structure['Timeline'][timeline] for character in structure['Character'].keys(): - character_folder_breakdown[structure['Character'][character]['path']] = structure['Character'][character] - + if ".json" in character: + character_folder_breakdown[structure['Character'][character]['path']] = structure['Character'][character] + else: + character_folder_breakdown[character] = structure['Character'][character] + + for definition in structure['Definition'].keys(): - definition_folder_breakdown[structure['Definition'][definition]['path']] = structure['Definition'][definition] - + if ".json" in definition: + definition_folder_breakdown[structure['Definition'][definition]['path']] = structure['Definition'][definition] + else: + definition_folder_breakdown[definition] = structure['Definition'][definition] + + for theme in structure['Theme'].keys(): - theme_folder_breakdown[structure['Theme'][theme]['path']] = structure['Theme'][theme] - + if ".json" in theme: + theme_folder_breakdown[structure['Theme'][theme]['path']] = structure['Theme'][theme] + else: + theme_folder_breakdown[theme] = structure['Theme'][theme] + + Engine.set_meta('dialogic_tree_loaded',true) Engine.set_meta('dialogic_timeline_tree', timeline_folder_breakdown) Engine.set_meta('dialogic_character_tree', character_folder_breakdown) @@ -67,6 +82,14 @@ static func prepare(): Engine.set_meta('dialogic_theme_tree', theme_folder_breakdown) print("loaded") + + var flatten = {} + flatten['Timeline'] = timeline_folder_breakdown + flatten['Character'] = character_folder_breakdown + flatten['Definition'] = definition_folder_breakdown + flatten['Theme'] = theme_folder_breakdown + + DialogicResources.save_resource_folder_flat_structure(flatten) ## Starts the dialog for the given timeline and returns a Dialog node. ## You must then add it manually to the scene to display the dialog. diff --git a/addons/dialogic/Other/DialogicResources.gd b/addons/dialogic/Other/DialogicResources.gd index 52ee74773..8716ccab4 100644 --- a/addons/dialogic/Other/DialogicResources.gd +++ b/addons/dialogic/Other/DialogicResources.gd @@ -528,9 +528,29 @@ static func get_resource_folder_flat_structure() -> Dictionary: static func save_resource_folder_flat_structure(flat_tree) -> Dictionary: # Convert the flat folder structure back into the nested dictionary to be able to save to JSON + var nested_structure = {} + nested_structure['Timeline'] = {} + nested_structure['Character'] = {} + nested_structure['Definition'] = {} + nested_structure['Theme'] = {} + + for timeline in flat_tree['Timeline'].keys(): + #First build just the folders + if timeline[-1] == ".": + var nested = {} + nested = recursive_build(timeline, flat_tree['Timeline'][timeline]) + + print(nested) + + + + + return {} static func recursive_search(currentCheck, currentDictionary, currentFolder, structure_dictionary): + structure_dictionary[currentCheck][currentFolder + "."] = currentDictionary['metadata'] + for structureFile in currentDictionary["files"]: match currentCheck: "Timeline": structure_dictionary['Timeline'][structureFile] = currentFolder @@ -542,3 +562,12 @@ static func recursive_search(currentCheck, currentDictionary, currentFolder, str recursive_search(currentCheck, currentDictionary["folders"][structureFolder], currentFolder + structureFolder + "/", structure_dictionary) return structure_dictionary + +static func recursive_build(build_path, meta): + var passer = {} + if '/' in build_path: + passer[build_path.split('/', true, 1)[0]] = recursive_build(build_path.split('/', true, 1)[1], meta) + return passer + else: + passer['metadata'] = meta + return passer From 180dc91a2dd4c5b81da6e38228c4fc17714f83f8 Mon Sep 17 00:00:00 2001 From: thebardsrc Date: Sat, 24 Dec 2022 12:16:47 -0700 Subject: [PATCH 06/54] files as well in the recursive, committing before i change it to merge it all --- addons/dialogic/Other/DialogicResources.gd | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/addons/dialogic/Other/DialogicResources.gd b/addons/dialogic/Other/DialogicResources.gd index 8716ccab4..f3cdb91f6 100644 --- a/addons/dialogic/Other/DialogicResources.gd +++ b/addons/dialogic/Other/DialogicResources.gd @@ -535,8 +535,6 @@ static func save_resource_folder_flat_structure(flat_tree) -> Dictionary: nested_structure['Theme'] = {} for timeline in flat_tree['Timeline'].keys(): - #First build just the folders - if timeline[-1] == ".": var nested = {} nested = recursive_build(timeline, flat_tree['Timeline'][timeline]) @@ -565,9 +563,15 @@ static func recursive_search(currentCheck, currentDictionary, currentFolder, str static func recursive_build(build_path, meta): var passer = {} + passer['folders'] = {} + passer['files'] = [] if '/' in build_path: - passer[build_path.split('/', true, 1)[0]] = recursive_build(build_path.split('/', true, 1)[1], meta) + passer['folders'][build_path.split('/', true, 1)[0]] = recursive_build(build_path.split('/', true, 1)[1], meta) return passer else: - passer['metadata'] = meta + if build_path == ".": + passer['metadata'] = meta + else: + passer['files'].append(meta['file']) + return passer From c287fa96e092f625ebbba7cbe2f2d0e3c86986e5 Mon Sep 17 00:00:00 2001 From: thebardsrc Date: Sat, 24 Dec 2022 15:02:43 -0700 Subject: [PATCH 07/54] full recursive function for all the parts i think? --- addons/dialogic/Other/DialogicResources.gd | 30 +- flat.json | 2645 ++++++++++++++++++++ nested.json | 359 +++ 3 files changed, 3024 insertions(+), 10 deletions(-) create mode 100644 flat.json create mode 100644 nested.json diff --git a/addons/dialogic/Other/DialogicResources.gd b/addons/dialogic/Other/DialogicResources.gd index f3cdb91f6..f64302f60 100644 --- a/addons/dialogic/Other/DialogicResources.gd +++ b/addons/dialogic/Other/DialogicResources.gd @@ -534,13 +534,18 @@ static func save_resource_folder_flat_structure(flat_tree) -> Dictionary: nested_structure['Definition'] = {} nested_structure['Theme'] = {} + set_json("res://flat.json", flat_tree) + + print(flat_tree['Timeline']) + var nested = {} + nested['folders'] = {} + nested['files'] = [] for timeline in flat_tree['Timeline'].keys(): - var nested = {} - nested = recursive_build(timeline, flat_tree['Timeline'][timeline]) + nested = recursive_build(timeline.right(1), flat_tree['Timeline'][timeline], nested) - print(nested) - + print(nested) + set_json("res://nested.json", nested) @@ -561,17 +566,22 @@ static func recursive_search(currentCheck, currentDictionary, currentFolder, str return structure_dictionary -static func recursive_build(build_path, meta): +static func recursive_build(build_path, meta, current_dictionary): var passer = {} passer['folders'] = {} passer['files'] = [] if '/' in build_path: - passer['folders'][build_path.split('/', true, 1)[0]] = recursive_build(build_path.split('/', true, 1)[1], meta) - return passer + var current_step = build_path.split('/', true, 1)[0] + if !current_dictionary['folders'].has(current_step): + current_dictionary['folders'][current_step] = passer + + current_dictionary['folders'][current_step] = recursive_build(build_path.split('/', true, 1)[1], meta,current_dictionary['folders'][current_step]) + + return current_dictionary else: if build_path == ".": - passer['metadata'] = meta + current_dictionary['metadata'] = meta else: - passer['files'].append(meta['file']) + current_dictionary['files'].append(meta['file']) - return passer + return current_dictionary diff --git a/flat.json b/flat.json new file mode 100644 index 000000000..eaba6112d --- /dev/null +++ b/flat.json @@ -0,0 +1,2645 @@ +{ + "Character": { + "/.": { + "color": null, + "folded": false + }, + "/Anhedonia/.": { + "color": null, + "folded": false + }, + "/Anhedonia/Amy-B": { + "color": "0.521569,0.764706,1,1", + "data": { + "color": "#ff85c3ff", + "description": "", + "display_name": "Amy", + "display_name_bool": true, + "id": "character-1641704620.json", + "mirror_portraits": false, + "name": "Amy-B", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "normal-neutral-straight", + "path": "res://portraits/amy-b/normal-neutral-straight.png" + } + ], + "scale": 100, + "theme": "" + }, + "display_name": "Amy", + "file": "character-1641704620.json", + "name": "Amy-B", + "nickname": "", + "path": "/Anhedonia/Amy-B", + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "normal-neutral-straight", + "path": "res://portraits/amy-b/normal-neutral-straight.png" + } + ] + }, + "/Chaos/.": { + "color": null, + "folded": false + }, + "/Chaos/Amy-D": { + "color": "0.521569,0.764706,1,1", + "data": { + "color": "#ff85c3ff", + "description": "", + "display_name": "Amy", + "display_name_bool": true, + "id": "character-1638041213.json", + "mirror_portraits": false, + "name": "Amy-D", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "res://transparent.png" + }, + { + "name": "pajama-distress-side", + "path": "res://portraits/amy-d/pajama-distress-side.png" + }, + { + "name": "pajama-distress-straight", + "path": "res://portraits/amy-d/pajama-distress-straight.png" + }, + { + "name": "pajama-mad-side", + "path": "res://portraits/amy-d/pajama-mad-side.png" + }, + { + "name": "pajama-mad-straight", + "path": "res://portraits/amy-d/pajama-mad-straight.png" + }, + { + "name": "pajama-neutral-side", + "path": "res://portraits/amy-d/pajama-neutral-side.png" + }, + { + "name": "pajama-neutral-straight", + "path": "res://portraits/amy-d/pajama-neutral-straight.png" + }, + { + "name": "shirt-distressed-straight", + "path": "res://portraits/amy-d/shirt-distressed-straight.png" + }, + { + "name": "shirt-happy-straight", + "path": "res://portraits/amy-d/shirt-happy-straight.png" + }, + { + "name": "shirt-mad-straight", + "path": "res://portraits/amy-d/shirt-mad-straight.png" + }, + { + "name": "shirt-neutral-straight", + "path": "res://portraits/amy-d/shirt-neutral-straight.png" + }, + { + "name": "shirt-smile-straight", + "path": "res://portraits/amy-d/shirt-smile-straight.png" + }, + { + "name": "shirt-confused-straight", + "path": "res://portraits/amy-d/shirt-confused-straight.png" + }, + { + "name": "overshirt-mad-straight", + "path": "res://portraits/amy-d/overshirt-mad-straight.png" + }, + { + "name": "overshirt-yell-straight", + "path": "res://portraits/amy-d/overshirt-yell-straight.png" + }, + { + "name": "drunk-confused-straight", + "path": "res://portraits/amy-d/drunk-confused-straight.png" + }, + { + "name": "drunk-distress-straight", + "path": "res://portraits/amy-d/drunk-distress-straight.png" + }, + { + "name": "drunk-ehehe-straight", + "path": "res://portraits/amy-d/drunk-ehehe-straight.png" + }, + { + "name": "drunk-frown-straight", + "path": "res://portraits/amy-d/drunk-frown-straight.png" + }, + { + "name": "drunk-horny-straight", + "path": "res://portraits/amy-d/drunk-horny-straight.png" + }, + { + "name": "drunk-neutral-straight", + "path": "res://portraits/amy-d/drunk-neutral-straight.png" + }, + { + "name": "drunk-sad-side", + "path": "res://portraits/amy-d/drunk-sad-side.png" + }, + { + "name": "drunk-sad-straight", + "path": "res://portraits/amy-d/drunk-sad-straight.png" + }, + { + "name": "drunk-smile-straight", + "path": "res://portraits/amy-d/drunk-smile-straight.png" + }, + { + "name": "hangover-confused-side", + "path": "res://portraits/amy-d/hangover-confused-side.png" + }, + { + "name": "hangover-confused-straight", + "path": "res://portraits/amy-d/hangover-confused-straight.png" + }, + { + "name": "hangover-ehehe-straight", + "path": "res://portraits/amy-d/hangover-ehehe-straight.png" + }, + { + "name": "hangover-frown-straight", + "path": "res://portraits/amy-d/hangover-frown-straight.png" + }, + { + "name": "hangover-sad-straight", + "path": "res://portraits/amy-d/hangover-sad-straight.png" + }, + { + "name": "hangover-smile-side", + "path": "res://portraits/amy-d/hangover-smile-side.png" + }, + { + "name": "hangover-smile-straight", + "path": "res://portraits/amy-d/hangover-smile-straight.png" + }, + { + "name": "shirt-panic-straight", + "path": "res://portraits/amy-d/shirt-panic-straight.png" + }, + { + "name": "coat-cry-straight", + "path": "res://portraits/amy-d/coat-cry-straight.png" + }, + { + "name": "coat-excited-straight", + "path": "res://portraits/amy-d/coat-excited-straight.png" + }, + { + "name": "coat-frown-straight", + "path": "res://portraits/amy-d/coat-frown-straight.png" + }, + { + "name": "coat-smile-straight", + "path": "res://portraits/amy-d/coat-smile-straight.png" + }, + { + "name": "shirt-sad-straight", + "path": "res://portraits/amy-d/shirt-sad-straight.png" + }, + { + "name": "nogloves-frown-straight", + "path": "res://portraits/amy-d/nogloves-frown-straight.png" + }, + { + "name": "nochoker-distress-sick", + "path": "res://portraits/amy-d/nochoker-distress-sick.png" + }, + { + "name": "nochoker-ehehe-sick", + "path": "res://portraits/amy-d/nochoker-ehehe-sick.png" + }, + { + "name": "nochoker-frown-sick", + "path": "res://portraits/amy-d/nochoker-frown-sick.png" + }, + { + "name": "clean-curious-straight", + "path": "res://portraits/amy-d/clean-curious-straight.png" + }, + { + "name": "clean-distressed-straight", + "path": "res://portraits/amy-d/clean-distressed-straight.png" + }, + { + "name": "clean-sad-straight", + "path": "res://portraits/amy-d/clean-sad-straight.png" + }, + { + "name": "clean-smile-straight", + "path": "res://portraits/amy-d/clean-smile-straight.png" + }, + { + "name": "clean-surprised-straight", + "path": "res://portraits/amy-d/clean-surprised-straight.png" + } + ], + "scale": 100, + "theme": "" + }, + "display_name": "Amy", + "file": "character-1638041213.json", + "name": "Amy-D", + "nickname": "", + "path": "/Chaos/Amy-D", + "portraits": [ + { + "name": "Default", + "path": "res://transparent.png" + }, + { + "name": "pajama-distress-side", + "path": "res://portraits/amy-d/pajama-distress-side.png" + }, + { + "name": "pajama-distress-straight", + "path": "res://portraits/amy-d/pajama-distress-straight.png" + }, + { + "name": "pajama-mad-side", + "path": "res://portraits/amy-d/pajama-mad-side.png" + }, + { + "name": "pajama-mad-straight", + "path": "res://portraits/amy-d/pajama-mad-straight.png" + }, + { + "name": "pajama-neutral-side", + "path": "res://portraits/amy-d/pajama-neutral-side.png" + }, + { + "name": "pajama-neutral-straight", + "path": "res://portraits/amy-d/pajama-neutral-straight.png" + }, + { + "name": "shirt-distressed-straight", + "path": "res://portraits/amy-d/shirt-distressed-straight.png" + }, + { + "name": "shirt-happy-straight", + "path": "res://portraits/amy-d/shirt-happy-straight.png" + }, + { + "name": "shirt-mad-straight", + "path": "res://portraits/amy-d/shirt-mad-straight.png" + }, + { + "name": "shirt-neutral-straight", + "path": "res://portraits/amy-d/shirt-neutral-straight.png" + }, + { + "name": "shirt-smile-straight", + "path": "res://portraits/amy-d/shirt-smile-straight.png" + }, + { + "name": "shirt-confused-straight", + "path": "res://portraits/amy-d/shirt-confused-straight.png" + }, + { + "name": "overshirt-mad-straight", + "path": "res://portraits/amy-d/overshirt-mad-straight.png" + }, + { + "name": "overshirt-yell-straight", + "path": "res://portraits/amy-d/overshirt-yell-straight.png" + }, + { + "name": "drunk-confused-straight", + "path": "res://portraits/amy-d/drunk-confused-straight.png" + }, + { + "name": "drunk-distress-straight", + "path": "res://portraits/amy-d/drunk-distress-straight.png" + }, + { + "name": "drunk-ehehe-straight", + "path": "res://portraits/amy-d/drunk-ehehe-straight.png" + }, + { + "name": "drunk-frown-straight", + "path": "res://portraits/amy-d/drunk-frown-straight.png" + }, + { + "name": "drunk-horny-straight", + "path": "res://portraits/amy-d/drunk-horny-straight.png" + }, + { + "name": "drunk-neutral-straight", + "path": "res://portraits/amy-d/drunk-neutral-straight.png" + }, + { + "name": "drunk-sad-side", + "path": "res://portraits/amy-d/drunk-sad-side.png" + }, + { + "name": "drunk-sad-straight", + "path": "res://portraits/amy-d/drunk-sad-straight.png" + }, + { + "name": "drunk-smile-straight", + "path": "res://portraits/amy-d/drunk-smile-straight.png" + }, + { + "name": "hangover-confused-side", + "path": "res://portraits/amy-d/hangover-confused-side.png" + }, + { + "name": "hangover-confused-straight", + "path": "res://portraits/amy-d/hangover-confused-straight.png" + }, + { + "name": "hangover-ehehe-straight", + "path": "res://portraits/amy-d/hangover-ehehe-straight.png" + }, + { + "name": "hangover-frown-straight", + "path": "res://portraits/amy-d/hangover-frown-straight.png" + }, + { + "name": "hangover-sad-straight", + "path": "res://portraits/amy-d/hangover-sad-straight.png" + }, + { + "name": "hangover-smile-side", + "path": "res://portraits/amy-d/hangover-smile-side.png" + }, + { + "name": "hangover-smile-straight", + "path": "res://portraits/amy-d/hangover-smile-straight.png" + }, + { + "name": "shirt-panic-straight", + "path": "res://portraits/amy-d/shirt-panic-straight.png" + }, + { + "name": "coat-cry-straight", + "path": "res://portraits/amy-d/coat-cry-straight.png" + }, + { + "name": "coat-excited-straight", + "path": "res://portraits/amy-d/coat-excited-straight.png" + }, + { + "name": "coat-frown-straight", + "path": "res://portraits/amy-d/coat-frown-straight.png" + }, + { + "name": "coat-smile-straight", + "path": "res://portraits/amy-d/coat-smile-straight.png" + }, + { + "name": "shirt-sad-straight", + "path": "res://portraits/amy-d/shirt-sad-straight.png" + }, + { + "name": "nogloves-frown-straight", + "path": "res://portraits/amy-d/nogloves-frown-straight.png" + }, + { + "name": "nochoker-distress-sick", + "path": "res://portraits/amy-d/nochoker-distress-sick.png" + }, + { + "name": "nochoker-ehehe-sick", + "path": "res://portraits/amy-d/nochoker-ehehe-sick.png" + }, + { + "name": "nochoker-frown-sick", + "path": "res://portraits/amy-d/nochoker-frown-sick.png" + }, + { + "name": "clean-curious-straight", + "path": "res://portraits/amy-d/clean-curious-straight.png" + }, + { + "name": "clean-distressed-straight", + "path": "res://portraits/amy-d/clean-distressed-straight.png" + }, + { + "name": "clean-sad-straight", + "path": "res://portraits/amy-d/clean-sad-straight.png" + }, + { + "name": "clean-smile-straight", + "path": "res://portraits/amy-d/clean-smile-straight.png" + }, + { + "name": "clean-surprised-straight", + "path": "res://portraits/amy-d/clean-surprised-straight.png" + } + ] + }, + "/Chaos/Emily": { + "color": "0.917647,0.772549,0.678431,1", + "data": { + "color": "#ffeac5ad", + "description": "", + "display_name": "Woman", + "display_name_bool": true, + "id": "character-1641441147.json", + "mirror_portraits": false, + "name": "Emily", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "suit-distressed-straight", + "path": "res://portraits/emily/suit-distressed-straight.png" + }, + { + "name": "suit-frown-straight", + "path": "res://portraits/emily/suit-frown-straight.png" + }, + { + "name": "suit-happy-straight", + "path": "res://portraits/emily/suit-happy-straight.png" + }, + { + "name": "suit-serious-straight", + "path": "res://portraits/emily/suit-serious-straight.png" + }, + { + "name": "suit-smile-straight", + "path": "res://portraits/emily/suit-smile-straight.png" + } + ], + "scale": 100, + "theme": "" + }, + "display_name": "Woman", + "file": "character-1641441147.json", + "name": "Emily", + "nickname": "", + "path": "/Chaos/Emily", + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "suit-distressed-straight", + "path": "res://portraits/emily/suit-distressed-straight.png" + }, + { + "name": "suit-frown-straight", + "path": "res://portraits/emily/suit-frown-straight.png" + }, + { + "name": "suit-happy-straight", + "path": "res://portraits/emily/suit-happy-straight.png" + }, + { + "name": "suit-serious-straight", + "path": "res://portraits/emily/suit-serious-straight.png" + }, + { + "name": "suit-smile-straight", + "path": "res://portraits/emily/suit-smile-straight.png" + } + ] + }, + "/Chaos/Marceline": { + "color": "0.517647,0.901961,0.529412,1", + "data": { + "color": "#ff84e687", + "description": "", + "display_name": "", + "display_name_bool": false, + "id": "character-1641441574.json", + "mirror_portraits": false, + "name": "Marceline", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "dress-curious-straight", + "path": "res://portraits/marceline/dress-curious-straight.png" + }, + { + "name": "dress-distressed-straight", + "path": "res://portraits/marceline/dress-distressed-straight.png" + }, + { + "name": "dress-happy-closed", + "path": "res://portraits/marceline/dress-happy-closed.png" + }, + { + "name": "dress-happy-straight", + "path": "res://portraits/marceline/dress-happy-straight.png" + }, + { + "name": "dress-serious-straight", + "path": "res://portraits/marceline/dress-serious-straight.png" + }, + { + "name": "dress-smile-straight", + "path": "res://portraits/marceline/dress-smile-straight.png" + }, + { + "name": "dress-unhappy-straight", + "path": "res://portraits/marceline/dress-unhappy-straight.png" + } + ], + "scale": 100 + }, + "display_name": "", + "file": "character-1641441574.json", + "name": "Marceline", + "nickname": "", + "path": "/Chaos/Marceline", + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "dress-curious-straight", + "path": "res://portraits/marceline/dress-curious-straight.png" + }, + { + "name": "dress-distressed-straight", + "path": "res://portraits/marceline/dress-distressed-straight.png" + }, + { + "name": "dress-happy-closed", + "path": "res://portraits/marceline/dress-happy-closed.png" + }, + { + "name": "dress-happy-straight", + "path": "res://portraits/marceline/dress-happy-straight.png" + }, + { + "name": "dress-serious-straight", + "path": "res://portraits/marceline/dress-serious-straight.png" + }, + { + "name": "dress-smile-straight", + "path": "res://portraits/marceline/dress-smile-straight.png" + }, + { + "name": "dress-unhappy-straight", + "path": "res://portraits/marceline/dress-unhappy-straight.png" + } + ] + }, + "/Chaos/Marceline-???": { + "color": "0.517647,0.901961,0.529412,1", + "data": { + "color": "#ff84e687", + "description": "", + "display_name": "???", + "display_name_bool": true, + "id": "character-1641441541.json", + "mirror_portraits": false, + "name": "Marceline-???", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + } + ], + "scale": 100 + }, + "display_name": "???", + "file": "character-1641441541.json", + "name": "Marceline-???", + "nickname": "", + "path": "/Chaos/Marceline-???", + "portraits": [ + { + "name": "Default", + "path": "" + } + ] + }, + "/Chaos/Marcus": { + "color": "0.701961,0.588235,0.588235,1", + "data": { + "color": "#ffb39696", + "description": "", + "display_name": "", + "display_name_bool": false, + "id": "character-1639165833.json", + "mirror_portraits": false, + "name": "Marcus", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "", + "path": "" + }, + { + "name": "work-angry-straight", + "path": "res://portraits/marcus/work-angry-straight.png" + }, + { + "name": "work-frown-straight", + "path": "res://portraits/marcus/work-frown-straight.png" + }, + { + "name": "work-neutral-straight", + "path": "res://portraits/marcus/work-neutral-straight.png" + }, + { + "name": "work-smile-straight", + "path": "res://portraits/marcus/work-smile-straight.png" + } + ], + "scale": 100, + "theme": "" + }, + "display_name": "", + "file": "character-1639165833.json", + "name": "Marcus", + "nickname": "", + "path": "/Chaos/Marcus", + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "", + "path": "" + }, + { + "name": "work-angry-straight", + "path": "res://portraits/marcus/work-angry-straight.png" + }, + { + "name": "work-frown-straight", + "path": "res://portraits/marcus/work-frown-straight.png" + }, + { + "name": "work-neutral-straight", + "path": "res://portraits/marcus/work-neutral-straight.png" + }, + { + "name": "work-smile-straight", + "path": "res://portraits/marcus/work-smile-straight.png" + } + ] + }, + "/Chaos/Moran": { + "color": "0.839216,0.65098,0.878431,1", + "data": { + "color": "#ffd6a6e0", + "description": "", + "display_name": "Agent Moran", + "display_name_bool": true, + "id": "character-1641442800.json", + "mirror_portraits": false, + "name": "Moran", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + } + ], + "scale": 100 + }, + "display_name": "Agent Moran", + "file": "character-1641442800.json", + "name": "Moran", + "nickname": "", + "path": "/Chaos/Moran", + "portraits": [ + { + "name": "Default", + "path": "" + } + ] + }, + "/Chaos/Moran-Man": { + "color": "0.839216,0.65098,0.878431,1", + "data": { + "color": "#ffd6a6e0", + "description": "", + "display_name": "Man", + "display_name_bool": true, + "id": "character-1641442751.json", + "mirror_portraits": false, + "name": "Moran-Man", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + } + ], + "scale": 100, + "theme": "" + }, + "display_name": "Man", + "file": "character-1641442751.json", + "name": "Moran-Man", + "nickname": "", + "path": "/Chaos/Moran-Man", + "portraits": [ + { + "name": "Default", + "path": "" + } + ] + }, + "/Chaos/Officer": { + "color": "1,1,1,1", + "data": { + "color": "#ffffffff", + "description": "", + "display_name": "", + "display_name_bool": false, + "id": "character-1639714911.json", + "mirror_portraits": false, + "name": "Officer", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + } + ], + "scale": 100, + "theme": "" + }, + "display_name": "", + "file": "character-1639714911.json", + "name": "Officer", + "nickname": "", + "path": "/Chaos/Officer", + "portraits": [ + { + "name": "Default", + "path": "" + } + ] + }, + "/Chaos/Thug": { + "color": "1,1,1,1", + "data": { + "color": "#ffffffff", + "description": "", + "display_name": "", + "display_name_bool": false, + "id": "character-1639420125.json", + "mirror_portraits": false, + "name": "Thug", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "thug-frown", + "path": "res://portraits/thug/thug-frown.png" + }, + { + "name": "thug-gun", + "path": "res://portraits/thug/thug-gun.png" + }, + { + "name": "thug-shout", + "path": "res://portraits/thug/thug-shout.png" + } + ], + "scale": 100, + "theme": "" + }, + "display_name": "", + "file": "character-1639420125.json", + "name": "Thug", + "nickname": "", + "path": "/Chaos/Thug", + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "thug-frown", + "path": "res://portraits/thug/thug-frown.png" + }, + { + "name": "thug-gun", + "path": "res://portraits/thug/thug-gun.png" + }, + { + "name": "thug-shout", + "path": "res://portraits/thug/thug-shout.png" + } + ] + }, + "/Chaos/Thug 2": { + "color": "1,1,1,1", + "data": { + "color": "#ffffffff", + "description": "", + "display_name": "", + "display_name_bool": false, + "id": "character-1639714073.json", + "mirror_portraits": false, + "name": "Thug 2", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + } + ], + "scale": 100 + }, + "display_name": "", + "file": "character-1639714073.json", + "name": "Thug 2", + "nickname": "", + "path": "/Chaos/Thug 2", + "portraits": [ + { + "name": "Default", + "path": "" + } + ] + }, + "/Chaos/Thug 3": { + "color": "1,1,1,1", + "data": { + "color": "#ffffffff", + "description": "", + "display_name": "", + "display_name_bool": false, + "id": "character-1639714081.json", + "mirror_portraits": false, + "name": "Thug 3", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + } + ], + "scale": 100, + "theme": "" + }, + "display_name": "", + "file": "character-1639714081.json", + "name": "Thug 3", + "nickname": "", + "path": "/Chaos/Thug 3", + "portraits": [ + { + "name": "Default", + "path": "" + } + ] + }, + "/Divergence/.": { + "color": null, + "folded": false + }, + "/Divergence/Attia-???": { + "color": "0.541176,0.976471,0.760784,1", + "data": { + "color": "#ff8af9c2", + "description": "", + "display_name": "???", + "display_name_bool": true, + "id": "character-1639689789.json", + "mirror_portraits": false, + "name": "Attia-???", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "stripes-frown-straight", + "path": "res://portraits/attiacitan/stripes-frown-straight.png" + }, + { + "name": "stripes-happy-straight", + "path": "res://portraits/attiacitan/stripes-happy-straight.png" + }, + { + "name": "stripes-mad-straight", + "path": "res://portraits/attiacitan/stripes-mad-straight.png" + }, + { + "name": "stripes-neutral-straight", + "path": "res://portraits/attiacitan/stripes-neutral-straight.png" + }, + { + "name": "stripes-proud-straight", + "path": "res://portraits/attiacitan/stripes-proud-straight.png" + }, + { + "name": "stripes-smile-straight", + "path": "res://portraits/attiacitan/stripes-smile-straight.png" + }, + { + "name": "stripes-worried-straight", + "path": "res://portraits/attiacitan/stripes-worried-straight.png" + } + ], + "scale": 100, + "theme": "" + }, + "display_name": "???", + "file": "character-1639689789.json", + "name": "Attia-???", + "nickname": "", + "path": "/Divergence/Attia-???", + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "stripes-frown-straight", + "path": "res://portraits/attiacitan/stripes-frown-straight.png" + }, + { + "name": "stripes-happy-straight", + "path": "res://portraits/attiacitan/stripes-happy-straight.png" + }, + { + "name": "stripes-mad-straight", + "path": "res://portraits/attiacitan/stripes-mad-straight.png" + }, + { + "name": "stripes-neutral-straight", + "path": "res://portraits/attiacitan/stripes-neutral-straight.png" + }, + { + "name": "stripes-proud-straight", + "path": "res://portraits/attiacitan/stripes-proud-straight.png" + }, + { + "name": "stripes-smile-straight", + "path": "res://portraits/attiacitan/stripes-smile-straight.png" + }, + { + "name": "stripes-worried-straight", + "path": "res://portraits/attiacitan/stripes-worried-straight.png" + } + ] + }, + "/Divergence/AttiaCitan": { + "color": "0.541176,0.976471,0.760784,1", + "data": { + "color": "#ff8af9c2", + "description": "", + "display_name": "Jenna", + "display_name_bool": true, + "id": "character-1639689665.json", + "mirror_portraits": false, + "name": "AttiaCitan", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "", + "path": "" + }, + { + "name": "stripes-frown-straight", + "path": "res://portraits/attiacitan/stripes-frown-straight.png" + }, + { + "name": "stripes-happy-straight", + "path": "res://portraits/attiacitan/stripes-happy-straight.png" + }, + { + "name": "stripes-mad-straight", + "path": "res://portraits/attiacitan/stripes-mad-straight.png" + }, + { + "name": "stripes-neutral-straight", + "path": "res://portraits/attiacitan/stripes-neutral-straight.png" + }, + { + "name": "stripes-proud-straight", + "path": "res://portraits/attiacitan/stripes-proud-straight.png" + }, + { + "name": "stripes-smile-straight", + "path": "res://portraits/attiacitan/stripes-smile-straight.png" + }, + { + "name": "stripes-worried-straight", + "path": "res://portraits/attiacitan/stripes-worried-straight.png" + } + ], + "scale": 100, + "theme": "" + }, + "display_name": "Jenna", + "file": "character-1639689665.json", + "name": "AttiaCitan", + "nickname": "", + "path": "/Divergence/AttiaCitan", + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "", + "path": "" + }, + { + "name": "stripes-frown-straight", + "path": "res://portraits/attiacitan/stripes-frown-straight.png" + }, + { + "name": "stripes-happy-straight", + "path": "res://portraits/attiacitan/stripes-happy-straight.png" + }, + { + "name": "stripes-mad-straight", + "path": "res://portraits/attiacitan/stripes-mad-straight.png" + }, + { + "name": "stripes-neutral-straight", + "path": "res://portraits/attiacitan/stripes-neutral-straight.png" + }, + { + "name": "stripes-proud-straight", + "path": "res://portraits/attiacitan/stripes-proud-straight.png" + }, + { + "name": "stripes-smile-straight", + "path": "res://portraits/attiacitan/stripes-smile-straight.png" + }, + { + "name": "stripes-worried-straight", + "path": "res://portraits/attiacitan/stripes-worried-straight.png" + } + ] + }, + "/Extras/.": { + "color": null, + "folded": false + }, + "/Extras/Amy-T": { + "color": "0.521569,0.764706,1,1", + "data": { + "color": "#ff85c3ff", + "description": "", + "display_name": "Amy", + "display_name_bool": true, + "id": "character-1641702109.json", + "mirror_portraits": false, + "name": "Amy-T", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "confused", + "path": "res://portraits/amy-t/confused.png" + }, + { + "name": "frown", + "path": "res://portraits/amy-t/frown.png" + }, + { + "name": "glare", + "path": "res://portraits/amy-t/glare.png" + }, + { + "name": "neutral", + "path": "res://portraits/amy-t/neutral.png" + }, + { + "name": "shout", + "path": "res://portraits/amy-t/shout.png" + }, + { + "name": "exasperated", + "path": "res://portraits/amy-t/exasperated.png" + }, + { + "name": "cross", + "path": "res://portraits/amy-t/cross.png" + }, + { + "name": "armsonhips", + "path": "res://portraits/amy-t/armsonhips.png" + }, + { + "name": "thinking", + "path": "res://portraits/amy-t/thinking.png" + }, + { + "name": "amyshadertest", + "path": "res://amyshadertest.tscn" + } + ], + "scale": 100, + "theme": "" + }, + "display_name": "Amy", + "file": "character-1641702109.json", + "name": "Amy-T", + "nickname": "", + "path": "/Extras/Amy-T", + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "confused", + "path": "res://portraits/amy-t/confused.png" + }, + { + "name": "frown", + "path": "res://portraits/amy-t/frown.png" + }, + { + "name": "glare", + "path": "res://portraits/amy-t/glare.png" + }, + { + "name": "neutral", + "path": "res://portraits/amy-t/neutral.png" + }, + { + "name": "shout", + "path": "res://portraits/amy-t/shout.png" + }, + { + "name": "exasperated", + "path": "res://portraits/amy-t/exasperated.png" + }, + { + "name": "cross", + "path": "res://portraits/amy-t/cross.png" + }, + { + "name": "armsonhips", + "path": "res://portraits/amy-t/armsonhips.png" + }, + { + "name": "thinking", + "path": "res://portraits/amy-t/thinking.png" + }, + { + "name": "amyshadertest", + "path": "res://amyshadertest.tscn" + } + ] + }, + "/Extras/AttiaCitan": { + "color": "0.541176,0.976471,0.760784,1", + "data": { + "color": "#ff8af9c2", + "description": "", + "display_name": "", + "display_name_bool": false, + "id": "character-1641703870.json", + "mirror_portraits": false, + "name": "AttiaCitan", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + } + ], + "scale": 100 + }, + "display_name": "", + "file": "character-1641703870.json", + "name": "AttiaCitan", + "nickname": "", + "path": "/Extras/AttiaCitan", + "portraits": [ + { + "name": "Default", + "path": "" + } + ] + }, + "/Extras/MikolElrik": { + "color": "0.67451,0.682353,0.427451,1", + "data": { + "color": "#ffacae6d", + "description": "", + "display_name": "", + "display_name_bool": false, + "id": "character-1641703940.json", + "mirror_portraits": false, + "name": "MikolElrik", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + } + ], + "scale": 100 + }, + "display_name": "", + "file": "character-1641703940.json", + "name": "MikolElrik", + "nickname": "", + "path": "/Extras/MikolElrik", + "portraits": [ + { + "name": "Default", + "path": "" + } + ] + }, + "/Phobia/.": { + "color": null, + "folded": false + }, + "/Phobia/Aimee": { + "color": "1,0.760784,0.521569,1", + "data": { + "color": "#ffffc285", + "description": "", + "display_name": "", + "display_name_bool": false, + "id": "character-1644966307.json", + "mirror_portraits": false, + "name": "Aimee", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "res://portraits/phobia/aimee-test.png" + } + ], + "scale": 70 + }, + "display_name": "", + "file": "character-1644966307.json", + "name": "Aimee", + "nickname": "", + "path": "/Phobia/Aimee", + "portraits": [ + { + "name": "Default", + "path": "res://portraits/phobia/aimee-test.png" + } + ] + }, + "/Phobia/AttiaCitan": { + "color": "0.541176,0.976471,0.760784,1", + "data": { + "color": "#ff8af9c2", + "description": "", + "display_name": "", + "display_name_bool": false, + "id": "character-1644966329.json", + "mirror_portraits": true, + "name": "AttiaCitan", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "res://portraits/phobia/attia-test.png" + } + ], + "scale": 70 + }, + "display_name": "", + "file": "character-1644966329.json", + "name": "AttiaCitan", + "nickname": "", + "path": "/Phobia/AttiaCitan", + "portraits": [ + { + "name": "Default", + "path": "res://portraits/phobia/attia-test.png" + } + ] + }, + "/Phobia/James": { + "color": "0.988235,1,0.615686,1", + "data": { + "color": "#fffcff9d", + "description": "", + "display_name": "", + "display_name_bool": false, + "id": "character-1644966302.json", + "mirror_portraits": false, + "name": "James", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "res://portraits/phobia/james-test.png" + } + ], + "scale": 70 + }, + "display_name": "", + "file": "character-1644966302.json", + "name": "James", + "nickname": "", + "path": "/Phobia/James", + "portraits": [ + { + "name": "Default", + "path": "res://portraits/phobia/james-test.png" + } + ] + }, + "/Phobia/MikolElrik": { + "color": "0.709804,0.709804,0.545098,1", + "data": { + "color": "#ffb5b58b", + "description": "", + "display_name": "", + "display_name_bool": false, + "id": "character-1644966321.json", + "mirror_portraits": true, + "name": "MikolElrik", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "res://portraits/phobia/mikol-test.png" + } + ], + "scale": 70 + }, + "display_name": "", + "file": "character-1644966321.json", + "name": "MikolElrik", + "nickname": "", + "path": "/Phobia/MikolElrik", + "portraits": [ + { + "name": "Default", + "path": "res://portraits/phobia/mikol-test.png" + } + ] + }, + "/Phobia/Tiffany": { + "color": "0.745098,0.619608,1,1", + "data": { + "color": "#ffbe9eff", + "description": "", + "display_name": "", + "display_name_bool": false, + "id": "character-1644966315.json", + "mirror_portraits": false, + "name": "Tiffany", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "res://portraits/phobia/tiffany-test.png" + } + ], + "scale": 70 + }, + "display_name": "", + "file": "character-1644966315.json", + "name": "Tiffany", + "nickname": "", + "path": "/Phobia/Tiffany", + "portraits": [ + { + "name": "Default", + "path": "res://portraits/phobia/tiffany-test.png" + } + ] + }, + "/PrivateWorld/.": { + "color": null, + "folded": false + }, + "/PrivateWorld/Amy-A": { + "color": "0.521569,0.764706,1,1", + "data": { + "color": "#ff85c3ff", + "description": "", + "display_name": "Amy", + "display_name_bool": true, + "id": "character-1641704651.json", + "mirror_portraits": false, + "name": "Amy-A", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "normal-sad-straight", + "path": "res://portraits/amy-a/normal-sad-straight.png" + }, + { + "name": "normal-confused-straight", + "path": "res://portraits/amy-a/normal-confused-straight.png" + }, + { + "name": "normal-neutral-straight", + "path": "res://portraits/amy-a/normal-neutral-straight.png" + }, + { + "name": "normal-proud-straight", + "path": "res://portraits/amy-a/normal-proud-straight.png" + }, + { + "name": "normal-sigh-straight", + "path": "res://portraits/amy-a/normal-sigh-straight.png" + }, + { + "name": "normal-smile-straight", + "path": "res://portraits/amy-a/normal-smile-straight.png" + }, + { + "name": "normal-smirk-straight", + "path": "res://portraits/amy-a/normal-smirk-straight.png" + }, + { + "name": "normal-happy-straight", + "path": "res://portraits/amy-a/normal-happy-straight.png" + }, + { + "name": "normal-shout-straight", + "path": "res://portraits/amy-a/normal-shout-straight.png" + } + ], + "scale": 100 + }, + "display_name": "Amy", + "file": "character-1641704651.json", + "name": "Amy-A", + "nickname": "", + "path": "/PrivateWorld/Amy-A", + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "normal-sad-straight", + "path": "res://portraits/amy-a/normal-sad-straight.png" + }, + { + "name": "normal-confused-straight", + "path": "res://portraits/amy-a/normal-confused-straight.png" + }, + { + "name": "normal-neutral-straight", + "path": "res://portraits/amy-a/normal-neutral-straight.png" + }, + { + "name": "normal-proud-straight", + "path": "res://portraits/amy-a/normal-proud-straight.png" + }, + { + "name": "normal-sigh-straight", + "path": "res://portraits/amy-a/normal-sigh-straight.png" + }, + { + "name": "normal-smile-straight", + "path": "res://portraits/amy-a/normal-smile-straight.png" + }, + { + "name": "normal-smirk-straight", + "path": "res://portraits/amy-a/normal-smirk-straight.png" + }, + { + "name": "normal-happy-straight", + "path": "res://portraits/amy-a/normal-happy-straight.png" + }, + { + "name": "normal-shout-straight", + "path": "res://portraits/amy-a/normal-shout-straight.png" + } + ] + }, + "/PrivateWorld/Jessica": { + "color": "0.701961,0.588235,0.588235,1", + "data": { + "color": "#ffb39696", + "description": "", + "display_name": "", + "display_name_bool": false, + "id": "character-1644888036.json", + "mirror_portraits": false, + "name": "Jessica", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "goth-curious-normal", + "path": "res://portraits/jessica/goth-curious-normal.png" + }, + { + "name": "goth-disappointed-normal", + "path": "res://portraits/jessica/goth-disappointed-normal.png" + }, + { + "name": "goth-happy-normal", + "path": "res://portraits/jessica/goth-happy-normal.png" + }, + { + "name": "goth-mad-normal", + "path": "res://portraits/jessica/goth-mad-normal.png" + }, + { + "name": "goth-neutral-normal", + "path": "res://portraits/jessica/goth-neutral-normal.png" + }, + { + "name": "goth-sad-normal", + "path": "res://portraits/jessica/goth-sad-normal.png" + }, + { + "name": "goth-shout-normal", + "path": "res://portraits/jessica/goth-shout-normal.png" + }, + { + "name": "goth-sigh-normal", + "path": "res://portraits/jessica/goth-sigh-normal.png" + }, + { + "name": "goth-smile-normal", + "path": "res://portraits/jessica/goth-smile-normal.png" + }, + { + "name": "goth-surprised-normal", + "path": "res://portraits/jessica/goth-surprised-normal.png" + }, + { + "name": "goth-thought-normal", + "path": "res://portraits/jessica/goth-thought-normal.png" + }, + { + "name": "goth-wink-normal", + "path": "res://portraits/jessica/goth-wink-normal.png" + } + ], + "scale": 100 + }, + "display_name": "", + "file": "character-1644888036.json", + "name": "Jessica", + "nickname": "", + "path": "/PrivateWorld/Jessica", + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "goth-curious-normal", + "path": "res://portraits/jessica/goth-curious-normal.png" + }, + { + "name": "goth-disappointed-normal", + "path": "res://portraits/jessica/goth-disappointed-normal.png" + }, + { + "name": "goth-happy-normal", + "path": "res://portraits/jessica/goth-happy-normal.png" + }, + { + "name": "goth-mad-normal", + "path": "res://portraits/jessica/goth-mad-normal.png" + }, + { + "name": "goth-neutral-normal", + "path": "res://portraits/jessica/goth-neutral-normal.png" + }, + { + "name": "goth-sad-normal", + "path": "res://portraits/jessica/goth-sad-normal.png" + }, + { + "name": "goth-shout-normal", + "path": "res://portraits/jessica/goth-shout-normal.png" + }, + { + "name": "goth-sigh-normal", + "path": "res://portraits/jessica/goth-sigh-normal.png" + }, + { + "name": "goth-smile-normal", + "path": "res://portraits/jessica/goth-smile-normal.png" + }, + { + "name": "goth-surprised-normal", + "path": "res://portraits/jessica/goth-surprised-normal.png" + }, + { + "name": "goth-thought-normal", + "path": "res://portraits/jessica/goth-thought-normal.png" + }, + { + "name": "goth-wink-normal", + "path": "res://portraits/jessica/goth-wink-normal.png" + } + ] + }, + "/PrivateWorld/Jessica-???": { + "color": "0.701961,0.588235,0.588235,1", + "data": { + "color": "#ffb39696", + "description": "", + "display_name": "???", + "display_name_bool": true, + "id": "character-1644888018.json", + "mirror_portraits": false, + "name": "Jessica-???", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "goth-curious-normal", + "path": "res://portraits/jessica/goth-curious-normal.png" + }, + { + "name": "goth-surprised-normal", + "path": "res://portraits/jessica/goth-surprised-normal.png" + }, + { + "name": "goth-smile-normal", + "path": "res://portraits/jessica/goth-smile-normal.png" + }, + { + "name": "goth-sigh-normal", + "path": "res://portraits/jessica/goth-sigh-normal.png" + } + ], + "scale": 100 + }, + "display_name": "???", + "file": "character-1644888018.json", + "name": "Jessica-???", + "nickname": "", + "path": "/PrivateWorld/Jessica-???", + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "goth-curious-normal", + "path": "res://portraits/jessica/goth-curious-normal.png" + }, + { + "name": "goth-surprised-normal", + "path": "res://portraits/jessica/goth-surprised-normal.png" + }, + { + "name": "goth-smile-normal", + "path": "res://portraits/jessica/goth-smile-normal.png" + }, + { + "name": "goth-sigh-normal", + "path": "res://portraits/jessica/goth-sigh-normal.png" + } + ] + }, + "/SchoolDaze/.": { + "color": null, + "folded": false + }, + "/SchoolDaze/Amy-C": { + "color": "0.521569,0.764706,1,1", + "data": { + "color": "#ff85c3ff", + "description": "", + "display_name": "Amy", + "display_name_bool": true, + "id": "character-1641704666.json", + "mirror_portraits": false, + "name": "Amy-C", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "normal-smile-straight", + "path": "res://portraits/amy-c/normal-smile-straight.png" + } + ], + "scale": 100 + }, + "display_name": "Amy", + "file": "character-1641704666.json", + "name": "Amy-C", + "nickname": "", + "path": "/SchoolDaze/Amy-C", + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "normal-smile-straight", + "path": "res://portraits/amy-c/normal-smile-straight.png" + } + ] + }, + "/Shared/.": { + "color": null, + "folded": false + }, + "/Shared/All": { + "color": "1,1,1,1", + "data": { + "color": "#ffffffff", + "description": "", + "display_name": "", + "display_name_bool": false, + "id": "character-1641494010.json", + "mirror_portraits": false, + "name": "All", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + } + ], + "scale": 100 + }, + "display_name": "", + "file": "character-1641494010.json", + "name": "All", + "nickname": "", + "path": "/Shared/All", + "portraits": [ + { + "name": "Default", + "path": "" + } + ] + }, + "/Shared/Amy-???": { + "color": "0.521569,0.764706,1,1", + "data": { + "color": "#ff85c3ff", + "description": "", + "display_name": "???", + "display_name_bool": true, + "id": "character-1638076571.json", + "mirror_portraits": false, + "name": "Amy-???", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + } + ], + "scale": 100, + "theme": "" + }, + "display_name": "???", + "file": "character-1638076571.json", + "name": "Amy-???", + "nickname": "", + "path": "/Shared/Amy-???", + "portraits": [ + { + "name": "Default", + "path": "" + } + ] + }, + "/Shared/Doctor": { + "color": "1,1,1,1", + "data": { + "color": "#ffffffff", + "description": "", + "display_name": "", + "display_name_bool": false, + "id": "character-1637984819.json", + "mirror_portraits": false, + "name": "Doctor", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + } + ], + "scale": 100 + }, + "display_name": "", + "file": "character-1637984819.json", + "name": "Doctor", + "nickname": "", + "path": "/Shared/Doctor", + "portraits": [ + { + "name": "Default", + "path": "" + } + ] + }, + "/Shared/James": { + "color": "0.988235,1,0.615686,1", + "data": { + "color": "#fffcff9d", + "description": "", + "display_name": "", + "display_name_bool": false, + "id": "character-1637960611.json", + "mirror_portraits": false, + "name": "James", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + } + ], + "scale": 100 + }, + "display_name": "", + "file": "character-1637960611.json", + "name": "James", + "nickname": "", + "path": "/Shared/James", + "portraits": [ + { + "name": "Default", + "path": "" + } + ] + }, + "/Shared/KingOfHearts": { + "color": "1,1,1,1", + "data": { + "color": "#ffffffff", + "description": "", + "display_name": "Dr. Hart", + "display_name_bool": true, + "id": "character-1639165152.json", + "mirror_portraits": false, + "name": "KingOfHearts", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "psych-neutral-straight", + "path": "res://portraits/kingofhearts/psych-neutral-straight.png" + } + ], + "scale": 100, + "theme": "" + }, + "display_name": "Dr. Hart", + "file": "character-1639165152.json", + "name": "KingOfHearts", + "nickname": "", + "path": "/Shared/KingOfHearts", + "portraits": [ + { + "name": "Default", + "path": "" + }, + { + "name": "psych-neutral-straight", + "path": "res://portraits/kingofhearts/psych-neutral-straight.png" + } + ] + }, + "/Shared/Misc-???": { + "color": "1,1,1,1", + "data": { + "color": "#ffffffff", + "description": "", + "display_name": "???", + "display_name_bool": true, + "id": "character-1639714895.json", + "mirror_portraits": false, + "name": "Misc-???", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + } + ], + "scale": 100, + "theme": "" + }, + "display_name": "???", + "file": "character-1639714895.json", + "name": "Misc-???", + "nickname": "", + "path": "/Shared/Misc-???", + "portraits": [ + { + "name": "Default", + "path": "" + } + ] + }, + "/Shared/Nurse": { + "color": "1,1,1,1", + "data": { + "color": "#ffffffff", + "description": "", + "display_name": "", + "display_name_bool": false, + "id": "character-1637984811.json", + "mirror_portraits": false, + "name": "Nurse", + "nickname": "", + "nickname_bool": false, + "offset_x": 0, + "offset_y": 0, + "portraits": [ + { + "name": "Default", + "path": "" + } + ], + "scale": 100 + }, + "display_name": "", + "file": "character-1637984811.json", + "name": "Nurse", + "nickname": "", + "path": "/Shared/Nurse", + "portraits": [ + { + "name": "Default", + "path": "" + } + ] + } + }, + "Definition": { + "/.": { + "color": null, + "folded": false + }, + "/New Folder 1667185667/.": { + "color": null, + "folded": false + }, + "1637962614-364": { + "id": "1637962614-364", + "name": "Iteration", + "path": "/Iteration", + "type": 0, + "value": "0" + }, + "1637980455-648": { + "id": "1637980455-648", + "name": "LastAmy", + "path": "/LastAmy", + "type": 0, + "value": "0" + }, + "1640299195-648": { + "id": "1640299195-648", + "name": "BranchA", + "path": "/BranchA", + "type": 0, + "value": "0" + }, + "1640299228-787": { + "id": "1640299228-787", + "name": "BranchB", + "path": "/BranchB", + "type": 0, + "value": "0" + }, + "1640299237-366": { + "id": "1640299237-366", + "name": "BranchC", + "path": "/BranchC", + "type": 0, + "value": "0" + }, + "1640299253-146": { + "id": "1640299253-146", + "name": "BranchD", + "path": "/BranchD", + "type": 0, + "value": "0" + }, + "1657506003-648": { + "id": "1657506003-648", + "name": "ReviewMode", + "path": "/ReviewMode", + "type": 0, + "value": "0" + } + }, + "Theme": { + "/.": { + "color": null, + "folded": false + }, + "/New Folder 1667185671/.": { + "color": null, + "folded": false + }, + "default-theme.cfg": { + "config": "[ConfigFile:1525]", + "file": "default-theme.cfg", + "name": "Default Theme", + "path": "/Default Theme" + }, + "theme-1637887617.cfg": { + "config": "[ConfigFile:1527]", + "file": "theme-1637887617.cfg", + "name": "TypeB", + "path": "/TypeB" + }, + "theme-1647033784.cfg": { + "config": "[ConfigFile:1528]", + "file": "theme-1647033784.cfg", + "name": "theme-1647033784.cfg", + "path": "/theme-1647033784.cfg" + }, + "theme-1650214108.cfg": { + "config": "[ConfigFile:1526]", + "file": "theme-1650214108.cfg", + "name": "TypeB-nodim", + "path": "/TypeB-nodim" + }, + "theme-1657083809.cfg": { + "config": "[ConfigFile:1529]", + "file": "theme-1657083809.cfg", + "name": "Distorted", + "path": "/Distorted" + }, + "theme-1657502129.cfg": { + "config": "[ConfigFile:1530]", + "file": "theme-1657502129.cfg", + "name": "CreditsWait", + "path": "/CreditsWait" + } + }, + "Timeline": { + "/.": { + "color": null, + "folded": false + }, + "/Anhedonia/.": { + "color": null, + "folded": false + }, + "/Anhedonia/step-1": { + "color": "1,1,1,1", + "file": "timeline-1640471640.json", + "name": "step-1", + "path": "/Anhedonia/step-1" + }, + "/Anhedonia/step-last": { + "color": "1,1,1,1", + "file": "timeline-1644935376.json", + "name": "step-last", + "path": "/Anhedonia/step-last" + }, + "/Anhedonia/step-mid": { + "color": "1,1,1,1", + "file": "timeline-1655846991.json", + "name": "step-mid", + "path": "/Anhedonia/step-mid" + }, + "/Chaos/.": { + "color": null, + "folded": false + }, + "/Chaos/New Folder 1666844659/.": { + "color": null, + "folded": false + }, + "/Chaos/New Folder 1666844659/New Folder 1666844963/.": { + "color": null, + "folded": false + }, + "/Chaos/New Folder 1666844659/New Folder 1666844963/New Folder 1666845169/.": { + "color": null, + "folded": false + }, + "/Chaos/New Folder 1666844659/New Folder 1666844963/New Folder 1666845169/New Folder 1666845175/.": { + "color": null, + "folded": false + }, + "/Chaos/New Folder 1666844659/New Folder 1666844963/New Folder 1666845169/New Folder 1666845175/New Folder 1666845194/.": { + "color": null, + "folded": false + }, + "/Chaos/New Folder 1666844659/New Folder 1666844963/New Folder 1666845169/New Folder 1666845175/New Folder 1666845194/ddfgdfg/.": { + "color": null, + "folded": false + }, + "/Chaos/New Folder 1666844659/New Folder 1666844963/New Folder 1666845169/New Folder 1666845175/New Folder 1666845194/ddfgdfg/New Folder 1667185561/.": { + "color": null, + "folded": false + }, + "/Chaos/step-1": { + "color": "1,1,1,1", + "file": "timeline-1638076419.json", + "name": "step-1", + "path": "/Chaos/step-1" + }, + "/Chaos/step-10": { + "color": "1,1,1,1", + "file": "timeline-1639788969.json", + "name": "step-10", + "path": "/Chaos/step-10" + }, + "/Chaos/step-11": { + "color": "1,1,1,1", + "file": "timeline-1639788975.json", + "name": "step-11", + "path": "/Chaos/step-11" + }, + "/Chaos/step-12": { + "color": "1,1,1,1", + "file": "timeline-1641351628.json", + "name": "step-12", + "path": "/Chaos/step-12" + }, + "/Chaos/step-13": { + "color": "1,1,1,1", + "file": "timeline-1644372410.json", + "name": "step-13", + "path": "/Chaos/step-13" + }, + "/Chaos/step-14": { + "color": "1,1,1,1", + "file": "timeline-1644373602.json", + "name": "step-14", + "path": "/Chaos/step-14" + }, + "/Chaos/step-15": { + "color": "1,1,1,1", + "file": "timeline-1644373684.json", + "name": "step-15", + "path": "/Chaos/step-15" + }, + "/Chaos/step-16": { + "color": "1,1,1,1", + "file": "timeline-1644629041.json", + "name": "step-16", + "path": "/Chaos/step-16" + }, + "/Chaos/step-17": { + "color": "1,1,1,1", + "file": "timeline-1644629050.json", + "name": "step-17", + "path": "/Chaos/step-17" + }, + "/Chaos/step-18": { + "color": "1,1,1,1", + "file": "timeline-1646621254.json", + "name": "step-18", + "path": "/Chaos/step-18" + }, + "/Chaos/step-2": { + "color": "1,1,1,1", + "file": "timeline-1638159119.json", + "name": "step-2", + "path": "/Chaos/step-2" + }, + "/Chaos/step-3": { + "color": "1,1,1,1", + "file": "timeline-1638245534.json", + "name": "step-3", + "path": "/Chaos/step-3" + }, + "/Chaos/step-4": { + "color": "1,1,1,1", + "file": "timeline-1638491011.json", + "name": "step-4", + "path": "/Chaos/step-4" + }, + "/Chaos/step-5": { + "color": "1,1,1,1", + "file": "timeline-1639165202.json", + "name": "step-5", + "path": "/Chaos/step-5" + }, + "/Chaos/step-6": { + "color": "1,1,1,1", + "file": "timeline-1639165263.json", + "name": "step-6", + "path": "/Chaos/step-6" + }, + "/Chaos/step-7": { + "color": "1,1,1,1", + "file": "timeline-1639167221.json", + "name": "step-7", + "path": "/Chaos/step-7" + }, + "/Chaos/step-8": { + "color": "1,1,1,1", + "file": "timeline-1639511076.json", + "name": "step-8", + "path": "/Chaos/step-8" + }, + "/Chaos/step-9": { + "color": "1,1,1,1", + "file": "timeline-1639711484.json", + "name": "step-9", + "path": "/Chaos/step-9" + }, + "/DefaultTimeline": { + "color": "1,1,1,1", + "file": "timeline-1640294642.json", + "name": "DefaultTimeline", + "path": "/DefaultTimeline" + }, + "/Divergence/.": { + "color": null, + "folded": false + }, + "/Divergence/step-1": { + "color": "1,1,1,1", + "file": "timeline-1639689624.json", + "name": "step-1", + "path": "/Divergence/step-1" + }, + "/Divergence/step-last": { + "color": "1,1,1,1", + "file": "timeline-1657083875.json", + "name": "step-last", + "path": "/Divergence/step-last" + }, + "/Extras/.": { + "color": null, + "folded": false + }, + "/Extras/amy-contact": { + "color": "1,1,1,1", + "file": "timeline-1641702565.json", + "name": "amy-contact", + "path": "/Extras/amy-contact" + }, + "/Intro/.": { + "color": null, + "folded": false + }, + "/Intro/intro": { + "color": "1,1,1,1", + "file": "timeline-1637959587.json", + "name": "intro", + "path": "/Intro/intro" + }, + "/Phobia/.": { + "color": null, + "folded": false + }, + "/Phobia/New Folder 1667185581/.": { + "color": null, + "folded": false + }, + "/Phobia/Reviews/.": { + "color": null, + "folded": false + }, + "/Phobia/Reviews/AnhedSD/.": { + "color": null, + "folded": false + }, + "/Phobia/Reviews/AnhedSD/step-1": { + "color": "1,1,1,1", + "file": "timeline-1650379703.json", + "name": "step-1", + "path": "/Phobia/Reviews/AnhedSD/step-1" + }, + "/Phobia/Reviews/Anhedonia/.": { + "color": null, + "folded": false + }, + "/Phobia/Reviews/Anhedonia/step-idk": { + "color": "1,1,1,1", + "file": "timeline-1655999723.json", + "name": "step-idk", + "path": "/Phobia/Reviews/Anhedonia/step-idk" + }, + "/Phobia/Reviews/Anhedonia/step-last": { + "color": "1,1,1,1", + "file": "timeline-1648476775.json", + "name": "step-last", + "path": "/Phobia/Reviews/Anhedonia/step-last" + }, + "/Phobia/Reviews/Chaos/.": { + "color": null, + "folded": false + }, + "/Phobia/Reviews/Chaos/step-1": { + "color": "1,1,1,1", + "file": "timeline-1650208093.json", + "name": "step-1", + "path": "/Phobia/Reviews/Chaos/step-1" + }, + "/Phobia/Reviews/Chaos/step-12": { + "color": "1,1,1,1", + "file": "timeline-1645281133.json", + "name": "step-12", + "path": "/Phobia/Reviews/Chaos/step-12" + }, + "/Phobia/Reviews/Chaos/step-3": { + "color": "1,1,1,1", + "file": "timeline-1645904743.json", + "name": "step-3", + "path": "/Phobia/Reviews/Chaos/step-3" + }, + "/Phobia/Reviews/Chaos/step-8": { + "color": "1,1,1,1", + "file": "timeline-1644976135.json", + "name": "step-8", + "path": "/Phobia/Reviews/Chaos/step-8" + }, + "/Phobia/Reviews/ChaosPW/.": { + "color": null, + "folded": false + }, + "/Phobia/Reviews/ChaosPW/step-1": { + "color": "1,1,1,1", + "file": "timeline-1650213352.json", + "name": "step-1", + "path": "/Phobia/Reviews/ChaosPW/step-1" + }, + "/Phobia/Reviews/Divergence/.": { + "color": null, + "folded": false + }, + "/Phobia/Reviews/Divergence/step-1": { + "color": "1,1,1,1", + "file": "timeline-1648491092.json", + "name": "step-1", + "path": "/Phobia/Reviews/Divergence/step-1" + }, + "/Phobia/Reviews/Divergence/step-3": { + "color": "1,1,1,1", + "file": "timeline-1648503983.json", + "name": "step-3", + "path": "/Phobia/Reviews/Divergence/step-3" + }, + "/Phobia/Reviews/Extras/.": { + "color": null, + "folded": false + }, + "/Phobia/Reviews/Extras/amy-contact": { + "color": "1,1,1,1", + "file": "timeline-1644985622.json", + "name": "amy-contact", + "path": "/Phobia/Reviews/Extras/amy-contact" + }, + "/Phobia/Reviews/Extras/marcus-druglord": { + "color": "1,1,1,1", + "file": "timeline-1645055274.json", + "name": "marcus-druglord", + "path": "/Phobia/Reviews/Extras/marcus-druglord" + }, + "/Phobia/Reviews/Extras/marcus-observation": { + "color": "1,1,1,1", + "file": "timeline-1644986027.json", + "name": "marcus-observation", + "path": "/Phobia/Reviews/Extras/marcus-observation" + }, + "/Phobia/Reviews/PrivateWorld/.": { + "color": null, + "folded": false + }, + "/Phobia/Reviews/PrivateWorld/step-idk": { + "color": "1,1,1,1", + "file": "timeline-1644983642.json", + "name": "step-idk", + "path": "/Phobia/Reviews/PrivateWorld/step-idk" + }, + "/Phobia/Reviews/SchoolDaze/.": { + "color": null, + "folded": false + }, + "/Phobia/Reviews/SchoolDaze/step-idk": { + "color": "1,1,1,1", + "file": "timeline-1650385585.json", + "name": "step-idk", + "path": "/Phobia/Reviews/SchoolDaze/step-idk" + }, + "/PrivateWorld/.": { + "color": null, + "folded": false + }, + "/PrivateWorld/step-1": { + "color": "1,1,1,1", + "file": "timeline-1640471655.json", + "name": "step-1", + "path": "/PrivateWorld/step-1" + }, + "/PrivateWorld/step-idk": { + "color": "1,1,1,1", + "file": "timeline-1644885560.json", + "name": "step-idk", + "path": "/PrivateWorld/step-idk" + }, + "/PrivateWorld/step-last": { + "color": "1,1,1,1", + "file": "timeline-1644935463.json", + "name": "step-last", + "path": "/PrivateWorld/step-last" + }, + "/SchoolDaze/.": { + "color": null, + "folded": false + }, + "/SchoolDaze/dfgdgf/.": { + "color": null, + "folded": false + }, + "/SchoolDaze/dfgdgf/New Folder 1666844265/.": { + "color": null, + "folded": false + }, + "/SchoolDaze/step-1": { + "color": "1,1,1,1", + "file": "timeline-1640471668.json", + "name": "step-1", + "path": "/SchoolDaze/step-1" + }, + "/SchoolDaze/step-last": { + "color": "1,1,1,1", + "file": "timeline-1645278809.json", + "name": "step-last", + "path": "/SchoolDaze/step-last" + }, + "/credits": { + "color": "1,1,1,1", + "file": "timeline-1644631930.json", + "name": "credits", + "path": "/credits" + }, + "/debugintro": { + "color": "1,1,1,1", + "file": "timeline-1637980436.json", + "name": "debugintro", + "path": "/debugintro" + }, + "/pic-test": { + "color": "1,1,1,1", + "file": "timeline-1638041067.json", + "name": "pic-test", + "path": "/pic-test" + }, + "/portraittest": { + "color": "1,1,1,1", + "file": "timeline-1641705554.json", + "name": "portraittest", + "path": "/portraittest" + }, + "/xbxbc": { + "color": "1,1,1,1", + "file": "timeline-1670110627.json", + "name": "xbxbc", + "path": "/xbxbc" + } + } +} diff --git a/nested.json b/nested.json new file mode 100644 index 000000000..2d46cdfba --- /dev/null +++ b/nested.json @@ -0,0 +1,359 @@ +{ + "files": [ + "timeline-1637980436.json", + "timeline-1638041067.json", + "timeline-1640294642.json", + "timeline-1641705554.json", + "timeline-1644631930.json", + "timeline-1670110627.json" + ], + "folders": { + "Anhedonia": { + "files": [ + "timeline-1640471640.json", + "timeline-1644935376.json", + "timeline-1655846991.json" + ], + "folders": { + + }, + "metadata": { + "color": null, + "folded": false + } + }, + "Chaos": { + "files": [ + "timeline-1638076419.json", + "timeline-1638159119.json", + "timeline-1638245534.json", + "timeline-1638491011.json", + "timeline-1639165202.json", + "timeline-1639165263.json", + "timeline-1639167221.json", + "timeline-1639511076.json", + "timeline-1639711484.json", + "timeline-1639788969.json", + "timeline-1639788975.json", + "timeline-1641351628.json", + "timeline-1644372410.json", + "timeline-1644373602.json", + "timeline-1644373684.json", + "timeline-1644629041.json", + "timeline-1644629050.json", + "timeline-1646621254.json" + ], + "folders": { + "New Folder 1666844659": { + "files": [ + + ], + "folders": { + "New Folder 1666844963": { + "files": [ + + ], + "folders": { + "New Folder 1666845169": { + "files": [ + + ], + "folders": { + "New Folder 1666845175": { + "files": [ + + ], + "folders": { + "New Folder 1666845194": { + "files": [ + + ], + "folders": { + "ddfgdfg": { + "files": [ + + ], + "folders": { + "New Folder 1667185561": { + "files": [ + + ], + "folders": { + + }, + "metadata": { + "color": null, + "folded": false + } + } + }, + "metadata": { + "color": null, + "folded": false + } + } + }, + "metadata": { + "color": null, + "folded": false + } + } + }, + "metadata": { + "color": null, + "folded": false + } + } + }, + "metadata": { + "color": null, + "folded": false + } + } + }, + "metadata": { + "color": null, + "folded": false + } + } + }, + "metadata": { + "color": null, + "folded": false + } + } + }, + "metadata": { + "color": null, + "folded": false + } + }, + "Divergence": { + "files": [ + "timeline-1639689624.json", + "timeline-1657083875.json" + ], + "folders": { + + }, + "metadata": { + "color": null, + "folded": false + } + }, + "Extras": { + "files": [ + "timeline-1641702565.json" + ], + "folders": { + + }, + "metadata": { + "color": null, + "folded": false + } + }, + "Intro": { + "files": [ + "timeline-1637959587.json" + ], + "folders": { + + }, + "metadata": { + "color": null, + "folded": false + } + }, + "Phobia": { + "files": [ + + ], + "folders": { + "New Folder 1667185581": { + "files": [ + + ], + "folders": { + + }, + "metadata": { + "color": null, + "folded": false + } + }, + "Reviews": { + "files": [ + + ], + "folders": { + "AnhedSD": { + "files": [ + "timeline-1650379703.json" + ], + "folders": { + + }, + "metadata": { + "color": null, + "folded": false + } + }, + "Anhedonia": { + "files": [ + "timeline-1648476775.json", + "timeline-1655999723.json" + ], + "folders": { + + }, + "metadata": { + "color": null, + "folded": false + } + }, + "Chaos": { + "files": [ + "timeline-1644976135.json", + "timeline-1645281133.json", + "timeline-1645904743.json", + "timeline-1650208093.json" + ], + "folders": { + + }, + "metadata": { + "color": null, + "folded": false + } + }, + "ChaosPW": { + "files": [ + "timeline-1650213352.json" + ], + "folders": { + + }, + "metadata": { + "color": null, + "folded": false + } + }, + "Divergence": { + "files": [ + "timeline-1648491092.json", + "timeline-1648503983.json" + ], + "folders": { + + }, + "metadata": { + "color": null, + "folded": false + } + }, + "Extras": { + "files": [ + "timeline-1644985622.json", + "timeline-1644986027.json", + "timeline-1645055274.json" + ], + "folders": { + + }, + "metadata": { + "color": null, + "folded": false + } + }, + "PrivateWorld": { + "files": [ + "timeline-1644983642.json" + ], + "folders": { + + }, + "metadata": { + "color": null, + "folded": false + } + }, + "SchoolDaze": { + "files": [ + "timeline-1650385585.json" + ], + "folders": { + + }, + "metadata": { + "color": null, + "folded": false + } + } + }, + "metadata": { + "color": null, + "folded": false + } + } + }, + "metadata": { + "color": null, + "folded": false + } + }, + "PrivateWorld": { + "files": [ + "timeline-1640471655.json", + "timeline-1644885560.json", + "timeline-1644935463.json" + ], + "folders": { + + }, + "metadata": { + "color": null, + "folded": false + } + }, + "SchoolDaze": { + "files": [ + "timeline-1640471668.json", + "timeline-1645278809.json" + ], + "folders": { + "dfgdgf": { + "files": [ + + ], + "folders": { + "New Folder 1666844265": { + "files": [ + + ], + "folders": { + + }, + "metadata": { + "color": null, + "folded": false + } + } + }, + "metadata": { + "color": null, + "folded": false + } + } + }, + "metadata": { + "color": null, + "folded": false + } + } + }, + "metadata": { + "color": null, + "folded": false + } +} From 5cc42fb31257b01b73853f23d59a450073bc3325 Mon Sep 17 00:00:00 2001 From: thebardsrc Date: Wed, 28 Dec 2022 14:50:14 -0700 Subject: [PATCH 08/54] completed recursive algorithm to turn the flat structure back into folder_structure.json --- addons/dialogic/Other/DialogicClass.gd | 49 +++++++++---------- addons/dialogic/Other/DialogicResources.gd | 55 ++++++++++++---------- 2 files changed, 55 insertions(+), 49 deletions(-) diff --git a/addons/dialogic/Other/DialogicClass.gd b/addons/dialogic/Other/DialogicClass.gd index 33f58545d..44ada4e54 100644 --- a/addons/dialogic/Other/DialogicClass.gd +++ b/addons/dialogic/Other/DialogicClass.gd @@ -32,47 +32,48 @@ static func prepare(): # populate the data from the resources for timeline in timeline_list: - timeline['path'] = structure['Timeline'][timeline['file']] + timeline['name'] - structure['Timeline'][timeline['file']]= timeline + timeline['path'] = structure['Timelines'][timeline['file']] + timeline['name'] + structure['Timelines'][timeline['file']]= timeline for character in character_list: - character['path'] = structure['Character'][character['file']] + character['name'] - structure['Character'][character['file']]= character + character['path'] = structure['Characters'][character['file']] + character['name'] + structure['Characters'][character['file']]= character for definition in definition_list: - definition['path'] = structure['Definition'][definition['id']] + definition['name'] - structure['Definition'][definition['id']]= definition + definition['path'] = structure['Definitions'][definition['id']] + definition['name'] + structure['Definitions'][definition['id']]= definition + definition['file'] = definition['id'] for theme in theme_list: - theme['path'] = structure['Theme'][theme['file']] + theme['name'] - structure['Theme'][theme['file']]= theme + theme['path'] = structure['Themes'][theme['file']] + theme['name'] + structure['Themes'][theme['file']]= theme # After that we put them in the order we need to make the folder paths easiest to use - for timeline in structure['Timeline'].keys(): + for timeline in structure['Timelines'].keys(): if ".json" in timeline: - timeline_folder_breakdown[structure['Timeline'][timeline]['path']] = structure['Timeline'][timeline] + timeline_folder_breakdown[structure['Timelines'][timeline]['path']] = structure['Timelines'][timeline] else: - timeline_folder_breakdown[timeline] = structure['Timeline'][timeline] + timeline_folder_breakdown[timeline] = structure['Timelines'][timeline] - for character in structure['Character'].keys(): + for character in structure['Characters'].keys(): if ".json" in character: - character_folder_breakdown[structure['Character'][character]['path']] = structure['Character'][character] + character_folder_breakdown[structure['Characters'][character]['path']] = structure['Characters'][character] else: - character_folder_breakdown[character] = structure['Character'][character] + character_folder_breakdown[character] = structure['Characters'][character] - for definition in structure['Definition'].keys(): + for definition in structure['Definitions'].keys(): if ".json" in definition: - definition_folder_breakdown[structure['Definition'][definition]['path']] = structure['Definition'][definition] + definition_folder_breakdown[structure['Definitions'][definition]['path']] = structure['Definitions'][definition] else: - definition_folder_breakdown[definition] = structure['Definition'][definition] + definition_folder_breakdown[definition] = structure['Definitions'][definition] - for theme in structure['Theme'].keys(): + for theme in structure['Themes'].keys(): if ".json" in theme: - theme_folder_breakdown[structure['Theme'][theme]['path']] = structure['Theme'][theme] + theme_folder_breakdown[structure['Themes'][theme]['path']] = structure['Themes'][theme] else: - theme_folder_breakdown[theme] = structure['Theme'][theme] + theme_folder_breakdown[theme] = structure['Themes'][theme] Engine.set_meta('dialogic_tree_loaded',true) @@ -84,10 +85,10 @@ static func prepare(): print("loaded") var flatten = {} - flatten['Timeline'] = timeline_folder_breakdown - flatten['Character'] = character_folder_breakdown - flatten['Definition'] = definition_folder_breakdown - flatten['Theme'] = theme_folder_breakdown + flatten['Timelines'] = timeline_folder_breakdown + flatten['Characters'] = character_folder_breakdown + flatten['Definitions'] = definition_folder_breakdown + flatten['Themes'] = theme_folder_breakdown DialogicResources.save_resource_folder_flat_structure(flatten) diff --git a/addons/dialogic/Other/DialogicResources.gd b/addons/dialogic/Other/DialogicResources.gd index f64302f60..83fc27fb8 100644 --- a/addons/dialogic/Other/DialogicResources.gd +++ b/addons/dialogic/Other/DialogicResources.gd @@ -511,41 +511,46 @@ static func save_resource_folder_structure(data): static func get_resource_folder_flat_structure() -> Dictionary: # Convert the folder structure from the JSON file into a simpler one that doesn't require recursive loops var flat_structure = {} - flat_structure['Timeline'] = {} - flat_structure['Character'] = {} - flat_structure['Definition'] = {} - flat_structure['Theme'] = {} + flat_structure['Timelines'] = {} + flat_structure['Characters'] = {} + flat_structure['Definitions'] = {} + flat_structure['Themes'] = {} var json_structure = get_resource_folder_structure() - flat_structure = recursive_search("Timeline", json_structure["folders"]["Timelines"], "/", flat_structure) - flat_structure = recursive_search("Character", json_structure["folders"]["Characters"], "/", flat_structure) - flat_structure = recursive_search("Definition", json_structure["folders"]["Definitions"], "/", flat_structure) - flat_structure = recursive_search("Theme", json_structure["folders"]["Themes"], "/", flat_structure) + flat_structure = recursive_search("Timelines", json_structure["folders"]["Timelines"], "/", flat_structure) + flat_structure = recursive_search("Characters", json_structure["folders"]["Characters"], "/", flat_structure) + flat_structure = recursive_search("Definitions", json_structure["folders"]["Definitions"], "/", flat_structure) + flat_structure = recursive_search("Themes", json_structure["folders"]["Themes"], "/", flat_structure) return flat_structure static func save_resource_folder_flat_structure(flat_tree) -> Dictionary: # Convert the flat folder structure back into the nested dictionary to be able to save to JSON var nested_structure = {} - nested_structure['Timeline'] = {} - nested_structure['Character'] = {} - nested_structure['Definition'] = {} - nested_structure['Theme'] = {} + nested_structure['files'] = [] + nested_structure['folders'] = {} + nested_structure['folders']['Characters'] = {} + nested_structure['folders']['Definitions'] = {} + nested_structure['folders']['Themes'] = {} + nested_structure['folders']['Timelines'] = {} + + var structure_keys = {"Characters":"Characters", "Definitions":"Definitions", "Themes":"Themes", "Timelines":"Timelines"} set_json("res://flat.json", flat_tree) - print(flat_tree['Timeline']) - var nested = {} - nested['folders'] = {} - nested['files'] = [] - for timeline in flat_tree['Timeline'].keys(): - nested = recursive_build(timeline.right(1), flat_tree['Timeline'][timeline], nested) - + for key in structure_keys: + + var nested = {} + nested['folders'] = {} + nested['files'] = [] + for flat_key in flat_tree[key].keys(): + nested = recursive_build(flat_key.right(1), flat_tree[key][flat_key], nested) + nested_structure['folders'][key] = nested - print(nested) - set_json("res://nested.json", nested) + + set_json("res://nested.json", nested_structure) @@ -556,10 +561,10 @@ static func recursive_search(currentCheck, currentDictionary, currentFolder, str for structureFile in currentDictionary["files"]: match currentCheck: - "Timeline": structure_dictionary['Timeline'][structureFile] = currentFolder - "Character": structure_dictionary['Character'][structureFile] = currentFolder - "Definition": structure_dictionary['Definition'][structureFile] = currentFolder - "Theme": structure_dictionary['Theme'][structureFile] = currentFolder + "Timelines": structure_dictionary['Timelines'][structureFile] = currentFolder + "Characters": structure_dictionary['Characters'][structureFile] = currentFolder + "Definitions": structure_dictionary['Definitions'][structureFile] = currentFolder + "Themes": structure_dictionary['Themes'][structureFile] = currentFolder for structureFolder in currentDictionary["folders"]: recursive_search(currentCheck, currentDictionary["folders"][structureFolder], currentFolder + structureFolder + "/", structure_dictionary) From ac793a26170388255f6ea8b8d06601805b807816 Mon Sep 17 00:00:00 2001 From: thebardsrc Date: Tue, 10 Jan 2023 18:06:43 -0700 Subject: [PATCH 09/54] Revert "Merge branch 'dialogic-1' into dialogic-1x-speedups" This reverts commit 0e8df0bb74ea766a211392fbda450a0dee2b0964, reversing changes made to d4ca70bb30c0c9517efe765a8d126cd99d053487. --- .../Example Assets/History/HistoryRow.gd | 3 -- addons/dialogic/Nodes/DialogNode.gd | 3 -- addons/dialogic/Nodes/DialogProxy.gd | 2 - addons/dialogic/Nodes/History.gd | 4 +- addons/dialogic/Nodes/TextBubble.gd | 7 +-- addons/dialogic/Nodes/canvas_dialog_node.gd | 7 --- addons/dialogic/Other/DialogicResources.gd | 50 +------------------ 7 files changed, 4 insertions(+), 72 deletions(-) diff --git a/addons/dialogic/Example Assets/History/HistoryRow.gd b/addons/dialogic/Example Assets/History/HistoryRow.gd index 131c67d84..543541899 100644 --- a/addons/dialogic/Example Assets/History/HistoryRow.gd +++ b/addons/dialogic/Example Assets/History/HistoryRow.gd @@ -29,9 +29,6 @@ func _ready(): func add_history(historyString, newAudio=''): - var regex = RegEx.new() - regex.compile("\\[\\s{0,}speed\\s{0,}\\=\\s{0,}\\d{0,}\\s{0,}\\]") - historyString = regex.sub(historyString, "") TextLabel.append_bbcode(historyString) audioPath = newAudio if newAudio != '': diff --git a/addons/dialogic/Nodes/DialogNode.gd b/addons/dialogic/Nodes/DialogNode.gd index ab1015091..857d7e1f8 100644 --- a/addons/dialogic/Nodes/DialogNode.gd +++ b/addons/dialogic/Nodes/DialogNode.gd @@ -83,7 +83,6 @@ signal event_end(type) signal text_complete(text_data) # Timeline end/start signal timeline_start(timeline_name) -signal timeline_changed(old_timeline_name, new_timeline_name) signal timeline_end(timeline_name) # Custom user signal signal dialogic_signal(value) @@ -1033,8 +1032,6 @@ func event_handler(event: Dictionary): func change_timeline(timeline): dialog_script = set_current_dialog(timeline) - emit_signal("timeline_changed", timeline_name, dialog_script['metadata']['name']) - timeline_name = dialog_script['metadata']['name'] _init_dialog() diff --git a/addons/dialogic/Nodes/DialogProxy.gd b/addons/dialogic/Nodes/DialogProxy.gd index 382dccf76..7d2f7afc8 100644 --- a/addons/dialogic/Nodes/DialogProxy.gd +++ b/addons/dialogic/Nodes/DialogProxy.gd @@ -33,7 +33,6 @@ var _signals_to_copy = [ 'text_complete', 'timeline_start', 'timeline_end', - 'timeline_changed', 'dialogic_signal', 'letter_displayed', 'auto_advance_toggled', @@ -50,7 +49,6 @@ signal text_complete(text_data) # Timeline end/start signal timeline_start(timeline_name) signal timeline_end(timeline_name) -signal timeline_changed(old_timeline_name, new_timeline_name) # Custom user signal signal dialogic_signal(value) signal letter_displayed(lastLetter) diff --git a/addons/dialogic/Nodes/History.gd b/addons/dialogic/Nodes/History.gd index 58ec900e2..4981a81b4 100644 --- a/addons/dialogic/Nodes/History.gd +++ b/addons/dialogic/Nodes/History.gd @@ -220,9 +220,9 @@ func add_history_row_event(eventData): # event logging handled here - # Text Events, replacing br with linebreaks + # Text Events if eventData.event_id == 'dialogic_001': - newHistoryRow.add_history(str(characterPrefix, eventData.text.replace('[br]', '\n')), audioData) + newHistoryRow.add_history(str(characterPrefix, eventData.text), audioData) # Character Arrivals elif eventData.event_id == 'dialogic_002': var logText = get_parent().settings.get_value('history', 'text_arrivals', 'has arrived') diff --git a/addons/dialogic/Nodes/TextBubble.gd b/addons/dialogic/Nodes/TextBubble.gd index 03d3f8c56..f52d85f0d 100644 --- a/addons/dialogic/Nodes/TextBubble.gd +++ b/addons/dialogic/Nodes/TextBubble.gd @@ -35,16 +35,11 @@ func update_name(name: String, color: Color = Color.white, autocolor: bool=false return if not name.empty(): - # 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 - - name_label.rect_size = name_label.get_font("font").get_string_size(name_label.text) - name_label.rect_min_size = name_label.get_font("font").get_string_size(name_label.text) # Alignment call_deferred('align_name_label') if autocolor: @@ -324,7 +319,7 @@ func align_name_label(): name_label.rect_global_position.x = rect_global_position.x + (rect_size.x / 2) - (label_size / 2) + horizontal_offset elif name_label_position == 2: # Right name_label.rect_global_position.x = rect_global_position.x + rect_size.x - label_size + horizontal_offset - + ## ***************************************************************************** ## OVERRIDES ## ***************************************************************************** diff --git a/addons/dialogic/Nodes/canvas_dialog_node.gd b/addons/dialogic/Nodes/canvas_dialog_node.gd index bf90b8874..02d2f9a2c 100644 --- a/addons/dialogic/Nodes/canvas_dialog_node.gd +++ b/addons/dialogic/Nodes/canvas_dialog_node.gd @@ -10,7 +10,6 @@ signal event_end(type) # Timeline end/start signal timeline_start(timeline_name) signal timeline_end(timeline_name) -signal timeline_changed(old_timeline_name, new_timeline_name) signal text_complete(text_event) # Custom user signal signal dialogic_signal(value) @@ -35,8 +34,6 @@ func set_dialog_node_scene(scene) -> void: assert(_err == OK) _err = dialog_node.connect("timeline_end", self, "_on_timeline_end") assert(_err == OK) - _err = dialog_node.connect("timeline_changed", self, "_on_timeline_changed") - assert(_err == OK) _err = dialog_node.connect("text_complete", self, "_on_text_complete") assert(_err == OK) _err = dialog_node.connect("dialogic_signal", self, "_on_dialogic_signal") @@ -73,10 +70,6 @@ func _on_event_end(type) -> void: emit_signal("event_end", type) -func _on_timeline_changed(old_timeline_name, new_timeline_name) -> void: - emit_signal("timeline_changed", old_timeline_name, new_timeline_name) - - func _on_timeline_start(timeline_name) -> void: emit_signal("timeline_start", timeline_name) diff --git a/addons/dialogic/Other/DialogicResources.gd b/addons/dialogic/Other/DialogicResources.gd index 83fc27fb8..d3c9ff278 100644 --- a/addons/dialogic/Other/DialogicResources.gd +++ b/addons/dialogic/Other/DialogicResources.gd @@ -327,12 +327,6 @@ static func delete_default_definition(id: String): static func get_saves_folders() -> Array: var save_folders = [] var directory := Directory.new() - if (OS.get_name() == "HTML5"): - if (OS.has_feature("JavaScript")): - directory.make_dir(WORKING_DIR) - print("get saves fold func: got working dir ", WORKING_DIR) - else: - printerr("JavaScript not enabled") if directory.open(WORKING_DIR) != OK: print("[D] Error: Failed to access working directory.") return [] @@ -422,51 +416,9 @@ static func get_saved_definitions(save_name: String = '') -> Dictionary: print("[D] Wasn't able to find save '"+save_name+"'. Loaded the default definitions.") return get_default_definitions() -# return load_json(WORKING_DIR+"/"+save_name+"/definitions.json", {}) - - var default_definitions : Dictionary = get_default_definitions() - - var saved_definitions : Dictionary = {} - - if save_name == '': - saved_definitions = load_json(get_config_files_paths()['DEFINITIONS_DEFAULT_SAVE'], default_definitions) - print("empty save slot, loaded saved definition from default save definitions") - - else: - saved_definitions = load_json(WORKING_DIR+"/"+save_name+"/definitions.json", {}) - print("saved user definitions on ''user://'' loaded") - - # Store variables in arrays from saved and default data - var base_def_var = default_definitions.variables - var saved_user_def_var = saved_definitions.variables - - #filler out depreciated variables - var distilled_saved_data: Array = [] - for sd in saved_user_def_var: - var sd_id = sd.id - var bd_id - for bd in base_def_var: - bd_id = bd.id - if sd_id == bd_id: - distilled_saved_data.append (sd) - - #adds missing new variables not in saved game - for dd in base_def_var: - var dd_id = dd.id - var sd_id - for sd in distilled_saved_data: - var sd_keys = sd.id - if dd_id == sd_keys: - sd_id = sd_keys - if dd_id == sd_id: - pass - else: - distilled_saved_data.append (dd) + return load_json(WORKING_DIR+"/"+save_name+"/definitions.json", {}) - #adds it back distilled data into main Saved Definitions - saved_definitions.variables = distilled_saved_data - return saved_definitions ## ***************************************************************************** ## FOLDER STRUCTURE From 86681c67daf8beb4242d2d3353bb4c090c6debf1 Mon Sep 17 00:00:00 2001 From: thebardsrc Date: Wed, 11 Jan 2023 13:02:14 -0700 Subject: [PATCH 10/54] move the actual conversion steps out of DialogicClass and into DialogicUtil --- addons/dialogic/Other/DialogicClass.gd | 74 +--------------------- addons/dialogic/Other/DialogicResources.gd | 3 +- addons/dialogic/Other/DialogicUtil.gd | 73 +++++++++++++++++++++ 3 files changed, 77 insertions(+), 73 deletions(-) diff --git a/addons/dialogic/Other/DialogicClass.gd b/addons/dialogic/Other/DialogicClass.gd index 44ada4e54..2b961db72 100644 --- a/addons/dialogic/Other/DialogicClass.gd +++ b/addons/dialogic/Other/DialogicClass.gd @@ -17,80 +17,12 @@ class_name Dialogic ## If for any reason during game runtime this needs to be rebuilt, Engine.get_main_loop().remove_meta('dialogic_tree_loaded') will make it run on next Dialogic.start() static func prepare(): - var timeline_folder_breakdown = {} - var character_folder_breakdown = {} - var definition_folder_breakdown = {} - var theme_folder_breakdown = {} - - # load the main folder strucutre, and then use the DialogicUtils to match their names - var structure = DialogicResources.get_resource_folder_flat_structure() - var timeline_list = DialogicUtil.get_timeline_list() - var character_list = DialogicUtil.get_character_list() - var definition_list = DialogicUtil.get_default_definitions_list() - var theme_list = DialogicUtil.get_theme_list() - - - # populate the data from the resources - for timeline in timeline_list: - timeline['path'] = structure['Timelines'][timeline['file']] + timeline['name'] - structure['Timelines'][timeline['file']]= timeline - - for character in character_list: - character['path'] = structure['Characters'][character['file']] + character['name'] - structure['Characters'][character['file']]= character - - for definition in definition_list: - definition['path'] = structure['Definitions'][definition['id']] + definition['name'] - structure['Definitions'][definition['id']]= definition - definition['file'] = definition['id'] - - for theme in theme_list: - theme['path'] = structure['Themes'][theme['file']] + theme['name'] - structure['Themes'][theme['file']]= theme - - # After that we put them in the order we need to make the folder paths easiest to use - for timeline in structure['Timelines'].keys(): - if ".json" in timeline: - timeline_folder_breakdown[structure['Timelines'][timeline]['path']] = structure['Timelines'][timeline] - else: - timeline_folder_breakdown[timeline] = structure['Timelines'][timeline] - - for character in structure['Characters'].keys(): - if ".json" in character: - character_folder_breakdown[structure['Characters'][character]['path']] = structure['Characters'][character] - else: - character_folder_breakdown[character] = structure['Characters'][character] - - - for definition in structure['Definitions'].keys(): - if ".json" in definition: - definition_folder_breakdown[structure['Definitions'][definition]['path']] = structure['Definitions'][definition] - else: - definition_folder_breakdown[definition] = structure['Definitions'][definition] - - - for theme in structure['Themes'].keys(): - if ".json" in theme: - theme_folder_breakdown[structure['Themes'][theme]['path']] = structure['Themes'][theme] - else: - theme_folder_breakdown[theme] = structure['Themes'][theme] + var flat_structure = DialogicUtil.get_flat_folders_list() Engine.set_meta('dialogic_tree_loaded',true) - Engine.set_meta('dialogic_timeline_tree', timeline_folder_breakdown) - Engine.set_meta('dialogic_character_tree', character_folder_breakdown) - Engine.set_meta('dialogic_definition_tree', definition_folder_breakdown) - Engine.set_meta('dialogic_theme_tree', theme_folder_breakdown) - - print("loaded") - - var flatten = {} - flatten['Timelines'] = timeline_folder_breakdown - flatten['Characters'] = character_folder_breakdown - flatten['Definitions'] = definition_folder_breakdown - flatten['Themes'] = theme_folder_breakdown - - DialogicResources.save_resource_folder_flat_structure(flatten) + Engine.set_meta('dialogic_tree', flat_structure) + ## Starts the dialog for the given timeline and returns a Dialog node. ## You must then add it manually to the scene to display the dialog. diff --git a/addons/dialogic/Other/DialogicResources.gd b/addons/dialogic/Other/DialogicResources.gd index d3c9ff278..e54bf7440 100644 --- a/addons/dialogic/Other/DialogicResources.gd +++ b/addons/dialogic/Other/DialogicResources.gd @@ -490,7 +490,6 @@ static func save_resource_folder_flat_structure(flat_tree) -> Dictionary: var structure_keys = {"Characters":"Characters", "Definitions":"Definitions", "Themes":"Themes", "Timelines":"Timelines"} - set_json("res://flat.json", flat_tree) for key in structure_keys: @@ -502,7 +501,7 @@ static func save_resource_folder_flat_structure(flat_tree) -> Dictionary: nested_structure['folders'][key] = nested - set_json("res://nested.json", nested_structure) + set_json(get_config_files_paths()['FOLDER_STRUCTURE_FILE'], nested_structure) diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index ee8cf1854..f2babf84e 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -597,6 +597,77 @@ static func list_dir(path: String) -> Array: files += [file] file = dir.get_next() return files + +## ***************************************************************************** +## DIALOGIC FLAT LOADER +## ***************************************************************************** + +static func get_flat_folders_list() -> Dictionary: + var timeline_folder_breakdown = {} + var character_folder_breakdown = {} + var definition_folder_breakdown = {} + var theme_folder_breakdown = {} + + # load the main folder strucutre, and then use the DialogicUtils to match their names + var structure = DialogicResources.get_resource_folder_flat_structure() + var timeline_list = get_timeline_list() + var character_list = get_character_list() + var definition_list = get_default_definitions_list() + var theme_list = get_theme_list() + + + # populate the data from the resources + for timeline in timeline_list: + timeline['path'] = structure['Timelines'][timeline['file']] + timeline['name'] + structure['Timelines'][timeline['file']]= timeline + + for character in character_list: + character['path'] = structure['Characters'][character['file']] + character['name'] + structure['Characters'][character['file']]= character + + for definition in definition_list: + definition['path'] = structure['Definitions'][definition['id']] + definition['name'] + structure['Definitions'][definition['id']]= definition + definition['file'] = definition['id'] + + for theme in theme_list: + theme['path'] = structure['Themes'][theme['file']] + theme['name'] + structure['Themes'][theme['file']]= theme + + # After that we put them in the order we need to make the folder paths easiest to use + for timeline in structure['Timelines'].keys(): + if ".json" in timeline: + timeline_folder_breakdown[structure['Timelines'][timeline]['path']] = structure['Timelines'][timeline] + else: + timeline_folder_breakdown[timeline] = structure['Timelines'][timeline] + + for character in structure['Characters'].keys(): + if ".json" in character: + character_folder_breakdown[structure['Characters'][character]['path']] = structure['Characters'][character] + else: + character_folder_breakdown[character] = structure['Characters'][character] + + + for definition in structure['Definitions'].keys(): + if ".json" in definition: + definition_folder_breakdown[structure['Definitions'][definition]['path']] = structure['Definitions'][definition] + else: + definition_folder_breakdown[definition] = structure['Definitions'][definition] + + + for theme in structure['Themes'].keys(): + if ".json" in theme: + theme_folder_breakdown[structure['Themes'][theme]['path']] = structure['Themes'][theme] + else: + theme_folder_breakdown[theme] = structure['Themes'][theme] + + var flatten = {} + flatten['Timelines'] = timeline_folder_breakdown + flatten['Characters'] = character_folder_breakdown + flatten['Definitions'] = definition_folder_breakdown + flatten['Themes'] = theme_folder_breakdown + + return flatten ## ***************************************************************************** @@ -629,3 +700,5 @@ class DialgicSorter: static func sort_resources(a: Dictionary, b: Dictionary): return get_compare_value(a).to_lower() < get_compare_value(b).to_lower() + + From 830f1cfc534802ba4ecc3a32a512e3880ba1fc70 Mon Sep 17 00:00:00 2001 From: thebardsrc Date: Wed, 11 Jan 2023 13:03:10 -0700 Subject: [PATCH 11/54] Revert "Revert "Merge branch 'dialogic-1' into dialogic-1x-speedups"" This reverts commit 588c3c8b16f9ed5334785ff104b875a5ef53a30d. --- .../Example Assets/History/HistoryRow.gd | 3 ++ addons/dialogic/Nodes/DialogNode.gd | 3 ++ addons/dialogic/Nodes/DialogProxy.gd | 2 + addons/dialogic/Nodes/History.gd | 4 +- addons/dialogic/Nodes/TextBubble.gd | 7 ++- addons/dialogic/Nodes/canvas_dialog_node.gd | 7 +++ addons/dialogic/Other/DialogicResources.gd | 50 ++++++++++++++++++- 7 files changed, 72 insertions(+), 4 deletions(-) diff --git a/addons/dialogic/Example Assets/History/HistoryRow.gd b/addons/dialogic/Example Assets/History/HistoryRow.gd index 543541899..131c67d84 100644 --- a/addons/dialogic/Example Assets/History/HistoryRow.gd +++ b/addons/dialogic/Example Assets/History/HistoryRow.gd @@ -29,6 +29,9 @@ func _ready(): func add_history(historyString, newAudio=''): + var regex = RegEx.new() + regex.compile("\\[\\s{0,}speed\\s{0,}\\=\\s{0,}\\d{0,}\\s{0,}\\]") + historyString = regex.sub(historyString, "") TextLabel.append_bbcode(historyString) audioPath = newAudio if newAudio != '': diff --git a/addons/dialogic/Nodes/DialogNode.gd b/addons/dialogic/Nodes/DialogNode.gd index 857d7e1f8..ab1015091 100644 --- a/addons/dialogic/Nodes/DialogNode.gd +++ b/addons/dialogic/Nodes/DialogNode.gd @@ -83,6 +83,7 @@ signal event_end(type) signal text_complete(text_data) # Timeline end/start signal timeline_start(timeline_name) +signal timeline_changed(old_timeline_name, new_timeline_name) signal timeline_end(timeline_name) # Custom user signal signal dialogic_signal(value) @@ -1032,6 +1033,8 @@ func event_handler(event: Dictionary): func change_timeline(timeline): dialog_script = set_current_dialog(timeline) + emit_signal("timeline_changed", timeline_name, dialog_script['metadata']['name']) + timeline_name = dialog_script['metadata']['name'] _init_dialog() diff --git a/addons/dialogic/Nodes/DialogProxy.gd b/addons/dialogic/Nodes/DialogProxy.gd index 7d2f7afc8..382dccf76 100644 --- a/addons/dialogic/Nodes/DialogProxy.gd +++ b/addons/dialogic/Nodes/DialogProxy.gd @@ -33,6 +33,7 @@ var _signals_to_copy = [ 'text_complete', 'timeline_start', 'timeline_end', + 'timeline_changed', 'dialogic_signal', 'letter_displayed', 'auto_advance_toggled', @@ -49,6 +50,7 @@ signal text_complete(text_data) # Timeline end/start signal timeline_start(timeline_name) signal timeline_end(timeline_name) +signal timeline_changed(old_timeline_name, new_timeline_name) # Custom user signal signal dialogic_signal(value) signal letter_displayed(lastLetter) diff --git a/addons/dialogic/Nodes/History.gd b/addons/dialogic/Nodes/History.gd index 4981a81b4..58ec900e2 100644 --- a/addons/dialogic/Nodes/History.gd +++ b/addons/dialogic/Nodes/History.gd @@ -220,9 +220,9 @@ func add_history_row_event(eventData): # event logging handled here - # Text Events + # Text Events, replacing br with linebreaks if eventData.event_id == 'dialogic_001': - newHistoryRow.add_history(str(characterPrefix, eventData.text), audioData) + newHistoryRow.add_history(str(characterPrefix, eventData.text.replace('[br]', '\n')), audioData) # Character Arrivals elif eventData.event_id == 'dialogic_002': var logText = get_parent().settings.get_value('history', 'text_arrivals', 'has arrived') diff --git a/addons/dialogic/Nodes/TextBubble.gd b/addons/dialogic/Nodes/TextBubble.gd index f52d85f0d..03d3f8c56 100644 --- a/addons/dialogic/Nodes/TextBubble.gd +++ b/addons/dialogic/Nodes/TextBubble.gd @@ -35,11 +35,16 @@ func update_name(name: String, color: Color = Color.white, autocolor: bool=false return if not name.empty(): + # 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 + + name_label.rect_size = name_label.get_font("font").get_string_size(name_label.text) + name_label.rect_min_size = name_label.get_font("font").get_string_size(name_label.text) # Alignment call_deferred('align_name_label') if autocolor: @@ -319,7 +324,7 @@ func align_name_label(): name_label.rect_global_position.x = rect_global_position.x + (rect_size.x / 2) - (label_size / 2) + horizontal_offset elif name_label_position == 2: # Right name_label.rect_global_position.x = rect_global_position.x + rect_size.x - label_size + horizontal_offset - + ## ***************************************************************************** ## OVERRIDES ## ***************************************************************************** diff --git a/addons/dialogic/Nodes/canvas_dialog_node.gd b/addons/dialogic/Nodes/canvas_dialog_node.gd index 02d2f9a2c..bf90b8874 100644 --- a/addons/dialogic/Nodes/canvas_dialog_node.gd +++ b/addons/dialogic/Nodes/canvas_dialog_node.gd @@ -10,6 +10,7 @@ signal event_end(type) # Timeline end/start signal timeline_start(timeline_name) signal timeline_end(timeline_name) +signal timeline_changed(old_timeline_name, new_timeline_name) signal text_complete(text_event) # Custom user signal signal dialogic_signal(value) @@ -34,6 +35,8 @@ func set_dialog_node_scene(scene) -> void: assert(_err == OK) _err = dialog_node.connect("timeline_end", self, "_on_timeline_end") assert(_err == OK) + _err = dialog_node.connect("timeline_changed", self, "_on_timeline_changed") + assert(_err == OK) _err = dialog_node.connect("text_complete", self, "_on_text_complete") assert(_err == OK) _err = dialog_node.connect("dialogic_signal", self, "_on_dialogic_signal") @@ -70,6 +73,10 @@ func _on_event_end(type) -> void: emit_signal("event_end", type) +func _on_timeline_changed(old_timeline_name, new_timeline_name) -> void: + emit_signal("timeline_changed", old_timeline_name, new_timeline_name) + + func _on_timeline_start(timeline_name) -> void: emit_signal("timeline_start", timeline_name) diff --git a/addons/dialogic/Other/DialogicResources.gd b/addons/dialogic/Other/DialogicResources.gd index e54bf7440..2d9227258 100644 --- a/addons/dialogic/Other/DialogicResources.gd +++ b/addons/dialogic/Other/DialogicResources.gd @@ -327,6 +327,12 @@ static func delete_default_definition(id: String): static func get_saves_folders() -> Array: var save_folders = [] var directory := Directory.new() + if (OS.get_name() == "HTML5"): + if (OS.has_feature("JavaScript")): + directory.make_dir(WORKING_DIR) + print("get saves fold func: got working dir ", WORKING_DIR) + else: + printerr("JavaScript not enabled") if directory.open(WORKING_DIR) != OK: print("[D] Error: Failed to access working directory.") return [] @@ -416,9 +422,51 @@ static func get_saved_definitions(save_name: String = '') -> Dictionary: print("[D] Wasn't able to find save '"+save_name+"'. Loaded the default definitions.") return get_default_definitions() - return load_json(WORKING_DIR+"/"+save_name+"/definitions.json", {}) +# return load_json(WORKING_DIR+"/"+save_name+"/definitions.json", {}) + + var default_definitions : Dictionary = get_default_definitions() + + var saved_definitions : Dictionary = {} + + if save_name == '': + saved_definitions = load_json(get_config_files_paths()['DEFINITIONS_DEFAULT_SAVE'], default_definitions) + print("empty save slot, loaded saved definition from default save definitions") + + else: + saved_definitions = load_json(WORKING_DIR+"/"+save_name+"/definitions.json", {}) + print("saved user definitions on ''user://'' loaded") + + # Store variables in arrays from saved and default data + var base_def_var = default_definitions.variables + var saved_user_def_var = saved_definitions.variables + + #filler out depreciated variables + var distilled_saved_data: Array = [] + for sd in saved_user_def_var: + var sd_id = sd.id + var bd_id + for bd in base_def_var: + bd_id = bd.id + if sd_id == bd_id: + distilled_saved_data.append (sd) + + #adds missing new variables not in saved game + for dd in base_def_var: + var dd_id = dd.id + var sd_id + for sd in distilled_saved_data: + var sd_keys = sd.id + if dd_id == sd_keys: + sd_id = sd_keys + if dd_id == sd_id: + pass + else: + distilled_saved_data.append (dd) + #adds it back distilled data into main Saved Definitions + saved_definitions.variables = distilled_saved_data + return saved_definitions ## ***************************************************************************** ## FOLDER STRUCTURE From 684cd58a285095ee228003224b1539e95a2bb765 Mon Sep 17 00:00:00 2001 From: thebardsrc Date: Wed, 11 Jan 2023 13:13:47 -0700 Subject: [PATCH 12/54] the boolean is redundant --- addons/dialogic/Other/DialogicClass.gd | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/dialogic/Other/DialogicClass.gd b/addons/dialogic/Other/DialogicClass.gd index 2b961db72..298260cce 100644 --- a/addons/dialogic/Other/DialogicClass.gd +++ b/addons/dialogic/Other/DialogicClass.gd @@ -14,14 +14,13 @@ class_name Dialogic ## Not necessary to run separately, it will be run by Dialogic.start() the first time if it's not present ## But useful to speed up loading ## This might be slower than the older way, though, so best to do with some other loading -## If for any reason during game runtime this needs to be rebuilt, Engine.get_main_loop().remove_meta('dialogic_tree_loaded') will make it run on next Dialogic.start() +## If for any reason during game runtime this needs to be rebuilt, Engine.get_main_loop().remove_meta('dialogic_tree') will make it run on next Dialogic.start() static func prepare(): var flat_structure = DialogicUtil.get_flat_folders_list() - Engine.set_meta('dialogic_tree_loaded',true) - Engine.set_meta('dialogic_tree', flat_structure) + Engine.get_main_loop().set_meta('dialogic_tree', flat_structure) ## Starts the dialog for the given timeline and returns a Dialog node. From 7434c0681917f35c6c2f40d5469dc606bc1fc6ea Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Wed, 11 Jan 2023 13:04:53 -0700 Subject: [PATCH 13/54] Delete flat.json --- flat.json | 2645 ----------------------------------------------------- 1 file changed, 2645 deletions(-) delete mode 100644 flat.json diff --git a/flat.json b/flat.json deleted file mode 100644 index eaba6112d..000000000 --- a/flat.json +++ /dev/null @@ -1,2645 +0,0 @@ -{ - "Character": { - "/.": { - "color": null, - "folded": false - }, - "/Anhedonia/.": { - "color": null, - "folded": false - }, - "/Anhedonia/Amy-B": { - "color": "0.521569,0.764706,1,1", - "data": { - "color": "#ff85c3ff", - "description": "", - "display_name": "Amy", - "display_name_bool": true, - "id": "character-1641704620.json", - "mirror_portraits": false, - "name": "Amy-B", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "normal-neutral-straight", - "path": "res://portraits/amy-b/normal-neutral-straight.png" - } - ], - "scale": 100, - "theme": "" - }, - "display_name": "Amy", - "file": "character-1641704620.json", - "name": "Amy-B", - "nickname": "", - "path": "/Anhedonia/Amy-B", - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "normal-neutral-straight", - "path": "res://portraits/amy-b/normal-neutral-straight.png" - } - ] - }, - "/Chaos/.": { - "color": null, - "folded": false - }, - "/Chaos/Amy-D": { - "color": "0.521569,0.764706,1,1", - "data": { - "color": "#ff85c3ff", - "description": "", - "display_name": "Amy", - "display_name_bool": true, - "id": "character-1638041213.json", - "mirror_portraits": false, - "name": "Amy-D", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "res://transparent.png" - }, - { - "name": "pajama-distress-side", - "path": "res://portraits/amy-d/pajama-distress-side.png" - }, - { - "name": "pajama-distress-straight", - "path": "res://portraits/amy-d/pajama-distress-straight.png" - }, - { - "name": "pajama-mad-side", - "path": "res://portraits/amy-d/pajama-mad-side.png" - }, - { - "name": "pajama-mad-straight", - "path": "res://portraits/amy-d/pajama-mad-straight.png" - }, - { - "name": "pajama-neutral-side", - "path": "res://portraits/amy-d/pajama-neutral-side.png" - }, - { - "name": "pajama-neutral-straight", - "path": "res://portraits/amy-d/pajama-neutral-straight.png" - }, - { - "name": "shirt-distressed-straight", - "path": "res://portraits/amy-d/shirt-distressed-straight.png" - }, - { - "name": "shirt-happy-straight", - "path": "res://portraits/amy-d/shirt-happy-straight.png" - }, - { - "name": "shirt-mad-straight", - "path": "res://portraits/amy-d/shirt-mad-straight.png" - }, - { - "name": "shirt-neutral-straight", - "path": "res://portraits/amy-d/shirt-neutral-straight.png" - }, - { - "name": "shirt-smile-straight", - "path": "res://portraits/amy-d/shirt-smile-straight.png" - }, - { - "name": "shirt-confused-straight", - "path": "res://portraits/amy-d/shirt-confused-straight.png" - }, - { - "name": "overshirt-mad-straight", - "path": "res://portraits/amy-d/overshirt-mad-straight.png" - }, - { - "name": "overshirt-yell-straight", - "path": "res://portraits/amy-d/overshirt-yell-straight.png" - }, - { - "name": "drunk-confused-straight", - "path": "res://portraits/amy-d/drunk-confused-straight.png" - }, - { - "name": "drunk-distress-straight", - "path": "res://portraits/amy-d/drunk-distress-straight.png" - }, - { - "name": "drunk-ehehe-straight", - "path": "res://portraits/amy-d/drunk-ehehe-straight.png" - }, - { - "name": "drunk-frown-straight", - "path": "res://portraits/amy-d/drunk-frown-straight.png" - }, - { - "name": "drunk-horny-straight", - "path": "res://portraits/amy-d/drunk-horny-straight.png" - }, - { - "name": "drunk-neutral-straight", - "path": "res://portraits/amy-d/drunk-neutral-straight.png" - }, - { - "name": "drunk-sad-side", - "path": "res://portraits/amy-d/drunk-sad-side.png" - }, - { - "name": "drunk-sad-straight", - "path": "res://portraits/amy-d/drunk-sad-straight.png" - }, - { - "name": "drunk-smile-straight", - "path": "res://portraits/amy-d/drunk-smile-straight.png" - }, - { - "name": "hangover-confused-side", - "path": "res://portraits/amy-d/hangover-confused-side.png" - }, - { - "name": "hangover-confused-straight", - "path": "res://portraits/amy-d/hangover-confused-straight.png" - }, - { - "name": "hangover-ehehe-straight", - "path": "res://portraits/amy-d/hangover-ehehe-straight.png" - }, - { - "name": "hangover-frown-straight", - "path": "res://portraits/amy-d/hangover-frown-straight.png" - }, - { - "name": "hangover-sad-straight", - "path": "res://portraits/amy-d/hangover-sad-straight.png" - }, - { - "name": "hangover-smile-side", - "path": "res://portraits/amy-d/hangover-smile-side.png" - }, - { - "name": "hangover-smile-straight", - "path": "res://portraits/amy-d/hangover-smile-straight.png" - }, - { - "name": "shirt-panic-straight", - "path": "res://portraits/amy-d/shirt-panic-straight.png" - }, - { - "name": "coat-cry-straight", - "path": "res://portraits/amy-d/coat-cry-straight.png" - }, - { - "name": "coat-excited-straight", - "path": "res://portraits/amy-d/coat-excited-straight.png" - }, - { - "name": "coat-frown-straight", - "path": "res://portraits/amy-d/coat-frown-straight.png" - }, - { - "name": "coat-smile-straight", - "path": "res://portraits/amy-d/coat-smile-straight.png" - }, - { - "name": "shirt-sad-straight", - "path": "res://portraits/amy-d/shirt-sad-straight.png" - }, - { - "name": "nogloves-frown-straight", - "path": "res://portraits/amy-d/nogloves-frown-straight.png" - }, - { - "name": "nochoker-distress-sick", - "path": "res://portraits/amy-d/nochoker-distress-sick.png" - }, - { - "name": "nochoker-ehehe-sick", - "path": "res://portraits/amy-d/nochoker-ehehe-sick.png" - }, - { - "name": "nochoker-frown-sick", - "path": "res://portraits/amy-d/nochoker-frown-sick.png" - }, - { - "name": "clean-curious-straight", - "path": "res://portraits/amy-d/clean-curious-straight.png" - }, - { - "name": "clean-distressed-straight", - "path": "res://portraits/amy-d/clean-distressed-straight.png" - }, - { - "name": "clean-sad-straight", - "path": "res://portraits/amy-d/clean-sad-straight.png" - }, - { - "name": "clean-smile-straight", - "path": "res://portraits/amy-d/clean-smile-straight.png" - }, - { - "name": "clean-surprised-straight", - "path": "res://portraits/amy-d/clean-surprised-straight.png" - } - ], - "scale": 100, - "theme": "" - }, - "display_name": "Amy", - "file": "character-1638041213.json", - "name": "Amy-D", - "nickname": "", - "path": "/Chaos/Amy-D", - "portraits": [ - { - "name": "Default", - "path": "res://transparent.png" - }, - { - "name": "pajama-distress-side", - "path": "res://portraits/amy-d/pajama-distress-side.png" - }, - { - "name": "pajama-distress-straight", - "path": "res://portraits/amy-d/pajama-distress-straight.png" - }, - { - "name": "pajama-mad-side", - "path": "res://portraits/amy-d/pajama-mad-side.png" - }, - { - "name": "pajama-mad-straight", - "path": "res://portraits/amy-d/pajama-mad-straight.png" - }, - { - "name": "pajama-neutral-side", - "path": "res://portraits/amy-d/pajama-neutral-side.png" - }, - { - "name": "pajama-neutral-straight", - "path": "res://portraits/amy-d/pajama-neutral-straight.png" - }, - { - "name": "shirt-distressed-straight", - "path": "res://portraits/amy-d/shirt-distressed-straight.png" - }, - { - "name": "shirt-happy-straight", - "path": "res://portraits/amy-d/shirt-happy-straight.png" - }, - { - "name": "shirt-mad-straight", - "path": "res://portraits/amy-d/shirt-mad-straight.png" - }, - { - "name": "shirt-neutral-straight", - "path": "res://portraits/amy-d/shirt-neutral-straight.png" - }, - { - "name": "shirt-smile-straight", - "path": "res://portraits/amy-d/shirt-smile-straight.png" - }, - { - "name": "shirt-confused-straight", - "path": "res://portraits/amy-d/shirt-confused-straight.png" - }, - { - "name": "overshirt-mad-straight", - "path": "res://portraits/amy-d/overshirt-mad-straight.png" - }, - { - "name": "overshirt-yell-straight", - "path": "res://portraits/amy-d/overshirt-yell-straight.png" - }, - { - "name": "drunk-confused-straight", - "path": "res://portraits/amy-d/drunk-confused-straight.png" - }, - { - "name": "drunk-distress-straight", - "path": "res://portraits/amy-d/drunk-distress-straight.png" - }, - { - "name": "drunk-ehehe-straight", - "path": "res://portraits/amy-d/drunk-ehehe-straight.png" - }, - { - "name": "drunk-frown-straight", - "path": "res://portraits/amy-d/drunk-frown-straight.png" - }, - { - "name": "drunk-horny-straight", - "path": "res://portraits/amy-d/drunk-horny-straight.png" - }, - { - "name": "drunk-neutral-straight", - "path": "res://portraits/amy-d/drunk-neutral-straight.png" - }, - { - "name": "drunk-sad-side", - "path": "res://portraits/amy-d/drunk-sad-side.png" - }, - { - "name": "drunk-sad-straight", - "path": "res://portraits/amy-d/drunk-sad-straight.png" - }, - { - "name": "drunk-smile-straight", - "path": "res://portraits/amy-d/drunk-smile-straight.png" - }, - { - "name": "hangover-confused-side", - "path": "res://portraits/amy-d/hangover-confused-side.png" - }, - { - "name": "hangover-confused-straight", - "path": "res://portraits/amy-d/hangover-confused-straight.png" - }, - { - "name": "hangover-ehehe-straight", - "path": "res://portraits/amy-d/hangover-ehehe-straight.png" - }, - { - "name": "hangover-frown-straight", - "path": "res://portraits/amy-d/hangover-frown-straight.png" - }, - { - "name": "hangover-sad-straight", - "path": "res://portraits/amy-d/hangover-sad-straight.png" - }, - { - "name": "hangover-smile-side", - "path": "res://portraits/amy-d/hangover-smile-side.png" - }, - { - "name": "hangover-smile-straight", - "path": "res://portraits/amy-d/hangover-smile-straight.png" - }, - { - "name": "shirt-panic-straight", - "path": "res://portraits/amy-d/shirt-panic-straight.png" - }, - { - "name": "coat-cry-straight", - "path": "res://portraits/amy-d/coat-cry-straight.png" - }, - { - "name": "coat-excited-straight", - "path": "res://portraits/amy-d/coat-excited-straight.png" - }, - { - "name": "coat-frown-straight", - "path": "res://portraits/amy-d/coat-frown-straight.png" - }, - { - "name": "coat-smile-straight", - "path": "res://portraits/amy-d/coat-smile-straight.png" - }, - { - "name": "shirt-sad-straight", - "path": "res://portraits/amy-d/shirt-sad-straight.png" - }, - { - "name": "nogloves-frown-straight", - "path": "res://portraits/amy-d/nogloves-frown-straight.png" - }, - { - "name": "nochoker-distress-sick", - "path": "res://portraits/amy-d/nochoker-distress-sick.png" - }, - { - "name": "nochoker-ehehe-sick", - "path": "res://portraits/amy-d/nochoker-ehehe-sick.png" - }, - { - "name": "nochoker-frown-sick", - "path": "res://portraits/amy-d/nochoker-frown-sick.png" - }, - { - "name": "clean-curious-straight", - "path": "res://portraits/amy-d/clean-curious-straight.png" - }, - { - "name": "clean-distressed-straight", - "path": "res://portraits/amy-d/clean-distressed-straight.png" - }, - { - "name": "clean-sad-straight", - "path": "res://portraits/amy-d/clean-sad-straight.png" - }, - { - "name": "clean-smile-straight", - "path": "res://portraits/amy-d/clean-smile-straight.png" - }, - { - "name": "clean-surprised-straight", - "path": "res://portraits/amy-d/clean-surprised-straight.png" - } - ] - }, - "/Chaos/Emily": { - "color": "0.917647,0.772549,0.678431,1", - "data": { - "color": "#ffeac5ad", - "description": "", - "display_name": "Woman", - "display_name_bool": true, - "id": "character-1641441147.json", - "mirror_portraits": false, - "name": "Emily", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "suit-distressed-straight", - "path": "res://portraits/emily/suit-distressed-straight.png" - }, - { - "name": "suit-frown-straight", - "path": "res://portraits/emily/suit-frown-straight.png" - }, - { - "name": "suit-happy-straight", - "path": "res://portraits/emily/suit-happy-straight.png" - }, - { - "name": "suit-serious-straight", - "path": "res://portraits/emily/suit-serious-straight.png" - }, - { - "name": "suit-smile-straight", - "path": "res://portraits/emily/suit-smile-straight.png" - } - ], - "scale": 100, - "theme": "" - }, - "display_name": "Woman", - "file": "character-1641441147.json", - "name": "Emily", - "nickname": "", - "path": "/Chaos/Emily", - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "suit-distressed-straight", - "path": "res://portraits/emily/suit-distressed-straight.png" - }, - { - "name": "suit-frown-straight", - "path": "res://portraits/emily/suit-frown-straight.png" - }, - { - "name": "suit-happy-straight", - "path": "res://portraits/emily/suit-happy-straight.png" - }, - { - "name": "suit-serious-straight", - "path": "res://portraits/emily/suit-serious-straight.png" - }, - { - "name": "suit-smile-straight", - "path": "res://portraits/emily/suit-smile-straight.png" - } - ] - }, - "/Chaos/Marceline": { - "color": "0.517647,0.901961,0.529412,1", - "data": { - "color": "#ff84e687", - "description": "", - "display_name": "", - "display_name_bool": false, - "id": "character-1641441574.json", - "mirror_portraits": false, - "name": "Marceline", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "dress-curious-straight", - "path": "res://portraits/marceline/dress-curious-straight.png" - }, - { - "name": "dress-distressed-straight", - "path": "res://portraits/marceline/dress-distressed-straight.png" - }, - { - "name": "dress-happy-closed", - "path": "res://portraits/marceline/dress-happy-closed.png" - }, - { - "name": "dress-happy-straight", - "path": "res://portraits/marceline/dress-happy-straight.png" - }, - { - "name": "dress-serious-straight", - "path": "res://portraits/marceline/dress-serious-straight.png" - }, - { - "name": "dress-smile-straight", - "path": "res://portraits/marceline/dress-smile-straight.png" - }, - { - "name": "dress-unhappy-straight", - "path": "res://portraits/marceline/dress-unhappy-straight.png" - } - ], - "scale": 100 - }, - "display_name": "", - "file": "character-1641441574.json", - "name": "Marceline", - "nickname": "", - "path": "/Chaos/Marceline", - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "dress-curious-straight", - "path": "res://portraits/marceline/dress-curious-straight.png" - }, - { - "name": "dress-distressed-straight", - "path": "res://portraits/marceline/dress-distressed-straight.png" - }, - { - "name": "dress-happy-closed", - "path": "res://portraits/marceline/dress-happy-closed.png" - }, - { - "name": "dress-happy-straight", - "path": "res://portraits/marceline/dress-happy-straight.png" - }, - { - "name": "dress-serious-straight", - "path": "res://portraits/marceline/dress-serious-straight.png" - }, - { - "name": "dress-smile-straight", - "path": "res://portraits/marceline/dress-smile-straight.png" - }, - { - "name": "dress-unhappy-straight", - "path": "res://portraits/marceline/dress-unhappy-straight.png" - } - ] - }, - "/Chaos/Marceline-???": { - "color": "0.517647,0.901961,0.529412,1", - "data": { - "color": "#ff84e687", - "description": "", - "display_name": "???", - "display_name_bool": true, - "id": "character-1641441541.json", - "mirror_portraits": false, - "name": "Marceline-???", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - } - ], - "scale": 100 - }, - "display_name": "???", - "file": "character-1641441541.json", - "name": "Marceline-???", - "nickname": "", - "path": "/Chaos/Marceline-???", - "portraits": [ - { - "name": "Default", - "path": "" - } - ] - }, - "/Chaos/Marcus": { - "color": "0.701961,0.588235,0.588235,1", - "data": { - "color": "#ffb39696", - "description": "", - "display_name": "", - "display_name_bool": false, - "id": "character-1639165833.json", - "mirror_portraits": false, - "name": "Marcus", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "", - "path": "" - }, - { - "name": "work-angry-straight", - "path": "res://portraits/marcus/work-angry-straight.png" - }, - { - "name": "work-frown-straight", - "path": "res://portraits/marcus/work-frown-straight.png" - }, - { - "name": "work-neutral-straight", - "path": "res://portraits/marcus/work-neutral-straight.png" - }, - { - "name": "work-smile-straight", - "path": "res://portraits/marcus/work-smile-straight.png" - } - ], - "scale": 100, - "theme": "" - }, - "display_name": "", - "file": "character-1639165833.json", - "name": "Marcus", - "nickname": "", - "path": "/Chaos/Marcus", - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "", - "path": "" - }, - { - "name": "work-angry-straight", - "path": "res://portraits/marcus/work-angry-straight.png" - }, - { - "name": "work-frown-straight", - "path": "res://portraits/marcus/work-frown-straight.png" - }, - { - "name": "work-neutral-straight", - "path": "res://portraits/marcus/work-neutral-straight.png" - }, - { - "name": "work-smile-straight", - "path": "res://portraits/marcus/work-smile-straight.png" - } - ] - }, - "/Chaos/Moran": { - "color": "0.839216,0.65098,0.878431,1", - "data": { - "color": "#ffd6a6e0", - "description": "", - "display_name": "Agent Moran", - "display_name_bool": true, - "id": "character-1641442800.json", - "mirror_portraits": false, - "name": "Moran", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - } - ], - "scale": 100 - }, - "display_name": "Agent Moran", - "file": "character-1641442800.json", - "name": "Moran", - "nickname": "", - "path": "/Chaos/Moran", - "portraits": [ - { - "name": "Default", - "path": "" - } - ] - }, - "/Chaos/Moran-Man": { - "color": "0.839216,0.65098,0.878431,1", - "data": { - "color": "#ffd6a6e0", - "description": "", - "display_name": "Man", - "display_name_bool": true, - "id": "character-1641442751.json", - "mirror_portraits": false, - "name": "Moran-Man", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - } - ], - "scale": 100, - "theme": "" - }, - "display_name": "Man", - "file": "character-1641442751.json", - "name": "Moran-Man", - "nickname": "", - "path": "/Chaos/Moran-Man", - "portraits": [ - { - "name": "Default", - "path": "" - } - ] - }, - "/Chaos/Officer": { - "color": "1,1,1,1", - "data": { - "color": "#ffffffff", - "description": "", - "display_name": "", - "display_name_bool": false, - "id": "character-1639714911.json", - "mirror_portraits": false, - "name": "Officer", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - } - ], - "scale": 100, - "theme": "" - }, - "display_name": "", - "file": "character-1639714911.json", - "name": "Officer", - "nickname": "", - "path": "/Chaos/Officer", - "portraits": [ - { - "name": "Default", - "path": "" - } - ] - }, - "/Chaos/Thug": { - "color": "1,1,1,1", - "data": { - "color": "#ffffffff", - "description": "", - "display_name": "", - "display_name_bool": false, - "id": "character-1639420125.json", - "mirror_portraits": false, - "name": "Thug", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "thug-frown", - "path": "res://portraits/thug/thug-frown.png" - }, - { - "name": "thug-gun", - "path": "res://portraits/thug/thug-gun.png" - }, - { - "name": "thug-shout", - "path": "res://portraits/thug/thug-shout.png" - } - ], - "scale": 100, - "theme": "" - }, - "display_name": "", - "file": "character-1639420125.json", - "name": "Thug", - "nickname": "", - "path": "/Chaos/Thug", - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "thug-frown", - "path": "res://portraits/thug/thug-frown.png" - }, - { - "name": "thug-gun", - "path": "res://portraits/thug/thug-gun.png" - }, - { - "name": "thug-shout", - "path": "res://portraits/thug/thug-shout.png" - } - ] - }, - "/Chaos/Thug 2": { - "color": "1,1,1,1", - "data": { - "color": "#ffffffff", - "description": "", - "display_name": "", - "display_name_bool": false, - "id": "character-1639714073.json", - "mirror_portraits": false, - "name": "Thug 2", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - } - ], - "scale": 100 - }, - "display_name": "", - "file": "character-1639714073.json", - "name": "Thug 2", - "nickname": "", - "path": "/Chaos/Thug 2", - "portraits": [ - { - "name": "Default", - "path": "" - } - ] - }, - "/Chaos/Thug 3": { - "color": "1,1,1,1", - "data": { - "color": "#ffffffff", - "description": "", - "display_name": "", - "display_name_bool": false, - "id": "character-1639714081.json", - "mirror_portraits": false, - "name": "Thug 3", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - } - ], - "scale": 100, - "theme": "" - }, - "display_name": "", - "file": "character-1639714081.json", - "name": "Thug 3", - "nickname": "", - "path": "/Chaos/Thug 3", - "portraits": [ - { - "name": "Default", - "path": "" - } - ] - }, - "/Divergence/.": { - "color": null, - "folded": false - }, - "/Divergence/Attia-???": { - "color": "0.541176,0.976471,0.760784,1", - "data": { - "color": "#ff8af9c2", - "description": "", - "display_name": "???", - "display_name_bool": true, - "id": "character-1639689789.json", - "mirror_portraits": false, - "name": "Attia-???", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "stripes-frown-straight", - "path": "res://portraits/attiacitan/stripes-frown-straight.png" - }, - { - "name": "stripes-happy-straight", - "path": "res://portraits/attiacitan/stripes-happy-straight.png" - }, - { - "name": "stripes-mad-straight", - "path": "res://portraits/attiacitan/stripes-mad-straight.png" - }, - { - "name": "stripes-neutral-straight", - "path": "res://portraits/attiacitan/stripes-neutral-straight.png" - }, - { - "name": "stripes-proud-straight", - "path": "res://portraits/attiacitan/stripes-proud-straight.png" - }, - { - "name": "stripes-smile-straight", - "path": "res://portraits/attiacitan/stripes-smile-straight.png" - }, - { - "name": "stripes-worried-straight", - "path": "res://portraits/attiacitan/stripes-worried-straight.png" - } - ], - "scale": 100, - "theme": "" - }, - "display_name": "???", - "file": "character-1639689789.json", - "name": "Attia-???", - "nickname": "", - "path": "/Divergence/Attia-???", - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "stripes-frown-straight", - "path": "res://portraits/attiacitan/stripes-frown-straight.png" - }, - { - "name": "stripes-happy-straight", - "path": "res://portraits/attiacitan/stripes-happy-straight.png" - }, - { - "name": "stripes-mad-straight", - "path": "res://portraits/attiacitan/stripes-mad-straight.png" - }, - { - "name": "stripes-neutral-straight", - "path": "res://portraits/attiacitan/stripes-neutral-straight.png" - }, - { - "name": "stripes-proud-straight", - "path": "res://portraits/attiacitan/stripes-proud-straight.png" - }, - { - "name": "stripes-smile-straight", - "path": "res://portraits/attiacitan/stripes-smile-straight.png" - }, - { - "name": "stripes-worried-straight", - "path": "res://portraits/attiacitan/stripes-worried-straight.png" - } - ] - }, - "/Divergence/AttiaCitan": { - "color": "0.541176,0.976471,0.760784,1", - "data": { - "color": "#ff8af9c2", - "description": "", - "display_name": "Jenna", - "display_name_bool": true, - "id": "character-1639689665.json", - "mirror_portraits": false, - "name": "AttiaCitan", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "", - "path": "" - }, - { - "name": "stripes-frown-straight", - "path": "res://portraits/attiacitan/stripes-frown-straight.png" - }, - { - "name": "stripes-happy-straight", - "path": "res://portraits/attiacitan/stripes-happy-straight.png" - }, - { - "name": "stripes-mad-straight", - "path": "res://portraits/attiacitan/stripes-mad-straight.png" - }, - { - "name": "stripes-neutral-straight", - "path": "res://portraits/attiacitan/stripes-neutral-straight.png" - }, - { - "name": "stripes-proud-straight", - "path": "res://portraits/attiacitan/stripes-proud-straight.png" - }, - { - "name": "stripes-smile-straight", - "path": "res://portraits/attiacitan/stripes-smile-straight.png" - }, - { - "name": "stripes-worried-straight", - "path": "res://portraits/attiacitan/stripes-worried-straight.png" - } - ], - "scale": 100, - "theme": "" - }, - "display_name": "Jenna", - "file": "character-1639689665.json", - "name": "AttiaCitan", - "nickname": "", - "path": "/Divergence/AttiaCitan", - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "", - "path": "" - }, - { - "name": "stripes-frown-straight", - "path": "res://portraits/attiacitan/stripes-frown-straight.png" - }, - { - "name": "stripes-happy-straight", - "path": "res://portraits/attiacitan/stripes-happy-straight.png" - }, - { - "name": "stripes-mad-straight", - "path": "res://portraits/attiacitan/stripes-mad-straight.png" - }, - { - "name": "stripes-neutral-straight", - "path": "res://portraits/attiacitan/stripes-neutral-straight.png" - }, - { - "name": "stripes-proud-straight", - "path": "res://portraits/attiacitan/stripes-proud-straight.png" - }, - { - "name": "stripes-smile-straight", - "path": "res://portraits/attiacitan/stripes-smile-straight.png" - }, - { - "name": "stripes-worried-straight", - "path": "res://portraits/attiacitan/stripes-worried-straight.png" - } - ] - }, - "/Extras/.": { - "color": null, - "folded": false - }, - "/Extras/Amy-T": { - "color": "0.521569,0.764706,1,1", - "data": { - "color": "#ff85c3ff", - "description": "", - "display_name": "Amy", - "display_name_bool": true, - "id": "character-1641702109.json", - "mirror_portraits": false, - "name": "Amy-T", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "confused", - "path": "res://portraits/amy-t/confused.png" - }, - { - "name": "frown", - "path": "res://portraits/amy-t/frown.png" - }, - { - "name": "glare", - "path": "res://portraits/amy-t/glare.png" - }, - { - "name": "neutral", - "path": "res://portraits/amy-t/neutral.png" - }, - { - "name": "shout", - "path": "res://portraits/amy-t/shout.png" - }, - { - "name": "exasperated", - "path": "res://portraits/amy-t/exasperated.png" - }, - { - "name": "cross", - "path": "res://portraits/amy-t/cross.png" - }, - { - "name": "armsonhips", - "path": "res://portraits/amy-t/armsonhips.png" - }, - { - "name": "thinking", - "path": "res://portraits/amy-t/thinking.png" - }, - { - "name": "amyshadertest", - "path": "res://amyshadertest.tscn" - } - ], - "scale": 100, - "theme": "" - }, - "display_name": "Amy", - "file": "character-1641702109.json", - "name": "Amy-T", - "nickname": "", - "path": "/Extras/Amy-T", - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "confused", - "path": "res://portraits/amy-t/confused.png" - }, - { - "name": "frown", - "path": "res://portraits/amy-t/frown.png" - }, - { - "name": "glare", - "path": "res://portraits/amy-t/glare.png" - }, - { - "name": "neutral", - "path": "res://portraits/amy-t/neutral.png" - }, - { - "name": "shout", - "path": "res://portraits/amy-t/shout.png" - }, - { - "name": "exasperated", - "path": "res://portraits/amy-t/exasperated.png" - }, - { - "name": "cross", - "path": "res://portraits/amy-t/cross.png" - }, - { - "name": "armsonhips", - "path": "res://portraits/amy-t/armsonhips.png" - }, - { - "name": "thinking", - "path": "res://portraits/amy-t/thinking.png" - }, - { - "name": "amyshadertest", - "path": "res://amyshadertest.tscn" - } - ] - }, - "/Extras/AttiaCitan": { - "color": "0.541176,0.976471,0.760784,1", - "data": { - "color": "#ff8af9c2", - "description": "", - "display_name": "", - "display_name_bool": false, - "id": "character-1641703870.json", - "mirror_portraits": false, - "name": "AttiaCitan", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - } - ], - "scale": 100 - }, - "display_name": "", - "file": "character-1641703870.json", - "name": "AttiaCitan", - "nickname": "", - "path": "/Extras/AttiaCitan", - "portraits": [ - { - "name": "Default", - "path": "" - } - ] - }, - "/Extras/MikolElrik": { - "color": "0.67451,0.682353,0.427451,1", - "data": { - "color": "#ffacae6d", - "description": "", - "display_name": "", - "display_name_bool": false, - "id": "character-1641703940.json", - "mirror_portraits": false, - "name": "MikolElrik", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - } - ], - "scale": 100 - }, - "display_name": "", - "file": "character-1641703940.json", - "name": "MikolElrik", - "nickname": "", - "path": "/Extras/MikolElrik", - "portraits": [ - { - "name": "Default", - "path": "" - } - ] - }, - "/Phobia/.": { - "color": null, - "folded": false - }, - "/Phobia/Aimee": { - "color": "1,0.760784,0.521569,1", - "data": { - "color": "#ffffc285", - "description": "", - "display_name": "", - "display_name_bool": false, - "id": "character-1644966307.json", - "mirror_portraits": false, - "name": "Aimee", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "res://portraits/phobia/aimee-test.png" - } - ], - "scale": 70 - }, - "display_name": "", - "file": "character-1644966307.json", - "name": "Aimee", - "nickname": "", - "path": "/Phobia/Aimee", - "portraits": [ - { - "name": "Default", - "path": "res://portraits/phobia/aimee-test.png" - } - ] - }, - "/Phobia/AttiaCitan": { - "color": "0.541176,0.976471,0.760784,1", - "data": { - "color": "#ff8af9c2", - "description": "", - "display_name": "", - "display_name_bool": false, - "id": "character-1644966329.json", - "mirror_portraits": true, - "name": "AttiaCitan", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "res://portraits/phobia/attia-test.png" - } - ], - "scale": 70 - }, - "display_name": "", - "file": "character-1644966329.json", - "name": "AttiaCitan", - "nickname": "", - "path": "/Phobia/AttiaCitan", - "portraits": [ - { - "name": "Default", - "path": "res://portraits/phobia/attia-test.png" - } - ] - }, - "/Phobia/James": { - "color": "0.988235,1,0.615686,1", - "data": { - "color": "#fffcff9d", - "description": "", - "display_name": "", - "display_name_bool": false, - "id": "character-1644966302.json", - "mirror_portraits": false, - "name": "James", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "res://portraits/phobia/james-test.png" - } - ], - "scale": 70 - }, - "display_name": "", - "file": "character-1644966302.json", - "name": "James", - "nickname": "", - "path": "/Phobia/James", - "portraits": [ - { - "name": "Default", - "path": "res://portraits/phobia/james-test.png" - } - ] - }, - "/Phobia/MikolElrik": { - "color": "0.709804,0.709804,0.545098,1", - "data": { - "color": "#ffb5b58b", - "description": "", - "display_name": "", - "display_name_bool": false, - "id": "character-1644966321.json", - "mirror_portraits": true, - "name": "MikolElrik", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "res://portraits/phobia/mikol-test.png" - } - ], - "scale": 70 - }, - "display_name": "", - "file": "character-1644966321.json", - "name": "MikolElrik", - "nickname": "", - "path": "/Phobia/MikolElrik", - "portraits": [ - { - "name": "Default", - "path": "res://portraits/phobia/mikol-test.png" - } - ] - }, - "/Phobia/Tiffany": { - "color": "0.745098,0.619608,1,1", - "data": { - "color": "#ffbe9eff", - "description": "", - "display_name": "", - "display_name_bool": false, - "id": "character-1644966315.json", - "mirror_portraits": false, - "name": "Tiffany", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "res://portraits/phobia/tiffany-test.png" - } - ], - "scale": 70 - }, - "display_name": "", - "file": "character-1644966315.json", - "name": "Tiffany", - "nickname": "", - "path": "/Phobia/Tiffany", - "portraits": [ - { - "name": "Default", - "path": "res://portraits/phobia/tiffany-test.png" - } - ] - }, - "/PrivateWorld/.": { - "color": null, - "folded": false - }, - "/PrivateWorld/Amy-A": { - "color": "0.521569,0.764706,1,1", - "data": { - "color": "#ff85c3ff", - "description": "", - "display_name": "Amy", - "display_name_bool": true, - "id": "character-1641704651.json", - "mirror_portraits": false, - "name": "Amy-A", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "normal-sad-straight", - "path": "res://portraits/amy-a/normal-sad-straight.png" - }, - { - "name": "normal-confused-straight", - "path": "res://portraits/amy-a/normal-confused-straight.png" - }, - { - "name": "normal-neutral-straight", - "path": "res://portraits/amy-a/normal-neutral-straight.png" - }, - { - "name": "normal-proud-straight", - "path": "res://portraits/amy-a/normal-proud-straight.png" - }, - { - "name": "normal-sigh-straight", - "path": "res://portraits/amy-a/normal-sigh-straight.png" - }, - { - "name": "normal-smile-straight", - "path": "res://portraits/amy-a/normal-smile-straight.png" - }, - { - "name": "normal-smirk-straight", - "path": "res://portraits/amy-a/normal-smirk-straight.png" - }, - { - "name": "normal-happy-straight", - "path": "res://portraits/amy-a/normal-happy-straight.png" - }, - { - "name": "normal-shout-straight", - "path": "res://portraits/amy-a/normal-shout-straight.png" - } - ], - "scale": 100 - }, - "display_name": "Amy", - "file": "character-1641704651.json", - "name": "Amy-A", - "nickname": "", - "path": "/PrivateWorld/Amy-A", - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "normal-sad-straight", - "path": "res://portraits/amy-a/normal-sad-straight.png" - }, - { - "name": "normal-confused-straight", - "path": "res://portraits/amy-a/normal-confused-straight.png" - }, - { - "name": "normal-neutral-straight", - "path": "res://portraits/amy-a/normal-neutral-straight.png" - }, - { - "name": "normal-proud-straight", - "path": "res://portraits/amy-a/normal-proud-straight.png" - }, - { - "name": "normal-sigh-straight", - "path": "res://portraits/amy-a/normal-sigh-straight.png" - }, - { - "name": "normal-smile-straight", - "path": "res://portraits/amy-a/normal-smile-straight.png" - }, - { - "name": "normal-smirk-straight", - "path": "res://portraits/amy-a/normal-smirk-straight.png" - }, - { - "name": "normal-happy-straight", - "path": "res://portraits/amy-a/normal-happy-straight.png" - }, - { - "name": "normal-shout-straight", - "path": "res://portraits/amy-a/normal-shout-straight.png" - } - ] - }, - "/PrivateWorld/Jessica": { - "color": "0.701961,0.588235,0.588235,1", - "data": { - "color": "#ffb39696", - "description": "", - "display_name": "", - "display_name_bool": false, - "id": "character-1644888036.json", - "mirror_portraits": false, - "name": "Jessica", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "goth-curious-normal", - "path": "res://portraits/jessica/goth-curious-normal.png" - }, - { - "name": "goth-disappointed-normal", - "path": "res://portraits/jessica/goth-disappointed-normal.png" - }, - { - "name": "goth-happy-normal", - "path": "res://portraits/jessica/goth-happy-normal.png" - }, - { - "name": "goth-mad-normal", - "path": "res://portraits/jessica/goth-mad-normal.png" - }, - { - "name": "goth-neutral-normal", - "path": "res://portraits/jessica/goth-neutral-normal.png" - }, - { - "name": "goth-sad-normal", - "path": "res://portraits/jessica/goth-sad-normal.png" - }, - { - "name": "goth-shout-normal", - "path": "res://portraits/jessica/goth-shout-normal.png" - }, - { - "name": "goth-sigh-normal", - "path": "res://portraits/jessica/goth-sigh-normal.png" - }, - { - "name": "goth-smile-normal", - "path": "res://portraits/jessica/goth-smile-normal.png" - }, - { - "name": "goth-surprised-normal", - "path": "res://portraits/jessica/goth-surprised-normal.png" - }, - { - "name": "goth-thought-normal", - "path": "res://portraits/jessica/goth-thought-normal.png" - }, - { - "name": "goth-wink-normal", - "path": "res://portraits/jessica/goth-wink-normal.png" - } - ], - "scale": 100 - }, - "display_name": "", - "file": "character-1644888036.json", - "name": "Jessica", - "nickname": "", - "path": "/PrivateWorld/Jessica", - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "goth-curious-normal", - "path": "res://portraits/jessica/goth-curious-normal.png" - }, - { - "name": "goth-disappointed-normal", - "path": "res://portraits/jessica/goth-disappointed-normal.png" - }, - { - "name": "goth-happy-normal", - "path": "res://portraits/jessica/goth-happy-normal.png" - }, - { - "name": "goth-mad-normal", - "path": "res://portraits/jessica/goth-mad-normal.png" - }, - { - "name": "goth-neutral-normal", - "path": "res://portraits/jessica/goth-neutral-normal.png" - }, - { - "name": "goth-sad-normal", - "path": "res://portraits/jessica/goth-sad-normal.png" - }, - { - "name": "goth-shout-normal", - "path": "res://portraits/jessica/goth-shout-normal.png" - }, - { - "name": "goth-sigh-normal", - "path": "res://portraits/jessica/goth-sigh-normal.png" - }, - { - "name": "goth-smile-normal", - "path": "res://portraits/jessica/goth-smile-normal.png" - }, - { - "name": "goth-surprised-normal", - "path": "res://portraits/jessica/goth-surprised-normal.png" - }, - { - "name": "goth-thought-normal", - "path": "res://portraits/jessica/goth-thought-normal.png" - }, - { - "name": "goth-wink-normal", - "path": "res://portraits/jessica/goth-wink-normal.png" - } - ] - }, - "/PrivateWorld/Jessica-???": { - "color": "0.701961,0.588235,0.588235,1", - "data": { - "color": "#ffb39696", - "description": "", - "display_name": "???", - "display_name_bool": true, - "id": "character-1644888018.json", - "mirror_portraits": false, - "name": "Jessica-???", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "goth-curious-normal", - "path": "res://portraits/jessica/goth-curious-normal.png" - }, - { - "name": "goth-surprised-normal", - "path": "res://portraits/jessica/goth-surprised-normal.png" - }, - { - "name": "goth-smile-normal", - "path": "res://portraits/jessica/goth-smile-normal.png" - }, - { - "name": "goth-sigh-normal", - "path": "res://portraits/jessica/goth-sigh-normal.png" - } - ], - "scale": 100 - }, - "display_name": "???", - "file": "character-1644888018.json", - "name": "Jessica-???", - "nickname": "", - "path": "/PrivateWorld/Jessica-???", - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "goth-curious-normal", - "path": "res://portraits/jessica/goth-curious-normal.png" - }, - { - "name": "goth-surprised-normal", - "path": "res://portraits/jessica/goth-surprised-normal.png" - }, - { - "name": "goth-smile-normal", - "path": "res://portraits/jessica/goth-smile-normal.png" - }, - { - "name": "goth-sigh-normal", - "path": "res://portraits/jessica/goth-sigh-normal.png" - } - ] - }, - "/SchoolDaze/.": { - "color": null, - "folded": false - }, - "/SchoolDaze/Amy-C": { - "color": "0.521569,0.764706,1,1", - "data": { - "color": "#ff85c3ff", - "description": "", - "display_name": "Amy", - "display_name_bool": true, - "id": "character-1641704666.json", - "mirror_portraits": false, - "name": "Amy-C", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "normal-smile-straight", - "path": "res://portraits/amy-c/normal-smile-straight.png" - } - ], - "scale": 100 - }, - "display_name": "Amy", - "file": "character-1641704666.json", - "name": "Amy-C", - "nickname": "", - "path": "/SchoolDaze/Amy-C", - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "normal-smile-straight", - "path": "res://portraits/amy-c/normal-smile-straight.png" - } - ] - }, - "/Shared/.": { - "color": null, - "folded": false - }, - "/Shared/All": { - "color": "1,1,1,1", - "data": { - "color": "#ffffffff", - "description": "", - "display_name": "", - "display_name_bool": false, - "id": "character-1641494010.json", - "mirror_portraits": false, - "name": "All", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - } - ], - "scale": 100 - }, - "display_name": "", - "file": "character-1641494010.json", - "name": "All", - "nickname": "", - "path": "/Shared/All", - "portraits": [ - { - "name": "Default", - "path": "" - } - ] - }, - "/Shared/Amy-???": { - "color": "0.521569,0.764706,1,1", - "data": { - "color": "#ff85c3ff", - "description": "", - "display_name": "???", - "display_name_bool": true, - "id": "character-1638076571.json", - "mirror_portraits": false, - "name": "Amy-???", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - } - ], - "scale": 100, - "theme": "" - }, - "display_name": "???", - "file": "character-1638076571.json", - "name": "Amy-???", - "nickname": "", - "path": "/Shared/Amy-???", - "portraits": [ - { - "name": "Default", - "path": "" - } - ] - }, - "/Shared/Doctor": { - "color": "1,1,1,1", - "data": { - "color": "#ffffffff", - "description": "", - "display_name": "", - "display_name_bool": false, - "id": "character-1637984819.json", - "mirror_portraits": false, - "name": "Doctor", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - } - ], - "scale": 100 - }, - "display_name": "", - "file": "character-1637984819.json", - "name": "Doctor", - "nickname": "", - "path": "/Shared/Doctor", - "portraits": [ - { - "name": "Default", - "path": "" - } - ] - }, - "/Shared/James": { - "color": "0.988235,1,0.615686,1", - "data": { - "color": "#fffcff9d", - "description": "", - "display_name": "", - "display_name_bool": false, - "id": "character-1637960611.json", - "mirror_portraits": false, - "name": "James", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - } - ], - "scale": 100 - }, - "display_name": "", - "file": "character-1637960611.json", - "name": "James", - "nickname": "", - "path": "/Shared/James", - "portraits": [ - { - "name": "Default", - "path": "" - } - ] - }, - "/Shared/KingOfHearts": { - "color": "1,1,1,1", - "data": { - "color": "#ffffffff", - "description": "", - "display_name": "Dr. Hart", - "display_name_bool": true, - "id": "character-1639165152.json", - "mirror_portraits": false, - "name": "KingOfHearts", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "psych-neutral-straight", - "path": "res://portraits/kingofhearts/psych-neutral-straight.png" - } - ], - "scale": 100, - "theme": "" - }, - "display_name": "Dr. Hart", - "file": "character-1639165152.json", - "name": "KingOfHearts", - "nickname": "", - "path": "/Shared/KingOfHearts", - "portraits": [ - { - "name": "Default", - "path": "" - }, - { - "name": "psych-neutral-straight", - "path": "res://portraits/kingofhearts/psych-neutral-straight.png" - } - ] - }, - "/Shared/Misc-???": { - "color": "1,1,1,1", - "data": { - "color": "#ffffffff", - "description": "", - "display_name": "???", - "display_name_bool": true, - "id": "character-1639714895.json", - "mirror_portraits": false, - "name": "Misc-???", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - } - ], - "scale": 100, - "theme": "" - }, - "display_name": "???", - "file": "character-1639714895.json", - "name": "Misc-???", - "nickname": "", - "path": "/Shared/Misc-???", - "portraits": [ - { - "name": "Default", - "path": "" - } - ] - }, - "/Shared/Nurse": { - "color": "1,1,1,1", - "data": { - "color": "#ffffffff", - "description": "", - "display_name": "", - "display_name_bool": false, - "id": "character-1637984811.json", - "mirror_portraits": false, - "name": "Nurse", - "nickname": "", - "nickname_bool": false, - "offset_x": 0, - "offset_y": 0, - "portraits": [ - { - "name": "Default", - "path": "" - } - ], - "scale": 100 - }, - "display_name": "", - "file": "character-1637984811.json", - "name": "Nurse", - "nickname": "", - "path": "/Shared/Nurse", - "portraits": [ - { - "name": "Default", - "path": "" - } - ] - } - }, - "Definition": { - "/.": { - "color": null, - "folded": false - }, - "/New Folder 1667185667/.": { - "color": null, - "folded": false - }, - "1637962614-364": { - "id": "1637962614-364", - "name": "Iteration", - "path": "/Iteration", - "type": 0, - "value": "0" - }, - "1637980455-648": { - "id": "1637980455-648", - "name": "LastAmy", - "path": "/LastAmy", - "type": 0, - "value": "0" - }, - "1640299195-648": { - "id": "1640299195-648", - "name": "BranchA", - "path": "/BranchA", - "type": 0, - "value": "0" - }, - "1640299228-787": { - "id": "1640299228-787", - "name": "BranchB", - "path": "/BranchB", - "type": 0, - "value": "0" - }, - "1640299237-366": { - "id": "1640299237-366", - "name": "BranchC", - "path": "/BranchC", - "type": 0, - "value": "0" - }, - "1640299253-146": { - "id": "1640299253-146", - "name": "BranchD", - "path": "/BranchD", - "type": 0, - "value": "0" - }, - "1657506003-648": { - "id": "1657506003-648", - "name": "ReviewMode", - "path": "/ReviewMode", - "type": 0, - "value": "0" - } - }, - "Theme": { - "/.": { - "color": null, - "folded": false - }, - "/New Folder 1667185671/.": { - "color": null, - "folded": false - }, - "default-theme.cfg": { - "config": "[ConfigFile:1525]", - "file": "default-theme.cfg", - "name": "Default Theme", - "path": "/Default Theme" - }, - "theme-1637887617.cfg": { - "config": "[ConfigFile:1527]", - "file": "theme-1637887617.cfg", - "name": "TypeB", - "path": "/TypeB" - }, - "theme-1647033784.cfg": { - "config": "[ConfigFile:1528]", - "file": "theme-1647033784.cfg", - "name": "theme-1647033784.cfg", - "path": "/theme-1647033784.cfg" - }, - "theme-1650214108.cfg": { - "config": "[ConfigFile:1526]", - "file": "theme-1650214108.cfg", - "name": "TypeB-nodim", - "path": "/TypeB-nodim" - }, - "theme-1657083809.cfg": { - "config": "[ConfigFile:1529]", - "file": "theme-1657083809.cfg", - "name": "Distorted", - "path": "/Distorted" - }, - "theme-1657502129.cfg": { - "config": "[ConfigFile:1530]", - "file": "theme-1657502129.cfg", - "name": "CreditsWait", - "path": "/CreditsWait" - } - }, - "Timeline": { - "/.": { - "color": null, - "folded": false - }, - "/Anhedonia/.": { - "color": null, - "folded": false - }, - "/Anhedonia/step-1": { - "color": "1,1,1,1", - "file": "timeline-1640471640.json", - "name": "step-1", - "path": "/Anhedonia/step-1" - }, - "/Anhedonia/step-last": { - "color": "1,1,1,1", - "file": "timeline-1644935376.json", - "name": "step-last", - "path": "/Anhedonia/step-last" - }, - "/Anhedonia/step-mid": { - "color": "1,1,1,1", - "file": "timeline-1655846991.json", - "name": "step-mid", - "path": "/Anhedonia/step-mid" - }, - "/Chaos/.": { - "color": null, - "folded": false - }, - "/Chaos/New Folder 1666844659/.": { - "color": null, - "folded": false - }, - "/Chaos/New Folder 1666844659/New Folder 1666844963/.": { - "color": null, - "folded": false - }, - "/Chaos/New Folder 1666844659/New Folder 1666844963/New Folder 1666845169/.": { - "color": null, - "folded": false - }, - "/Chaos/New Folder 1666844659/New Folder 1666844963/New Folder 1666845169/New Folder 1666845175/.": { - "color": null, - "folded": false - }, - "/Chaos/New Folder 1666844659/New Folder 1666844963/New Folder 1666845169/New Folder 1666845175/New Folder 1666845194/.": { - "color": null, - "folded": false - }, - "/Chaos/New Folder 1666844659/New Folder 1666844963/New Folder 1666845169/New Folder 1666845175/New Folder 1666845194/ddfgdfg/.": { - "color": null, - "folded": false - }, - "/Chaos/New Folder 1666844659/New Folder 1666844963/New Folder 1666845169/New Folder 1666845175/New Folder 1666845194/ddfgdfg/New Folder 1667185561/.": { - "color": null, - "folded": false - }, - "/Chaos/step-1": { - "color": "1,1,1,1", - "file": "timeline-1638076419.json", - "name": "step-1", - "path": "/Chaos/step-1" - }, - "/Chaos/step-10": { - "color": "1,1,1,1", - "file": "timeline-1639788969.json", - "name": "step-10", - "path": "/Chaos/step-10" - }, - "/Chaos/step-11": { - "color": "1,1,1,1", - "file": "timeline-1639788975.json", - "name": "step-11", - "path": "/Chaos/step-11" - }, - "/Chaos/step-12": { - "color": "1,1,1,1", - "file": "timeline-1641351628.json", - "name": "step-12", - "path": "/Chaos/step-12" - }, - "/Chaos/step-13": { - "color": "1,1,1,1", - "file": "timeline-1644372410.json", - "name": "step-13", - "path": "/Chaos/step-13" - }, - "/Chaos/step-14": { - "color": "1,1,1,1", - "file": "timeline-1644373602.json", - "name": "step-14", - "path": "/Chaos/step-14" - }, - "/Chaos/step-15": { - "color": "1,1,1,1", - "file": "timeline-1644373684.json", - "name": "step-15", - "path": "/Chaos/step-15" - }, - "/Chaos/step-16": { - "color": "1,1,1,1", - "file": "timeline-1644629041.json", - "name": "step-16", - "path": "/Chaos/step-16" - }, - "/Chaos/step-17": { - "color": "1,1,1,1", - "file": "timeline-1644629050.json", - "name": "step-17", - "path": "/Chaos/step-17" - }, - "/Chaos/step-18": { - "color": "1,1,1,1", - "file": "timeline-1646621254.json", - "name": "step-18", - "path": "/Chaos/step-18" - }, - "/Chaos/step-2": { - "color": "1,1,1,1", - "file": "timeline-1638159119.json", - "name": "step-2", - "path": "/Chaos/step-2" - }, - "/Chaos/step-3": { - "color": "1,1,1,1", - "file": "timeline-1638245534.json", - "name": "step-3", - "path": "/Chaos/step-3" - }, - "/Chaos/step-4": { - "color": "1,1,1,1", - "file": "timeline-1638491011.json", - "name": "step-4", - "path": "/Chaos/step-4" - }, - "/Chaos/step-5": { - "color": "1,1,1,1", - "file": "timeline-1639165202.json", - "name": "step-5", - "path": "/Chaos/step-5" - }, - "/Chaos/step-6": { - "color": "1,1,1,1", - "file": "timeline-1639165263.json", - "name": "step-6", - "path": "/Chaos/step-6" - }, - "/Chaos/step-7": { - "color": "1,1,1,1", - "file": "timeline-1639167221.json", - "name": "step-7", - "path": "/Chaos/step-7" - }, - "/Chaos/step-8": { - "color": "1,1,1,1", - "file": "timeline-1639511076.json", - "name": "step-8", - "path": "/Chaos/step-8" - }, - "/Chaos/step-9": { - "color": "1,1,1,1", - "file": "timeline-1639711484.json", - "name": "step-9", - "path": "/Chaos/step-9" - }, - "/DefaultTimeline": { - "color": "1,1,1,1", - "file": "timeline-1640294642.json", - "name": "DefaultTimeline", - "path": "/DefaultTimeline" - }, - "/Divergence/.": { - "color": null, - "folded": false - }, - "/Divergence/step-1": { - "color": "1,1,1,1", - "file": "timeline-1639689624.json", - "name": "step-1", - "path": "/Divergence/step-1" - }, - "/Divergence/step-last": { - "color": "1,1,1,1", - "file": "timeline-1657083875.json", - "name": "step-last", - "path": "/Divergence/step-last" - }, - "/Extras/.": { - "color": null, - "folded": false - }, - "/Extras/amy-contact": { - "color": "1,1,1,1", - "file": "timeline-1641702565.json", - "name": "amy-contact", - "path": "/Extras/amy-contact" - }, - "/Intro/.": { - "color": null, - "folded": false - }, - "/Intro/intro": { - "color": "1,1,1,1", - "file": "timeline-1637959587.json", - "name": "intro", - "path": "/Intro/intro" - }, - "/Phobia/.": { - "color": null, - "folded": false - }, - "/Phobia/New Folder 1667185581/.": { - "color": null, - "folded": false - }, - "/Phobia/Reviews/.": { - "color": null, - "folded": false - }, - "/Phobia/Reviews/AnhedSD/.": { - "color": null, - "folded": false - }, - "/Phobia/Reviews/AnhedSD/step-1": { - "color": "1,1,1,1", - "file": "timeline-1650379703.json", - "name": "step-1", - "path": "/Phobia/Reviews/AnhedSD/step-1" - }, - "/Phobia/Reviews/Anhedonia/.": { - "color": null, - "folded": false - }, - "/Phobia/Reviews/Anhedonia/step-idk": { - "color": "1,1,1,1", - "file": "timeline-1655999723.json", - "name": "step-idk", - "path": "/Phobia/Reviews/Anhedonia/step-idk" - }, - "/Phobia/Reviews/Anhedonia/step-last": { - "color": "1,1,1,1", - "file": "timeline-1648476775.json", - "name": "step-last", - "path": "/Phobia/Reviews/Anhedonia/step-last" - }, - "/Phobia/Reviews/Chaos/.": { - "color": null, - "folded": false - }, - "/Phobia/Reviews/Chaos/step-1": { - "color": "1,1,1,1", - "file": "timeline-1650208093.json", - "name": "step-1", - "path": "/Phobia/Reviews/Chaos/step-1" - }, - "/Phobia/Reviews/Chaos/step-12": { - "color": "1,1,1,1", - "file": "timeline-1645281133.json", - "name": "step-12", - "path": "/Phobia/Reviews/Chaos/step-12" - }, - "/Phobia/Reviews/Chaos/step-3": { - "color": "1,1,1,1", - "file": "timeline-1645904743.json", - "name": "step-3", - "path": "/Phobia/Reviews/Chaos/step-3" - }, - "/Phobia/Reviews/Chaos/step-8": { - "color": "1,1,1,1", - "file": "timeline-1644976135.json", - "name": "step-8", - "path": "/Phobia/Reviews/Chaos/step-8" - }, - "/Phobia/Reviews/ChaosPW/.": { - "color": null, - "folded": false - }, - "/Phobia/Reviews/ChaosPW/step-1": { - "color": "1,1,1,1", - "file": "timeline-1650213352.json", - "name": "step-1", - "path": "/Phobia/Reviews/ChaosPW/step-1" - }, - "/Phobia/Reviews/Divergence/.": { - "color": null, - "folded": false - }, - "/Phobia/Reviews/Divergence/step-1": { - "color": "1,1,1,1", - "file": "timeline-1648491092.json", - "name": "step-1", - "path": "/Phobia/Reviews/Divergence/step-1" - }, - "/Phobia/Reviews/Divergence/step-3": { - "color": "1,1,1,1", - "file": "timeline-1648503983.json", - "name": "step-3", - "path": "/Phobia/Reviews/Divergence/step-3" - }, - "/Phobia/Reviews/Extras/.": { - "color": null, - "folded": false - }, - "/Phobia/Reviews/Extras/amy-contact": { - "color": "1,1,1,1", - "file": "timeline-1644985622.json", - "name": "amy-contact", - "path": "/Phobia/Reviews/Extras/amy-contact" - }, - "/Phobia/Reviews/Extras/marcus-druglord": { - "color": "1,1,1,1", - "file": "timeline-1645055274.json", - "name": "marcus-druglord", - "path": "/Phobia/Reviews/Extras/marcus-druglord" - }, - "/Phobia/Reviews/Extras/marcus-observation": { - "color": "1,1,1,1", - "file": "timeline-1644986027.json", - "name": "marcus-observation", - "path": "/Phobia/Reviews/Extras/marcus-observation" - }, - "/Phobia/Reviews/PrivateWorld/.": { - "color": null, - "folded": false - }, - "/Phobia/Reviews/PrivateWorld/step-idk": { - "color": "1,1,1,1", - "file": "timeline-1644983642.json", - "name": "step-idk", - "path": "/Phobia/Reviews/PrivateWorld/step-idk" - }, - "/Phobia/Reviews/SchoolDaze/.": { - "color": null, - "folded": false - }, - "/Phobia/Reviews/SchoolDaze/step-idk": { - "color": "1,1,1,1", - "file": "timeline-1650385585.json", - "name": "step-idk", - "path": "/Phobia/Reviews/SchoolDaze/step-idk" - }, - "/PrivateWorld/.": { - "color": null, - "folded": false - }, - "/PrivateWorld/step-1": { - "color": "1,1,1,1", - "file": "timeline-1640471655.json", - "name": "step-1", - "path": "/PrivateWorld/step-1" - }, - "/PrivateWorld/step-idk": { - "color": "1,1,1,1", - "file": "timeline-1644885560.json", - "name": "step-idk", - "path": "/PrivateWorld/step-idk" - }, - "/PrivateWorld/step-last": { - "color": "1,1,1,1", - "file": "timeline-1644935463.json", - "name": "step-last", - "path": "/PrivateWorld/step-last" - }, - "/SchoolDaze/.": { - "color": null, - "folded": false - }, - "/SchoolDaze/dfgdgf/.": { - "color": null, - "folded": false - }, - "/SchoolDaze/dfgdgf/New Folder 1666844265/.": { - "color": null, - "folded": false - }, - "/SchoolDaze/step-1": { - "color": "1,1,1,1", - "file": "timeline-1640471668.json", - "name": "step-1", - "path": "/SchoolDaze/step-1" - }, - "/SchoolDaze/step-last": { - "color": "1,1,1,1", - "file": "timeline-1645278809.json", - "name": "step-last", - "path": "/SchoolDaze/step-last" - }, - "/credits": { - "color": "1,1,1,1", - "file": "timeline-1644631930.json", - "name": "credits", - "path": "/credits" - }, - "/debugintro": { - "color": "1,1,1,1", - "file": "timeline-1637980436.json", - "name": "debugintro", - "path": "/debugintro" - }, - "/pic-test": { - "color": "1,1,1,1", - "file": "timeline-1638041067.json", - "name": "pic-test", - "path": "/pic-test" - }, - "/portraittest": { - "color": "1,1,1,1", - "file": "timeline-1641705554.json", - "name": "portraittest", - "path": "/portraittest" - }, - "/xbxbc": { - "color": "1,1,1,1", - "file": "timeline-1670110627.json", - "name": "xbxbc", - "path": "/xbxbc" - } - } -} From 2c9a91bbb5ef40704056da7d6082101ba6302931 Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Wed, 11 Jan 2023 13:05:04 -0700 Subject: [PATCH 14/54] Delete nested.json --- nested.json | 359 ---------------------------------------------------- 1 file changed, 359 deletions(-) delete mode 100644 nested.json diff --git a/nested.json b/nested.json deleted file mode 100644 index 2d46cdfba..000000000 --- a/nested.json +++ /dev/null @@ -1,359 +0,0 @@ -{ - "files": [ - "timeline-1637980436.json", - "timeline-1638041067.json", - "timeline-1640294642.json", - "timeline-1641705554.json", - "timeline-1644631930.json", - "timeline-1670110627.json" - ], - "folders": { - "Anhedonia": { - "files": [ - "timeline-1640471640.json", - "timeline-1644935376.json", - "timeline-1655846991.json" - ], - "folders": { - - }, - "metadata": { - "color": null, - "folded": false - } - }, - "Chaos": { - "files": [ - "timeline-1638076419.json", - "timeline-1638159119.json", - "timeline-1638245534.json", - "timeline-1638491011.json", - "timeline-1639165202.json", - "timeline-1639165263.json", - "timeline-1639167221.json", - "timeline-1639511076.json", - "timeline-1639711484.json", - "timeline-1639788969.json", - "timeline-1639788975.json", - "timeline-1641351628.json", - "timeline-1644372410.json", - "timeline-1644373602.json", - "timeline-1644373684.json", - "timeline-1644629041.json", - "timeline-1644629050.json", - "timeline-1646621254.json" - ], - "folders": { - "New Folder 1666844659": { - "files": [ - - ], - "folders": { - "New Folder 1666844963": { - "files": [ - - ], - "folders": { - "New Folder 1666845169": { - "files": [ - - ], - "folders": { - "New Folder 1666845175": { - "files": [ - - ], - "folders": { - "New Folder 1666845194": { - "files": [ - - ], - "folders": { - "ddfgdfg": { - "files": [ - - ], - "folders": { - "New Folder 1667185561": { - "files": [ - - ], - "folders": { - - }, - "metadata": { - "color": null, - "folded": false - } - } - }, - "metadata": { - "color": null, - "folded": false - } - } - }, - "metadata": { - "color": null, - "folded": false - } - } - }, - "metadata": { - "color": null, - "folded": false - } - } - }, - "metadata": { - "color": null, - "folded": false - } - } - }, - "metadata": { - "color": null, - "folded": false - } - } - }, - "metadata": { - "color": null, - "folded": false - } - } - }, - "metadata": { - "color": null, - "folded": false - } - }, - "Divergence": { - "files": [ - "timeline-1639689624.json", - "timeline-1657083875.json" - ], - "folders": { - - }, - "metadata": { - "color": null, - "folded": false - } - }, - "Extras": { - "files": [ - "timeline-1641702565.json" - ], - "folders": { - - }, - "metadata": { - "color": null, - "folded": false - } - }, - "Intro": { - "files": [ - "timeline-1637959587.json" - ], - "folders": { - - }, - "metadata": { - "color": null, - "folded": false - } - }, - "Phobia": { - "files": [ - - ], - "folders": { - "New Folder 1667185581": { - "files": [ - - ], - "folders": { - - }, - "metadata": { - "color": null, - "folded": false - } - }, - "Reviews": { - "files": [ - - ], - "folders": { - "AnhedSD": { - "files": [ - "timeline-1650379703.json" - ], - "folders": { - - }, - "metadata": { - "color": null, - "folded": false - } - }, - "Anhedonia": { - "files": [ - "timeline-1648476775.json", - "timeline-1655999723.json" - ], - "folders": { - - }, - "metadata": { - "color": null, - "folded": false - } - }, - "Chaos": { - "files": [ - "timeline-1644976135.json", - "timeline-1645281133.json", - "timeline-1645904743.json", - "timeline-1650208093.json" - ], - "folders": { - - }, - "metadata": { - "color": null, - "folded": false - } - }, - "ChaosPW": { - "files": [ - "timeline-1650213352.json" - ], - "folders": { - - }, - "metadata": { - "color": null, - "folded": false - } - }, - "Divergence": { - "files": [ - "timeline-1648491092.json", - "timeline-1648503983.json" - ], - "folders": { - - }, - "metadata": { - "color": null, - "folded": false - } - }, - "Extras": { - "files": [ - "timeline-1644985622.json", - "timeline-1644986027.json", - "timeline-1645055274.json" - ], - "folders": { - - }, - "metadata": { - "color": null, - "folded": false - } - }, - "PrivateWorld": { - "files": [ - "timeline-1644983642.json" - ], - "folders": { - - }, - "metadata": { - "color": null, - "folded": false - } - }, - "SchoolDaze": { - "files": [ - "timeline-1650385585.json" - ], - "folders": { - - }, - "metadata": { - "color": null, - "folded": false - } - } - }, - "metadata": { - "color": null, - "folded": false - } - } - }, - "metadata": { - "color": null, - "folded": false - } - }, - "PrivateWorld": { - "files": [ - "timeline-1640471655.json", - "timeline-1644885560.json", - "timeline-1644935463.json" - ], - "folders": { - - }, - "metadata": { - "color": null, - "folded": false - } - }, - "SchoolDaze": { - "files": [ - "timeline-1640471668.json", - "timeline-1645278809.json" - ], - "folders": { - "dfgdgf": { - "files": [ - - ], - "folders": { - "New Folder 1666844265": { - "files": [ - - ], - "folders": { - - }, - "metadata": { - "color": null, - "folded": false - } - } - }, - "metadata": { - "color": null, - "folded": false - } - } - }, - "metadata": { - "color": null, - "folded": false - } - } - }, - "metadata": { - "color": null, - "folded": false - } -} From 29d3f729ba362e50049f4cd43562b34cc1345916 Mon Sep 17 00:00:00 2001 From: thebardsrc Date: Wed, 11 Jan 2023 13:40:09 -0700 Subject: [PATCH 15/54] replace _get_timeline_file_from_name() and _get_variable_file_from_name() --- addons/dialogic/Other/DialogicClass.gd | 110 ++++++------------------- 1 file changed, 27 insertions(+), 83 deletions(-) diff --git a/addons/dialogic/Other/DialogicClass.gd b/addons/dialogic/Other/DialogicClass.gd index 298260cce..547774527 100644 --- a/addons/dialogic/Other/DialogicClass.gd +++ b/addons/dialogic/Other/DialogicClass.gd @@ -465,97 +465,41 @@ static func set_variable_from_id(id: String, value: String, operation: String) - # tries to find the path of a given timeline static func _get_timeline_file_from_name(timeline_name_path: String) -> String: - var timelines = DialogicUtil.get_full_resource_folder_structure()['folders']['Timelines'] - - # Checks for slash in the name, and uses the folder search if there is - if '/' in timeline_name_path: - #Add leading slash if its a path and it is missing, for paths that have subfolders but no leading slash - if(timeline_name_path.left(1) != '/'): - timeline_name_path = "/" + timeline_name_path - var parts = timeline_name_path.split('/', false) + #First add the leading slash if it is missing so algorithm works properly + if(timeline_name_path.left(1) != '/'): + timeline_name_path = "/" + timeline_name_path + + if !Engine.get_main_loop().has_meta('dialogic_tree'): + prepare() + + + var timelines = Engine.get_main_loop().get_meta('dialogic_tree')['Timelines'] - # First check if it's a timeline in the root folder - if parts.size() == 1: - for t in DialogicUtil.get_timeline_list(): - for f in timelines['files']: - if t['file'] == f && t['name'] == parts[0]: - return t['file'] - if parts.size() > 1: - var current_data - var current_depth = 0 - for p in parts: - if current_depth == 0: - # Starting the crawl - if (timelines['folders'].has(p) ): - current_data = timelines['folders'][p] - else: - return '' - elif current_depth == parts.size() - 1: - # The final destination - for t in DialogicUtil.get_timeline_list(): - for f in current_data['files']: - if t['file'] == f && t['name'] == p: - return t['file'] - - else: - # Still going deeper - if (current_data['folders'].size() > 0): - if p in current_data['folders']: - current_data = current_data['folders'][p] - else: - return '' - else: - return '' - current_depth += 1 - return '' + if timeline_name_path in timelines: + return timelines[timeline_name_path]['file'] else: - # Searching for any timeline that could match that name - for t in DialogicUtil.get_timeline_list(): - if t['name'] == timeline_name_path: - return t['file'] + #step through each one in turn to find the first matching string + for path in timelines.keys(): + if timeline_name_path in path: + return timelines[path]['file'] return '' static func _get_variable_from_file_name(variable_name_path: String) -> String: #First add the leading slash if it is missing so algorithm works properly if(variable_name_path.left(1) != '/'): variable_name_path = "/" + variable_name_path + + if !Engine.get_main_loop().has_meta('dialogic_tree'): + prepare() - var definitions = DialogicUtil.get_full_resource_folder_structure()['folders']['Definitions'] - var parts = variable_name_path.split('/', false) + + var definitions = Engine.get_main_loop().get_meta('dialogic_tree')['Definitions'] - # Check the root if it's a variable in the root folder - if parts.size() == 1: - for t in _get_definitions()['variables']: - for f in definitions['files']: - if t['id'] == f && t['name'] == parts[0]: - return t['id'] - if parts.size() > 1: - var current_data - var current_depth = 0 - - for p in parts: - if current_depth == 0: - - # Starting the crawl - if (definitions['folders'].has(p)): - current_data = definitions['folders'][p] - else: - return '' - elif current_depth == parts.size() - 1: - # The final destination - for t in _get_definitions()['variables']: - for f in current_data['files']: - if t['id'] == f && t['name'] == p: - return t['id'] - - else: - # Still going deeper - if (current_data['folders'].size() > 0): - if p in current_data['folders']: - current_data = current_data['folders'][p] - else: - return '' - else: - return '' - current_depth += 1 + if variable_name_path in definitions: + return definitions[variable_name_path]['id'] + else: + #step through each one in turn to find the first matching string + for path in definitions.keys(): + if variable_name_path in path: + return definitions[path]['id'] return '' From 6d58701b1489ee0b91e79481fceb2251fc3b07fd Mon Sep 17 00:00:00 2001 From: thebardsrc Date: Wed, 11 Jan 2023 18:39:50 -0700 Subject: [PATCH 16/54] adding flat structure to Editor, and begin by building the new folder tree with it. nothing hooked up from there yet --- addons/dialogic/Editor/EditorView.gd | 10 +- .../dialogic/Editor/MasterTree/MasterTree.gd | 100 +++++++++++++++++- 2 files changed, 101 insertions(+), 9 deletions(-) diff --git a/addons/dialogic/Editor/EditorView.gd b/addons/dialogic/Editor/EditorView.gd index 35defc02a..8e9fc2aaf 100644 --- a/addons/dialogic/Editor/EditorView.gd +++ b/addons/dialogic/Editor/EditorView.gd @@ -6,7 +6,7 @@ var file_picker_data: Dictionary = {'method': '', 'node': self} var version_string: String var dialogicTranslator = load("res://addons/dialogic/Localization/translation_service.gd").new() - +var flat_structure = {} # this is set when the plugins main-view is instanced in dialogic.gd var editor_interface = null @@ -14,6 +14,9 @@ var editor_interface = null var editor_scene_cache = {} func _ready(): + # Updating the folder structure + flat_structure = DialogicUtil.get_flat_folders_list() + # Adding file dialog to get used by Events editor_file_dialog = EditorFileDialog.new() add_child(editor_file_dialog) @@ -23,9 +26,6 @@ func _ready(): $MainPanel/MasterTreeContainer/MasterTree.connect("editor_selected", self, 'on_master_tree_editor_selected') - # Updating the folder structure - DialogicUtil.update_resource_folder_structure() - # Sizes # This part of the code is a bit terrible. But there is no better way # of doing this in Godot at the moment. I'm sorry. @@ -109,7 +109,7 @@ func _ready(): $ToolBar/Version.text = 'Dialogic v' + version_string $MainPanel/MasterTreeContainer/FilterMasterTreeEdit.right_icon = get_icon("Search", "EditorIcons") - + $MainPanel/MasterTreeContainer/MasterTree.build_full_tree() func on_master_tree_editor_selected(editor: String): $ToolBar/FoldTools.visible = editor == 'timeline' diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index 7dbaf126d..ee0fbb538 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -43,6 +43,7 @@ signal editor_selected(selected) func _ready(): editor_reference = find_parent('EditorView') + # Tree Settings allow_rmb_select = true var root = tree.create_item() @@ -144,14 +145,105 @@ func _ready(): func build_full_tree(selected_item: String = ''): # Adding timelines - build_timelines(selected_item) + build_flat_tree_items(selected_item, "Timelines") # Adding characters - build_characters(selected_item) + build_flat_tree_items(selected_item, "Characters") # Adding Definitions - build_definitions(selected_item) + build_flat_tree_items(selected_item, "Definitions") # Adding Themes - build_themes(selected_item) + build_flat_tree_items(selected_item, "Themes") + +func build_flat_tree_items(selected_item: String='',current_tree: String=''): + #break if the flat_structure isn't built yet so it doesn't throw an error, which happens at plugin start + if !current_tree in editor_reference.flat_structure: + return + var current_root + var editor + var depth_stack = [] + + match (current_tree): + "Timelines": + current_root = timelines_tree + _clear_tree_children(timelines_tree) + editor = "Timeline Root" + "Characters": + current_root = characters_tree + _clear_tree_children(characters_tree) + editor = "Character Root" + "Definitions": + current_root = definitions_tree + _clear_tree_children(definitions_tree) + editor = "Definition Root" + "Themes": + current_root = themes_tree + _clear_tree_children(themes_tree) + editor = "Theme Root" + + depth_stack.push_back({"path": "/", "object": current_root}) + + for entry in editor_reference.flat_structure[current_tree]: + #Skip the root folder + if entry == "/.": + continue + + #check where we are in the stack + while !(depth_stack[-1]["path"] in entry.rsplit("/", true,1)[0]) and depth_stack.size() > 1: + var popped = depth_stack.pop_back() + + current_root = depth_stack[-1]["object"] + + if "folded" in editor_reference.flat_structure[current_tree][entry]: + # folder add + var folder_item:TreeItem= tree.create_item(current_root) + # set text and icon + folder_item.set_text(0, entry.split("/")[-2]) + folder_item.set_icon(0, get_icon("Folder", "EditorIcons")) + folder_item.set_icon_modulate(0, get_color("folder_icon_modulate", "FileDialog")) + # set metadata + folder_item.set_metadata(0, {'editor': editor, 'editable': true}) + # set collapsed + folder_item.collapsed = editor_reference.flat_structure[current_tree][entry]['folded'] + current_root = folder_item + depth_stack.push_back({"path": entry.rstrip("/."), "object": folder_item}) + + else: + #file add + var resource_data = editor_reference.flat_structure[current_tree][entry] + + var item = tree.create_item(current_root) + # set the text + if resource_data.has('name'): + item.set_text(0, resource_data['name']) + else: + item.set_text(0, resource_data['file']) + if not get_constant("dark_theme", "Editor"): + item.set_icon_modulate(0, get_color("property_color", "Editor")) + # set it as editable + resource_data['editable'] = true + # resource specific changes + match current_tree: + "Timelines": + item.set_icon(0, timeline_icon) + resource_data['editor'] = 'Timeline' + "Characters": + item.set_icon(0, character_icon) + resource_data['editor'] = 'Character' + if resource_data.has('color'): + item.set_icon_modulate(0, resource_data['color']) + "Definitions": + if resource_data['type'] == 0: + item.set_icon(0, definition_icon) + resource_data['editor'] = 'Value' + else: + item.set_icon(0, glossary_icon) + resource_data['editor'] = 'GlossaryEntry' + "Themes": + item.set_icon(0, theme_icon) + resource_data['editor'] = 'Theme' + + item.set_metadata(0, resource_data) + func _clear_tree_children(parent: TreeItem): while parent.get_children() != null: From 058413564d1a2323e9ccf2ab71312fdc20c027a8 Mon Sep 17 00:00:00 2001 From: thebardsrc Date: Wed, 11 Jan 2023 18:45:38 -0700 Subject: [PATCH 17/54] oh this line actually makes everything work on click --- addons/dialogic/Editor/MasterTree/MasterTree.gd | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index ee0fbb538..bed2c6464 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -153,6 +153,9 @@ func build_full_tree(selected_item: String = ''): # Adding Themes build_flat_tree_items(selected_item, "Themes") + # force redraw control + update() + func build_flat_tree_items(selected_item: String='',current_tree: String=''): #break if the flat_structure isn't built yet so it doesn't throw an error, which happens at plugin start if !current_tree in editor_reference.flat_structure: From 33d3f76f8f361b53363373d0c58bdff5dd64c047 Mon Sep 17 00:00:00 2001 From: thebardsrc Date: Sun, 22 Jan 2023 11:09:36 -0700 Subject: [PATCH 18/54] current progress, editor needs an array for rebuilding sorting --- addons/dialogic/Editor/EditorView.gd | 19 ++++ .../dialogic/Editor/MasterTree/MasterTree.gd | 87 ++++++++++++------- addons/dialogic/Other/DialogicUtil.gd | 18 ++-- 3 files changed, 82 insertions(+), 42 deletions(-) diff --git a/addons/dialogic/Editor/EditorView.gd b/addons/dialogic/Editor/EditorView.gd index 8e9fc2aaf..033691718 100644 --- a/addons/dialogic/Editor/EditorView.gd +++ b/addons/dialogic/Editor/EditorView.gd @@ -16,6 +16,7 @@ var editor_scene_cache = {} func _ready(): # Updating the folder structure flat_structure = DialogicUtil.get_flat_folders_list() + flat_structure_to_editor_array() # Adding file dialog to get used by Events editor_file_dialog = EditorFileDialog.new() @@ -111,6 +112,24 @@ func _ready(): $MainPanel/MasterTreeContainer/FilterMasterTreeEdit.right_icon = get_icon("Search", "EditorIcons") $MainPanel/MasterTreeContainer/MasterTree.build_full_tree() +func flat_structure_to_editor_array(): + flat_structure['Timelines_Array'] = [] + flat_structure['Characters_Array'] = [] + flat_structure['Definitions_Array'] = [] + flat_structure['Themes_Array'] = [] + + for key in flat_structure['Timelines'].keys(): + flat_structure['Timelines_Array'].push_back({'key': key, 'value': flat_structure['Timelines'][key]}) + + for key in flat_structure['Characters'].keys(): + flat_structure['Characters_Array'].push_back({'key': key, 'value': flat_structure['Characters'][key]}) + + for key in flat_structure['Definitions'].keys(): + flat_structure['Definitions_Array'].push_back({'key': key, 'value': flat_structure['Definitions'][key]}) + + for key in flat_structure['Themes'].keys(): + flat_structure['Themes_Array'].push_back({'key': key, 'value': flat_structure['Themes'][key]}) + func on_master_tree_editor_selected(editor: String): $ToolBar/FoldTools.visible = editor == 'timeline' $ToolBar/DocumentationNavigation.visible = editor == 'documentation' diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index bed2c6464..ef2608557 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -145,18 +145,19 @@ func _ready(): func build_full_tree(selected_item: String = ''): # Adding timelines - build_flat_tree_items(selected_item, "Timelines") + build_flat_tree_items("Timelines") # Adding characters - build_flat_tree_items(selected_item, "Characters") + build_flat_tree_items("Characters") # Adding Definitions - build_flat_tree_items(selected_item, "Definitions") + build_flat_tree_items("Definitions") # Adding Themes - build_flat_tree_items(selected_item, "Themes") + build_flat_tree_items("Themes") # force redraw control update() -func build_flat_tree_items(selected_item: String='',current_tree: String=''): +func build_flat_tree_items(current_tree: String=''): + current_tree = current_tree + "_Array" #break if the flat_structure isn't built yet so it doesn't throw an error, which happens at plugin start if !current_tree in editor_reference.flat_structure: return @@ -166,53 +167,55 @@ func build_flat_tree_items(selected_item: String='',current_tree: String=''): var depth_stack = [] match (current_tree): - "Timelines": + "Timelines_Array": current_root = timelines_tree _clear_tree_children(timelines_tree) editor = "Timeline Root" - "Characters": + "Characters_Array": current_root = characters_tree _clear_tree_children(characters_tree) editor = "Character Root" - "Definitions": + "Definitions_Array": current_root = definitions_tree _clear_tree_children(definitions_tree) editor = "Definition Root" - "Themes": + "Themes_Array": current_root = themes_tree _clear_tree_children(themes_tree) editor = "Theme Root" depth_stack.push_back({"path": "/", "object": current_root}) + var step = -1 for entry in editor_reference.flat_structure[current_tree]: + step = step + 1 #Skip the root folder - if entry == "/.": + if entry['key'] == "/.": continue #check where we are in the stack - while !(depth_stack[-1]["path"] in entry.rsplit("/", true,1)[0]) and depth_stack.size() > 1: + while !(depth_stack[-1]["path"] in entry['key'].rsplit("/", true,1)[0]) and depth_stack.size() > 1: var popped = depth_stack.pop_back() current_root = depth_stack[-1]["object"] - if "folded" in editor_reference.flat_structure[current_tree][entry]: + if "folded" in entry['value']: # folder add var folder_item:TreeItem= tree.create_item(current_root) # set text and icon - folder_item.set_text(0, entry.split("/")[-2]) + folder_item.set_text(0, entry['key'].split("/")[-2]) folder_item.set_icon(0, get_icon("Folder", "EditorIcons")) folder_item.set_icon_modulate(0, get_color("folder_icon_modulate", "FileDialog")) # set metadata - folder_item.set_metadata(0, {'editor': editor, 'editable': true}) + folder_item.set_metadata(0, {'editor': editor, 'editable': true, "path": entry['key'].rstrip("/."), "category": current_tree, 'step': step}) # set collapsed - folder_item.collapsed = editor_reference.flat_structure[current_tree][entry]['folded'] + folder_item.collapsed = entry['value']['folded'] current_root = folder_item - depth_stack.push_back({"path": entry.rstrip("/."), "object": folder_item}) + depth_stack.push_back({"path": entry['key'].rstrip("/."), "object": folder_item}) else: #file add - var resource_data = editor_reference.flat_structure[current_tree][entry] + var resource_data = entry['value'] var item = tree.create_item(current_root) # set the text @@ -226,24 +229,29 @@ func build_flat_tree_items(selected_item: String='',current_tree: String=''): resource_data['editable'] = true # resource specific changes match current_tree: - "Timelines": + "Timelines_Array": item.set_icon(0, timeline_icon) resource_data['editor'] = 'Timeline' - "Characters": + resource_data['step'] = step + "Characters_Array": item.set_icon(0, character_icon) resource_data['editor'] = 'Character' + resource_data['step'] = step if resource_data.has('color'): item.set_icon_modulate(0, resource_data['color']) - "Definitions": + "Definitions_Array": if resource_data['type'] == 0: item.set_icon(0, definition_icon) resource_data['editor'] = 'Value' + resource_data['step'] = step else: item.set_icon(0, glossary_icon) resource_data['editor'] = 'GlossaryEntry' - "Themes": + resource_data['step'] = step + "Themes_Array": item.set_icon(0, theme_icon) resource_data['editor'] = 'Theme' + resource_data['step'] = step item.set_metadata(0, resource_data) @@ -288,15 +296,20 @@ func build_resource_folder(parent_folder_item:TreeItem, folder_data:Dictionary, func _add_folder_item(parent_item: TreeItem, folder_name: String, editor:String, meta_folder_info:Dictionary): # create item var folder_item:TreeItem= tree.create_item(parent_item) + print(parent_item.get_metadata(0)) + var parent_path = parent_item.get_metadata(0)['path'] + var current_tree = parent_item.get_metadata(0)['category'] # set text and icon folder_item.set_text(0, folder_name) folder_item.set_icon(0, get_icon("Folder", "EditorIcons")) folder_item.set_icon_modulate(0, get_color("folder_icon_modulate", "FileDialog")) # set metadata - folder_item.set_metadata(0, {'editor': editor, 'editable': true}) + folder_item.set_metadata(0, {'editor': editor, 'editable': true, "path:": parent_path + "/" + folder_name, "category": current_tree}) # set collapsed if filter_tree_term.empty(): folder_item.collapsed = meta_folder_info['folded'] + # add to flat table + editor_reference.editor_reference.flat_structure[parent_path + "/" + "folder_name" + "/."] = {"color": null, "folded": folder_item.collapsed} return folder_item @@ -611,7 +624,11 @@ func get_item_folder(item: TreeItem, root : String): func get_item_path(item: TreeItem) -> String: if item == null: return '' - return create_item_path_recursive(item, "").trim_suffix("/") + + print(item.get_metadata(0)['path']) + if !'path' in item.get_metadata(0): + return "/" + return item.get_metadata(0)['path'] func create_item_path_recursive(item:TreeItem, path:String) -> String: @@ -681,8 +698,9 @@ func _on_TimelineRootPopupMenu_id_pressed(id): if id == 0: # Add Timeline new_timeline() if id == 1: # add subfolder - DialogicUtil.add_folder(get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) - build_timelines() + print(get_item_path(get_selected())) + DialogicUtil.add_folder(editor_reference.flat_structure, "Timelines", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) + build_flat_tree_items("Timelines") if id == 2: # remove folder and substuff if get_selected().get_parent() == get_root(): return @@ -694,9 +712,10 @@ func _on_CharacterRootPopupMenu_id_pressed(id): if id == 0: # Add Character new_character() if id == 1: # add subfolder - DialogicUtil.add_folder(get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) + print(get_item_path(get_selected())) + DialogicUtil.add_folder(editor_reference.flat_structure, "Characters", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) - build_characters() + build_flat_tree_items("Characters") if id == 2: # remove folder and substuff if get_selected().get_parent() == get_root(): return @@ -710,8 +729,9 @@ func _on_DefinitionRootPopupMenu_id_pressed(id): if id == 1: # Add Glossary Definition new_glossary_entry() if id == 2: # add subfolder - DialogicUtil.add_folder(get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) - build_definitions() + print(get_item_path(get_selected())) + DialogicUtil.add_folder(editor_reference.flat_structure, "Definitions", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) + build_flat_tree_items("Definitions") if id == 3: # remove folder and substuff if get_selected().get_parent() == get_root(): return @@ -723,8 +743,9 @@ func _on_ThemeRootPopupMenu_id_pressed(id): if id == 0: # Add Theme new_theme() if id == 1: # add subfolder - DialogicUtil.add_folder(get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) - build_themes() + print(get_item_path(get_selected())) + DialogicUtil.add_folder(editor_reference.flat_structure, "Themes", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) + build_flat_tree_items("Themes") if id == 2: # remove folder and substuff if get_selected().get_parent() == get_root(): return @@ -827,7 +848,7 @@ func drop_data(position, data): if data['item_type'] == 'folder': # on a folder if 'Root' in item.get_metadata(0)['editor']: - DialogicUtil.move_folder_to_folder(data['orig_path'], get_item_folder(item, data['orig_path'].split('/')[0])) + DialogicUtil.move_folder_to_folder(editor_reference.flat_structure, data['orig_path'], get_item_folder(item, data['orig_path'].split('/')[0])) # dragging a file elif data['item_type'] == 'file': # on a folder @@ -928,7 +949,7 @@ func _on_item_edited(): if "Root" in metadata['editor']: if item.get_text(0) == item_path_before_edit.split("/")[-1]: return - var result = DialogicUtil.rename_folder(item_path_before_edit, item.get_text(0)) + var result = DialogicUtil.rename_folder(editor_reference.flat_structure, item_path_before_edit, item.get_text(0)) if result != OK: item.set_text(0, item_path_before_edit.split("/")[-1]) diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index f2babf84e..2f2223d27 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -242,15 +242,15 @@ static func get_folder_meta(folder_path: String, key:String): ## FOLDER FUNCTIONS -static func add_folder(path:String, folder_name:String): +static func add_folder(folder_structure:Dictionary, tree:String, path:String, folder_name:String): # check if the name is allowed - if folder_name in get_folder_at_path(path)['folders'].keys(): + var new_path = path + "/" + folder_name + "/." + + if new_path in folder_structure[tree]: print("[D] A folder with the name '"+folder_name+"' already exists in the target folder '"+path+"'.") return ERR_ALREADY_EXISTS - var folder_data = get_folder_at_path(path) - folder_data['folders'][folder_name] = {"folders":{}, "files":[], 'metadata':{'color':null, 'folded':false}} - set_folder_at_path(path, folder_data) + folder_structure[tree][path + "/" + folder_name + "/."] = {'color':null, 'folded':false} return OK @@ -273,7 +273,7 @@ static func remove_folder(folder_path:String, delete_files:bool = true): DialogicResources.delete_theme(file) set_folder_at_path(folder_path, {}) -static func rename_folder(path:String, new_folder_name:String): +static func rename_folder(folder_structure: Dictionary, path:String, new_folder_name:String): # check if the name is allowed if new_folder_name in get_folder_at_path(get_parent_path(path))['folders'].keys(): print("[D] A folder with the name '"+new_folder_name+"' already exists in the target folder '"+get_parent_path(path)+"'.") @@ -289,13 +289,13 @@ static func rename_folder(path:String, new_folder_name:String): remove_folder(path, false) # add the new folder - add_folder(get_parent_path(path), new_folder_name) + add_folder(folder_structure, "tree", get_parent_path(path), new_folder_name) var new_path = get_parent_path(path)+ "/"+new_folder_name set_folder_at_path(new_path, folder_content) return OK -static func move_folder_to_folder(orig_path, target_folder): +static func move_folder_to_folder(folder_structure:Dictionary, orig_path, target_folder): # check if the name is allowed if orig_path.split("/")[-1] in get_folder_at_path(target_folder)['folders'].keys(): print("[D] A folder with the name '"+orig_path.split("/")[-1]+"' already exists in the target folder '"+target_folder+"'.") @@ -310,7 +310,7 @@ static func move_folder_to_folder(orig_path, target_folder): # add the new folder var folder_name = orig_path.split("/")[-1] - add_folder(target_folder, folder_name) + add_folder(folder_structure, "tree", target_folder, folder_name) var new_path = target_folder+ "/"+folder_name set_folder_at_path(new_path, folder_content) From 6183d1d1e5d237e1c173f5ca1028bf2b6caed959 Mon Sep 17 00:00:00 2001 From: thebardsrc Date: Wed, 25 Jan 2023 09:38:16 -0700 Subject: [PATCH 19/54] adding folder into array, so it inserts in the right spot in the tree --- .../dialogic/Editor/MasterTree/MasterTree.gd | 24 +++++++++---------- addons/dialogic/Other/DialogicUtil.gd | 8 +++---- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index ef2608557..dbfab513e 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -161,7 +161,7 @@ func build_flat_tree_items(current_tree: String=''): #break if the flat_structure isn't built yet so it doesn't throw an error, which happens at plugin start if !current_tree in editor_reference.flat_structure: return - + var current_root var editor var depth_stack = [] @@ -613,7 +613,7 @@ func _on_item_rmb_selected(position): func get_item_folder(item: TreeItem, root : String): if not item: return root - var current_path:String = get_item_path(item) + var current_path:String = get_item_path(item)['path'] if not "Root" in item.get_metadata(0)['editor']: current_path = DialogicUtil.get_parent_path(current_path) if not current_path.begins_with(root): @@ -621,14 +621,14 @@ func get_item_folder(item: TreeItem, root : String): return current_path -func get_item_path(item: TreeItem) -> String: +func get_item_path(item: TreeItem) -> Dictionary: if item == null: - return '' + return {'path': "", 'step': '0'} print(item.get_metadata(0)['path']) if !'path' in item.get_metadata(0): - return "/" - return item.get_metadata(0)['path'] + return {'path': "/", 'step': '0'} + return {'path': item.get_metadata(0)['path'], 'step': item.get_metadata(0)['step']} func create_item_path_recursive(item:TreeItem, path:String) -> String: @@ -648,7 +648,7 @@ func _on_TimelinePopupMenu_id_pressed(id): if id == 0: # View files OS.shell_open(ProjectSettings.globalize_path(DialogicResources.get_path('TIMELINE_DIR'))) elif id == 1: # Copy to clipboard - OS.set_clipboard(get_item_path(get_selected()).replace('Timelines', '')) + OS.set_clipboard(get_item_path(get_selected())['path'].replace('Timelines', '')) elif id == 2: # Copy File name OS.set_clipboard(get_selected().get_metadata(0).get('file')) elif id == 3: # Remove @@ -699,7 +699,7 @@ func _on_TimelineRootPopupMenu_id_pressed(id): new_timeline() if id == 1: # add subfolder print(get_item_path(get_selected())) - DialogicUtil.add_folder(editor_reference.flat_structure, "Timelines", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) + DialogicUtil.add_folder(editor_reference.flat_structure, "Timelines_Array", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) build_flat_tree_items("Timelines") if id == 2: # remove folder and substuff if get_selected().get_parent() == get_root(): @@ -713,7 +713,7 @@ func _on_CharacterRootPopupMenu_id_pressed(id): new_character() if id == 1: # add subfolder print(get_item_path(get_selected())) - DialogicUtil.add_folder(editor_reference.flat_structure, "Characters", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) + DialogicUtil.add_folder(editor_reference.flat_structure, "Characters_Array", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) build_flat_tree_items("Characters") if id == 2: # remove folder and substuff @@ -730,7 +730,7 @@ func _on_DefinitionRootPopupMenu_id_pressed(id): new_glossary_entry() if id == 2: # add subfolder print(get_item_path(get_selected())) - DialogicUtil.add_folder(editor_reference.flat_structure, "Definitions", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) + DialogicUtil.add_folder(editor_reference.flat_structure, "Definitions_Array", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) build_flat_tree_items("Definitions") if id == 3: # remove folder and substuff if get_selected().get_parent() == get_root(): @@ -744,7 +744,7 @@ func _on_ThemeRootPopupMenu_id_pressed(id): new_theme() if id == 1: # add subfolder print(get_item_path(get_selected())) - DialogicUtil.add_folder(editor_reference.flat_structure, "Themes", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) + DialogicUtil.add_folder(editor_reference.flat_structure, "Themes_Array", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) build_flat_tree_items("Themes") if id == 2: # remove folder and substuff if get_selected().get_parent() == get_root(): @@ -914,7 +914,7 @@ func _start_rename(): var item = get_selected() var metadata = item.get_metadata(0) if metadata.has("editable") and metadata["editable"]: - item_path_before_edit = get_item_path(item) + item_path_before_edit = get_item_path(item)['path'] item.set_editable(0, true) $RenamerReset.start(0.5) diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index 2f2223d27..4c3fcb755 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -242,15 +242,15 @@ static func get_folder_meta(folder_path: String, key:String): ## FOLDER FUNCTIONS -static func add_folder(folder_structure:Dictionary, tree:String, path:String, folder_name:String): +static func add_folder(folder_structure:Dictionary, tree:String, path:Dictionary, folder_name:String): # check if the name is allowed - var new_path = path + "/" + folder_name + "/." + var new_path = path['path'] + "/" + folder_name + "/." if new_path in folder_structure[tree]: - print("[D] A folder with the name '"+folder_name+"' already exists in the target folder '"+path+"'.") + print("[D] A folder with the name '"+folder_name+"' already exists in the target folder '"+path['path']+"'.") return ERR_ALREADY_EXISTS - folder_structure[tree][path + "/" + folder_name + "/."] = {'color':null, 'folded':false} + folder_structure[tree].insert(path['step'] + 1, {'key': new_path, "value":{'color':null, 'folded':false}}) return OK From 82c10f7baa0415cbb00030ba5c22f9d62b99d1bc Mon Sep 17 00:00:00 2001 From: thebardsrc Date: Wed, 25 Jan 2023 10:06:26 -0700 Subject: [PATCH 20/54] actually add to both , so the Dictionary can verify existing folders --- addons/dialogic/Editor/MasterTree/MasterTree.gd | 8 ++++---- addons/dialogic/Other/DialogicUtil.gd | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index dbfab513e..0a4eb9b95 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -699,7 +699,7 @@ func _on_TimelineRootPopupMenu_id_pressed(id): new_timeline() if id == 1: # add subfolder print(get_item_path(get_selected())) - DialogicUtil.add_folder(editor_reference.flat_structure, "Timelines_Array", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) + DialogicUtil.add_folder(editor_reference.flat_structure, "Timelines", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) build_flat_tree_items("Timelines") if id == 2: # remove folder and substuff if get_selected().get_parent() == get_root(): @@ -713,7 +713,7 @@ func _on_CharacterRootPopupMenu_id_pressed(id): new_character() if id == 1: # add subfolder print(get_item_path(get_selected())) - DialogicUtil.add_folder(editor_reference.flat_structure, "Characters_Array", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) + DialogicUtil.add_folder(editor_reference.flat_structure, "Characters", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) build_flat_tree_items("Characters") if id == 2: # remove folder and substuff @@ -730,7 +730,7 @@ func _on_DefinitionRootPopupMenu_id_pressed(id): new_glossary_entry() if id == 2: # add subfolder print(get_item_path(get_selected())) - DialogicUtil.add_folder(editor_reference.flat_structure, "Definitions_Array", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) + DialogicUtil.add_folder(editor_reference.flat_structure, "Definitions", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) build_flat_tree_items("Definitions") if id == 3: # remove folder and substuff if get_selected().get_parent() == get_root(): @@ -744,7 +744,7 @@ func _on_ThemeRootPopupMenu_id_pressed(id): new_theme() if id == 1: # add subfolder print(get_item_path(get_selected())) - DialogicUtil.add_folder(editor_reference.flat_structure, "Themes_Array", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) + DialogicUtil.add_folder(editor_reference.flat_structure, "Themes", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) build_flat_tree_items("Themes") if id == 2: # remove folder and substuff if get_selected().get_parent() == get_root(): diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index 4c3fcb755..cb3e21c7f 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -250,7 +250,8 @@ static func add_folder(folder_structure:Dictionary, tree:String, path:Dictionary print("[D] A folder with the name '"+folder_name+"' already exists in the target folder '"+path['path']+"'.") return ERR_ALREADY_EXISTS - folder_structure[tree].insert(path['step'] + 1, {'key': new_path, "value":{'color':null, 'folded':false}}) + folder_structure[tree][new_path] = {'color':null, 'folded':false} + folder_structure[tree + "_Array"].insert(path['step'] + 1, {'key': new_path, "value":{'color':null, 'folded':false}}) return OK From 5e0a4def892cdd840ff307ae5f6c1e19b9a0a89d Mon Sep 17 00:00:00 2001 From: thebardsrc Date: Wed, 25 Jan 2023 10:52:06 -0700 Subject: [PATCH 21/54] wip on remove folder, have to go now --- addons/dialogic/Editor/EditorView.gd | 2 +- addons/dialogic/Other/DialogicUtil.gd | 26 ++++++++++++-------------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/addons/dialogic/Editor/EditorView.gd b/addons/dialogic/Editor/EditorView.gd index 033691718..86cff4996 100644 --- a/addons/dialogic/Editor/EditorView.gd +++ b/addons/dialogic/Editor/EditorView.gd @@ -158,7 +158,7 @@ func popup_remove_confirmation(what): func _on_RemoveFolderConfirmation_confirmed(): var item_path = $MainPanel/MasterTreeContainer/MasterTree.get_item_path($MainPanel/MasterTreeContainer/MasterTree.get_selected()) - DialogicUtil.remove_folder(item_path) + DialogicUtil.remove_folder(flat_structure, item_path) $MainPanel/MasterTreeContainer/MasterTree.build_full_tree() diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index cb3e21c7f..f166062da 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -255,23 +255,21 @@ static func add_folder(folder_structure:Dictionary, tree:String, path:Dictionary return OK -static func remove_folder(folder_path:String, delete_files:bool = true): +static func remove_folder(flat_structure: Dictionary, folder_path:Dictionary, delete_files:bool = true): #print("[D] Removing 'Folder' "+folder_path) - for folder in get_folder_at_path(folder_path)['folders']: - remove_folder(folder_path+"/"+folder, delete_files) + + #temp because i need to leave soon and want to remember what I'm doing + var tree ="Timelines" + flat_structure[tree].erase(folder_path['path']) + flat_structure[tree +"_Array"].remove(folder_path['step']) if delete_files: - for file in get_folder_at_path(folder_path)['files']: - #print("[D] Removing file ", file) - match folder_path.split("/")[0]: - 'Timelines': - DialogicResources.delete_timeline(file) - 'Characters': - DialogicResources.delete_character(file) - 'Definitions': - DialogicResources.delete_default_definition(file) - 'Themes': - DialogicResources.delete_theme(file) + var folder_root = folder_path.rstrip("/.") + + for key in flat_structure[tree].keys(): + if folder_root in key: + #Erasing elements while iterating over them is not supported and will result in undefined behavior. + set_folder_at_path(folder_path, {}) static func rename_folder(folder_structure: Dictionary, path:String, new_folder_name:String): From f5c5c2f6dec210ff4c901640b30c6a11437440db Mon Sep 17 00:00:00 2001 From: thebardsrc Date: Wed, 8 Feb 2023 20:01:54 -0700 Subject: [PATCH 22/54] converting more folder functions, all WIP none tested --- addons/dialogic/Editor/EditorView.gd | 1 + addons/dialogic/Other/DialogicUtil.gd | 70 +++++++++++++++------------ 2 files changed, 39 insertions(+), 32 deletions(-) diff --git a/addons/dialogic/Editor/EditorView.gd b/addons/dialogic/Editor/EditorView.gd index 86cff4996..6551761df 100644 --- a/addons/dialogic/Editor/EditorView.gd +++ b/addons/dialogic/Editor/EditorView.gd @@ -159,6 +159,7 @@ func popup_remove_confirmation(what): func _on_RemoveFolderConfirmation_confirmed(): var item_path = $MainPanel/MasterTreeContainer/MasterTree.get_item_path($MainPanel/MasterTreeContainer/MasterTree.get_selected()) DialogicUtil.remove_folder(flat_structure, item_path) + flat_structure_to_editor_array() $MainPanel/MasterTreeContainer/MasterTree.build_full_tree() diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index f166062da..780a48acd 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -242,76 +242,82 @@ static func get_folder_meta(folder_path: String, key:String): ## FOLDER FUNCTIONS -static func add_folder(folder_structure:Dictionary, tree:String, path:Dictionary, folder_name:String): +static func add_folder(flat_structure:Dictionary, tree:String, path:Dictionary, folder_name:String): # check if the name is allowed var new_path = path['path'] + "/" + folder_name + "/." - if new_path in folder_structure[tree]: + if new_path in flat_structure[tree]: print("[D] A folder with the name '"+folder_name+"' already exists in the target folder '"+path['path']+"'.") return ERR_ALREADY_EXISTS - folder_structure[tree][new_path] = {'color':null, 'folded':false} - folder_structure[tree + "_Array"].insert(path['step'] + 1, {'key': new_path, "value":{'color':null, 'folded':false}}) + flat_structure[tree][new_path] = {'color':null, 'folded':false} + flat_structure[tree + "_Array"].insert(path['step'] + 1, {'key': new_path, "value":{'color':null, 'folded':false}}) + DialogicResources.save_resource_folder_flat_structure(flat_structure) return OK -static func remove_folder(flat_structure: Dictionary, folder_path:Dictionary, delete_files:bool = true): +static func remove_folder(flat_structure: Dictionary, tree:String, folder_path:Dictionary, delete_files:bool = true): #print("[D] Removing 'Folder' "+folder_path) - #temp because i need to leave soon and want to remember what I'm doing - var tree ="Timelines" flat_structure[tree].erase(folder_path['path']) flat_structure[tree +"_Array"].remove(folder_path['step']) if delete_files: - var folder_root = folder_path.rstrip("/.") + var folder_root = folder_path['step'].rstrip("/.") for key in flat_structure[tree].keys(): if folder_root in key: - #Erasing elements while iterating over them is not supported and will result in undefined behavior. + flat_structure.erase(key) + - set_folder_at_path(folder_path, {}) + DialogicResources.save_resource_folder_flat_structure(flat_structure) -static func rename_folder(folder_structure: Dictionary, path:String, new_folder_name:String): +static func rename_folder(flat_structure: Dictionary, tree:String, path:Dictionary, new_folder_name:String): # check if the name is allowed - if new_folder_name in get_folder_at_path(get_parent_path(path))['folders'].keys(): - print("[D] A folder with the name '"+new_folder_name+"' already exists in the target folder '"+get_parent_path(path)+"'.") + var new_path = path['path'] + "/" + new_folder_name + "/." + + if new_path in flat_structure[tree]: + print("[D] A folder with the name '"+new_folder_name+"' already exists in the target folder '"++path['path']+"'.") return ERR_ALREADY_EXISTS elif new_folder_name.empty(): return ERR_PRINTER_ON_FIRE + flat_structure[tree + "_Array"][path['step']]['key'] = new_path + #gotta split up the dictionary and reassemble it to change a key's name + var tree_keys = flat_structure[tree].keys() + var tree_values = flat_structure[tree].values() + tree_keys[path['step'] + 1] = new_path - # save the content - var folder_content = get_folder_at_path(path) + var new_dictionary = {} + for i in tree_keys.size(): + new_dictionary[tree_keys[i]] = tree_values[i] - # remove the old folder BUT NOT THE FILES !!!!! - remove_folder(path, false) + flat_structure[tree] = new_dictionary - # add the new folder - add_folder(folder_structure, "tree", get_parent_path(path), new_folder_name) - var new_path = get_parent_path(path)+ "/"+new_folder_name - set_folder_at_path(new_path, folder_content) + DialogicResources.save_resource_folder_flat_structure(flat_structure) return OK -static func move_folder_to_folder(folder_structure:Dictionary, orig_path, target_folder): +static func move_folder_to_folder(flat_structure:Dictionary, tree:String, original_path:Dictionary, destination_path:Dictionary): # check if the name is allowed - if orig_path.split("/")[-1] in get_folder_at_path(target_folder)['folders'].keys(): - print("[D] A folder with the name '"+orig_path.split("/")[-1]+"' already exists in the target folder '"+target_folder+"'.") - return ERR_ALREADY_EXISTS + var new_path = destination_path['path'] - # save the content - var folder_content = get_folder_at_path(orig_path) + if new_path in flat_structure[tree]: + print("[D] A folder with the name '"+destination_path['path'].split("/")[-1]+"' already exists in the target folder '"+original_path['path']+"'.") + return ERR_ALREADY_EXISTS + # remove the old folder BUT DON'T DELETE THE FILES!!!!!!!!!!! # took me ages to find this when I forgot it.. - remove_folder(orig_path, false) + remove_folder(flat_structure, tree,original_path, false) # add the new folder - var folder_name = orig_path.split("/")[-1] - add_folder(folder_structure, "tree", target_folder, folder_name) - var new_path = target_folder+ "/"+folder_name - set_folder_at_path(new_path, folder_content) + var folder_name = destination_path['path'].split("/")[-1] + + add_folder(flat_structure, tree, destination_path, new_path) + + + DialogicResources.save_resource_folder_flat_structure(flat_structure) return OK From 0a06de44e55785c12e544e1baf3487433faf5f8f Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Tue, 21 Feb 2023 12:24:51 -0700 Subject: [PATCH 23/54] just fixes for errors initializing editor, doesnt actually do anything more --- .../DocumentationViewer.gd | 130 +++++++++--------- .../dialogic/Editor/MasterTree/MasterTree.gd | 4 +- 2 files changed, 67 insertions(+), 67 deletions(-) diff --git a/addons/dialogic/Editor/DocumentationViewer/DocumentationViewer.gd b/addons/dialogic/Editor/DocumentationViewer/DocumentationViewer.gd index 386f3ed0d..32391d849 100644 --- a/addons/dialogic/Editor/DocumentationViewer/DocumentationViewer.gd +++ b/addons/dialogic/Editor/DocumentationViewer/DocumentationViewer.gd @@ -1,65 +1,65 @@ -tool -extends Control - -onready var master_tree = get_node('../MasterTreeContainer/MasterTree') -var current_page : String = "" - -var previous_pages = [] -var next_pages = [] - -signal open_link(link) - -onready var nodes = { - 'DocsViewer': $DocsViewer, - 'Next': null, - 'Previous':null, -} - -func _ready(): - set("custom_styles/panel", get_stylebox("Background", "EditorStyles")) - - var _scale = get_constant("inspector_margin", "Editor") - _scale = _scale * 0.125 - nodes['DocsViewer'].MarkdownParser.editor_scale = _scale - nodes['Next'] = find_parent("EditorView").get_node("ToolBar/DocumentationNavigation/Next") - nodes['Next'].connect('pressed',self, 'open_next_page') - nodes['Previous'] = find_parent("EditorView").get_node("ToolBar/DocumentationNavigation/Previous") - nodes['Previous'].connect('pressed',self, 'open_previous_page') - - - -func load_page(page): - if current_page: - previous_pages.push_back(current_page) - nodes['Previous'].disabled = false - next_pages = [] - current_page = page - nodes['DocsViewer'].load_page(current_page) - nodes['Next'].disabled = true - - -func open_previous_page(): - if len(previous_pages): - next_pages.push_front(current_page) - current_page = previous_pages.pop_back() - nodes['DocsViewer'].load_page(current_page) - nodes['Previous'].disabled = len(previous_pages) == 0 - nodes['Next'].disabled = false - - -func open_next_page(): - if len(next_pages): - previous_pages.push_back(current_page) - current_page = next_pages.pop_front() - nodes['DocsViewer'].load_page(current_page) - nodes['Next'].disabled = len(next_pages) == 0 - nodes['Previous'].disabled = false - - -func toggle_editing(): - nodes['DocsViewer'].toggle_editing() - - -func _on_DocsViewer_open_non_html_link(link, section): - #print(link, " ", section) - master_tree.select_documentation_item(link) +tool +extends Control + +onready var master_tree = get_node('../MasterTreeContainer/MasterTree') +var current_page : String = "" + +var previous_pages = [] +var next_pages = [] + +signal open_link(link) + +onready var nodes = { + 'DocsViewer': $DocsViewer, + 'Next': null, + 'Previous':null, +} + +func _ready(): + set("custom_styles/panel", get_stylebox("Background", "EditorStyles")) + + var _scale = get_constant("inspector_margin", "Editor") + _scale = _scale * 0.125 + nodes['DocsViewer'].MarkdownParser.editor_scale = _scale + nodes['Next'] = find_parent("EditorView").get_node("ToolBar/DocumentationNavigation/Next") + nodes['Next'].connect('pressed',self, 'open_next_page') + nodes['Previous'] = find_parent("EditorView").get_node("ToolBar/DocumentationNavigation/Previous") + nodes['Previous'].connect('pressed',self, 'open_previous_page') + + + +func load_page(page): + if current_page: + previous_pages.push_back(current_page) + nodes['Previous'].disabled = false + next_pages = [] + current_page = page + nodes['DocsViewer'].load_page(current_page) + nodes['Next'].disabled = true + + +func open_previous_page(): + if len(previous_pages): + next_pages.push_front(current_page) + current_page = previous_pages.pop_back() + nodes['DocsViewer'].load_page(current_page) + nodes['Previous'].disabled = len(previous_pages) == 0 + nodes['Next'].disabled = false + + +func open_next_page(): + if len(next_pages): + previous_pages.push_back(current_page) + current_page = next_pages.pop_front() + nodes['DocsViewer'].load_page(current_page) + nodes['Next'].disabled = len(next_pages) == 0 + nodes['Previous'].disabled = false + + +func toggle_editing(): + nodes['DocsViewer'].toggle_editing() + + +func _on_DocsViewer_open_non_html_link(link, section): + #print(link, " ", section) + master_tree.select_documentation_item(link) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index 0a4eb9b95..eb757401d 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -848,7 +848,7 @@ func drop_data(position, data): if data['item_type'] == 'folder': # on a folder if 'Root' in item.get_metadata(0)['editor']: - DialogicUtil.move_folder_to_folder(editor_reference.flat_structure, data['orig_path'], get_item_folder(item, data['orig_path'].split('/')[0])) + DialogicUtil.move_folder_to_folder(editor_reference.flat_structure, "tree", data['orig_path'], get_item_folder(item, data['orig_path'].split('/')[0])) # dragging a file elif data['item_type'] == 'file': # on a folder @@ -949,7 +949,7 @@ func _on_item_edited(): if "Root" in metadata['editor']: if item.get_text(0) == item_path_before_edit.split("/")[-1]: return - var result = DialogicUtil.rename_folder(editor_reference.flat_structure, item_path_before_edit, item.get_text(0)) + var result = DialogicUtil.rename_folder(editor_reference.flat_structure, "tree", item_path_before_edit, item.get_text(0)) if result != OK: item.set_text(0, item_path_before_edit.split("/")[-1]) From e1f00cc65b1b5267e4951ed5843a4ed3f14dcba6 Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Sat, 25 Feb 2023 17:51:46 -0700 Subject: [PATCH 24/54] move the editor helper functions into DialogicUtil + more data --- addons/dialogic/Editor/EditorView.gd | 24 +------- .../dialogic/Editor/MasterTree/MasterTree.gd | 5 ++ addons/dialogic/Other/DialogicUtil.gd | 56 +++++++++++++++++++ 3 files changed, 64 insertions(+), 21 deletions(-) diff --git a/addons/dialogic/Editor/EditorView.gd b/addons/dialogic/Editor/EditorView.gd index 6551761df..1f2188a6b 100644 --- a/addons/dialogic/Editor/EditorView.gd +++ b/addons/dialogic/Editor/EditorView.gd @@ -16,7 +16,7 @@ var editor_scene_cache = {} func _ready(): # Updating the folder structure flat_structure = DialogicUtil.get_flat_folders_list() - flat_structure_to_editor_array() + flat_structure = DialogicUtil.flat_structure_to_editor_array(flat_structure) # Adding file dialog to get used by Events editor_file_dialog = EditorFileDialog.new() @@ -112,24 +112,6 @@ func _ready(): $MainPanel/MasterTreeContainer/FilterMasterTreeEdit.right_icon = get_icon("Search", "EditorIcons") $MainPanel/MasterTreeContainer/MasterTree.build_full_tree() -func flat_structure_to_editor_array(): - flat_structure['Timelines_Array'] = [] - flat_structure['Characters_Array'] = [] - flat_structure['Definitions_Array'] = [] - flat_structure['Themes_Array'] = [] - - for key in flat_structure['Timelines'].keys(): - flat_structure['Timelines_Array'].push_back({'key': key, 'value': flat_structure['Timelines'][key]}) - - for key in flat_structure['Characters'].keys(): - flat_structure['Characters_Array'].push_back({'key': key, 'value': flat_structure['Characters'][key]}) - - for key in flat_structure['Definitions'].keys(): - flat_structure['Definitions_Array'].push_back({'key': key, 'value': flat_structure['Definitions'][key]}) - - for key in flat_structure['Themes'].keys(): - flat_structure['Themes_Array'].push_back({'key': key, 'value': flat_structure['Themes'][key]}) - func on_master_tree_editor_selected(editor: String): $ToolBar/FoldTools.visible = editor == 'timeline' $ToolBar/DocumentationNavigation.visible = editor == 'documentation' @@ -158,8 +140,8 @@ func popup_remove_confirmation(what): func _on_RemoveFolderConfirmation_confirmed(): var item_path = $MainPanel/MasterTreeContainer/MasterTree.get_item_path($MainPanel/MasterTreeContainer/MasterTree.get_selected()) - DialogicUtil.remove_folder(flat_structure, item_path) - flat_structure_to_editor_array() + DialogicUtil.remove_folder(flat_structure, "tree", item_path) + flat_structure = DialogicUtil.flat_structure_to_editor_array(flat_structure) $MainPanel/MasterTreeContainer/MasterTree.build_full_tree() diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index eb757401d..6749f2c46 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -218,11 +218,16 @@ func build_flat_tree_items(current_tree: String=''): var resource_data = entry['value'] var item = tree.create_item(current_root) + item['category']= current_tree # set the text if resource_data.has('name'): item.set_text(0, resource_data['name']) + item['path'] = entry['key'].rstrip(resource_data['name']) + item['current_name'] = resource_data['name'] else: item.set_text(0, resource_data['file']) + item['path'] = entry['key'].rstrip(resource_data['file']) + item['current_name'] = resource_data['file'] if not get_constant("dark_theme", "Editor"): item.set_icon_modulate(0, get_color("property_color", "Editor")) # set it as editable diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index 780a48acd..bfc4fed2f 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -386,6 +386,62 @@ static func beautify_filename(animation_name: String) -> String: else: a_string = a_string.capitalize() return a_string + +static func flat_structure_to_editor_array(flat_structure: Dictionary, tree:String="all") -> Dictionary: + if tree != "all": + flat_structure[tree + '_Array'] = [] + + for key in flat_structure[tree].keys(): + flat_structure[tree+ '_Array'].push_back({'key': key, 'value': flat_structure[tree][key]}) + else: + + flat_structure['Timelines_Array'] = [] + flat_structure['Characters_Array'] = [] + flat_structure['Definitions_Array'] = [] + flat_structure['Themes_Array'] = [] + + for key in flat_structure['Timelines'].keys(): + flat_structure['Timelines_Array'].push_back({'key': key, 'value': flat_structure['Timelines'][key]}) + + for key in flat_structure['Characters'].keys(): + flat_structure['Characters_Array'].push_back({'key': key, 'value': flat_structure['Characters'][key]}) + + for key in flat_structure['Definitions'].keys(): + flat_structure['Definitions_Array'].push_back({'key': key, 'value': flat_structure['Definitions'][key]}) + + for key in flat_structure['Themes'].keys(): + flat_structure['Themes_Array'].push_back({'key': key, 'value': flat_structure['Themes'][key]}) + + return flat_structure + +static func editor_array_to_flat_structure(flat_structure: Dictionary, tree:String="all") -> Dictionary: + if tree != "all": + flat_structure[tree] = {} + + for idx in flat_structure[tree + '_Array'].size(): + flat_structure[tree][flat_structure[tree + '_Array'][idx]['key']] = flat_structure[tree + '_Array'][idx]['value'] + + else: + flat_structure['Timelines'] = {} + flat_structure['Characters'] = {} + flat_structure['Definitions'] = {} + flat_structure['Themes'] = {} + + for idx in flat_structure['Timelines_Array'].size(): + flat_structure['Timelines'][flat_structure['Timelines_Array'][idx]['key']] = flat_structure['Timelines_Array'][idx]['value'] + + for idx in flat_structure['Characters_Array'].size(): + flat_structure['Characters'][flat_structure['Characters_Array'][idx]['key']] = flat_structure['Characters_Array'][idx]['value'] + + for idx in flat_structure['Definitions_Array'].size(): + flat_structure['Definitions'][flat_structure['Definitions_Array'][idx]['key']] = flat_structure['Definitions_Array'][idx]['value'] + + for idx in flat_structure['Themes_Array'].size(): + flat_structure['Themes'][flat_structure['Themes_Array'][idx]['key']] = flat_structure['Themes_Array'][idx]['value'] + + + return flat_structure + ## ***************************************************************************** ## USEFUL FUNCTIONS From 60e2019e8eee6d1ab7612702237aafe3334cf832 Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Sat, 25 Feb 2023 23:00:22 -0700 Subject: [PATCH 25/54] further structure readjustments for editor, now the functions can finally be converted --- addons/dialogic/Editor/EditorView.gd | 8 ++--- .../dialogic/Editor/MasterTree/MasterTree.gd | 30 +++++++++---------- addons/dialogic/Other/DialogicUtil.gd | 23 ++++++++------ 3 files changed, 31 insertions(+), 30 deletions(-) diff --git a/addons/dialogic/Editor/EditorView.gd b/addons/dialogic/Editor/EditorView.gd index 1f2188a6b..47b26a51c 100644 --- a/addons/dialogic/Editor/EditorView.gd +++ b/addons/dialogic/Editor/EditorView.gd @@ -15,8 +15,7 @@ var editor_scene_cache = {} func _ready(): # Updating the folder structure - flat_structure = DialogicUtil.get_flat_folders_list() - flat_structure = DialogicUtil.flat_structure_to_editor_array(flat_structure) + flat_structure = DialogicUtil.flat_structure_to_editor_array(DialogicUtil.get_flat_folders_list()) # Adding file dialog to get used by Events editor_file_dialog = EditorFileDialog.new() @@ -139,9 +138,8 @@ func popup_remove_confirmation(what): func _on_RemoveFolderConfirmation_confirmed(): - var item_path = $MainPanel/MasterTreeContainer/MasterTree.get_item_path($MainPanel/MasterTreeContainer/MasterTree.get_selected()) - DialogicUtil.remove_folder(flat_structure, "tree", item_path) - flat_structure = DialogicUtil.flat_structure_to_editor_array(flat_structure) + var item_data = $MainPanel/MasterTreeContainer/MasterTree.get_selected().get_metadata(0) + DialogicUtil.remove_folder(flat_structure, "tree", item_data) $MainPanel/MasterTreeContainer/MasterTree.build_full_tree() diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index 6749f2c46..d809897a2 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -203,11 +203,13 @@ func build_flat_tree_items(current_tree: String=''): # folder add var folder_item:TreeItem= tree.create_item(current_root) # set text and icon - folder_item.set_text(0, entry['key'].split("/")[-2]) + var folder_name = entry['key'].split("/")[-2] + folder_item.set_text(0, folder_name) folder_item.set_icon(0, get_icon("Folder", "EditorIcons")) folder_item.set_icon_modulate(0, get_color("folder_icon_modulate", "FileDialog")) # set metadata - folder_item.set_metadata(0, {'editor': editor, 'editable': true, "path": entry['key'].rstrip("/."), "category": current_tree, 'step': step}) + var stripped_path = entry['key'].rstrip("/.").rstrip(folder_name) + folder_item.set_metadata(0, {'editor': editor, 'editable': true, "path": stripped_path, "name": folder_name, "category": current_tree, 'step': step}) # set collapsed folder_item.collapsed = entry['value']['folded'] current_root = folder_item @@ -218,16 +220,15 @@ func build_flat_tree_items(current_tree: String=''): var resource_data = entry['value'] var item = tree.create_item(current_root) - item['category']= current_tree + item['resource_data']= current_tree # set the text if resource_data.has('name'): item.set_text(0, resource_data['name']) - item['path'] = entry['key'].rstrip(resource_data['name']) - item['current_name'] = resource_data['name'] + resource_data['path'] = entry['key'].rstrip(resource_data['name']) else: item.set_text(0, resource_data['file']) - item['path'] = entry['key'].rstrip(resource_data['file']) - item['current_name'] = resource_data['file'] + resource_data['path'] = entry['key'].rstrip(resource_data['file']) + resource_data['name'] = resource_data['file'] if not get_constant("dark_theme", "Editor"): item.set_icon_modulate(0, get_color("property_color", "Editor")) # set it as editable @@ -309,7 +310,7 @@ func _add_folder_item(parent_item: TreeItem, folder_name: String, editor:String, folder_item.set_icon(0, get_icon("Folder", "EditorIcons")) folder_item.set_icon_modulate(0, get_color("folder_icon_modulate", "FileDialog")) # set metadata - folder_item.set_metadata(0, {'editor': editor, 'editable': true, "path:": parent_path + "/" + folder_name, "category": current_tree}) + folder_item.set_metadata(0, {'editor': editor, 'editable': true, "name": folder_name, "path:": parent_path, "category": current_tree}) # set collapsed if filter_tree_term.empty(): folder_item.collapsed = meta_folder_info['folded'] @@ -319,6 +320,7 @@ func _add_folder_item(parent_item: TreeItem, folder_name: String, editor:String, func _add_resource_item(resource_type, parent_item, resource_data, select): + resource_data['category'] = resource_type # create item var item = tree.create_item(parent_item) # set the text @@ -703,8 +705,7 @@ func _on_TimelineRootPopupMenu_id_pressed(id): if id == 0: # Add Timeline new_timeline() if id == 1: # add subfolder - print(get_item_path(get_selected())) - DialogicUtil.add_folder(editor_reference.flat_structure, "Timelines", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) + DialogicUtil.add_folder(editor_reference.flat_structure, "Timelines", get_selected().get_metadata(0), "New Folder "+str(OS.get_unix_time())) build_flat_tree_items("Timelines") if id == 2: # remove folder and substuff if get_selected().get_parent() == get_root(): @@ -717,8 +718,7 @@ func _on_CharacterRootPopupMenu_id_pressed(id): if id == 0: # Add Character new_character() if id == 1: # add subfolder - print(get_item_path(get_selected())) - DialogicUtil.add_folder(editor_reference.flat_structure, "Characters", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) + DialogicUtil.add_folder(editor_reference.flat_structure, "Characters", get_selected().get_metadata(0), "New Folder "+str(OS.get_unix_time())) build_flat_tree_items("Characters") if id == 2: # remove folder and substuff @@ -734,8 +734,7 @@ func _on_DefinitionRootPopupMenu_id_pressed(id): if id == 1: # Add Glossary Definition new_glossary_entry() if id == 2: # add subfolder - print(get_item_path(get_selected())) - DialogicUtil.add_folder(editor_reference.flat_structure, "Definitions", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) + DialogicUtil.add_folder(editor_reference.flat_structure, "Definitions", get_selected().get_metadata(0), "New Folder "+str(OS.get_unix_time())) build_flat_tree_items("Definitions") if id == 3: # remove folder and substuff if get_selected().get_parent() == get_root(): @@ -748,8 +747,7 @@ func _on_ThemeRootPopupMenu_id_pressed(id): if id == 0: # Add Theme new_theme() if id == 1: # add subfolder - print(get_item_path(get_selected())) - DialogicUtil.add_folder(editor_reference.flat_structure, "Themes", get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) + DialogicUtil.add_folder(editor_reference.flat_structure, "Themes", get_selected().get_metadata(0), "New Folder "+str(OS.get_unix_time())) build_flat_tree_items("Themes") if id == 2: # remove folder and substuff if get_selected().get_parent() == get_root(): diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index bfc4fed2f..e6ab8cc10 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -244,30 +244,35 @@ static func get_folder_meta(folder_path: String, key:String): ## FOLDER FUNCTIONS static func add_folder(flat_structure:Dictionary, tree:String, path:Dictionary, folder_name:String): # check if the name is allowed - var new_path = path['path'] + "/" + folder_name + "/." + var new_path = path['path'] + "/" + path['name'] + "/" + folder_name + "/." if new_path in flat_structure[tree]: print("[D] A folder with the name '"+folder_name+"' already exists in the target folder '"+path['path']+"'.") return ERR_ALREADY_EXISTS - flat_structure[tree][new_path] = {'color':null, 'folded':false} flat_structure[tree + "_Array"].insert(path['step'] + 1, {'key': new_path, "value":{'color':null, 'folded':false}}) + flat_structure = editor_array_to_flat_structure(flat_structure,tree) DialogicResources.save_resource_folder_flat_structure(flat_structure) return OK -static func remove_folder(flat_structure: Dictionary, tree:String, folder_path:Dictionary, delete_files:bool = true): +static func remove_folder(flat_structure: Dictionary, tree:String, folder_data:Dictionary, delete_files:bool = true): #print("[D] Removing 'Folder' "+folder_path) - flat_structure[tree].erase(folder_path['path']) - flat_structure[tree +"_Array"].remove(folder_path['step']) + flat_structure[tree +"_Array"].remove(folder_data['step']) if delete_files: - var folder_root = folder_path['step'].rstrip("/.") + var folder_root = folder_data['path'] + "/" + folder_data['name'] + "/" - for key in flat_structure[tree].keys(): - if folder_root in key: - flat_structure.erase(key) + var new_array = [] + + for idx in flat_structure[tree +"_Array"].size(): + if not folder_root in flat_structure[tree +"_Array"][idx]['key']: + new_array.push_back(flat_structure[tree +"_Array"][idx]) + + flat_structure[tree +"_Array"] = new_array + + flat_structure = editor_array_to_flat_structure(flat_structure, tree) DialogicResources.save_resource_folder_flat_structure(flat_structure) From c8d38afc75ab006b38ab5c206ee8c4ac3587eb47 Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Sat, 25 Feb 2023 23:14:25 -0700 Subject: [PATCH 26/54] update rename_folder(), slight name changes on move folder, but I don't think theyre even used? --- .../dialogic/Editor/MasterTree/MasterTree.gd | 2 +- addons/dialogic/Other/DialogicUtil.gd | 22 ++++++------------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index d809897a2..bff4ef4db 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -851,7 +851,7 @@ func drop_data(position, data): if data['item_type'] == 'folder': # on a folder if 'Root' in item.get_metadata(0)['editor']: - DialogicUtil.move_folder_to_folder(editor_reference.flat_structure, "tree", data['orig_path'], get_item_folder(item, data['orig_path'].split('/')[0])) + DialogicUtil.move_folder_to_folder(editor_reference.flat_structure, item.get_metadata(0)['category'], data['orig_path'], item.get_metadata(0)) # dragging a file elif data['item_type'] == 'file': # on a folder diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index e6ab8cc10..6ad9fa3d4 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -288,38 +288,30 @@ static func rename_folder(flat_structure: Dictionary, tree:String, path:Dictiona return ERR_PRINTER_ON_FIRE flat_structure[tree + "_Array"][path['step']]['key'] = new_path - #gotta split up the dictionary and reassemble it to change a key's name - var tree_keys = flat_structure[tree].keys() - var tree_values = flat_structure[tree].values() - tree_keys[path['step'] + 1] = new_path - var new_dictionary = {} - for i in tree_keys.size(): - new_dictionary[tree_keys[i]] = tree_values[i] - - flat_structure[tree] = new_dictionary + flat_structure = editor_array_to_flat_structure(flat_structure, tree) DialogicResources.save_resource_folder_flat_structure(flat_structure) return OK -static func move_folder_to_folder(flat_structure:Dictionary, tree:String, original_path:Dictionary, destination_path:Dictionary): +static func move_folder_to_folder(flat_structure:Dictionary, tree:String, original_data:Dictionary, destination_data:Dictionary): # check if the name is allowed - var new_path = destination_path['path'] + var new_path = destination_data['path'] if new_path in flat_structure[tree]: - print("[D] A folder with the name '"+destination_path['path'].split("/")[-1]+"' already exists in the target folder '"+original_path['path']+"'.") + print("[D] A folder with the name '"+destination_data['path'].split("/")[-1]+"' already exists in the target folder '"+original_data['path']+"'.") return ERR_ALREADY_EXISTS # remove the old folder BUT DON'T DELETE THE FILES!!!!!!!!!!! # took me ages to find this when I forgot it.. - remove_folder(flat_structure, tree,original_path, false) + remove_folder(flat_structure, tree,original_data, false) # add the new folder - var folder_name = destination_path['path'].split("/")[-1] + var folder_name = destination_data['path'].split("/")[-1] - add_folder(flat_structure, tree, destination_path, new_path) + add_folder(flat_structure, tree, destination_data, new_path) DialogicResources.save_resource_folder_flat_structure(flat_structure) From 29c1f3a9bdc2d6b9282b7781d08f9010ac4e0c1e Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Sun, 26 Feb 2023 00:14:17 -0700 Subject: [PATCH 27/54] starting to create files in the new flat structure --- addons/dialogic/Editor/MasterTree/MasterTree.gd | 4 ++-- addons/dialogic/Other/DialogicUtil.gd | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index bff4ef4db..509617cec 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -766,8 +766,8 @@ func _on_DocumentationPopupMenu_id_pressed(id): # it will be added to the selected folder (if it's a timeline folder) or the Timeline root folder func new_timeline(): var timeline = editor_reference.get_node('MainPanel/TimelineEditor').create_timeline() - var folder = get_item_folder(get_selected(), "Timelines") - DialogicUtil.add_file_to_folder(folder, timeline['metadata']['file']) + var folder = get_selected().get_metadata(0) + DialogicUtil.add_file_to_folder(editor_reference.flat_structure, "Timelines",folder, timeline['metadata']['file']) build_timelines(timeline['metadata']['file']) rename_selected() diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index 6ad9fa3d4..1a716a41f 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -321,12 +321,15 @@ static func move_folder_to_folder(flat_structure:Dictionary, tree:String, origin ## FILE FUNCTIONS static func move_file_to_folder(file_name, orig_folder, target_folder): remove_file_from_folder(orig_folder, file_name) - add_file_to_folder(target_folder, file_name) + #add_file_to_folder(target_folder, file_name) -static func add_file_to_folder(folder_path, file_name): - var folder_data = get_folder_at_path(folder_path) - folder_data["files"].append(file_name) - set_folder_at_path(folder_path, folder_data) +static func add_file_to_folder(flat_structure:Dictionary, tree:String, path:Dictionary, file_name:String): + var new_data = {} + new_data['key'] = path['path'] + "/" + path['name'] + file_name + new_data['value'] = {'name': file_name, "color": null, 'file': file_name, 'path': new_data['key']} + flat_structure[tree + "_Array"].insert(path['step'] + 1, new_data) + flat_structure = editor_array_to_flat_structure(flat_structure,tree) + DialogicResources.save_resource_folder_flat_structure(flat_structure) static func remove_file_from_folder(folder_path, file_name): var folder_data = get_folder_at_path(folder_path) From 4031a42e22dd0242f58d808d7fe1e39423a8be03 Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Sun, 26 Feb 2023 09:40:09 -0700 Subject: [PATCH 28/54] converting the file functions. nothings tested yet --- .../dialogic/Editor/MasterTree/MasterTree.gd | 24 ++++++------- addons/dialogic/Other/DialogicUtil.gd | 35 +++++++++++++------ 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index 509617cec..c06cac864 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -776,8 +776,8 @@ func new_timeline(): # it will be added to the selected folder (if it's a character folder) or the Character root folder func new_character(): var character = editor_reference.get_node("MainPanel/CharacterEditor").create_character() - var folder = get_item_folder(get_selected(), "Characters") - DialogicUtil.add_file_to_folder(folder, character['metadata']['file']) + var folder = get_selected().get_metadata(0) + DialogicUtil.add_file_to_folder(editor_reference.flat_structure, "Characters",folder, character['metadata']['file']) build_characters(character['metadata']['file']) rename_selected() @@ -785,8 +785,8 @@ func new_character(): # it will be added to the selected folder (if it's a theme folder) or the Theme root folder func new_theme(): var theme_file = editor_reference.get_node("MainPanel/ThemeEditor").create_theme() - var folder = get_item_folder(get_selected(), "Themes") - DialogicUtil.add_file_to_folder(folder, theme_file) + var folder = get_selected().get_metadata(0) + DialogicUtil.add_file_to_folder(editor_reference.flat_structure, "Themes",folder, theme_file) build_themes(theme_file) rename_selected() @@ -794,8 +794,8 @@ func new_theme(): # it will be added to the selected folder (if it's a definition folder) or the Definition root folder func new_value_definition(): var definition_id = editor_reference.get_node("MainPanel/ValueEditor").create_value() - var folder = get_item_folder(get_selected(), "Definitions") - DialogicUtil.add_file_to_folder(folder, definition_id) + var folder = get_selected().get_metadata(0) + DialogicUtil.add_file_to_folder(editor_reference.flat_structure, "Definitions",folder, definition_id) build_definitions(definition_id) rename_selected() @@ -803,8 +803,8 @@ func new_value_definition(): # it will be added to the selected folder (if it's a definition folder) or the Definition root folder func new_glossary_entry(): var definition_id = editor_reference.get_node("MainPanel/GlossaryEntryEditor").create_glossary_entry() - var folder = get_item_folder(get_selected(), "Definitions") - DialogicUtil.add_file_to_folder(folder, definition_id) + var folder = get_selected().get_metadata(0) + DialogicUtil.add_file_to_folder(editor_reference.flat_structure, "Definitions",folder, definition_id) build_definitions(definition_id) rename_selected() @@ -851,19 +851,19 @@ func drop_data(position, data): if data['item_type'] == 'folder': # on a folder if 'Root' in item.get_metadata(0)['editor']: - DialogicUtil.move_folder_to_folder(editor_reference.flat_structure, item.get_metadata(0)['category'], data['orig_path'], item.get_metadata(0)) + DialogicUtil.move_folder_to_folder(editor_reference.flat_structure, item.get_metadata(0)['category'], data, item.get_metadata(0)) # dragging a file elif data['item_type'] == 'file': # on a folder if 'Root' in item.get_metadata(0)['editor']: if data.has('file_name'): - DialogicUtil.move_file_to_folder(data['file_name'], data['orig_path'], get_item_folder(item, data['orig_path'].split('/')[0])) + DialogicUtil.move_file_to_folder(editor_reference.flat_structure, item.get_metadata(0)['category'], data, item.get_metadata(0)) elif data.has('resource_id'): - DialogicUtil.move_file_to_folder(data['resource_id'], data['orig_path'], get_item_folder(item, data['orig_path'].split('/')[0])) + DialogicUtil.move_file_to_folder(editor_reference.flat_structure, item.get_metadata(0)['category'], data, item.get_metadata(0)) pass # WORK TODO # on a file else: - DialogicUtil.move_file_to_folder(data['file_name'], data['orig_path'], get_item_folder(item, data['orig_path'].split('/')[0])) + DialogicUtil.move_file_to_folder(editor_reference.flat_structure, item.get_metadata(0)['category'], data, item.get_metadata(0)) dragging_item.queue_free() dragging_item = null build_full_tree() diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index 1a716a41f..bbac4195f 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -319,22 +319,35 @@ static func move_folder_to_folder(flat_structure:Dictionary, tree:String, origin return OK ## FILE FUNCTIONS -static func move_file_to_folder(file_name, orig_folder, target_folder): - remove_file_from_folder(orig_folder, file_name) +static func move_file_to_folder(flat_structure:Dictionary, tree:String, original_data:Dictionary, destination_data:Dictionary): + #remove_file_from_folder(orig_folder, file_name) #add_file_to_folder(target_folder, file_name) + remove_file_from_folder(flat_structure, tree,original_data) + add_file_to_folder(flat_structure,tree,destination_data, "",original_data) + + flat_structure = editor_array_to_flat_structure(flat_structure, tree) + DialogicResources.save_resource_folder_flat_structure(flat_structure) -static func add_file_to_folder(flat_structure:Dictionary, tree:String, path:Dictionary, file_name:String): - var new_data = {} - new_data['key'] = path['path'] + "/" + path['name'] + file_name - new_data['value'] = {'name': file_name, "color": null, 'file': file_name, 'path': new_data['key']} - flat_structure[tree + "_Array"].insert(path['step'] + 1, new_data) +static func add_file_to_folder(flat_structure:Dictionary, tree:String, path:Dictionary, file_name:String, existing_data:Dictionary = {}): + if existing_data.empty(): + var new_data = {} + new_data['key'] = path['path'] + "/" + path['name'] + file_name + new_data['value'] = {'name': file_name, "color": null, 'file': file_name, 'path': new_data['key']} + flat_structure[tree + "_Array"].insert(path['step'] + 1, new_data) + else: + existing_data['key'] = path['path'] + "/" + existing_data['value']['name'] + existing_data['value']['path'] = path['path'] + flat_structure[tree + "_Array"].insert(path['step'] + 1, existing_data) + flat_structure = editor_array_to_flat_structure(flat_structure,tree) DialogicResources.save_resource_folder_flat_structure(flat_structure) -static func remove_file_from_folder(folder_path, file_name): - var folder_data = get_folder_at_path(folder_path) - folder_data["files"].erase(file_name) - set_folder_at_path(folder_path, folder_data) +static func remove_file_from_folder(flat_structure:Dictionary, tree:String, path:Dictionary): + flat_structure[tree +"_Array"].remove(path['step']) + + flat_structure = editor_array_to_flat_structure(flat_structure, tree) + DialogicResources.save_resource_folder_flat_structure(flat_structure) + ## STRUCTURE UPDATES From 8bf4779593d824aceab1f95987225418bd694bcc Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Sun, 26 Feb 2023 09:41:24 -0700 Subject: [PATCH 29/54] too many save operations --- addons/dialogic/Other/DialogicUtil.gd | 3 --- 1 file changed, 3 deletions(-) diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index bbac4195f..4552543da 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -324,9 +324,6 @@ static func move_file_to_folder(flat_structure:Dictionary, tree:String, original #add_file_to_folder(target_folder, file_name) remove_file_from_folder(flat_structure, tree,original_data) add_file_to_folder(flat_structure,tree,destination_data, "",original_data) - - flat_structure = editor_array_to_flat_structure(flat_structure, tree) - DialogicResources.save_resource_folder_flat_structure(flat_structure) static func add_file_to_folder(flat_structure:Dictionary, tree:String, path:Dictionary, file_name:String, existing_data:Dictionary = {}): if existing_data.empty(): From 80feb391e5267443cef1a0cc6c20680bf294315b Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Sun, 26 Feb 2023 21:16:02 -0700 Subject: [PATCH 30/54] rearrange tree to match previous order (folders first files after), more functiosn converted --- .../dialogic/Editor/MasterTree/MasterTree.gd | 28 +++------- addons/dialogic/Other/DialogicResources.gd | 11 ++-- addons/dialogic/Other/DialogicUtil.gd | 53 +++++++++++++------ 3 files changed, 53 insertions(+), 39 deletions(-) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index c06cac864..fe91d1a16 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -209,7 +209,7 @@ func build_flat_tree_items(current_tree: String=''): folder_item.set_icon_modulate(0, get_color("folder_icon_modulate", "FileDialog")) # set metadata var stripped_path = entry['key'].rstrip("/.").rstrip(folder_name) - folder_item.set_metadata(0, {'editor': editor, 'editable': true, "path": stripped_path, "name": folder_name, "category": current_tree, 'step': step}) + folder_item.set_metadata(0, {'editor': editor, 'editable': true, "path": stripped_path, "name": folder_name, "category": current_tree.rstrip('_Array'), 'step': step}) # set collapsed folder_item.collapsed = entry['value']['folded'] current_root = folder_item @@ -220,7 +220,7 @@ func build_flat_tree_items(current_tree: String=''): var resource_data = entry['value'] var item = tree.create_item(current_root) - item['resource_data']= current_tree + resource_data['category']= current_tree.rstrip('_Array') # set the text if resource_data.has('name'): item.set_text(0, resource_data['name']) @@ -363,41 +363,29 @@ func _add_resource_item(resource_type, parent_item, resource_data, select): func build_timelines(selected_item: String=''): _clear_tree_children(timelines_tree) - DialogicUtil.update_resource_folder_structure() - var structure = DialogicUtil.get_timelines_folder_structure() - build_resource_folder(timelines_tree, structure, selected_item, "Timeline Root", "Timeline") - + build_flat_tree_items("Timelines") ## CHARACTERS func build_characters(selected_item: String=''): _clear_tree_children(characters_tree) - DialogicUtil.update_resource_folder_structure() - var structure = DialogicUtil.get_characters_folder_structure() - build_resource_folder(characters_tree, structure, selected_item, "Character Root", "Character") - + build_flat_tree_items("Characters") ## DEFINTIONS func build_definitions(selected_item: String=''): _clear_tree_children(definitions_tree) - DialogicUtil.update_resource_folder_structure() - var structure = DialogicUtil.get_definitions_folder_structure() - build_resource_folder(definitions_tree, structure, selected_item, "Definition Root", "Definition") - + build_flat_tree_items("Definitions") ## THEMES func build_themes(selected_item: String=''): _clear_tree_children(themes_tree) - DialogicUtil.update_resource_folder_structure() - var structure = DialogicUtil.get_theme_folder_structure() - build_resource_folder(themes_tree, structure, selected_item, "Theme Root", "Theme") - + build_flat_tree_items("Themes") func _on_item_collapsed(item: TreeItem): if filter_tree_term.empty() and item != null and 'Root' in item.get_metadata(0)['editor'] and not 'Documentation' in item.get_metadata(0)['editor']: - DialogicUtil.set_folder_meta(get_item_folder(item, ''), 'folded', item.collapsed) + DialogicUtil.set_folder_meta(editor_reference.flat_structure, item.get_metadata(0), 'folded', item.collapsed) func build_documentation(selected_item: String=''): var child = documentation_tree.get_children() @@ -769,7 +757,7 @@ func new_timeline(): var folder = get_selected().get_metadata(0) DialogicUtil.add_file_to_folder(editor_reference.flat_structure, "Timelines",folder, timeline['metadata']['file']) build_timelines(timeline['metadata']['file']) - rename_selected() + #rename_selected() # creates a new character and opens it diff --git a/addons/dialogic/Other/DialogicResources.gd b/addons/dialogic/Other/DialogicResources.gd index 2d9227258..45b35f73d 100644 --- a/addons/dialogic/Other/DialogicResources.gd +++ b/addons/dialogic/Other/DialogicResources.gd @@ -558,6 +558,9 @@ static func save_resource_folder_flat_structure(flat_tree) -> Dictionary: static func recursive_search(currentCheck, currentDictionary, currentFolder, structure_dictionary): structure_dictionary[currentCheck][currentFolder + "."] = currentDictionary['metadata'] + for structureFolder in currentDictionary["folders"]: + recursive_search(currentCheck, currentDictionary["folders"][structureFolder], currentFolder + structureFolder + "/", structure_dictionary) + for structureFile in currentDictionary["files"]: match currentCheck: "Timelines": structure_dictionary['Timelines'][structureFile] = currentFolder @@ -565,9 +568,6 @@ static func recursive_search(currentCheck, currentDictionary, currentFolder, str "Definitions": structure_dictionary['Definitions'][structureFile] = currentFolder "Themes": structure_dictionary['Themes'][structureFile] = currentFolder - for structureFolder in currentDictionary["folders"]: - recursive_search(currentCheck, currentDictionary["folders"][structureFolder], currentFolder + structureFolder + "/", structure_dictionary) - return structure_dictionary static func recursive_build(build_path, meta, current_dictionary): @@ -581,7 +581,7 @@ static func recursive_build(build_path, meta, current_dictionary): current_dictionary['folders'][current_step] = recursive_build(build_path.split('/', true, 1)[1], meta,current_dictionary['folders'][current_step]) - return current_dictionary + return current_dictionary else: if build_path == ".": current_dictionary['metadata'] = meta @@ -589,3 +589,6 @@ static func recursive_build(build_path, meta, current_dictionary): current_dictionary['files'].append(meta['file']) return current_dictionary + + + diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index 4552543da..dd8457fcb 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -232,10 +232,11 @@ static func set_folder_at_path(path: String, data:Dictionary): return OK ## FOLDER METADATA -static func set_folder_meta(folder_path: String, key:String, value): - var data = get_folder_at_path(folder_path) - data['metadata'][key] = value - set_folder_at_path(folder_path, data) +static func set_folder_meta(flat_structure:Dictionary, item: Dictionary, key:String, value): + flat_structure[item['category'] + "_Array"][item['step']]['value'][key] = value + + flat_structure = editor_array_to_flat_structure(flat_structure,item['category']) + DialogicResources.save_resource_folder_flat_structure(flat_structure) static func get_folder_meta(folder_path: String, key:String): return get_folder_at_path(folder_path)['metadata'][key] @@ -326,13 +327,31 @@ static func move_file_to_folder(flat_structure:Dictionary, tree:String, original add_file_to_folder(flat_structure,tree,destination_data, "",original_data) static func add_file_to_folder(flat_structure:Dictionary, tree:String, path:Dictionary, file_name:String, existing_data:Dictionary = {}): + var insert_position_data = flat_structure[tree + "_Array"][path['step']] + if existing_data.empty(): var new_data = {} - new_data['key'] = path['path'] + "/" + path['name'] + file_name - new_data['value'] = {'name': file_name, "color": null, 'file': file_name, 'path': new_data['key']} + if "/." in insert_position_data['key']: + new_data['key'] = insert_position_data['key'].rstrip('.') + file_name + new_data['value'] = {'category': tree, 'name': file_name, "color": null, 'file': file_name, 'path': insert_position_data['key'].rstrip('.')} + else: + new_data['key'] = insert_position_data['value']['path'] + file_name + new_data['value'] = {'category': tree, 'name': file_name, "color": null, 'file': file_name, 'path': insert_position_data['value']['path']} + + print(" ") + print(path) + print(file_name) + print(new_data['key']) + print(" ") + print("Existing:") + print(flat_structure[tree + "_Array"][path['step']]) + + print("New:") + print(new_data) flat_structure[tree + "_Array"].insert(path['step'] + 1, new_data) else: existing_data['key'] = path['path'] + "/" + existing_data['value']['name'] + print(existing_data['key']) existing_data['value']['path'] = path['path'] flat_structure[tree + "_Array"].insert(path['step'] + 1, existing_data) @@ -689,21 +708,25 @@ static func get_flat_folders_list() -> Dictionary: # populate the data from the resources for timeline in timeline_list: - timeline['path'] = structure['Timelines'][timeline['file']] + timeline['name'] - structure['Timelines'][timeline['file']]= timeline + if timeline['file'] in structure['Timelines']: + timeline['path'] = structure['Timelines'][timeline['file']] + timeline['name'] + structure['Timelines'][timeline['file']]= timeline for character in character_list: - character['path'] = structure['Characters'][character['file']] + character['name'] - structure['Characters'][character['file']]= character + if character['file'] in structure['Characters']: + character['path'] = structure['Characters'][character['file']] + character['name'] + structure['Characters'][character['file']]= character for definition in definition_list: - definition['path'] = structure['Definitions'][definition['id']] + definition['name'] - structure['Definitions'][definition['id']]= definition - definition['file'] = definition['id'] + if definition['id'] in structure['Definitions']: + definition['path'] = structure['Definitions'][definition['id']] + definition['name'] + structure['Definitions'][definition['id']]= definition + definition['file'] = definition['id'] for theme in theme_list: - theme['path'] = structure['Themes'][theme['file']] + theme['name'] - structure['Themes'][theme['file']]= theme + if theme['file'] in structure['Themes']: + theme['path'] = structure['Themes'][theme['file']] + theme['name'] + structure['Themes'][theme['file']]= theme # After that we put them in the order we need to make the folder paths easiest to use for timeline in structure['Timelines'].keys(): From f58acfe6fb0c8d180dcd538800454391ef8e967d Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Sun, 26 Feb 2023 21:34:29 -0700 Subject: [PATCH 31/54] fix on add folder path error, make renames on files work in editor tree, disable automatic rename --- addons/dialogic/Editor/MasterTree/MasterTree.gd | 15 ++++++++++----- addons/dialogic/Other/DialogicUtil.gd | 7 +++++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index fe91d1a16..03ee66b4d 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -767,7 +767,7 @@ func new_character(): var folder = get_selected().get_metadata(0) DialogicUtil.add_file_to_folder(editor_reference.flat_structure, "Characters",folder, character['metadata']['file']) build_characters(character['metadata']['file']) - rename_selected() + #rename_selected() # creates a new theme and opens it # it will be added to the selected folder (if it's a theme folder) or the Theme root folder @@ -776,7 +776,7 @@ func new_theme(): var folder = get_selected().get_metadata(0) DialogicUtil.add_file_to_folder(editor_reference.flat_structure, "Themes",folder, theme_file) build_themes(theme_file) - rename_selected() + #rename_selected() # creates a new value and opens it # it will be added to the selected folder (if it's a definition folder) or the Definition root folder @@ -785,7 +785,7 @@ func new_value_definition(): var folder = get_selected().get_metadata(0) DialogicUtil.add_file_to_folder(editor_reference.flat_structure, "Definitions",folder, definition_id) build_definitions(definition_id) - rename_selected() + #rename_selected() # creates a new glossary entry and opens it # it will be added to the selected folder (if it's a definition folder) or the Definition root folder @@ -794,7 +794,7 @@ func new_glossary_entry(): var folder = get_selected().get_metadata(0) DialogicUtil.add_file_to_folder(editor_reference.flat_structure, "Definitions",folder, definition_id) build_definitions(definition_id) - rename_selected() + #rename_selected() func remove_selected(): @@ -915,25 +915,30 @@ func _on_item_edited(): var metadata = item.get_metadata(0) if metadata['editor'] == 'Timeline': timeline_editor.timeline_name = item.get_text(0) + editor_reference.flat_structure['Timelines_Array'][metadata['step']]['value']['name'] = item.get_text(0) save_current_resource() build_timelines(metadata['file']) if metadata['editor'] == 'Theme': DialogicResources.set_theme_value(metadata['file'], 'settings', 'name', item.get_text(0)) + editor_reference.flat_structure['Themes_Array'][metadata['step']]['value']['name'] = item.get_text(0) build_themes(metadata['file']) if metadata['editor'] == 'Character': character_editor.nodes['name'].text = item.get_text(0) + editor_reference.flat_structure['Characters_Array'][metadata['step']]['value']['name'] = item.get_text(0) save_current_resource() build_characters(metadata['file']) if metadata['editor'] == 'Value': value_editor.nodes['name'].text = item.get_text(0) # Not sure why this signal doesn't triggers value_editor._on_name_changed(item.get_text(0)) + editor_reference.flat_structure['Definitions_Array'][metadata['step']]['value']['name'] = item.get_text(0) save_current_resource() build_definitions(metadata['id']) if metadata['editor'] == 'GlossaryEntry': glossary_entry_editor.nodes['name'].text = item.get_text(0) # Not sure why this signal doesn't triggers glossary_entry_editor._on_name_changed(item.get_text(0)) + editor_reference.flat_structure['Definitions_Array'][metadata['step']]['value']['name'] = item.get_text(0) save_current_resource() build_definitions(metadata['id']) @@ -942,7 +947,7 @@ func _on_item_edited(): return var result = DialogicUtil.rename_folder(editor_reference.flat_structure, "tree", item_path_before_edit, item.get_text(0)) if result != OK: - item.set_text(0, item_path_before_edit.split("/")[-1]) + item.set_text(0, item.get_text(0)) ## ***************************************************************************** ## AUTO SAVING diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index dd8457fcb..fb37b4071 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -244,9 +244,12 @@ static func get_folder_meta(folder_path: String, key:String): ## FOLDER FUNCTIONS static func add_folder(flat_structure:Dictionary, tree:String, path:Dictionary, folder_name:String): - # check if the name is allowed - var new_path = path['path'] + "/" + path['name'] + "/" + folder_name + "/." + print(path) + #first find the parent folder from here + # check if the name is allowed + var new_path = path['path'] + path['name'] + "/" + folder_name + "/." + print(new_path) if new_path in flat_structure[tree]: print("[D] A folder with the name '"+folder_name+"' already exists in the target folder '"+path['path']+"'.") return ERR_ALREADY_EXISTS From 405663addd32e9963200ab722104950b1abdb7ca Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Mon, 27 Feb 2023 09:05:35 -0700 Subject: [PATCH 32/54] fix from @zaknafean for Discord bug #1 --- addons/dialogic/Editor/MasterTree/MasterTree.gd | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index 03ee66b4d..05bd9109a 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -304,7 +304,7 @@ func _add_folder_item(parent_item: TreeItem, folder_name: String, editor:String, var folder_item:TreeItem= tree.create_item(parent_item) print(parent_item.get_metadata(0)) var parent_path = parent_item.get_metadata(0)['path'] - var current_tree = parent_item.get_metadata(0)['category'] + var current_tree = parent_item.get_metadata(0)['category'].rstrip("_Array") # set text and icon folder_item.set_text(0, folder_name) folder_item.set_icon(0, get_icon("Folder", "EditorIcons")) @@ -799,9 +799,10 @@ func new_glossary_entry(): func remove_selected(): var item = get_selected() - item.free() - timelines_tree.select(0) + var folder = get_selected().get_metadata(0) + DialogicUtil.remove_file_from_folder(editor_reference.flat_structure, folder['category'], folder) settings_editor.update_data() + build_flat_tree_items(folder['category']) func rename_selected(): From 00a573cf683ca7d342a4748818b440e995438359 Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Mon, 27 Feb 2023 09:27:18 -0700 Subject: [PATCH 33/54] fix part 2 for Discord bug #1, add type of file or folder to list items --- addons/dialogic/Editor/MasterTree/MasterTree.gd | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index 05bd9109a..e5698af37 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -209,7 +209,7 @@ func build_flat_tree_items(current_tree: String=''): folder_item.set_icon_modulate(0, get_color("folder_icon_modulate", "FileDialog")) # set metadata var stripped_path = entry['key'].rstrip("/.").rstrip(folder_name) - folder_item.set_metadata(0, {'editor': editor, 'editable': true, "path": stripped_path, "name": folder_name, "category": current_tree.rstrip('_Array'), 'step': step}) + folder_item.set_metadata(0, {'editor': editor,'type': 'folder', 'editable': true, "path": stripped_path, "name": folder_name, "category": current_tree.rstrip('_Array'), 'step': step}) # set collapsed folder_item.collapsed = entry['value']['folded'] current_root = folder_item @@ -221,6 +221,7 @@ func build_flat_tree_items(current_tree: String=''): var item = tree.create_item(current_root) resource_data['category']= current_tree.rstrip('_Array') + resource_data['type'] = 'folder' # set the text if resource_data.has('name'): item.set_text(0, resource_data['name']) @@ -310,7 +311,7 @@ func _add_folder_item(parent_item: TreeItem, folder_name: String, editor:String, folder_item.set_icon(0, get_icon("Folder", "EditorIcons")) folder_item.set_icon_modulate(0, get_color("folder_icon_modulate", "FileDialog")) # set metadata - folder_item.set_metadata(0, {'editor': editor, 'editable': true, "name": folder_name, "path:": parent_path, "category": current_tree}) + folder_item.set_metadata(0, {'editor': editor,'type':'folder', 'editable': true, "name": folder_name, "path:": parent_path, "category": current_tree}) # set collapsed if filter_tree_term.empty(): folder_item.collapsed = meta_folder_info['folded'] @@ -321,6 +322,7 @@ func _add_folder_item(parent_item: TreeItem, folder_name: String, editor:String, func _add_resource_item(resource_type, parent_item, resource_data, select): resource_data['category'] = resource_type + resource_data['type'] = 'file' # create item var item = tree.create_item(parent_item) # set the text @@ -800,7 +802,10 @@ func new_glossary_entry(): func remove_selected(): var item = get_selected() var folder = get_selected().get_metadata(0) - DialogicUtil.remove_file_from_folder(editor_reference.flat_structure, folder['category'], folder) + if folder['type'] == "folder": + DialogicUtil.remove_folder(editor_reference.flat_structure, folder['category'], folder, false) + else: + DialogicUtil.remove_file_from_folder(editor_reference.flat_structure, folder['category'], folder) settings_editor.update_data() build_flat_tree_items(folder['category']) From 343ba089f7e03f5a7ec3a171de22d4fbd92b255f Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Mon, 27 Feb 2023 21:28:25 -0700 Subject: [PATCH 34/54] several Discord bug fixes, plus coloring the characters --- .../Editor/CharacterEditor/CharacterEditor.gd | 4 +++- addons/dialogic/Editor/EditorView.gd | 3 +-- .../dialogic/Editor/MasterTree/MasterTree.gd | 21 ++++++++++++++----- addons/dialogic/Other/DialogicUtil.gd | 13 ++++++------ 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/addons/dialogic/Editor/CharacterEditor/CharacterEditor.gd b/addons/dialogic/Editor/CharacterEditor/CharacterEditor.gd index 564b83a4d..a3bd861b8 100644 --- a/addons/dialogic/Editor/CharacterEditor/CharacterEditor.gd +++ b/addons/dialogic/Editor/CharacterEditor/CharacterEditor.gd @@ -299,7 +299,9 @@ func _input(event): func _on_color_changed(color): var item = master_tree.get_selected() - item.set_icon_modulate(0, color) + if !item == null: + self.set_meta('current_color', color) + item.set_icon_modulate(0, color) diff --git a/addons/dialogic/Editor/EditorView.gd b/addons/dialogic/Editor/EditorView.gd index 47b26a51c..a766cea4a 100644 --- a/addons/dialogic/Editor/EditorView.gd +++ b/addons/dialogic/Editor/EditorView.gd @@ -139,8 +139,7 @@ func popup_remove_confirmation(what): func _on_RemoveFolderConfirmation_confirmed(): var item_data = $MainPanel/MasterTreeContainer/MasterTree.get_selected().get_metadata(0) - DialogicUtil.remove_folder(flat_structure, "tree", item_data) - $MainPanel/MasterTreeContainer/MasterTree.build_full_tree() + $MainPanel/MasterTreeContainer/MasterTree.remove_selected() func _on_RemoveConfirmation_confirmed(what: String = ''): diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index e5698af37..14ade5836 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -209,7 +209,7 @@ func build_flat_tree_items(current_tree: String=''): folder_item.set_icon_modulate(0, get_color("folder_icon_modulate", "FileDialog")) # set metadata var stripped_path = entry['key'].rstrip("/.").rstrip(folder_name) - folder_item.set_metadata(0, {'editor': editor,'type': 'folder', 'editable': true, "path": stripped_path, "name": folder_name, "category": current_tree.rstrip('_Array'), 'step': step}) + folder_item.set_metadata(0, {'editor': editor,'editortype': 'folder', 'editable': true, "path": stripped_path, "name": folder_name, "category": current_tree.rstrip('_Array'), 'step': step}) # set collapsed folder_item.collapsed = entry['value']['folded'] current_root = folder_item @@ -221,7 +221,7 @@ func build_flat_tree_items(current_tree: String=''): var item = tree.create_item(current_root) resource_data['category']= current_tree.rstrip('_Array') - resource_data['type'] = 'folder' + resource_data['editortype'] = 'file' # set the text if resource_data.has('name'): item.set_text(0, resource_data['name']) @@ -311,7 +311,7 @@ func _add_folder_item(parent_item: TreeItem, folder_name: String, editor:String, folder_item.set_icon(0, get_icon("Folder", "EditorIcons")) folder_item.set_icon_modulate(0, get_color("folder_icon_modulate", "FileDialog")) # set metadata - folder_item.set_metadata(0, {'editor': editor,'type':'folder', 'editable': true, "name": folder_name, "path:": parent_path, "category": current_tree}) + folder_item.set_metadata(0, {'editor': editor,'editortype':'folder', 'editable': true, "name": folder_name, "path:": parent_path, "category": current_tree}) # set collapsed if filter_tree_term.empty(): folder_item.collapsed = meta_folder_info['folded'] @@ -322,7 +322,7 @@ func _add_folder_item(parent_item: TreeItem, folder_name: String, editor:String, func _add_resource_item(resource_type, parent_item, resource_data, select): resource_data['category'] = resource_type - resource_data['type'] = 'file' + resource_data['editortype'] = 'file' # create item var item = tree.create_item(parent_item) # set the text @@ -415,6 +415,7 @@ func _on_item_selected(): show_timeline_editor() 'Character': character_editor.load_character(metadata['file']) + character_editor.set_meta('tree_position', metadata['step']) show_character_editor() 'Value': value_editor.load_definition(metadata['id']) @@ -759,6 +760,7 @@ func new_timeline(): var folder = get_selected().get_metadata(0) DialogicUtil.add_file_to_folder(editor_reference.flat_structure, "Timelines",folder, timeline['metadata']['file']) build_timelines(timeline['metadata']['file']) + hide_all_editors() #rename_selected() @@ -769,6 +771,7 @@ func new_character(): var folder = get_selected().get_metadata(0) DialogicUtil.add_file_to_folder(editor_reference.flat_structure, "Characters",folder, character['metadata']['file']) build_characters(character['metadata']['file']) + hide_all_editors() #rename_selected() # creates a new theme and opens it @@ -778,6 +781,7 @@ func new_theme(): var folder = get_selected().get_metadata(0) DialogicUtil.add_file_to_folder(editor_reference.flat_structure, "Themes",folder, theme_file) build_themes(theme_file) + hide_all_editors() #rename_selected() # creates a new value and opens it @@ -787,6 +791,7 @@ func new_value_definition(): var folder = get_selected().get_metadata(0) DialogicUtil.add_file_to_folder(editor_reference.flat_structure, "Definitions",folder, definition_id) build_definitions(definition_id) + hide_all_editors() #rename_selected() # creates a new glossary entry and opens it @@ -796,17 +801,19 @@ func new_glossary_entry(): var folder = get_selected().get_metadata(0) DialogicUtil.add_file_to_folder(editor_reference.flat_structure, "Definitions",folder, definition_id) build_definitions(definition_id) + hide_all_editors() #rename_selected() func remove_selected(): var item = get_selected() var folder = get_selected().get_metadata(0) - if folder['type'] == "folder": + if folder['editortype'] == "folder": DialogicUtil.remove_folder(editor_reference.flat_structure, folder['category'], folder, false) else: DialogicUtil.remove_file_from_folder(editor_reference.flat_structure, folder['category'], folder) settings_editor.update_data() + hide_all_editors() build_flat_tree_items(folder['category']) @@ -971,6 +978,10 @@ func save_current_resource(): if metadata['editor'] == 'Timeline': timeline_editor.save_timeline() if metadata['editor'] == 'Character': + if character_editor.has_meta('current_color'): + editor_reference.flat_structure['Characters_Array'][character_editor.get_meta('tree_position')]['value']['color'] = character_editor.get_meta('current_color') + else: + character_editor.set_meta('current_color', Color.white) character_editor.save_character() if metadata['editor'] == 'Value': value_editor.save_definition() diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index fb37b4071..d3fe55267 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -233,10 +233,11 @@ static func set_folder_at_path(path: String, data:Dictionary): ## FOLDER METADATA static func set_folder_meta(flat_structure:Dictionary, item: Dictionary, key:String, value): - flat_structure[item['category'] + "_Array"][item['step']]['value'][key] = value - - flat_structure = editor_array_to_flat_structure(flat_structure,item['category']) - DialogicResources.save_resource_folder_flat_structure(flat_structure) + if 'category' in item: + flat_structure[item['category'] + "_Array"][item['step']]['value'][key] = value + + flat_structure = editor_array_to_flat_structure(flat_structure,item['category']) + DialogicResources.save_resource_folder_flat_structure(flat_structure) static func get_folder_meta(folder_path: String, key:String): return get_folder_at_path(folder_path)['metadata'][key] @@ -336,10 +337,10 @@ static func add_file_to_folder(flat_structure:Dictionary, tree:String, path:Dic var new_data = {} if "/." in insert_position_data['key']: new_data['key'] = insert_position_data['key'].rstrip('.') + file_name - new_data['value'] = {'category': tree, 'name': file_name, "color": null, 'file': file_name, 'path': insert_position_data['key'].rstrip('.')} + new_data['value'] = {'category': tree, 'name': file_name, "color": Color.white, 'file': file_name, 'path': insert_position_data['key'].rstrip('.')} else: new_data['key'] = insert_position_data['value']['path'] + file_name - new_data['value'] = {'category': tree, 'name': file_name, "color": null, 'file': file_name, 'path': insert_position_data['value']['path']} + new_data['value'] = {'category': tree, 'name': file_name, "color": Color.white, 'file': file_name, 'path': insert_position_data['value']['path']} print(" ") print(path) From dd5b657801d4a901763d1d941086b149c9465574 Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Mon, 27 Feb 2023 21:32:56 -0700 Subject: [PATCH 35/54] temporarily reverting timeline node cache --- .../Editor/TimelineEditor/TimelineEditor.gd | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd b/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd index 25d4a6dc6..17b554eb3 100644 --- a/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd +++ b/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd @@ -797,29 +797,29 @@ func cancel_drop_event(): # Adding an event to the timeline func create_event(event_id: String, data: Dictionary = {'no-data': true} , indent: bool = false, at_index: int = -1, auto_select: bool = false): var piece = null - # check if it's a custom event if event_id in custom_events.keys(): piece = load(custom_events[event_id]['event_block_scene']).instance() # check if it's a builtin event elif event_id in id_to_scene_name.keys(): - var piece_name = "res://addons/dialogic/Editor/Events/" + id_to_scene_name[event_id] + ".tscn" - if piece_name in editor_reference.editor_scene_cache: - piece = editor_reference.editor_scene_cache[piece_name].instance() - else: - var scene_piece = load("res://addons/dialogic/Editor/Events/" + id_to_scene_name[event_id] + ".tscn") - editor_reference.editor_scene_cache[piece_name] = scene_piece - piece = scene_piece.instance() + piece = load("res://addons/dialogic/Editor/Events/" + id_to_scene_name[event_id] + ".tscn").instance() +# var piece_name = "res://addons/dialogic/Editor/Events/" + id_to_scene_name[event_id] + ".tscn" +# if piece_name in editor_reference.editor_scene_cache: +# piece = editor_reference.editor_scene_cache[piece_name].instance() +# else: +# var scene_piece = load("res://addons/dialogic/Editor/Events/" + id_to_scene_name[event_id] + ".tscn") +# editor_reference.editor_scene_cache[piece_name] = scene_piece +# piece = scene_piece.instance() # else use dummy event else: piece = load("res://addons/dialogic/Editor/Events/DummyEvent.tscn").instance() # load the piece with data piece.editor_reference = editor_reference - + print(editor_reference) if data.has('no-data') == false: piece.event_data = data - + print(piece) if at_index == -1: if len(selected_items) != 0: timeline.add_child_below_node(selected_items[0], piece) From c97b59b6783bc2894a97eade28588f932a4193fb Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Wed, 1 Mar 2023 21:38:04 -0700 Subject: [PATCH 36/54] add path and step to the roots so things can be created off of root --- addons/dialogic/Editor/MasterTree/MasterTree.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index 14ade5836..8709b231e 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -91,7 +91,7 @@ func _ready(): # set info sub_tree.set_text(0, tree_info[0]) sub_tree.collapsed = DialogicUtil.get_folder_meta(tree_info[0], 'folded') - sub_tree.set_metadata(0, {'editor': tree_info[1]}) + sub_tree.set_metadata(0, {'editor': tree_info[1], 'path': '/', 'step': 0}) # set the correct tree variable match tree_info[0]: "Timelines": From 3e8ce0457f5fe427c0b4bc6b59bb9c236a3095c3 Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Thu, 2 Mar 2023 08:58:31 -0700 Subject: [PATCH 37/54] fix creating on roots, plus trying to get the new timelines not a mess --- .../dialogic/Editor/MasterTree/MasterTree.gd | 4 ++- addons/dialogic/Other/DialogicUtil.gd | 27 ++++++++++--------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index 8709b231e..563d679cd 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -91,7 +91,7 @@ func _ready(): # set info sub_tree.set_text(0, tree_info[0]) sub_tree.collapsed = DialogicUtil.get_folder_meta(tree_info[0], 'folded') - sub_tree.set_metadata(0, {'editor': tree_info[1], 'path': '/', 'step': 0}) + sub_tree.set_metadata(0, {'editor': tree_info[1], 'path': '', 'step': 0, "name": ""}) # set the correct tree variable match tree_info[0]: "Timelines": @@ -205,6 +205,7 @@ func build_flat_tree_items(current_tree: String=''): # set text and icon var folder_name = entry['key'].split("/")[-2] folder_item.set_text(0, folder_name) + folder_item.set_tooltip(0, entry['key']) folder_item.set_icon(0, get_icon("Folder", "EditorIcons")) folder_item.set_icon_modulate(0, get_color("folder_icon_modulate", "FileDialog")) # set metadata @@ -261,6 +262,7 @@ func build_flat_tree_items(current_tree: String=''): resource_data['step'] = step item.set_metadata(0, resource_data) + item.set_tooltip(0, entry['key']) func _clear_tree_children(parent: TreeItem): diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index d3fe55267..6e64a96fe 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -332,6 +332,18 @@ static func move_file_to_folder(flat_structure:Dictionary, tree:String, original static func add_file_to_folder(flat_structure:Dictionary, tree:String, path:Dictionary, file_name:String, existing_data:Dictionary = {}): var insert_position_data = flat_structure[tree + "_Array"][path['step']] + var insert_position = path['step'] + #advance the position to scroll past the subfolders if inserting from top of a folder + + var current_position = flat_structure[tree + "_Array"][insert_position]['key'].rstrip("/.") + if insert_position == 0: + current_position = "/" + while insert_position + 1 < flat_structure[tree + "_Array"].size(): + + var next_position = flat_structure[tree + "_Array"][insert_position + 1]['key'] + if next_position.trim_prefix(current_position).count('/') == 0 or next_position.trim_prefix(current_position) == next_position: + break + insert_position = insert_position + 1 if existing_data.empty(): var new_data = {} @@ -342,22 +354,11 @@ static func add_file_to_folder(flat_structure:Dictionary, tree:String, path:Dic new_data['key'] = insert_position_data['value']['path'] + file_name new_data['value'] = {'category': tree, 'name': file_name, "color": Color.white, 'file': file_name, 'path': insert_position_data['value']['path']} - print(" ") - print(path) - print(file_name) - print(new_data['key']) - print(" ") - print("Existing:") - print(flat_structure[tree + "_Array"][path['step']]) - - print("New:") - print(new_data) - flat_structure[tree + "_Array"].insert(path['step'] + 1, new_data) + flat_structure[tree + "_Array"].insert(insert_position + 1, new_data) else: existing_data['key'] = path['path'] + "/" + existing_data['value']['name'] - print(existing_data['key']) existing_data['value']['path'] = path['path'] - flat_structure[tree + "_Array"].insert(path['step'] + 1, existing_data) + flat_structure[tree + "_Array"].insert(insert_position + 1, existing_data) flat_structure = editor_array_to_flat_structure(flat_structure,tree) DialogicResources.save_resource_folder_flat_structure(flat_structure) From 79c8951df9259e04bf8df8a3a379378806b7cfd5 Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Thu, 2 Mar 2023 09:14:06 -0700 Subject: [PATCH 38/54] fixed folder rename fucnction --- addons/dialogic/Editor/MasterTree/MasterTree.gd | 2 +- addons/dialogic/Other/DialogicUtil.gd | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index 563d679cd..9c19a76b3 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -960,7 +960,7 @@ func _on_item_edited(): if "Root" in metadata['editor']: if item.get_text(0) == item_path_before_edit.split("/")[-1]: return - var result = DialogicUtil.rename_folder(editor_reference.flat_structure, "tree", item_path_before_edit, item.get_text(0)) + var result = DialogicUtil.rename_folder(editor_reference.flat_structure, metadata['category'], metadata, item.get_text(0)) if result != OK: item.set_text(0, item.get_text(0)) diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index 6e64a96fe..c07645792 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -284,7 +284,8 @@ static func remove_folder(flat_structure: Dictionary, tree:String, folder_data:D static func rename_folder(flat_structure: Dictionary, tree:String, path:Dictionary, new_folder_name:String): # check if the name is allowed - var new_path = path['path'] + "/" + new_folder_name + "/." + var new_path = path['path'] + new_folder_name + "/." + if new_path in flat_structure[tree]: print("[D] A folder with the name '"+new_folder_name+"' already exists in the target folder '"++path['path']+"'.") From e2723210322d61025b79aaab85df6655c99e8c17 Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Thu, 2 Mar 2023 10:08:08 -0700 Subject: [PATCH 39/54] cascade folder rename changes to children, also rebuild tree to update tooltip --- addons/dialogic/Editor/MasterTree/MasterTree.gd | 2 ++ addons/dialogic/Other/DialogicUtil.gd | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index 9c19a76b3..6a2a7ab26 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -964,6 +964,8 @@ func _on_item_edited(): if result != OK: item.set_text(0, item.get_text(0)) + build_flat_tree_items(metadata['category']) + ## ***************************************************************************** ## AUTO SAVING ## ***************************************************************************** diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index c07645792..413493e1c 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -286,15 +286,18 @@ static func rename_folder(flat_structure: Dictionary, tree:String, path:Dictiona # check if the name is allowed var new_path = path['path'] + new_folder_name + "/." - if new_path in flat_structure[tree]: print("[D] A folder with the name '"+new_folder_name+"' already exists in the target folder '"++path['path']+"'.") return ERR_ALREADY_EXISTS elif new_folder_name.empty(): return ERR_PRINTER_ON_FIRE + var old_path = flat_structure[tree + "_Array"][path['step']]['key'].rstrip("/.") flat_structure[tree + "_Array"][path['step']]['key'] = new_path + for idx in flat_structure[tree + "_Array"].size(): + flat_structure[tree + "_Array"][idx]['key'] = flat_structure[tree + "_Array"][idx]['key'].replace(old_path, new_path.rstrip("/.")) + flat_structure = editor_array_to_flat_structure(flat_structure, tree) DialogicResources.save_resource_folder_flat_structure(flat_structure) From 3ed981c0bf9cd07701309c05ff5b917effba1bad Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Sun, 5 Mar 2023 09:31:40 -0700 Subject: [PATCH 40/54] make search functional, make the state of root's collapse saved, plus fix extra calls to saving from the set meta function --- .../dialogic/Editor/MasterTree/MasterTree.gd | 20 ++++++++++--------- addons/dialogic/Other/DialogicUtil.gd | 7 ++++--- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index 6a2a7ab26..23f5ec1ba 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -91,7 +91,7 @@ func _ready(): # set info sub_tree.set_text(0, tree_info[0]) sub_tree.collapsed = DialogicUtil.get_folder_meta(tree_info[0], 'folded') - sub_tree.set_metadata(0, {'editor': tree_info[1], 'path': '', 'step': 0, "name": ""}) + sub_tree.set_metadata(0, {'editor': tree_info[1], 'path': '', 'step': 0, "name": "", 'category': tree_info[0]}) # set the correct tree variable match tree_info[0]: "Timelines": @@ -193,6 +193,11 @@ func build_flat_tree_items(current_tree: String=''): if entry['key'] == "/.": continue + if (filter_tree_term == '') or (filter_tree_term.to_lower() in entry['key'].to_lower()): + pass + else: + continue + #check where we are in the stack while !(depth_stack[-1]["path"] in entry['key'].rsplit("/", true,1)[0]) and depth_stack.size() > 1: var popped = depth_stack.pop_back() @@ -1007,15 +1012,12 @@ func _on_filter_tree_edit_changed(value): definitions_tree.collapsed = false themes_tree.collapsed = false else: - timelines_tree.collapsed = DialogicUtil.get_folder_meta('Timelines', 'folded') - characters_tree.collapsed = DialogicUtil.get_folder_meta('Timelines', 'folded') - definitions_tree.collapsed = DialogicUtil.get_folder_meta('Timelines', 'folded') - themes_tree.collapsed = DialogicUtil.get_folder_meta('Timelines', 'folded') + timelines_tree.collapsed = editor_reference.flat_structure['Timelines']['/.']['folded'] + characters_tree.collapsed = editor_reference.flat_structure['Characters']['/.']['folded'] + definitions_tree.collapsed = editor_reference.flat_structure['Definitions']['/.']['folded'] + themes_tree.collapsed = editor_reference.flat_structure['Themes']['/.']['folded'] - if get_selected(): - build_full_tree(get_selected().get_metadata(0).get('file', '')) - else: - build_full_tree() + build_full_tree() # This was merged, not sure if it is properly placed build_documentation() diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index 413493e1c..44a41654f 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -234,10 +234,11 @@ static func set_folder_at_path(path: String, data:Dictionary): ## FOLDER METADATA static func set_folder_meta(flat_structure:Dictionary, item: Dictionary, key:String, value): if 'category' in item: - flat_structure[item['category'] + "_Array"][item['step']]['value'][key] = value + if flat_structure[item['category'] + "_Array"][item['step']]['value'][key] != value: + flat_structure[item['category'] + "_Array"][item['step']]['value'][key] = value - flat_structure = editor_array_to_flat_structure(flat_structure,item['category']) - DialogicResources.save_resource_folder_flat_structure(flat_structure) + flat_structure = editor_array_to_flat_structure(flat_structure,item['category']) + DialogicResources.save_resource_folder_flat_structure(flat_structure) static func get_folder_meta(folder_path: String, key:String): return get_folder_at_path(folder_path)['metadata'][key] From 0b7e9c667cfd1aa9917a51d310ecd55d839c071d Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Sun, 5 Mar 2023 18:30:51 -0700 Subject: [PATCH 41/54] fix crash on loading with blank or incorrect timeline names --- addons/dialogic/Other/DialogicClass.gd | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/addons/dialogic/Other/DialogicClass.gd b/addons/dialogic/Other/DialogicClass.gd index 547774527..8b9fffde9 100644 --- a/addons/dialogic/Other/DialogicClass.gd +++ b/addons/dialogic/Other/DialogicClass.gd @@ -100,10 +100,20 @@ static func start(timeline: String = '', default_timeline: String ='', dialog_sc # else get the file from the name var timeline_file = _get_timeline_file_from_name(timeline) - if timeline_file: + if timeline_file != "": dialog_node.timeline = timeline_file dialog_node.timeline_name = timeline return returned_dialog_node + else: + dialog_node.dialog_script = { + "events":[ + {"event_id":'dialogic_001', + "character":"", + "portrait":"", + "text":"[Dialogic Error] Loading dialog [color=red]" + timeline + "[/color]. It seems like the timeline doesn't exists. Maybe the name is wrong?" + }] + } + return returned_dialog_node # Just in case everything else fails. return returned_dialog_node @@ -149,7 +159,7 @@ static func next_event(discreetly: bool = false): ## does not. static func timeline_exists(timeline: String): var timeline_file = _get_timeline_file_from_name(timeline) - if timeline_file: + if timeline_file != "": return true else: return false @@ -465,6 +475,9 @@ static func set_variable_from_id(id: String, value: String, operation: String) - # tries to find the path of a given timeline static func _get_timeline_file_from_name(timeline_name_path: String) -> String: + if timeline_name_path == "": + return "" + #First add the leading slash if it is missing so algorithm works properly if(timeline_name_path.left(1) != '/'): timeline_name_path = "/" + timeline_name_path @@ -476,7 +489,11 @@ static func _get_timeline_file_from_name(timeline_name_path: String) -> String: var timelines = Engine.get_main_loop().get_meta('dialogic_tree')['Timelines'] if timeline_name_path in timelines: - return timelines[timeline_name_path]['file'] + if 'file' in timelines[timeline_name_path]: + return timelines[timeline_name_path]['file'] + else: + #return an invalid filename + return "not_found.json" else: #step through each one in turn to find the first matching string for path in timelines.keys(): From 4a37996ed9f4f62f8a516ac9e8e4994bee78dce6 Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Sun, 5 Mar 2023 18:44:55 -0700 Subject: [PATCH 42/54] clear the selection on renames --- addons/dialogic/Editor/MasterTree/MasterTree.gd | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index 23f5ec1ba..71c6761b0 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -828,6 +828,7 @@ func rename_selected(): yield(get_tree(), "idle_frame") _start_rename() edit_selected() + hide_all_editors() ## ***************************************************************************** ## DRAGGING ITEMS @@ -969,7 +970,10 @@ func _on_item_edited(): if result != OK: item.set_text(0, item.get_text(0)) + build_flat_tree_items(metadata['category']) + + hide_all_editors() ## ***************************************************************************** ## AUTO SAVING From 0a1f4ac5d1a8273863a23dd17e27cc0b832e786f Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Mon, 6 Mar 2023 21:10:09 -0700 Subject: [PATCH 43/54] fix Dialogic.start() so it will check the right variable --- addons/dialogic/Other/DialogicClass.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/dialogic/Other/DialogicClass.gd b/addons/dialogic/Other/DialogicClass.gd index 8b9fffde9..dd026aa6d 100644 --- a/addons/dialogic/Other/DialogicClass.gd +++ b/addons/dialogic/Other/DialogicClass.gd @@ -47,7 +47,7 @@ static func start(timeline: String = '', default_timeline: String ='', dialog_sc var canvas_dialog_node = null var returned_dialog_node = null - if !Engine.get_main_loop().has_meta('dialogic_tree_loaded'): + if !Engine.get_main_loop().has_meta('dialogic_tree'): prepare() if use_canvas_instead: From 2f754f8c5f30af625dcb417cfd2be7eadf3453ef Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Fri, 10 Mar 2023 11:13:49 -0700 Subject: [PATCH 44/54] fix for crash when adding definitions and glossaries --- addons/dialogic/Editor/MasterTree/MasterTree.gd | 2 ++ addons/dialogic/Other/DialogicUtil.gd | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index 71c6761b0..1df6f2017 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -796,6 +796,7 @@ func new_theme(): func new_value_definition(): var definition_id = editor_reference.get_node("MainPanel/ValueEditor").create_value() var folder = get_selected().get_metadata(0) + folder['type'] = 0 DialogicUtil.add_file_to_folder(editor_reference.flat_structure, "Definitions",folder, definition_id) build_definitions(definition_id) hide_all_editors() @@ -806,6 +807,7 @@ func new_value_definition(): func new_glossary_entry(): var definition_id = editor_reference.get_node("MainPanel/GlossaryEntryEditor").create_glossary_entry() var folder = get_selected().get_metadata(0) + folder['type'] = 1 DialogicUtil.add_file_to_folder(editor_reference.flat_structure, "Definitions",folder, definition_id) build_definitions(definition_id) hide_all_editors() diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index 44a41654f..d863e178e 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -246,8 +246,6 @@ static func get_folder_meta(folder_path: String, key:String): ## FOLDER FUNCTIONS static func add_folder(flat_structure:Dictionary, tree:String, path:Dictionary, folder_name:String): - print(path) - #first find the parent folder from here # check if the name is allowed var new_path = path['path'] + path['name'] + "/" + folder_name + "/." @@ -352,6 +350,7 @@ static func add_file_to_folder(flat_structure:Dictionary, tree:String, path:Dic if existing_data.empty(): var new_data = {} + if "/." in insert_position_data['key']: new_data['key'] = insert_position_data['key'].rstrip('.') + file_name new_data['value'] = {'category': tree, 'name': file_name, "color": Color.white, 'file': file_name, 'path': insert_position_data['key'].rstrip('.')} @@ -359,6 +358,10 @@ static func add_file_to_folder(flat_structure:Dictionary, tree:String, path:Dic new_data['key'] = insert_position_data['value']['path'] + file_name new_data['value'] = {'category': tree, 'name': file_name, "color": Color.white, 'file': file_name, 'path': insert_position_data['value']['path']} + if tree == "Definitions": + new_data['value']['type'] = path['type'] + new_data['value']['id'] = file_name + flat_structure[tree + "_Array"].insert(insert_position + 1, new_data) else: existing_data['key'] = path['path'] + "/" + existing_data['value']['name'] From d2936a4996554becedd76651abb526c4261b2e6a Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Fri, 10 Mar 2023 12:09:44 -0700 Subject: [PATCH 45/54] readjust timeline picker menu to use deconstructed flat file tree for speed --- .../Timelines/EventPart_TimelinePicker.gd | 37 ++++++++++++++----- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/addons/dialogic/Editor/Events/Parts/ResourcePickers/Timelines/EventPart_TimelinePicker.gd b/addons/dialogic/Editor/Events/Parts/ResourcePickers/Timelines/EventPart_TimelinePicker.gd index 0b1af11b9..c6b647427 100644 --- a/addons/dialogic/Editor/Events/Parts/ResourcePickers/Timelines/EventPart_TimelinePicker.gd +++ b/addons/dialogic/Editor/Events/Parts/ResourcePickers/Timelines/EventPart_TimelinePicker.gd @@ -47,33 +47,52 @@ func _on_PickerMenu_about_to_show(): func build_PickerMenu(): picker_menu.get_popup().clear() - var folder_structure = DialogicUtil.get_timelines_folder_structure() - + var timeline_structure = find_parent('EditorView').flat_structure['Timelines'] + var folder_structure = build_PickerMenuFolderFlat(picker_menu.get_popup(), timeline_structure, "MenuButton") + var files_info = build_PickerMenuFiles(timeline_structure) ## building the root level - build_PickerMenuFolder(picker_menu.get_popup(), folder_structure, "MenuButton") + build_PickerMenuFolder(picker_menu.get_popup(), folder_structure, "MenuButton", files_info) # is called recursively to build all levels of the folder structure -func build_PickerMenuFolder(menu:PopupMenu, folder_structure:Dictionary, current_folder_name:String): + +func build_PickerMenuFolderFlat(menu:PopupMenu, folder_structure:Dictionary, current_folder_name:String): + var nested = {} + nested['folders'] = {} + nested['files'] = [] + for item in folder_structure.keys(): + DialogicResources.recursive_build(item.right(1), folder_structure[item], nested) + + return nested + +func build_PickerMenuFiles(timeline_structure): + var files_dict = {} + + for i in timeline_structure.keys(): + if !("/." in i): + #print(timeline_structure[i]) + files_dict[timeline_structure[i]['file']] = {'color':timeline_structure[i]['color'], 'file':i, 'name': timeline_structure[i]['name']} + return files_dict + +func build_PickerMenuFolder(menu:PopupMenu, folder_structure:Dictionary, current_folder_name:String, files_info:Dictionary): var index = 0 for folder_name in folder_structure['folders'].keys(): var submenu = PopupMenu.new() - var submenu_name = build_PickerMenuFolder(submenu, folder_structure['folders'][folder_name], folder_name) + var submenu_name = build_PickerMenuFolder(submenu, folder_structure['folders'][folder_name], folder_name, files_info) submenu.name = submenu_name menu.add_submenu_item(folder_name, submenu_name) menu.set_item_icon(index, get_icon("Folder", "EditorIcons")) menu.add_child(submenu) picker_menu.update_submenu_style(submenu) index += 1 - - var files_info = DialogicUtil.get_timeline_dict() + for file in folder_structure['files']: menu.add_item(files_info[file]['name']) menu.set_item_icon(index, editor_reference.get_node("MainPanel/MasterTreeContainer/MasterTree").timeline_icon) menu.set_item_metadata(index, {'file':file}) index += 1 - + if not menu.is_connected("index_pressed", self, "_on_PickerMenu_selected"): menu.connect("index_pressed", self, '_on_PickerMenu_selected', [menu]) - + return current_folder_name From cd8c73882a528e0e7f3f3a3c17a6dce7bd0e7d86 Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Fri, 31 Mar 2023 10:04:53 -0600 Subject: [PATCH 46/54] fix renaming in current session --- addons/dialogic/Other/DialogicUtil.gd | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index d863e178e..fd7ee95f6 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -361,7 +361,13 @@ static func add_file_to_folder(flat_structure:Dictionary, tree:String, path:Dic if tree == "Definitions": new_data['value']['type'] = path['type'] new_data['value']['id'] = file_name - + if path['type'] == 0: + new_data['value']['name'] = "New value" + new_data['key'] = insert_position_data['key'].rstrip('.') + "New value" + elif path['type'] == 1: + new_data['value']['name'] = "New glossary entry" + new_data['key'] = insert_position_data['key'].rstrip('.') + "New glossary entry" + flat_structure[tree + "_Array"].insert(insert_position + 1, new_data) else: existing_data['key'] = path['path'] + "/" + existing_data['value']['name'] @@ -377,7 +383,14 @@ static func remove_file_from_folder(flat_structure:Dictionary, tree:String, pat flat_structure = editor_array_to_flat_structure(flat_structure, tree) DialogicResources.save_resource_folder_flat_structure(flat_structure) +static func rename_file(flat_structure:Dictionary, tree:String, path:Dictionary, new_name:String): + var insert_position = path['step'] + + flat_structure[tree + "_Array"][insert_position]['key'] = flat_structure[tree + "_Array"][insert_position]['value']['path'] + new_name + flat_structure[tree + "_Array"][insert_position]['value']['name'] = new_name + flat_structure = editor_array_to_flat_structure(flat_structure,tree) + DialogicResources.save_resource_folder_flat_structure(flat_structure) ## STRUCTURE UPDATES #should be called when files got deleted and on program start From 90f67c548473795d89d253caf10fd8b2be746408 Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Fri, 31 Mar 2023 13:52:42 -0600 Subject: [PATCH 47/54] fix definition folder build wrong on load, rest of fix for rename --- addons/dialogic/Editor/MasterTree/MasterTree.gd | 13 ++++++++----- addons/dialogic/Other/DialogicUtil.gd | 5 +++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index 1df6f2017..a0303f2ec 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -813,6 +813,9 @@ func new_glossary_entry(): hide_all_editors() #rename_selected() +func update_definition_entry(text): + # special funciton needed for name changes to the two definition types + var current = get_selected().get_metadata(0) func remove_selected(): var item = get_selected() @@ -938,30 +941,30 @@ func _on_item_edited(): var metadata = item.get_metadata(0) if metadata['editor'] == 'Timeline': timeline_editor.timeline_name = item.get_text(0) - editor_reference.flat_structure['Timelines_Array'][metadata['step']]['value']['name'] = item.get_text(0) + DialogicUtil.rename_file(editor_reference.flat_structure, 'Timelines', metadata, item.get_text(0)) save_current_resource() build_timelines(metadata['file']) if metadata['editor'] == 'Theme': DialogicResources.set_theme_value(metadata['file'], 'settings', 'name', item.get_text(0)) - editor_reference.flat_structure['Themes_Array'][metadata['step']]['value']['name'] = item.get_text(0) + DialogicUtil.rename_file(editor_reference.flat_structure, 'Themes', metadata, item.get_text(0)) build_themes(metadata['file']) if metadata['editor'] == 'Character': character_editor.nodes['name'].text = item.get_text(0) - editor_reference.flat_structure['Characters_Array'][metadata['step']]['value']['name'] = item.get_text(0) + DialogicUtil.rename_file(editor_reference.flat_structure, 'Characters', metadata, item.get_text(0)) save_current_resource() build_characters(metadata['file']) if metadata['editor'] == 'Value': value_editor.nodes['name'].text = item.get_text(0) # Not sure why this signal doesn't triggers value_editor._on_name_changed(item.get_text(0)) - editor_reference.flat_structure['Definitions_Array'][metadata['step']]['value']['name'] = item.get_text(0) + DialogicUtil.rename_file(editor_reference.flat_structure, 'Definitions', metadata, item.get_text(0)) save_current_resource() build_definitions(metadata['id']) if metadata['editor'] == 'GlossaryEntry': glossary_entry_editor.nodes['name'].text = item.get_text(0) # Not sure why this signal doesn't triggers glossary_entry_editor._on_name_changed(item.get_text(0)) - editor_reference.flat_structure['Definitions_Array'][metadata['step']]['value']['name'] = item.get_text(0) + DialogicUtil.rename_file(editor_reference.flat_structure, 'Definitions', metadata, item.get_text(0)) save_current_resource() build_definitions(metadata['id']) diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index fd7ee95f6..0839b9ac2 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -746,8 +746,8 @@ static func get_flat_folders_list() -> Dictionary: for definition in definition_list: if definition['id'] in structure['Definitions']: definition['path'] = structure['Definitions'][definition['id']] + definition['name'] - structure['Definitions'][definition['id']]= definition definition['file'] = definition['id'] + structure['Definitions'][definition['id']]= definition for theme in theme_list: if theme['file'] in structure['Themes']: @@ -769,7 +769,8 @@ static func get_flat_folders_list() -> Dictionary: for definition in structure['Definitions'].keys(): - if ".json" in definition: + + if !"/." in definition: definition_folder_breakdown[structure['Definitions'][definition]['path']] = structure['Definitions'][definition] else: definition_folder_breakdown[definition] = structure['Definitions'][definition] From 1e2f670788e808319ececf52352916e1a5f403a6 Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Fri, 31 Mar 2023 15:23:37 -0600 Subject: [PATCH 48/54] cleaning up some prints --- addons/dialogic/Editor/MasterTree/MasterTree.gd | 3 +-- addons/dialogic/Other/DialogicUtil.gd | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index a0303f2ec..ba1252dde 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -310,7 +310,7 @@ func build_resource_folder(parent_folder_item:TreeItem, folder_data:Dictionary, func _add_folder_item(parent_item: TreeItem, folder_name: String, editor:String, meta_folder_info:Dictionary): # create item var folder_item:TreeItem= tree.create_item(parent_item) - print(parent_item.get_metadata(0)) + var parent_path = parent_item.get_metadata(0)['path'] var current_tree = parent_item.get_metadata(0)['category'].rstrip("_Array") # set text and icon @@ -630,7 +630,6 @@ func get_item_path(item: TreeItem) -> Dictionary: if item == null: return {'path': "", 'step': '0'} - print(item.get_metadata(0)['path']) if !'path' in item.get_metadata(0): return {'path': "/", 'step': '0'} return {'path': item.get_metadata(0)['path'], 'step': item.get_metadata(0)['step']} diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index 0839b9ac2..a82e5c0a7 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -249,7 +249,6 @@ static func add_folder(flat_structure:Dictionary, tree:String, path:Dictionary, #first find the parent folder from here # check if the name is allowed var new_path = path['path'] + path['name'] + "/" + folder_name + "/." - print(new_path) if new_path in flat_structure[tree]: print("[D] A folder with the name '"+folder_name+"' already exists in the target folder '"+path['path']+"'.") return ERR_ALREADY_EXISTS @@ -261,7 +260,6 @@ static func add_folder(flat_structure:Dictionary, tree:String, path:Dictionary, return OK static func remove_folder(flat_structure: Dictionary, tree:String, folder_data:Dictionary, delete_files:bool = true): - #print("[D] Removing 'Folder' "+folder_path) flat_structure[tree +"_Array"].remove(folder_data['step']) From 7c1fa6c693209b8aa435747465aef72c2bb772d1 Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Fri, 31 Mar 2023 20:33:56 -0600 Subject: [PATCH 49/54] correct move of folder to folder, also remove some prints --- .../dialogic/Editor/MasterTree/MasterTree.gd | 2 +- .../Editor/SettingsEditor/SettingsEditor.gd | 1 - .../Editor/TimelineEditor/TimelineEditor.gd | 2 - addons/dialogic/Other/DialogicUtil.gd | 40 +++++++++++++++---- 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index ba1252dde..76aa64558 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -886,7 +886,7 @@ func get_drag_data(position): # if it is a folder and it's not one of the root folders if 'Root' in item.get_metadata(0)['editor'] and item.get_parent().get_parent(): instance_drag_preview(item.get_icon(0), item.get_text(0)) - return {'item_type': 'folder', 'orig_path': get_item_folder(item, "")} + return {'item_type': 'folder', 'name': item.get_metadata(0)['name'], 'orig_path': get_item_folder(item, ""), 'category': item.get_metadata(0)['category']} else: if item.get_metadata(0).has('file'): instance_drag_preview(item.get_icon(0), item.get_text(0)) diff --git a/addons/dialogic/Editor/SettingsEditor/SettingsEditor.gd b/addons/dialogic/Editor/SettingsEditor/SettingsEditor.gd index 85984daf9..23c47134b 100644 --- a/addons/dialogic/Editor/SettingsEditor/SettingsEditor.gd +++ b/addons/dialogic/Editor/SettingsEditor/SettingsEditor.gd @@ -250,7 +250,6 @@ func _on_hotkey_action_key_presssed(settingName = 'choice_hotkey_1') -> void: func _on_default_action_key_item_selected(index, settingName = 'default_action_key') -> void: - print(nodes[settingName].text) set_value('input', settingName, nodes[settingName].text) diff --git a/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd b/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd index 17b554eb3..bcf387153 100644 --- a/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd +++ b/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd @@ -816,10 +816,8 @@ func create_event(event_id: String, data: Dictionary = {'no-data': true} , inden # load the piece with data piece.editor_reference = editor_reference - print(editor_reference) if data.has('no-data') == false: piece.event_data = data - print(piece) if at_index == -1: if len(selected_items) != 0: timeline.add_child_below_node(selected_items[0], piece) diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index a82e5c0a7..27820697d 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -260,7 +260,7 @@ static func add_folder(flat_structure:Dictionary, tree:String, path:Dictionary, return OK static func remove_folder(flat_structure: Dictionary, tree:String, folder_data:Dictionary, delete_files:bool = true): - + print(folder_data) flat_structure[tree +"_Array"].remove(folder_data['step']) if delete_files: @@ -295,6 +295,7 @@ static func rename_folder(flat_structure: Dictionary, tree:String, path:Dictiona for idx in flat_structure[tree + "_Array"].size(): flat_structure[tree + "_Array"][idx]['key'] = flat_structure[tree + "_Array"][idx]['key'].replace(old_path, new_path.rstrip("/.")) + flat_structure = editor_array_to_flat_structure(flat_structure, tree) DialogicResources.save_resource_folder_flat_structure(flat_structure) @@ -302,9 +303,14 @@ static func rename_folder(flat_structure: Dictionary, tree:String, path:Dictiona return OK static func move_folder_to_folder(flat_structure:Dictionary, tree:String, original_data:Dictionary, destination_data:Dictionary): + #abort if its trying to move folder to wrong tree + if original_data['category'] != destination_data['category']: + return ERR_INVALID_DATA + + # check if the name is allowed var new_path = destination_data['path'] - + if new_path in flat_structure[tree]: print("[D] A folder with the name '"+destination_data['path'].split("/")[-1]+"' already exists in the target folder '"+original_data['path']+"'.") return ERR_ALREADY_EXISTS @@ -312,13 +318,33 @@ static func move_folder_to_folder(flat_structure:Dictionary, tree:String, origin # remove the old folder BUT DON'T DELETE THE FILES!!!!!!!!!!! # took me ages to find this when I forgot it.. - remove_folder(flat_structure, tree,original_data, false) - # add the new folder - var folder_name = destination_data['path'].split("/")[-1] + var new_array=[] + var rename_array = [] - add_folder(flat_structure, tree, destination_data, new_path) - + var original_folder = original_data['orig_path'] + original_data['name'] + var replace_folder = destination_data['path'] + destination_data['name'] + '/' + original_data['name'] + + + #first iterate through and find all the items that need to be renamed + for idx in flat_structure[tree +"_Array"].size(): + if original_folder in flat_structure[tree +"_Array"][idx]['key']: + var item = flat_structure[tree +"_Array"][idx] + item['key'] = item['key'].replace(original_folder, replace_folder) + if 'path' in item['value']: + item['value']['path'] = item['value']['path'].replace(original_folder, replace_folder) + rename_array.append(item) + else: + new_array.append(flat_structure[tree +"_Array"][idx]) + + + #now merge in and replace the original ones + while rename_array.size() > 0: + new_array.insert(destination_data['step'] + 1, rename_array.pop_back()) + + flat_structure[tree +"_Array"] = new_array + + flat_structure = editor_array_to_flat_structure(flat_structure, tree) DialogicResources.save_resource_folder_flat_structure(flat_structure) From a395fe08365f3b72c83da5319f9bf4c8573a4a2f Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Fri, 31 Mar 2023 21:03:17 -0600 Subject: [PATCH 50/54] move files, some loosening of restrictions for moving things --- .../dialogic/Editor/MasterTree/MasterTree.gd | 7 ++++--- addons/dialogic/Other/DialogicUtil.gd | 18 ++++++++++++++---- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index 76aa64558..e40d55ac2 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -845,8 +845,9 @@ func can_drop_data(position, data) -> bool: # if the data isn't empty and it's a valid DICT if data != null and data is Dictionary and data.has('item_type'): # if it's not trying to add a folder to a file - if not (data['item_type'] == "folder" and not 'Root' in item.get_metadata(0)["editor"]): + if not (data['item_type'] == "folder" and item.get_metadata(0)["editortype"] == "file"): # if it's the same type of folder as before + return true if get_item_folder(item, '').split("/")[0] == data['orig_path'].split("/")[0]: # make sure the folder/item is not a subfolder of the original folder if data['item_type'] == "file" or (not get_item_folder(item, '').begins_with(data['orig_path'])): @@ -890,10 +891,10 @@ func get_drag_data(position): else: if item.get_metadata(0).has('file'): instance_drag_preview(item.get_icon(0), item.get_text(0)) - return {'item_type': 'file', 'orig_path': get_item_folder(item, ""), 'file_name':item.get_metadata(0)['file']} + return {'item_type': 'file', 'orig_path': item.get_metadata(0)['path'], 'file_name':item.get_metadata(0)['file'], 'category': item.get_metadata(0)['category'], 'name': item.get_metadata(0)['name'], 'original_step': item.get_metadata(0)['step']} elif item.get_metadata(0).has('id'): instance_drag_preview(item.get_icon(0), item.get_text(0)) - return {'item_type': 'file', 'orig_path': get_item_folder(item, ""), 'resource_id':item.get_metadata(0)['id']} + return {'item_type': 'file', 'orig_path': item.get_metadata(0)['path'], 'resource_id':item.get_metadata(0)['id'], 'category': item.get_metadata(0)['category'], 'name': item.get_metadata(0)['name'], 'original_step': item.get_metadata(0)['step']} return null func instance_drag_preview(icon, text): diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index 27820697d..fd9bdd22e 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -352,10 +352,20 @@ static func move_folder_to_folder(flat_structure:Dictionary, tree:String, origin ## FILE FUNCTIONS static func move_file_to_folder(flat_structure:Dictionary, tree:String, original_data:Dictionary, destination_data:Dictionary): - #remove_file_from_folder(orig_folder, file_name) - #add_file_to_folder(target_folder, file_name) - remove_file_from_folder(flat_structure, tree,original_data) - add_file_to_folder(flat_structure,tree,destination_data, "",original_data) + #abort if its trying to move folder to wrong tree + if original_data['category'] != destination_data['category']: + return ERR_INVALID_DATA + + + var moving = flat_structure[tree +"_Array"].pop_at(original_data['original_step']) + moving['key'] = moving['key'].replace(original_data['orig_path'], destination_data['path']) + moving['value']['path'] = destination_data['path'] + flat_structure[tree +"_Array"].insert(destination_data['step'], moving) + + + flat_structure = editor_array_to_flat_structure(flat_structure,tree) + DialogicResources.save_resource_folder_flat_structure(flat_structure) + static func add_file_to_folder(flat_structure:Dictionary, tree:String, path:Dictionary, file_name:String, existing_data:Dictionary = {}): var insert_position_data = flat_structure[tree + "_Array"][path['step']] From 379853e48ad7ceace56dc1323a595afa7a2d9d1d Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Fri, 21 Apr 2023 04:51:48 -0600 Subject: [PATCH 51/54] expand the movement code to use drop zones, incomplete --- .../dialogic/Editor/MasterTree/MasterTree.gd | 37 +++++---- addons/dialogic/Other/DialogicUtil.gd | 77 +++++++++++++++++-- 2 files changed, 90 insertions(+), 24 deletions(-) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index e40d55ac2..2694421c3 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -144,6 +144,8 @@ func _ready(): ## ***************************************************************************** func build_full_tree(selected_item: String = ''): + + # Adding timelines build_flat_tree_items("Timelines") # Adding characters @@ -210,7 +212,7 @@ func build_flat_tree_items(current_tree: String=''): # set text and icon var folder_name = entry['key'].split("/")[-2] folder_item.set_text(0, folder_name) - folder_item.set_tooltip(0, entry['key']) + folder_item.set_tooltip(0, str(step) + ": " + entry['key']) folder_item.set_icon(0, get_icon("Folder", "EditorIcons")) folder_item.set_icon_modulate(0, get_color("folder_icon_modulate", "FileDialog")) # set metadata @@ -267,7 +269,7 @@ func build_flat_tree_items(current_tree: String=''): resource_data['step'] = step item.set_metadata(0, resource_data) - item.set_tooltip(0, entry['key']) + item.set_tooltip(0, str(step) + ": " +entry['key']) func _clear_tree_children(parent: TreeItem): @@ -839,19 +841,22 @@ func rename_selected(): ## ***************************************************************************** func can_drop_data(position, data) -> bool: + if tree.drop_mode_flags == DROP_MODE_DISABLED: + tree.set_drop_mode_flags(DROP_MODE_ON_ITEM | DROP_MODE_INBETWEEN) + var item = get_item_at_position(position) if item == null: return false # if the data isn't empty and it's a valid DICT if data != null and data is Dictionary and data.has('item_type'): - # if it's not trying to add a folder to a file - if not (data['item_type'] == "folder" and item.get_metadata(0)["editortype"] == "file"): - # if it's the same type of folder as before - return true - if get_item_folder(item, '').split("/")[0] == data['orig_path'].split("/")[0]: - # make sure the folder/item is not a subfolder of the original folder - if data['item_type'] == "file" or (not get_item_folder(item, '').begins_with(data['orig_path'])): - return true + # if the item is the same category as the original + if item.get_metadata(0)['category'] == data['category']: + #if we're moving to the root, no further checks needed + if item.get_metadata(0)['step'] == 0: + return true + # if the folders not moving a root folder into a subfolder of itself + if not ((data['item_type'] == "folder" and item.get_metadata(0)["editortype"] == "folder") and (data['orig_path'] + data['name']) in item.get_metadata(0)['path']): + return true return false func drop_data(position, data): @@ -859,27 +864,26 @@ func drop_data(position, data): var drop_section = get_drop_section_at_position(position) if not data.has('item_type'): return - if data['orig_path'] == get_item_folder(item, ''): - return # dragging a folder if data['item_type'] == 'folder': # on a folder if 'Root' in item.get_metadata(0)['editor']: - DialogicUtil.move_folder_to_folder(editor_reference.flat_structure, item.get_metadata(0)['category'], data, item.get_metadata(0)) + DialogicUtil.move_folder_to_folder(editor_reference.flat_structure, item.get_metadata(0)['category'], data, item.get_metadata(0), drop_section) # dragging a file elif data['item_type'] == 'file': # on a folder if 'Root' in item.get_metadata(0)['editor']: if data.has('file_name'): - DialogicUtil.move_file_to_folder(editor_reference.flat_structure, item.get_metadata(0)['category'], data, item.get_metadata(0)) + DialogicUtil.move_file_to_folder(editor_reference.flat_structure, item.get_metadata(0)['category'], data, item.get_metadata(0), drop_section) elif data.has('resource_id'): - DialogicUtil.move_file_to_folder(editor_reference.flat_structure, item.get_metadata(0)['category'], data, item.get_metadata(0)) + DialogicUtil.move_file_to_folder(editor_reference.flat_structure, item.get_metadata(0)['category'], data, item.get_metadata(0), drop_section) pass # WORK TODO # on a file else: - DialogicUtil.move_file_to_folder(editor_reference.flat_structure, item.get_metadata(0)['category'], data, item.get_metadata(0)) + DialogicUtil.move_file_to_folder(editor_reference.flat_structure, item.get_metadata(0)['category'], data, item.get_metadata(0), drop_section) dragging_item.queue_free() dragging_item = null + build_full_tree() func get_drag_data(position): @@ -913,6 +917,7 @@ func _process(delta): dragging_item = null + ## ***************************************************************************** ## ITEM EDITING (RENAMING) ## ***************************************************************************** diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index fd9bdd22e..e1b387423 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -302,7 +302,7 @@ static func rename_folder(flat_structure: Dictionary, tree:String, path:Dictiona return OK -static func move_folder_to_folder(flat_structure:Dictionary, tree:String, original_data:Dictionary, destination_data:Dictionary): +static func move_folder_to_folder(flat_structure:Dictionary, tree:String, original_data:Dictionary, destination_data:Dictionary, drop_position = 0): #abort if its trying to move folder to wrong tree if original_data['category'] != destination_data['category']: return ERR_INVALID_DATA @@ -322,9 +322,16 @@ static func move_folder_to_folder(flat_structure:Dictionary, tree:String, origin var new_array=[] var rename_array = [] - var original_folder = original_data['orig_path'] + original_data['name'] - var replace_folder = destination_data['path'] + destination_data['name'] + '/' + original_data['name'] - + #where we drop it will depend on the position. if we're targeting either above or below, we want to put it at the same level, not subfolder + var original_folder = "" + var replace_folder = "" + if drop_position != -1: + original_folder = original_data['orig_path'] + original_data['name'] + replace_folder = destination_data['path'] + destination_data['name'] + '/' + original_data['name'] + else: + destination_data['step'] = destination_data['step'] - 1 + original_folder = original_data['orig_path'] + original_data['name'] + replace_folder = destination_data['path'] + original_data['name'] #first iterate through and find all the items that need to be renamed for idx in flat_structure[tree +"_Array"].size(): @@ -351,16 +358,70 @@ static func move_folder_to_folder(flat_structure:Dictionary, tree:String, origin return OK ## FILE FUNCTIONS -static func move_file_to_folder(flat_structure:Dictionary, tree:String, original_data:Dictionary, destination_data:Dictionary): +static func move_file_to_folder(flat_structure:Dictionary, tree:String, original_data:Dictionary, destination_data:Dictionary, drop_position = 0): #abort if its trying to move folder to wrong tree + print("Move:") + print (original_data) + print("To:") + print(destination_data) + print("Position:") + print(drop_position) if original_data['category'] != destination_data['category']: return ERR_INVALID_DATA + var insert_position = destination_data['step'] + #adjust for the drop position + if drop_position != -1: + insert_position = insert_position + 1 + + #check to make sure the next item is a file, because if not we need to roll down to the next file at the same level + if 'folded' in flat_structure[tree +"_Array"][destination_data['step']]['value']: + var destination_folder = "" + if drop_position == -1: + print("moving to before item: " + flat_structure[tree +"_Array"][insert_position]['key']) + destination_folder = destination_data['path'] + else: + print("moving into item: " + flat_structure[tree +"_Array"][insert_position]['key']) + destination_folder = destination_data['path'] + destination_data['name'] + "/" + print(flat_structure[tree +"_Array"][insert_position]['key']) + + #var destination_path = + var searching = true + while searching: + insert_position = insert_position + 1 + if 'folded' in flat_structure[tree +"_Array"][insert_position]['value']: + if ! destination_folder in flat_structure[tree +"_Array"][insert_position]['key']: + searching = false + else: + if flat_structure[tree +"_Array"][insert_position]['value']['path'] == destination_folder: + searching = false + continue + #if flat_structure[tree +"_Array"][insert_position]['key']: + #flat_structure[tree +"_Array"][insert_position]['value']['path'] != destination_data['path'] + destination_data['folder'] + "/" + + print("Final move position: " + str(insert_position)) + + #if the file came from before where we are moving it to, we need to decrease the position since orders being changed + if original_data['original_step'] < destination_data['step']: + insert_position = insert_position - 1 + + print("inserting to: " + str(insert_position)) var moving = flat_structure[tree +"_Array"].pop_at(original_data['original_step']) - moving['key'] = moving['key'].replace(original_data['orig_path'], destination_data['path']) - moving['value']['path'] = destination_data['path'] - flat_structure[tree +"_Array"].insert(destination_data['step'], moving) + + if destination_data['editortype'] == "folder": + if drop_position != 1: + moving['key'] = moving['key'].replace(original_data['orig_path'], destination_data['path'] + destination_data['name'] + "/") + moving['value']['path'] = destination_data['path'] + destination_data['name'] + "/" + else: + moving['key'] = moving['key'].replace(original_data['orig_path'], destination_data['path']) + moving['value']['path'] = destination_data['path'] + + else: + moving['key'] = moving['key'].replace(original_data['orig_path'], destination_data['path']) + moving['value']['path'] = destination_data['path'] + + flat_structure[tree +"_Array"].insert(insert_position, moving) flat_structure = editor_array_to_flat_structure(flat_structure,tree) From 29a6c645195553e28225dbbb45a29852227fb2e2 Mon Sep 17 00:00:00 2001 From: Danielle Cheney Date: Sun, 23 Apr 2023 11:54:30 -0600 Subject: [PATCH 52/54] move folder to folder --- addons/dialogic/Other/DialogicUtil.gd | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index e1b387423..9c7b07699 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -303,10 +303,15 @@ static func rename_folder(flat_structure: Dictionary, tree:String, path:Dictiona return OK static func move_folder_to_folder(flat_structure:Dictionary, tree:String, original_data:Dictionary, destination_data:Dictionary, drop_position = 0): + #abort if its trying to move folder to wrong tree if original_data['category'] != destination_data['category']: return ERR_INVALID_DATA + var insert_position = destination_data['step'] + #adjust for the drop position + if drop_position != -1: + insert_position = insert_position + 1 # check if the name is allowed var new_path = destination_data['path'] @@ -329,14 +334,13 @@ static func move_folder_to_folder(flat_structure:Dictionary, tree:String, origin original_folder = original_data['orig_path'] + original_data['name'] replace_folder = destination_data['path'] + destination_data['name'] + '/' + original_data['name'] else: - destination_data['step'] = destination_data['step'] - 1 original_folder = original_data['orig_path'] + original_data['name'] replace_folder = destination_data['path'] + original_data['name'] #first iterate through and find all the items that need to be renamed for idx in flat_structure[tree +"_Array"].size(): if original_folder in flat_structure[tree +"_Array"][idx]['key']: - var item = flat_structure[tree +"_Array"][idx] + var item = flat_structure[tree +"_Array"][idx].duplicate() item['key'] = item['key'].replace(original_folder, replace_folder) if 'path' in item['value']: item['value']['path'] = item['value']['path'].replace(original_folder, replace_folder) @@ -344,10 +348,11 @@ static func move_folder_to_folder(flat_structure:Dictionary, tree:String, origin else: new_array.append(flat_structure[tree +"_Array"][idx]) - #now merge in and replace the original ones while rename_array.size() > 0: - new_array.insert(destination_data['step'] + 1, rename_array.pop_back()) + new_array.insert(insert_position, rename_array.pop_back()) + + #return ERR_INVALID_DATA flat_structure[tree +"_Array"] = new_array @@ -360,12 +365,6 @@ static func move_folder_to_folder(flat_structure:Dictionary, tree:String, origin ## FILE FUNCTIONS static func move_file_to_folder(flat_structure:Dictionary, tree:String, original_data:Dictionary, destination_data:Dictionary, drop_position = 0): #abort if its trying to move folder to wrong tree - print("Move:") - print (original_data) - print("To:") - print(destination_data) - print("Position:") - print(drop_position) if original_data['category'] != destination_data['category']: return ERR_INVALID_DATA @@ -378,12 +377,9 @@ static func move_file_to_folder(flat_structure:Dictionary, tree:String, original if 'folded' in flat_structure[tree +"_Array"][destination_data['step']]['value']: var destination_folder = "" if drop_position == -1: - print("moving to before item: " + flat_structure[tree +"_Array"][insert_position]['key']) destination_folder = destination_data['path'] else: - print("moving into item: " + flat_structure[tree +"_Array"][insert_position]['key']) destination_folder = destination_data['path'] + destination_data['name'] + "/" - print(flat_structure[tree +"_Array"][insert_position]['key']) #var destination_path = var searching = true @@ -399,18 +395,16 @@ static func move_file_to_folder(flat_structure:Dictionary, tree:String, original #if flat_structure[tree +"_Array"][insert_position]['key']: #flat_structure[tree +"_Array"][insert_position]['value']['path'] != destination_data['path'] + destination_data['folder'] + "/" - print("Final move position: " + str(insert_position)) #if the file came from before where we are moving it to, we need to decrease the position since orders being changed if original_data['original_step'] < destination_data['step']: insert_position = insert_position - 1 - print("inserting to: " + str(insert_position)) var moving = flat_structure[tree +"_Array"].pop_at(original_data['original_step']) if destination_data['editortype'] == "folder": - if drop_position != 1: + if drop_position != -1: moving['key'] = moving['key'].replace(original_data['orig_path'], destination_data['path'] + destination_data['name'] + "/") moving['value']['path'] = destination_data['path'] + destination_data['name'] + "/" else: @@ -565,6 +559,7 @@ static func flat_structure_to_editor_array(flat_structure: Dictionary, tree:Stri return flat_structure static func editor_array_to_flat_structure(flat_structure: Dictionary, tree:String="all") -> Dictionary: + print("editor array to flat strucutre") if tree != "all": flat_structure[tree] = {} From 9441a92c6ed4b8c034eeab6c612cd7ef63002c73 Mon Sep 17 00:00:00 2001 From: zaknafean Date: Sun, 16 Jul 2023 09:41:24 -0400 Subject: [PATCH 53/54] Show disabled choices Added option to show 'disabled choices' on a per theme basis Co-Authored-By: Celthim <34304819+celthim@users.noreply.github.com> --- addons/dialogic/Nodes/DialogNode.gd | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/addons/dialogic/Nodes/DialogNode.gd b/addons/dialogic/Nodes/DialogNode.gd index ab1015091..5d3c9bb44 100644 --- a/addons/dialogic/Nodes/DialogNode.gd +++ b/addons/dialogic/Nodes/DialogNode.gd @@ -507,10 +507,15 @@ func _on_text_completed(): var waiting_until_options_enabled = float(settings.get_value('input', 'delay_after_options', 0.1)) $OptionsDelayedInput.start(waiting_until_options_enabled) - + + var show_choices = current_theme.get_value('disabled_choices', 'show', false) for o in current_event['options']: - if _should_add_choice_button(o): - add_choice_button(o) + var is_valid_choice = _should_add_choice_button(o) + if show_choices: + var choice_button = add_choice_button(o) + choice_button.disabled = !is_valid_choice + elif is_valid_choice: + add_choice_button(o) # Auto focus $DialogicTimer.start(0.1); yield($DialogicTimer, "timeout") From 093bd592364045c82e2579ce0b649dfbe4b83dc8 Mon Sep 17 00:00:00 2001 From: zaknafean Date: Sun, 16 Jul 2023 09:43:40 -0400 Subject: [PATCH 54/54] comment clean up for theme scripts Cleaned up comments Co-Authored-By: Celthim <34304819+celthim@users.noreply.github.com> --- .../Editor/ThemeEditor/ThemeEditor.gd | 16 +- .../Editor/ThemeEditor/ThemeEditor.tscn | 1371 +++++++++-------- 2 files changed, 721 insertions(+), 666 deletions(-) diff --git a/addons/dialogic/Editor/ThemeEditor/ThemeEditor.gd b/addons/dialogic/Editor/ThemeEditor/ThemeEditor.gd index 3d05c11c1..2ad293144 100644 --- a/addons/dialogic/Editor/ThemeEditor/ThemeEditor.gd +++ b/addons/dialogic/Editor/ThemeEditor/ThemeEditor.gd @@ -110,7 +110,7 @@ onready var n : Dictionary = { # Choice Buttons - + 'show_disabled': $"VBoxContainer/TabContainer/Choice Buttons/Column/VBoxContainer/GridContainer/ChoiceShow", 'button_fixed': $"VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2/FixedSize", 'button_fixed_x': $"VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2/ButtonSizeX", 'button_fixed_y': $"VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2/ButtonSizeY", @@ -473,6 +473,9 @@ func load_theme(filename): n['name_position'].select(theme.get_value('name', 'position', 0)) + # Choice Buttons + n['show_disabled'].pressed = theme.get_value('disabled_choices', 'show', false) + # Audio var default_audio_file = "res://addons/dialogic/Example Assets/Sound Effects/Beep.wav" var default_audio_data = { @@ -1021,6 +1024,15 @@ func _on_CustomButtonsButton_pressed(): editor_reference.godot_dialog_connect(self, "_on_custom_button_selected") +func _on_choice_show_toggled(button_pressed) -> void: + if loading: + return + + DialogicResources.set_theme_value(current_theme, 'disabled_choices', 'show', button_pressed) + _on_PreviewButton_pressed() # Refreshing the preview + _update_name_fields_editable() + + ## ------------ GLOSSARY TAB ------------------------------------ ## TITLE FONT @@ -1132,5 +1144,3 @@ func _on_Glossary_BackgroundPanel_selected(path, target): func _on_audio_data_updated(section): DialogicResources.set_theme_value(current_theme, 'audio', section, n['audio_pickers'][section].get_data()) _on_PreviewButton_pressed() - - diff --git a/addons/dialogic/Editor/ThemeEditor/ThemeEditor.tscn b/addons/dialogic/Editor/ThemeEditor/ThemeEditor.tscn index 9c2cea2fd..261d10855 100644 --- a/addons/dialogic/Editor/ThemeEditor/ThemeEditor.tscn +++ b/addons/dialogic/Editor/ThemeEditor/ThemeEditor.tscn @@ -7,35 +7,35 @@ [ext_resource path="res://addons/dialogic/Editor/ThemeEditor/AudioPicker.tscn" type="PackedScene" id=7] [ext_resource path="res://addons/dialogic/Editor/Common/TLabel.tscn" type="PackedScene" id=8] -[sub_resource type="Image" id=9] +[sub_resource type="Image" id=19] data = { -"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), -"format": "LumAlpha8", -"height": 16, +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "RGBA8", +"height": 32, "mipmaps": false, -"width": 16 +"width": 32 } -[sub_resource type="ImageTexture" id=8] +[sub_resource type="ImageTexture" id=18] flags = 4 flags = 4 -image = SubResource( 9 ) -size = Vector2( 16, 16 ) +image = SubResource( 19 ) +size = Vector2( 32, 32 ) -[sub_resource type="Image" id=10] +[sub_resource type="Image" id=20] data = { -"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), -"format": "LumAlpha8", -"height": 16, +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "RGBA8", +"height": 32, "mipmaps": false, -"width": 16 +"width": 32 } -[sub_resource type="ImageTexture" id=6] +[sub_resource type="ImageTexture" id=16] flags = 4 flags = 4 -image = SubResource( 10 ) -size = Vector2( 16, 16 ) +image = SubResource( 20 ) +size = Vector2( 32, 32 ) [node name="ThemeEditor" type="ScrollContainer"] anchor_right = 1.0 @@ -43,45 +43,42 @@ anchor_bottom = 1.0 margin_right = -6.0 margin_bottom = 311.0 script = ExtResource( 2 ) -__meta__ = { -"_edit_use_anchors_": false -} [node name="VBoxContainer" type="VBoxContainer" parent="."] -margin_right = 1018.0 -margin_bottom = 911.0 +margin_right = 2431.0 +margin_bottom = 1367.0 size_flags_horizontal = 3 size_flags_vertical = 3 custom_constants/separation = 15 [node name="Panel" type="Panel" parent="VBoxContainer"] -margin_right = 1018.0 +margin_right = 2431.0 margin_bottom = 290.0 rect_min_size = Vector2( 0, 290 ) [node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer"] margin_top = 305.0 -margin_right = 1018.0 -margin_bottom = 389.0 +margin_right = 2431.0 +margin_bottom = 437.0 [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/VBoxContainer"] -margin_right = 1018.0 -margin_bottom = 20.0 +margin_right = 2431.0 +margin_bottom = 62.0 [node name="CharacterPicker" type="OptionButton" parent="VBoxContainer/VBoxContainer/HBoxContainer"] -margin_right = 145.0 -margin_bottom = 20.0 +margin_right = 412.0 +margin_bottom = 62.0 text = "Random Character" [node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/VBoxContainer"] -margin_top = 24.0 -margin_right = 1018.0 -margin_bottom = 84.0 +margin_top = 70.0 +margin_right = 2431.0 +margin_bottom = 132.0 custom_constants/separation = 10 [node name="TextEdit" type="TextEdit" parent="VBoxContainer/VBoxContainer/HBoxContainer3"] -margin_right = 864.0 -margin_bottom = 60.0 +margin_right = 2036.0 +margin_bottom = 62.0 rect_min_size = Vector2( 400, 60 ) size_flags_horizontal = 3 text = "This is [i]preview[/i] text. You can use [color=#A5EFAC]BBCode[/color] to [b]style[/b] it. @@ -90,16 +87,16 @@ syntax_highlighting = true wrap_enabled = true [node name="PreviewButton" type="Button" parent="VBoxContainer/VBoxContainer/HBoxContainer3"] -margin_left = 874.0 -margin_right = 1018.0 -margin_bottom = 60.0 +margin_left = 2046.0 +margin_right = 2431.0 +margin_bottom = 62.0 text = " Preview changes" icon = ExtResource( 1 ) [node name="TabContainer" type="TabContainer" parent="VBoxContainer"] -margin_top = 404.0 -margin_right = 1018.0 -margin_bottom = 911.0 +margin_top = 452.0 +margin_right = 2431.0 +margin_bottom = 1367.0 size_flags_horizontal = 3 size_flags_vertical = 3 tab_align = 0 @@ -109,18 +106,18 @@ drag_to_rearrange_enabled = true [node name="Dialog Text" type="HBoxContainer" parent="VBoxContainer/TabContainer"] anchor_right = 1.0 anchor_bottom = 1.0 -margin_left = 4.0 -margin_top = 32.0 -margin_right = -4.0 -margin_bottom = -4.0 +margin_left = 8.0 +margin_top = 86.0 +margin_right = -8.0 +margin_bottom = -8.0 custom_constants/separation = 10 __meta__ = { "_tab_name": "Dialog Text" } [node name="Column" type="VBoxContainer" parent="VBoxContainer/TabContainer/Dialog Text"] -margin_right = 270.0 -margin_bottom = 471.0 +margin_right = 653.0 +margin_bottom = 821.0 rect_min_size = Vector2( 270, 0 ) size_flags_vertical = 3 __meta__ = { @@ -128,13 +125,15 @@ __meta__ = { } [node name="SectionTitle" parent="VBoxContainer/TabContainer/Dialog Text/Column" instance=ExtResource( 3 )] +margin_right = 653.0 +margin_bottom = 58.0 text = "Fonts" text_key = "Fonts" [node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Dialog Text/Column"] -margin_top = 26.0 -margin_right = 270.0 -margin_bottom = 100.0 +margin_top = 66.0 +margin_right = 653.0 +margin_bottom = 268.0 size_flags_horizontal = 3 custom_constants/hseparation = 10 columns = 2 @@ -142,102 +141,100 @@ columns = 2 [node name="TLabel" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 4.0 -margin_right = 79.0 -margin_bottom = 18.0 +margin_top = 6.0 +margin_right = 241.0 +margin_bottom = 56.0 text = "Regular Font" text_key = "Regular Font" [node name="RegularFont" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer"] -margin_left = 89.0 -margin_right = 239.0 -margin_bottom = 22.0 +margin_left = 251.0 +margin_right = 653.0 +margin_bottom = 62.0 [node name="RegularFontButton" type="Button" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/RegularFont"] -margin_top = 1.0 -margin_right = 118.0 -margin_bottom = 21.0 +margin_right = 338.0 +margin_bottom = 62.0 size_flags_horizontal = 3 size_flags_vertical = 4 text = "DefaultFont" [node name="RegularFontOpen" type="Button" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/RegularFont"] -margin_left = 122.0 -margin_right = 150.0 -margin_bottom = 22.0 +margin_left = 346.0 +margin_right = 402.0 +margin_bottom = 62.0 size_flags_vertical = 4 -icon = SubResource( 8 ) +icon = SubResource( 18 ) [node name="TLabel2" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 30.0 -margin_right = 79.0 -margin_bottom = 44.0 +margin_top = 76.0 +margin_right = 241.0 +margin_bottom = 126.0 text = "Bold Font" text_key = "Bold Font" [node name="BoldFont" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer"] -margin_left = 89.0 -margin_top = 26.0 -margin_right = 239.0 -margin_bottom = 48.0 +margin_left = 251.0 +margin_top = 70.0 +margin_right = 653.0 +margin_bottom = 132.0 [node name="BoldFontButton" type="Button" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/BoldFont"] -margin_top = 1.0 -margin_right = 118.0 -margin_bottom = 21.0 +margin_right = 338.0 +margin_bottom = 62.0 size_flags_horizontal = 3 size_flags_vertical = 4 text = "DefaultBoldFont" [node name="BoldFontOpen" type="Button" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/BoldFont"] -margin_left = 122.0 -margin_right = 150.0 -margin_bottom = 22.0 +margin_left = 346.0 +margin_right = 402.0 +margin_bottom = 62.0 size_flags_vertical = 4 -icon = SubResource( 8 ) +icon = SubResource( 18 ) [node name="TLabel3" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 56.0 -margin_right = 79.0 -margin_bottom = 70.0 +margin_top = 146.0 +margin_right = 241.0 +margin_bottom = 196.0 text = "Italic Font" text_key = "Italic Font" [node name="ItalicFont" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer"] -margin_left = 89.0 -margin_top = 52.0 -margin_right = 239.0 -margin_bottom = 74.0 +margin_left = 251.0 +margin_top = 140.0 +margin_right = 653.0 +margin_bottom = 202.0 [node name="ItalicFontButton" type="Button" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/ItalicFont"] -margin_top = 1.0 -margin_right = 118.0 -margin_bottom = 21.0 +margin_right = 338.0 +margin_bottom = 62.0 size_flags_horizontal = 3 size_flags_vertical = 4 text = "DefaultItalicFont" [node name="ItalicFontOpen" type="Button" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/ItalicFont"] -margin_left = 122.0 -margin_right = 150.0 -margin_bottom = 22.0 +margin_left = 346.0 +margin_right = 402.0 +margin_bottom = 62.0 size_flags_vertical = 4 -icon = SubResource( 8 ) +icon = SubResource( 18 ) [node name="SectionTitle2" parent="VBoxContainer/TabContainer/Dialog Text/Column" instance=ExtResource( 3 )] -margin_top = 104.0 -margin_bottom = 126.0 +margin_top = 276.0 +margin_right = 653.0 +margin_bottom = 334.0 text = "Margin" text_key = "Margin" [node name="GridContainer2" type="GridContainer" parent="VBoxContainer/TabContainer/Dialog Text/Column"] -margin_top = 130.0 -margin_right = 270.0 -margin_bottom = 238.0 +margin_top = 342.0 +margin_right = 653.0 +margin_bottom = 646.0 size_flags_horizontal = 3 custom_constants/hseparation = 10 columns = 2 @@ -245,16 +242,16 @@ columns = 2 [node name="TLabel7" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer2" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 5.0 -margin_right = 95.0 -margin_bottom = 19.0 +margin_top = 10.0 +margin_right = 283.0 +margin_bottom = 60.0 text = "Margin Left" text_key = "Margin Left" [node name="MarginLeft" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer2"] -margin_left = 105.0 -margin_right = 179.0 -margin_bottom = 24.0 +margin_left = 293.0 +margin_right = 585.0 +margin_bottom = 70.0 min_value = -999.0 max_value = 999.0 value = 20.0 @@ -265,17 +262,17 @@ allow_lesser = true [node name="TLabel9" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer2" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 33.0 -margin_right = 95.0 -margin_bottom = 47.0 +margin_top = 88.0 +margin_right = 283.0 +margin_bottom = 138.0 text = "Margin Top" text_key = "Margin Top" [node name="MarginTop" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer2"] -margin_left = 105.0 -margin_top = 28.0 -margin_right = 179.0 -margin_bottom = 52.0 +margin_left = 293.0 +margin_top = 78.0 +margin_right = 585.0 +margin_bottom = 148.0 min_value = -999.0 max_value = 999.0 value = 10.0 @@ -286,17 +283,17 @@ allow_lesser = true [node name="TLabel10" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer2" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 61.0 -margin_right = 95.0 -margin_bottom = 75.0 +margin_top = 166.0 +margin_right = 283.0 +margin_bottom = 216.0 text = "Margin Right" text_key = "Margin Right" [node name="MarginRight" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer2"] -margin_left = 105.0 -margin_top = 56.0 -margin_right = 179.0 -margin_bottom = 80.0 +margin_left = 293.0 +margin_top = 156.0 +margin_right = 585.0 +margin_bottom = 226.0 min_value = -999.0 max_value = 999.0 value = -20.0 @@ -307,17 +304,17 @@ allow_lesser = true [node name="TLabel11" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer2" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 89.0 -margin_right = 95.0 -margin_bottom = 103.0 +margin_top = 244.0 +margin_right = 283.0 +margin_bottom = 294.0 text = "Margin Bottom" text_key = "Margin Bottom" [node name="MarginBottom" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer2"] -margin_left = 105.0 -margin_top = 84.0 -margin_right = 179.0 -margin_bottom = 108.0 +margin_left = 293.0 +margin_top = 234.0 +margin_right = 585.0 +margin_bottom = 304.0 min_value = -999.0 max_value = 999.0 value = -10.0 @@ -326,14 +323,14 @@ allow_greater = true allow_lesser = true [node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Dialog Text"] -margin_left = 280.0 -margin_right = 284.0 -margin_bottom = 471.0 +margin_left = 663.0 +margin_right = 671.0 +margin_bottom = 821.0 [node name="Column2" type="VBoxContainer" parent="VBoxContainer/TabContainer/Dialog Text"] -margin_left = 294.0 -margin_right = 564.0 -margin_bottom = 471.0 +margin_left = 681.0 +margin_right = 1563.0 +margin_bottom = 821.0 rect_min_size = Vector2( 270, 0 ) size_flags_vertical = 3 __meta__ = { @@ -341,13 +338,15 @@ __meta__ = { } [node name="SectionTitle" parent="VBoxContainer/TabContainer/Dialog Text/Column2" instance=ExtResource( 3 )] +margin_right = 882.0 +margin_bottom = 58.0 text = "Colors" text_key = "Colors" [node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Dialog Text/Column2"] -margin_top = 26.0 -margin_right = 270.0 -margin_bottom = 118.0 +margin_top = 66.0 +margin_right = 882.0 +margin_bottom = 280.0 size_flags_horizontal = 3 custom_constants/hseparation = 10 columns = 2 @@ -355,42 +354,42 @@ columns = 2 [node name="TLabel" parent="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 8.0 -margin_right = 91.0 -margin_bottom = 22.0 +margin_top = 6.0 +margin_right = 278.0 +margin_bottom = 56.0 text = "Text Color" text_key = "Text Color" [node name="ColorPickerButton" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer"] -margin_left = 101.0 -margin_right = 259.0 -margin_bottom = 30.0 +margin_left = 288.0 +margin_right = 882.0 +margin_bottom = 62.0 rect_min_size = Vector2( 50, 30 ) color = Color( 1, 1, 1, 1 ) [node name="TLabel2" parent="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 42.0 -margin_right = 91.0 -margin_bottom = 56.0 +margin_top = 78.0 +margin_right = 278.0 +margin_bottom = 128.0 text = "Shadow" text_key = "Shadow" [node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer"] -margin_left = 101.0 -margin_top = 34.0 -margin_right = 259.0 -margin_bottom = 64.0 +margin_left = 288.0 +margin_top = 70.0 +margin_right = 882.0 +margin_bottom = 136.0 [node name="CheckBoxShadow" type="CheckBox" parent="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer/HBoxContainer2"] -margin_right = 24.0 -margin_bottom = 30.0 +margin_right = 48.0 +margin_bottom = 66.0 [node name="ColorPickerButtonShadow" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer/HBoxContainer2"] -margin_left = 28.0 -margin_right = 158.0 -margin_bottom = 30.0 +margin_left = 56.0 +margin_right = 594.0 +margin_bottom = 66.0 rect_min_size = Vector2( 50, 30 ) size_flags_horizontal = 3 color = Color( 0, 0, 0, 0.619608 ) @@ -398,45 +397,45 @@ color = Color( 0, 0, 0, 0.619608 ) [node name="TLabel3" parent="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 73.0 -margin_right = 91.0 -margin_bottom = 87.0 +margin_top = 154.0 +margin_right = 278.0 +margin_bottom = 204.0 text = "Shadow Offset" text_key = "Shadow Offset" [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer"] -margin_left = 101.0 -margin_top = 68.0 -margin_right = 259.0 -margin_bottom = 92.0 +margin_left = 288.0 +margin_top = 144.0 +margin_right = 882.0 +margin_bottom = 214.0 custom_constants/separation = 10 [node name="ShadowOffsetX" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer/HBoxContainer"] -margin_right = 74.0 -margin_bottom = 24.0 +margin_right = 292.0 +margin_bottom = 70.0 value = 2.0 rounded = true allow_lesser = true prefix = "X" [node name="ShadowOffsetY" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer/HBoxContainer"] -margin_left = 84.0 -margin_right = 158.0 -margin_bottom = 24.0 +margin_left = 302.0 +margin_right = 594.0 +margin_bottom = 70.0 value = 2.0 rounded = true allow_lesser = true prefix = "Y" [node name="VSeparator2" type="VSeparator" parent="VBoxContainer/TabContainer/Dialog Text"] -margin_left = 574.0 -margin_right = 578.0 -margin_bottom = 471.0 +margin_left = 1573.0 +margin_right = 1581.0 +margin_bottom = 821.0 [node name="Column3" type="VBoxContainer" parent="VBoxContainer/TabContainer/Dialog Text"] -margin_left = 588.0 -margin_right = 873.0 -margin_bottom = 471.0 +margin_left = 1591.0 +margin_right = 2415.0 +margin_bottom = 821.0 rect_min_size = Vector2( 270, 0 ) size_flags_vertical = 3 __meta__ = { @@ -444,14 +443,15 @@ __meta__ = { } [node name="SectionTitle" parent="VBoxContainer/TabContainer/Dialog Text/Column3" instance=ExtResource( 3 )] -margin_right = 285.0 +margin_right = 824.0 +margin_bottom = 58.0 text = "Behaviour" text_key = "Behaviour" [node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Dialog Text/Column3"] -margin_top = 26.0 -margin_right = 285.0 -margin_bottom = 132.0 +margin_top = 66.0 +margin_right = 824.0 +margin_bottom = 354.0 size_flags_horizontal = 3 custom_constants/hseparation = 10 columns = 2 @@ -459,16 +459,16 @@ columns = 2 [node name="TLabel" parent="VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 5.0 -margin_right = 177.0 -margin_bottom = 19.0 +margin_top = 10.0 +margin_right = 522.0 +margin_bottom = 60.0 text = "Speed (bigger = slower)" text_key = "Speed (bigger = slower)" [node name="TextSpeed" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer"] -margin_left = 187.0 -margin_right = 285.0 -margin_bottom = 24.0 +margin_left = 532.0 +margin_right = 824.0 +margin_bottom = 70.0 max_value = 10.0 step = 0.01 value = 2.0 @@ -476,73 +476,73 @@ value = 2.0 [node name="TLabel2" parent="VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 32.0 -margin_right = 177.0 -margin_bottom = 46.0 +margin_top = 84.0 +margin_right = 522.0 +margin_bottom = 134.0 text = "Alignment" text_key = "Alignment" [node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer"] -margin_left = 187.0 -margin_top = 28.0 -margin_right = 285.0 -margin_bottom = 50.0 +margin_left = 532.0 +margin_top = 78.0 +margin_right = 824.0 +margin_bottom = 140.0 [node name="Alignment" type="OptionButton" parent="VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer/HBoxContainer3"] -margin_right = 98.0 -margin_bottom = 22.0 +margin_right = 292.0 +margin_bottom = 62.0 size_flags_horizontal = 3 text = "Top Left" -icon = SubResource( 6 ) -items = [ "Top Left", SubResource( 8 ), false, 0, null, "Top Center", SubResource( 8 ), false, 1, null, "Top Right", SubResource( 8 ), false, 2, null, "", null, false, -1, null, "Center Left", SubResource( 8 ), false, 3, null, "Center", SubResource( 8 ), false, 4, null, "Center Right", SubResource( 8 ), false, 5, null, "", null, false, -1, null, "Bottom Left", SubResource( 8 ), false, 6, null, "Bottom Center", SubResource( 8 ), false, 7, null, "Bottom Right", SubResource( 8 ), false, 8, null ] +icon = SubResource( 16 ) +items = [ "Top Left", SubResource( 18 ), false, 0, null, "Top Center", SubResource( 18 ), false, 1, null, "Top Right", SubResource( 18 ), false, 2, null, "", null, false, -1, null, "Center Left", SubResource( 18 ), false, 3, null, "Center", SubResource( 18 ), false, 4, null, "Center Right", SubResource( 18 ), false, 5, null, "", null, false, -1, null, "Bottom Left", SubResource( 18 ), false, 6, null, "Bottom Center", SubResource( 18 ), false, 7, null, "Bottom Right", SubResource( 18 ), false, 8, null ] selected = 0 [node name="TLabel3" parent="VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 59.0 -margin_right = 177.0 -margin_bottom = 73.0 +margin_top = 156.0 +margin_right = 522.0 +margin_bottom = 206.0 text = "Single Portrait Mode" text_key = "Single Portrait Mode" [node name="SinglePortraitModeCheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer"] -margin_left = 187.0 -margin_top = 54.0 -margin_right = 285.0 -margin_bottom = 78.0 +margin_left = 532.0 +margin_top = 148.0 +margin_right = 824.0 +margin_bottom = 214.0 [node name="TLabel4" parent="VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 87.0 -margin_right = 177.0 -margin_bottom = 101.0 +margin_top = 230.0 +margin_right = 522.0 +margin_bottom = 280.0 text = "Don't Close After Last Event" text_key = "Don't Close After Last Event" [node name="DontCloseAfterLastEventCheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer"] -margin_left = 187.0 -margin_top = 82.0 -margin_right = 285.0 -margin_bottom = 106.0 +margin_left = 532.0 +margin_top = 222.0 +margin_right = 824.0 +margin_bottom = 288.0 [node name="Dialog Box" type="HBoxContainer" parent="VBoxContainer/TabContainer"] visible = false anchor_right = 1.0 anchor_bottom = 1.0 -margin_left = 4.0 -margin_top = 32.0 -margin_right = -4.0 -margin_bottom = -4.0 +margin_left = 8.0 +margin_top = 86.0 +margin_right = -8.0 +margin_bottom = -8.0 custom_constants/separation = 10 __meta__ = { "_tab_name": "Dialog Box" } [node name="Column" type="VBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box"] -margin_right = 319.0 -margin_bottom = 615.0 +margin_right = 1136.0 +margin_bottom = 1036.0 rect_min_size = Vector2( 270, 0 ) size_flags_vertical = 3 __meta__ = { @@ -550,13 +550,14 @@ __meta__ = { } [node name="SectionTitle" parent="VBoxContainer/TabContainer/Dialog Box/Column" instance=ExtResource( 3 )] -margin_right = 319.0 +margin_right = 1136.0 +margin_bottom = 58.0 text_key = "Visuals" [node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column"] -margin_top = 26.0 -margin_right = 319.0 -margin_bottom = 162.0 +margin_top = 66.0 +margin_right = 1136.0 +margin_bottom = 436.0 size_flags_horizontal = 3 custom_constants/hseparation = 10 columns = 2 @@ -564,105 +565,105 @@ columns = 2 [node name="TLabel" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 5.0 -margin_right = 157.0 -margin_bottom = 19.0 +margin_top = 8.0 +margin_right = 534.0 +margin_bottom = 58.0 text = "Background Color" text_key = "Background Color" [node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"] -margin_left = 167.0 -margin_right = 319.0 -margin_bottom = 24.0 +margin_left = 544.0 +margin_right = 1136.0 +margin_bottom = 66.0 [node name="CheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer2"] -margin_right = 24.0 -margin_bottom = 24.0 +margin_right = 48.0 +margin_bottom = 66.0 [node name="ColorPickerButton" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer2"] -margin_left = 28.0 -margin_right = 152.0 -margin_bottom = 24.0 +margin_left = 56.0 +margin_right = 592.0 +margin_bottom = 66.0 size_flags_horizontal = 3 [node name="TLabel2" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 33.0 -margin_right = 157.0 -margin_bottom = 47.0 +margin_top = 82.0 +margin_right = 534.0 +margin_bottom = 132.0 text = "Background Texture" text_key = "Background Texture" [node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"] -margin_left = 167.0 -margin_top = 28.0 -margin_right = 319.0 -margin_bottom = 52.0 +margin_left = 544.0 +margin_top = 74.0 +margin_right = 1136.0 +margin_bottom = 140.0 [node name="CheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer3"] -margin_right = 24.0 -margin_bottom = 24.0 +margin_right = 48.0 +margin_bottom = 66.0 pressed = true [node name="BackgroundTextureButton" type="Button" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer3"] -margin_left = 28.0 -margin_right = 152.0 -margin_bottom = 24.0 +margin_left = 56.0 +margin_right = 592.0 +margin_bottom = 66.0 size_flags_horizontal = 3 text = "background-2" [node name="TLabel3" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 61.0 -margin_right = 157.0 -margin_bottom = 75.0 +margin_top = 156.0 +margin_right = 534.0 +margin_bottom = 206.0 text = "Texture Modulation" text_key = "Texture Modulation" [node name="HBoxContainer6" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"] -margin_left = 167.0 -margin_top = 56.0 -margin_right = 319.0 -margin_bottom = 80.0 +margin_left = 544.0 +margin_top = 148.0 +margin_right = 1136.0 +margin_bottom = 214.0 [node name="CheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer6"] -margin_right = 24.0 -margin_bottom = 24.0 +margin_right = 48.0 +margin_bottom = 66.0 [node name="ColorPickerButton" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer6"] -margin_left = 28.0 -margin_right = 152.0 -margin_bottom = 24.0 +margin_left = 56.0 +margin_right = 592.0 +margin_bottom = 66.0 size_flags_horizontal = 3 [node name="TLabel6" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 89.0 -margin_right = 157.0 -margin_bottom = 103.0 +margin_top = 232.0 +margin_right = 534.0 +margin_bottom = 282.0 text = "9-Patch Margin Left/Right" text_key = "9-Patch Margin Left/Right" [node name="NinePatchBoxLeftRight" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"] -margin_left = 167.0 -margin_top = 84.0 -margin_right = 319.0 -margin_bottom = 108.0 +margin_left = 544.0 +margin_top = 222.0 +margin_right = 1136.0 +margin_bottom = 292.0 [node name="PatchMarginLeft" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/NinePatchBoxLeftRight"] -margin_right = 74.0 -margin_bottom = 24.0 +margin_right = 292.0 +margin_bottom = 70.0 rounded = true allow_greater = true allow_lesser = true [node name="PatchMarginRight" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/NinePatchBoxLeftRight"] -margin_left = 78.0 -margin_right = 152.0 -margin_bottom = 24.0 +margin_left = 300.0 +margin_right = 592.0 +margin_bottom = 70.0 max_value = 999.0 rounded = true allow_greater = true @@ -671,45 +672,45 @@ allow_lesser = true [node name="TLabel7" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 117.0 -margin_right = 157.0 -margin_bottom = 131.0 +margin_top = 310.0 +margin_right = 534.0 +margin_bottom = 360.0 text = "9-Patch Margin Top/Bottom" text_key = "9-Patch Margin Top/Bottom" [node name="NinePatchBoxTopBottom" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"] -margin_left = 167.0 -margin_top = 112.0 -margin_right = 319.0 -margin_bottom = 136.0 +margin_left = 544.0 +margin_top = 300.0 +margin_right = 1136.0 +margin_bottom = 370.0 [node name="PatchMarginTop" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/NinePatchBoxTopBottom"] -margin_right = 74.0 -margin_bottom = 24.0 +margin_right = 292.0 +margin_bottom = 70.0 rounded = true allow_greater = true allow_lesser = true [node name="PatchMarginBottom" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/NinePatchBoxTopBottom"] -margin_left = 78.0 -margin_right = 152.0 -margin_bottom = 24.0 +margin_left = 300.0 +margin_right = 592.0 +margin_bottom = 70.0 max_value = 999.0 rounded = true allow_greater = true allow_lesser = true [node name="SectionTitle2" parent="VBoxContainer/TabContainer/Dialog Box/Column" instance=ExtResource( 3 )] -margin_top = 166.0 -margin_right = 319.0 -margin_bottom = 188.0 +margin_top = 444.0 +margin_right = 1136.0 +margin_bottom = 502.0 text = "Size and Position" text_key = "Size and Position" [node name="GridContainer2" type="GridContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column"] -margin_top = 136.0 -margin_right = 270.0 -margin_bottom = 326.0 +margin_top = 510.0 +margin_right = 1136.0 +margin_bottom = 1036.0 size_flags_horizontal = 3 custom_constants/hseparation = 10 columns = 2 @@ -717,48 +718,48 @@ columns = 2 [node name="TLabel4" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 5.0 -margin_right = 104.0 -margin_bottom = 19.0 +margin_top = 8.0 +margin_right = 307.0 +margin_bottom = 58.0 text = "Full width" text_key = "Full width" [node name="HBoxContainer7" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2"] -margin_left = 114.0 -margin_right = 266.0 -margin_bottom = 24.0 +margin_left = 317.0 +margin_right = 909.0 +margin_bottom = 66.0 [node name="CheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2/HBoxContainer7"] -margin_right = 24.0 -margin_bottom = 24.0 +margin_right = 48.0 +margin_bottom = 66.0 [node name="TLabel6" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 33.0 -margin_right = 104.0 -margin_bottom = 47.0 +margin_top = 84.0 +margin_right = 307.0 +margin_bottom = 134.0 text = "Box size (pixels)" text_key = "Box size (pixels)" [node name="HBoxContainer4" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2"] -margin_left = 114.0 -margin_top = 28.0 -margin_right = 266.0 -margin_bottom = 52.0 +margin_left = 317.0 +margin_top = 74.0 +margin_right = 909.0 +margin_bottom = 144.0 [node name="BoxSizeW" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2/HBoxContainer4"] -margin_right = 74.0 -margin_bottom = 24.0 +margin_right = 292.0 +margin_bottom = 70.0 value = 100.0 rounded = true allow_greater = true allow_lesser = true [node name="BoxSizeH" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2/HBoxContainer4"] -margin_left = 78.0 -margin_right = 152.0 -margin_bottom = 24.0 +margin_left = 300.0 +margin_right = 592.0 +margin_bottom = 70.0 max_value = 999.0 value = 167.0 rounded = true @@ -768,20 +769,20 @@ allow_lesser = true [node name="TLabel8" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 60.0 -margin_right = 104.0 -margin_bottom = 74.0 +margin_top = 158.0 +margin_right = 307.0 +margin_bottom = 208.0 text = "Position" text_key = "Position" [node name="PositionSelector" type="OptionButton" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2"] -margin_left = 114.0 -margin_top = 56.0 -margin_right = 266.0 -margin_bottom = 78.0 +margin_left = 317.0 +margin_top = 152.0 +margin_right = 909.0 +margin_bottom = 214.0 text = "Top Left" -icon = SubResource( 6 ) -items = [ "Top Left", SubResource( 8 ), false, 0, null, "Top Center", SubResource( 8 ), false, 1, null, "Top Right", SubResource( 8 ), false, 2, null, "", null, false, -1, null, "Center Left", SubResource( 8 ), false, 3, null, "Center", SubResource( 8 ), false, 4, null, "Center Right", SubResource( 8 ), false, 5, null, "", null, false, -1, null, "Bottom Left", SubResource( 8 ), false, 6, null, "Bottom Center", SubResource( 8 ), false, 7, null, "Bottom Right", SubResource( 8 ), false, 8, null ] +icon = SubResource( 16 ) +items = [ "Top Left", SubResource( 18 ), false, 0, null, "Top Center", SubResource( 18 ), false, 1, null, "Top Right", SubResource( 18 ), false, 2, null, "", null, false, -1, null, "Center Left", SubResource( 18 ), false, 3, null, "Center", SubResource( 18 ), false, 4, null, "Center Right", SubResource( 18 ), false, 5, null, "", null, false, -1, null, "Bottom Left", SubResource( 18 ), false, 6, null, "Bottom Center", SubResource( 18 ), false, 7, null, "Bottom Right", SubResource( 18 ), false, 8, null ] selected = 0 __meta__ = { "_edit_use_anchors_": false @@ -790,17 +791,17 @@ __meta__ = { [node name="TLabel7" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 87.0 -margin_right = 104.0 -margin_bottom = 101.0 +margin_top = 232.0 +margin_right = 307.0 +margin_bottom = 282.0 text = "Margin Left" text_key = "Margin Left" [node name="MarginLeft" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2"] -margin_left = 114.0 -margin_top = 82.0 -margin_right = 266.0 -margin_bottom = 106.0 +margin_left = 317.0 +margin_top = 222.0 +margin_right = 909.0 +margin_bottom = 292.0 min_value = -999.0 max_value = 999.0 value = 40.0 @@ -811,17 +812,17 @@ allow_lesser = true [node name="TLabel9" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 115.0 -margin_right = 104.0 -margin_bottom = 129.0 +margin_top = 310.0 +margin_right = 307.0 +margin_bottom = 360.0 text = "Margin Top" text_key = "Margin Top" [node name="MarginTop" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2"] -margin_left = 114.0 -margin_top = 110.0 -margin_right = 266.0 -margin_bottom = 134.0 +margin_left = 317.0 +margin_top = 300.0 +margin_right = 909.0 +margin_bottom = 370.0 min_value = -999.0 max_value = 999.0 value = 40.0 @@ -832,17 +833,17 @@ allow_lesser = true [node name="TLabel10" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 143.0 -margin_right = 104.0 -margin_bottom = 157.0 +margin_top = 388.0 +margin_right = 307.0 +margin_bottom = 438.0 text = "Margin Right" text_key = "Margin Right" [node name="MarginRight" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2"] -margin_left = 114.0 -margin_top = 138.0 -margin_right = 266.0 -margin_bottom = 162.0 +margin_left = 317.0 +margin_top = 378.0 +margin_right = 909.0 +margin_bottom = 448.0 min_value = -999.0 max_value = 999.0 value = -40.0 @@ -853,17 +854,17 @@ allow_lesser = true [node name="TLabel11" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 171.0 -margin_right = 104.0 -margin_bottom = 185.0 +margin_top = 466.0 +margin_right = 307.0 +margin_bottom = 516.0 text = "Margin Bottom" text_key = "Margin Bottom" [node name="MarginBottom" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2"] -margin_left = 114.0 -margin_top = 166.0 -margin_right = 266.0 -margin_bottom = 190.0 +margin_left = 317.0 +margin_top = 456.0 +margin_right = 909.0 +margin_bottom = 526.0 min_value = -999.0 max_value = 999.0 value = -40.0 @@ -872,14 +873,14 @@ allow_greater = true allow_lesser = true [node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Dialog Box"] -margin_left = 329.0 -margin_right = 333.0 -margin_bottom = 615.0 +margin_left = 1146.0 +margin_right = 1154.0 +margin_bottom = 1036.0 [node name="Column2" type="VBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box"] -margin_left = 343.0 -margin_right = 613.0 -margin_bottom = 615.0 +margin_left = 1164.0 +margin_right = 1961.0 +margin_bottom = 1036.0 rect_min_size = Vector2( 270, 0 ) size_flags_vertical = 3 __meta__ = { @@ -887,13 +888,15 @@ __meta__ = { } [node name="SectionTitle" parent="VBoxContainer/TabContainer/Dialog Box/Column2" instance=ExtResource( 3 )] +margin_right = 797.0 +margin_bottom = 58.0 text = "Next Indicator" text_key = "Next Indicator" [node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column2"] -margin_top = 26.0 -margin_right = 270.0 -margin_bottom = 126.0 +margin_top = 66.0 +margin_right = 797.0 +margin_bottom = 354.0 size_flags_horizontal = 3 custom_constants/hseparation = 10 columns = 2 @@ -901,32 +904,32 @@ columns = 2 [node name="TLabel" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 3.0 -margin_right = 66.0 -margin_bottom = 17.0 +margin_top = 6.0 +margin_right = 195.0 +margin_bottom = 56.0 text = "Image" text_key = "Image" [node name="NextIndicatorButton" type="Button" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"] -margin_left = 76.0 -margin_right = 228.0 -margin_bottom = 20.0 +margin_left = 205.0 +margin_right = 797.0 +margin_bottom = 62.0 text = "next-indicator" [node name="TLabel2" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 27.0 -margin_right = 66.0 -margin_bottom = 41.0 +margin_top = 76.0 +margin_right = 195.0 +margin_bottom = 126.0 text = "Animation" text_key = "Animation" [node name="NextAnimation" type="OptionButton" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"] -margin_left = 76.0 -margin_top = 24.0 -margin_right = 228.0 -margin_bottom = 44.0 +margin_left = 205.0 +margin_top = 70.0 +margin_right = 797.0 +margin_bottom = 132.0 __meta__ = { "_edit_use_anchors_": false } @@ -934,21 +937,21 @@ __meta__ = { [node name="TLabel3" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 53.0 -margin_right = 66.0 -margin_bottom = 67.0 +margin_top = 150.0 +margin_right = 195.0 +margin_bottom = 200.0 text = "Scale" text_key = "Scale" [node name="HBoxContainer7" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"] -margin_left = 76.0 -margin_top = 48.0 -margin_right = 228.0 -margin_bottom = 72.0 +margin_left = 205.0 +margin_top = 140.0 +margin_right = 797.0 +margin_bottom = 210.0 [node name="IndicatorScale" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer7"] -margin_right = 74.0 -margin_bottom = 24.0 +margin_right = 292.0 +margin_bottom = 70.0 max_value = 999.0 step = 0.1 value = 1.0 @@ -958,21 +961,21 @@ allow_lesser = true [node name="TLabel4" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 81.0 -margin_right = 66.0 -margin_bottom = 95.0 +margin_top = 228.0 +margin_right = 195.0 +margin_bottom = 278.0 text = "Offset" text_key = "Offset" [node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"] -margin_left = 76.0 -margin_top = 76.0 -margin_right = 228.0 -margin_bottom = 100.0 +margin_left = 205.0 +margin_top = 218.0 +margin_right = 797.0 +margin_bottom = 288.0 [node name="NextOffsetX" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer2"] -margin_right = 74.0 -margin_bottom = 24.0 +margin_right = 292.0 +margin_bottom = 70.0 max_value = 1e+07 value = 10.0 rounded = true @@ -980,9 +983,9 @@ allow_greater = true allow_lesser = true [node name="NextOffsetY" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer2"] -margin_left = 78.0 -margin_right = 152.0 -margin_bottom = 24.0 +margin_left = 300.0 +margin_right = 592.0 +margin_bottom = 70.0 max_value = 1e+07 value = 20.0 rounded = true @@ -990,14 +993,14 @@ allow_greater = true allow_lesser = true [node name="VSeparator2" type="VSeparator" parent="VBoxContainer/TabContainer/Dialog Box"] -margin_left = 623.0 -margin_right = 627.0 -margin_bottom = 615.0 +margin_left = 1971.0 +margin_right = 1979.0 +margin_bottom = 1036.0 [node name="Column3" type="VBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box"] -margin_left = 637.0 -margin_right = 907.0 -margin_bottom = 615.0 +margin_left = 1989.0 +margin_right = 2811.0 +margin_bottom = 1036.0 rect_min_size = Vector2( 270, 0 ) size_flags_vertical = 3 __meta__ = { @@ -1005,13 +1008,15 @@ __meta__ = { } [node name="SectionTitle" parent="VBoxContainer/TabContainer/Dialog Box/Column3" instance=ExtResource( 3 )] +margin_right = 822.0 +margin_bottom = 58.0 text = "Behaviour" text_key = "Behaviour" [node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column3"] -margin_top = 26.0 -margin_right = 270.0 -margin_bottom = 130.0 +margin_top = 66.0 +margin_right = 822.0 +margin_bottom = 358.0 size_flags_horizontal = 3 custom_constants/hseparation = 10 columns = 2 @@ -1019,20 +1024,20 @@ columns = 2 [node name="TLabel2" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 5.0 -margin_right = 175.0 -margin_bottom = 19.0 +margin_top = 10.0 +margin_right = 520.0 +margin_bottom = 60.0 text = "Fade in time:" text_key = "Fade in time:" [node name="ShowTime" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer"] -margin_left = 185.0 -margin_right = 259.0 -margin_bottom = 24.0 +margin_left = 530.0 +margin_right = 822.0 +margin_bottom = 70.0 [node name="SpinBox" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer/ShowTime"] -margin_right = 74.0 -margin_bottom = 24.0 +margin_right = 292.0 +margin_bottom = 70.0 max_value = 999.0 step = 0.1 value = 0.5 @@ -1041,45 +1046,45 @@ allow_greater = true [node name="TLabel3" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 31.0 -margin_right = 175.0 -margin_bottom = 45.0 +margin_top = 84.0 +margin_right = 520.0 +margin_bottom = 134.0 text = "Portraits Dim Color" text_key = "Portraits Dim Color" [node name="DimColor" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer"] -margin_left = 185.0 -margin_top = 28.0 -margin_right = 259.0 -margin_bottom = 48.0 +margin_left = 530.0 +margin_top = 78.0 +margin_right = 822.0 +margin_bottom = 140.0 [node name="ColorPickerButton" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer/DimColor"] -margin_right = 74.0 -margin_bottom = 20.0 +margin_right = 292.0 +margin_bottom = 62.0 size_flags_horizontal = 3 color = Color( 0.501961, 0.501961, 0.501961, 1 ) [node name="TLabel5" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 57.0 -margin_right = 175.0 -margin_bottom = 71.0 +margin_top = 158.0 +margin_right = 520.0 +margin_bottom = 208.0 text = "Portrait Dim time:" text_key = "Portrait Dim time:" [node name="PortraitDimTime" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer"] -margin_left = 185.0 -margin_top = 52.0 -margin_right = 259.0 -margin_bottom = 76.0 +margin_left = 530.0 +margin_top = 148.0 +margin_right = 822.0 +margin_bottom = 218.0 __meta__ = { "_edit_use_anchors_": false } [node name="SpinBox" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer/PortraitDimTime"] -margin_right = 74.0 -margin_bottom = 24.0 +margin_right = 292.0 +margin_bottom = 70.0 max_value = 999.0 step = 0.1 value = 0.5 @@ -1088,34 +1093,34 @@ allow_greater = true [node name="TLabel4" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 85.0 -margin_right = 175.0 -margin_bottom = 99.0 +margin_top = 234.0 +margin_right = 520.0 +margin_bottom = 284.0 text = "Portraits Behind Dialog Box" text_key = "Portraits Behind Dialog Box" [node name="PortraitsBehindDialogCheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer"] -margin_left = 185.0 -margin_top = 80.0 -margin_right = 259.0 -margin_bottom = 104.0 +margin_left = 530.0 +margin_top = 226.0 +margin_right = 822.0 +margin_bottom = 292.0 [node name="Name Label" type="HBoxContainer" parent="VBoxContainer/TabContainer"] visible = false anchor_right = 1.0 anchor_bottom = 1.0 -margin_left = 4.0 -margin_top = 32.0 -margin_right = -4.0 -margin_bottom = -4.0 +margin_left = 8.0 +margin_top = 86.0 +margin_right = -8.0 +margin_bottom = -8.0 custom_constants/separation = 10 __meta__ = { "_tab_name": "Name Label" } [node name="Column" type="VBoxContainer" parent="VBoxContainer/TabContainer/Name Label"] -margin_right = 287.0 -margin_bottom = 495.0 +margin_right = 975.0 +margin_bottom = 821.0 rect_min_size = Vector2( 270, 0 ) size_flags_vertical = 3 __meta__ = { @@ -1123,17 +1128,18 @@ __meta__ = { } [node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column"] -margin_right = 287.0 -margin_bottom = 50.0 +margin_right = 975.0 +margin_bottom = 132.0 [node name="SectionTitle" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer" instance=ExtResource( 3 )] -margin_right = 287.0 +margin_right = 975.0 +margin_bottom = 58.0 text = "Behaviour" [node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer"] -margin_top = 26.0 -margin_right = 287.0 -margin_bottom = 50.0 +margin_top = 66.0 +margin_right = 975.0 +margin_bottom = 132.0 columns = 2 __meta__ = { "_edit_use_anchors_": false @@ -1142,100 +1148,100 @@ __meta__ = { [node name="TLabel" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 5.0 -margin_right = 112.0 -margin_bottom = 19.0 +margin_top = 8.0 +margin_right = 326.0 +margin_bottom = 58.0 text = "Hide name labels" text_key = "Hide name labels" [node name="NameHide" type="CheckBox" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer/GridContainer"] -margin_left = 116.0 -margin_right = 140.0 -margin_bottom = 24.0 +margin_left = 334.0 +margin_right = 382.0 +margin_bottom = 66.0 [node name="VBoxContainer2" type="VBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column"] -margin_top = 54.0 -margin_right = 287.0 -margin_bottom = 192.0 +margin_top = 140.0 +margin_right = 975.0 +margin_bottom = 494.0 [node name="SectionTitle" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2" instance=ExtResource( 3 )] -margin_right = 287.0 +margin_right = 975.0 +margin_bottom = 58.0 text = "Text" text_key = "Text" [node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2"] -margin_top = 26.0 -margin_right = 287.0 -margin_bottom = 138.0 +margin_top = 66.0 +margin_right = 975.0 +margin_bottom = 354.0 columns = 2 [node name="TLabel" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 4.0 -margin_right = 125.0 -margin_bottom = 18.0 +margin_top = 6.0 +margin_right = 373.0 +margin_bottom = 56.0 text = "Name label Font" text_key = "Name label Font" [node name="RegularFont" type="HBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer"] -margin_left = 129.0 -margin_right = 287.0 -margin_bottom = 22.0 +margin_left = 381.0 +margin_right = 975.0 +margin_bottom = 62.0 [node name="NameFontButton" type="Button" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/RegularFont"] -margin_top = 1.0 -margin_right = 126.0 -margin_bottom = 21.0 +margin_right = 530.0 +margin_bottom = 62.0 size_flags_horizontal = 3 size_flags_vertical = 4 text = "DefaultFont" [node name="NameFontOpen" type="Button" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/RegularFont"] -margin_left = 130.0 -margin_right = 158.0 -margin_bottom = 22.0 +margin_left = 538.0 +margin_right = 594.0 +margin_bottom = 62.0 size_flags_vertical = 4 -icon = SubResource( 8 ) +icon = SubResource( 18 ) [node name="TLabel2" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 31.0 -margin_right = 125.0 -margin_bottom = 45.0 +margin_top = 78.0 +margin_right = 373.0 +margin_bottom = 128.0 text = "Use character Color" text_key = "Use character Color" [node name="CharacterColor" type="CheckBox" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer"] -margin_left = 129.0 -margin_top = 26.0 -margin_right = 287.0 -margin_bottom = 50.0 +margin_left = 381.0 +margin_top = 70.0 +margin_right = 975.0 +margin_bottom = 136.0 [node name="TLabel3" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 62.0 -margin_right = 125.0 -margin_bottom = 76.0 +margin_top = 152.0 +margin_right = 373.0 +margin_bottom = 202.0 text = "Shadow" text_key = "Shadow" [node name="HBoxContainer4" type="HBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer"] -margin_left = 129.0 -margin_top = 54.0 -margin_right = 287.0 -margin_bottom = 84.0 +margin_left = 381.0 +margin_top = 144.0 +margin_right = 975.0 +margin_bottom = 210.0 [node name="CheckBoxShadow" type="CheckBox" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/HBoxContainer4"] -margin_right = 24.0 -margin_bottom = 30.0 +margin_right = 48.0 +margin_bottom = 66.0 [node name="ColorPickerButtonShadow" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/HBoxContainer4"] -margin_left = 28.0 -margin_right = 158.0 -margin_bottom = 30.0 +margin_left = 56.0 +margin_right = 594.0 +margin_bottom = 66.0 rect_min_size = Vector2( 50, 30 ) size_flags_horizontal = 3 color = Color( 0, 0, 0, 0.619608 ) @@ -1243,45 +1249,45 @@ color = Color( 0, 0, 0, 0.619608 ) [node name="TLabel4" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 93.0 -margin_right = 125.0 -margin_bottom = 107.0 +margin_top = 228.0 +margin_right = 373.0 +margin_bottom = 278.0 text = "Shadow Offset" text_key = "Shadow Offset" [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer"] -margin_left = 129.0 -margin_top = 88.0 -margin_right = 287.0 -margin_bottom = 112.0 +margin_left = 381.0 +margin_top = 218.0 +margin_right = 975.0 +margin_bottom = 288.0 custom_constants/separation = 10 [node name="ShadowOffsetX" type="SpinBox" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/HBoxContainer"] -margin_right = 74.0 -margin_bottom = 24.0 +margin_right = 292.0 +margin_bottom = 70.0 value = 2.0 rounded = true allow_lesser = true prefix = "X" [node name="ShadowOffsetY" type="SpinBox" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/HBoxContainer"] -margin_left = 84.0 -margin_right = 158.0 -margin_bottom = 24.0 +margin_left = 302.0 +margin_right = 594.0 +margin_bottom = 70.0 value = 2.0 rounded = true allow_lesser = true prefix = "Y" [node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Name Label"] -margin_left = 297.0 -margin_right = 301.0 -margin_bottom = 495.0 +margin_left = 985.0 +margin_right = 993.0 +margin_bottom = 821.0 [node name="Column2" type="VBoxContainer" parent="VBoxContainer/TabContainer/Name Label"] -margin_left = 311.0 -margin_right = 599.0 -margin_bottom = 495.0 +margin_left = 1003.0 +margin_right = 1985.0 +margin_bottom = 821.0 rect_min_size = Vector2( 270, 0 ) size_flags_vertical = 3 __meta__ = { @@ -1289,133 +1295,134 @@ __meta__ = { } [node name="SectionTitle" parent="VBoxContainer/TabContainer/Name Label/Column2" instance=ExtResource( 3 )] -margin_right = 288.0 +margin_right = 982.0 +margin_bottom = 58.0 text = "Box" text_key = "Box" [node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Name Label/Column2"] -margin_top = 26.0 -margin_right = 288.0 -margin_bottom = 134.0 +margin_top = 66.0 +margin_right = 982.0 +margin_bottom = 358.0 columns = 2 [node name="TLabel" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 5.0 -margin_right = 126.0 -margin_bottom = 19.0 +margin_top = 8.0 +margin_right = 380.0 +margin_bottom = 58.0 text = "Background Color" text_key = "Background Color" [node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer"] -margin_left = 130.0 -margin_right = 288.0 -margin_bottom = 24.0 +margin_left = 388.0 +margin_right = 982.0 +margin_bottom = 66.0 [node name="CheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer2"] -margin_right = 24.0 -margin_bottom = 24.0 +margin_right = 48.0 +margin_bottom = 66.0 [node name="ColorPickerButton" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer2"] -margin_left = 28.0 -margin_right = 158.0 -margin_bottom = 24.0 +margin_left = 56.0 +margin_right = 594.0 +margin_bottom = 66.0 size_flags_horizontal = 3 [node name="TLabel2" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 33.0 -margin_right = 126.0 -margin_bottom = 47.0 +margin_top = 82.0 +margin_right = 380.0 +margin_bottom = 132.0 text = "Background Texture" text_key = "Background Texture" [node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer"] -margin_left = 130.0 -margin_top = 28.0 -margin_right = 288.0 -margin_bottom = 52.0 +margin_left = 388.0 +margin_top = 74.0 +margin_right = 982.0 +margin_bottom = 140.0 [node name="CheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer3"] -margin_right = 24.0 -margin_bottom = 24.0 +margin_right = 48.0 +margin_bottom = 66.0 pressed = true [node name="BackgroundTextureButton" type="Button" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer3"] -margin_left = 28.0 -margin_right = 158.0 -margin_bottom = 24.0 +margin_left = 56.0 +margin_right = 594.0 +margin_bottom = 66.0 size_flags_horizontal = 3 text = "background-2" [node name="TLabel3" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 61.0 -margin_right = 126.0 -margin_bottom = 75.0 +margin_top = 156.0 +margin_right = 380.0 +margin_bottom = 206.0 text = "Texture Modulation" text_key = "Texture Modulation" [node name="HBoxContainer6" type="HBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer"] -margin_left = 130.0 -margin_top = 56.0 -margin_right = 288.0 -margin_bottom = 80.0 +margin_left = 388.0 +margin_top = 148.0 +margin_right = 982.0 +margin_bottom = 214.0 [node name="CheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer6"] -margin_right = 24.0 -margin_bottom = 24.0 +margin_right = 48.0 +margin_bottom = 66.0 [node name="ColorPickerButton" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer6"] -margin_left = 28.0 -margin_right = 158.0 -margin_bottom = 24.0 +margin_left = 56.0 +margin_right = 594.0 +margin_bottom = 66.0 size_flags_horizontal = 3 [node name="TLabel4" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 89.0 -margin_right = 126.0 -margin_bottom = 103.0 +margin_top = 232.0 +margin_right = 380.0 +margin_bottom = 282.0 text = "Box Padding" text_key = "Box Padding" [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer"] -margin_left = 130.0 -margin_top = 84.0 -margin_right = 288.0 -margin_bottom = 108.0 +margin_left = 388.0 +margin_top = 222.0 +margin_right = 982.0 +margin_bottom = 292.0 custom_constants/separation = 10 [node name="NamePaddingX" type="SpinBox" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer"] -margin_right = 74.0 -margin_bottom = 24.0 +margin_right = 292.0 +margin_bottom = 70.0 step = 0.1 value = 10.0 allow_greater = true allow_lesser = true [node name="NamePaddingY" type="SpinBox" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer"] -margin_left = 84.0 -margin_right = 158.0 -margin_bottom = 24.0 +margin_left = 302.0 +margin_right = 594.0 +margin_bottom = 70.0 step = 0.1 allow_greater = true allow_lesser = true [node name="VSeparator2" type="VSeparator" parent="VBoxContainer/TabContainer/Name Label"] -margin_left = 609.0 -margin_right = 613.0 -margin_bottom = 495.0 +margin_left = 1995.0 +margin_right = 2003.0 +margin_bottom = 821.0 [node name="Column3" type="VBoxContainer" parent="VBoxContainer/TabContainer/Name Label"] -margin_left = 623.0 -margin_right = 893.0 -margin_bottom = 495.0 +margin_left = 2013.0 +margin_right = 2770.0 +margin_bottom = 821.0 rect_min_size = Vector2( 270, 0 ) size_flags_vertical = 3 __meta__ = { @@ -1423,63 +1430,65 @@ __meta__ = { } [node name="SectionTitle" parent="VBoxContainer/TabContainer/Name Label/Column3" instance=ExtResource( 3 )] +margin_right = 757.0 +margin_bottom = 58.0 text = "Placement" text_key = "Placement" [node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Name Label/Column3"] -margin_top = 26.0 -margin_right = 270.0 -margin_bottom = 74.0 +margin_top = 66.0 +margin_right = 757.0 +margin_bottom = 206.0 columns = 2 [node name="TLabel" parent="VBoxContainer/TabContainer/Name Label/Column3/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 3.0 -margin_right = 52.0 -margin_bottom = 17.0 +margin_top = 6.0 +margin_right = 157.0 +margin_bottom = 56.0 text = "Position" text_key = "Position" [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column3/GridContainer"] -margin_left = 56.0 -margin_right = 208.0 -margin_bottom = 20.0 +margin_left = 165.0 +margin_right = 757.0 +margin_bottom = 62.0 [node name="Positions" type="OptionButton" parent="VBoxContainer/TabContainer/Name Label/Column3/GridContainer/HBoxContainer"] -margin_right = 152.0 -margin_bottom = 20.0 +margin_right = 592.0 +margin_bottom = 62.0 size_flags_horizontal = 3 text = "Left" -items = [ "Left", null, false, -1, null, "Center", null, false, 0, null, "Right", null, false, 1, null ] +items = [ "Left", null, false, 0, null, "Center", null, false, 1, null, "Right", null, false, 2, null ] selected = 0 [node name="TLabel2" parent="VBoxContainer/TabContainer/Name Label/Column3/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 29.0 -margin_right = 52.0 -margin_bottom = 43.0 +margin_top = 80.0 +margin_right = 157.0 +margin_bottom = 130.0 text = "Offset" text_key = "Offset" [node name="HBoxContainer5" type="HBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column3/GridContainer"] -margin_left = 56.0 -margin_top = 24.0 -margin_right = 208.0 -margin_bottom = 48.0 +margin_left = 165.0 +margin_top = 70.0 +margin_right = 757.0 +margin_bottom = 140.0 [node name="HorizontalOffset" type="SpinBox" parent="VBoxContainer/TabContainer/Name Label/Column3/GridContainer/HBoxContainer5"] -margin_right = 74.0 -margin_bottom = 24.0 +margin_right = 292.0 +margin_bottom = 70.0 step = 0.1 allow_greater = true allow_lesser = true [node name="BottomGap" type="SpinBox" parent="VBoxContainer/TabContainer/Name Label/Column3/GridContainer/HBoxContainer5"] -margin_left = 78.0 -margin_right = 152.0 -margin_bottom = 24.0 +margin_left = 300.0 +margin_right = 592.0 +margin_bottom = 70.0 step = 0.1 value = 48.0 allow_greater = true @@ -1489,42 +1498,76 @@ allow_lesser = true visible = false anchor_right = 1.0 anchor_bottom = 1.0 -margin_left = 4.0 -margin_top = 32.0 -margin_right = -4.0 -margin_bottom = -4.0 +margin_left = 8.0 +margin_top = 86.0 +margin_right = -8.0 +margin_bottom = -8.0 custom_constants/separation = 10 __meta__ = { "_tab_name": "Choice Buttons" } [node name="Column" type="VBoxContainer" parent="VBoxContainer/TabContainer/Choice Buttons"] -margin_right = 380.0 -margin_bottom = 488.0 +margin_right = 734.0 +margin_bottom = 845.0 rect_min_size = Vector2( 380, 0 ) size_flags_vertical = 3 __meta__ = { "_edit_use_anchors_": false } +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/TabContainer/Choice Buttons/Column"] +margin_right = 734.0 +margin_bottom = 132.0 + +[node name="SectionTitle" parent="VBoxContainer/TabContainer/Choice Buttons/Column/VBoxContainer" instance=ExtResource( 3 )] +margin_right = 734.0 +margin_bottom = 58.0 +text = "Behaviour" + +[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Choice Buttons/Column/VBoxContainer"] +margin_top = 66.0 +margin_right = 734.0 +margin_bottom = 132.0 +columns = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TLabel" parent="VBoxContainer/TabContainer/Choice Buttons/Column/VBoxContainer/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 8.0 +margin_right = 379.0 +margin_bottom = 58.0 +text = "Show disabled choices" +text_key = "Show disabled choices" + +[node name="ChoiceShow" type="CheckBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column/VBoxContainer/GridContainer"] +margin_left = 387.0 +margin_right = 435.0 +margin_bottom = 66.0 + [node name="SectionTitle" parent="VBoxContainer/TabContainer/Choice Buttons/Column" instance=ExtResource( 3 )] -margin_right = 380.0 +margin_top = 140.0 +margin_right = 734.0 +margin_bottom = 198.0 text = "Button Style" text_key = "Button Style" [node name="TabContainer" type="TabContainer" parent="VBoxContainer/TabContainer/Choice Buttons/Column"] -margin_top = 26.0 -margin_right = 380.0 -margin_bottom = 170.0 +margin_top = 206.0 +margin_right = 734.0 +margin_bottom = 588.0 tab_align = 0 [node name="Normal" parent="VBoxContainer/TabContainer/Choice Buttons/Column/TabContainer" instance=ExtResource( 6 )] anchor_right = 1.0 anchor_bottom = 1.0 -margin_left = 4.0 -margin_top = 32.0 -margin_right = -4.0 -margin_bottom = -4.0 +margin_left = 8.0 +margin_top = 86.0 +margin_right = -8.0 +margin_bottom = -8.0 [node name="Hover" parent="VBoxContainer/TabContainer/Choice Buttons/Column/TabContainer" instance=ExtResource( 6 )] visible = false @@ -1563,28 +1606,29 @@ margin_right = -4.0 margin_bottom = -4.0 [node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Choice Buttons"] -margin_left = 390.0 -margin_right = 394.0 -margin_bottom = 488.0 +margin_left = 744.0 +margin_right = 752.0 +margin_bottom = 845.0 [node name="Column2" type="VBoxContainer" parent="VBoxContainer/TabContainer/Choice Buttons"] -margin_left = 404.0 -margin_right = 713.0 -margin_bottom = 488.0 +margin_left = 762.0 +margin_right = 1772.0 +margin_bottom = 845.0 size_flags_vertical = 3 __meta__ = { "_edit_use_anchors_": false } [node name="SectionTitle" parent="VBoxContainer/TabContainer/Choice Buttons/Column2" instance=ExtResource( 3 )] -margin_right = 309.0 +margin_right = 1010.0 +margin_bottom = 58.0 text = "Placement" text_key = "Placement" [node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Choice Buttons/Column2"] -margin_top = 26.0 -margin_right = 309.0 -margin_bottom = 184.0 +margin_top = 66.0 +margin_right = 1010.0 +margin_bottom = 510.0 size_flags_horizontal = 3 custom_constants/hseparation = 10 columns = 2 @@ -1592,29 +1636,29 @@ columns = 2 [node name="TLabel" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 5.0 -margin_right = 119.0 -margin_bottom = 19.0 +margin_top = 10.0 +margin_right = 352.0 +margin_bottom = 60.0 text = "Box padding" text_key = "Box padding" [node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer"] -margin_left = 129.0 -margin_right = 309.0 -margin_bottom = 24.0 +margin_left = 362.0 +margin_right = 1010.0 +margin_bottom = 70.0 [node name="TextOffsetV" type="SpinBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer"] -margin_right = 74.0 -margin_bottom = 24.0 +margin_right = 292.0 +margin_bottom = 70.0 value = 5.0 rounded = true allow_greater = true allow_lesser = true [node name="TextOffsetH" type="SpinBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer"] -margin_left = 78.0 -margin_right = 152.0 -margin_bottom = 24.0 +margin_left = 300.0 +margin_right = 592.0 +margin_bottom = 70.0 value = 5.0 rounded = true allow_greater = true @@ -1623,34 +1667,34 @@ allow_lesser = true [node name="TLabel2" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 33.0 -margin_right = 119.0 -margin_bottom = 47.0 +margin_top = 88.0 +margin_right = 352.0 +margin_bottom = 138.0 text = "Fixed button size" text_key = "Fixed button size" [node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer"] -margin_left = 129.0 -margin_top = 28.0 -margin_right = 309.0 -margin_bottom = 52.0 +margin_left = 362.0 +margin_top = 78.0 +margin_right = 1010.0 +margin_bottom = 148.0 [node name="FixedSize" type="CheckBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2"] -margin_right = 24.0 -margin_bottom = 24.0 +margin_right = 48.0 +margin_bottom = 70.0 [node name="ButtonSizeX" type="SpinBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2"] -margin_left = 28.0 -margin_right = 102.0 -margin_bottom = 24.0 +margin_left = 56.0 +margin_right = 348.0 +margin_bottom = 70.0 rounded = true allow_greater = true allow_lesser = true [node name="ButtonSizeY" type="SpinBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2"] -margin_left = 106.0 -margin_right = 180.0 -margin_bottom = 24.0 +margin_left = 356.0 +margin_right = 648.0 +margin_bottom = 70.0 rounded = true allow_greater = true allow_lesser = true @@ -1658,17 +1702,17 @@ allow_lesser = true [node name="TLabel3" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 61.0 -margin_right = 119.0 -margin_bottom = 75.0 +margin_top = 166.0 +margin_right = 352.0 +margin_bottom = 216.0 text = "Separation" text_key = "Separation" [node name="VerticalSeparation" type="SpinBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer"] -margin_left = 129.0 -margin_top = 56.0 -margin_right = 309.0 -margin_bottom = 80.0 +margin_left = 362.0 +margin_top = 156.0 +margin_right = 1010.0 +margin_bottom = 226.0 value = 5.0 rounded = true allow_lesser = true @@ -1676,17 +1720,17 @@ allow_lesser = true [node name="TLabel4" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 87.0 -margin_right = 119.0 -margin_bottom = 101.0 +margin_top = 240.0 +margin_right = 352.0 +margin_bottom = 290.0 text = "Button layout" text_key = "Button layout" [node name="Layout" type="OptionButton" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer"] -margin_left = 129.0 -margin_top = 84.0 -margin_right = 309.0 -margin_bottom = 104.0 +margin_left = 362.0 +margin_top = 234.0 +margin_right = 1010.0 +margin_bottom = 296.0 size_flags_horizontal = 3 text = "Vertical" items = [ "Vertical", null, false, 0, null, "Horizontal", null, false, 1, null ] @@ -1695,48 +1739,48 @@ selected = 0 [node name="TLabel5" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 112.0 -margin_right = 119.0 -margin_bottom = 126.0 +margin_top = 310.0 +margin_right = 352.0 +margin_bottom = 360.0 text = "Position on screen" text_key = "Position on screen" [node name="PositionOnScreenOptionButton" type="OptionButton" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer"] -margin_left = 129.0 -margin_top = 108.0 -margin_right = 309.0 -margin_bottom = 130.0 +margin_left = 362.0 +margin_top = 304.0 +margin_right = 1010.0 +margin_bottom = 366.0 size_flags_horizontal = 3 text = "Top Left" -icon = SubResource( 6 ) -items = [ "Top Left", SubResource( 8 ), false, 0, null, "Top Center", SubResource( 8 ), false, 1, null, "Top Right", SubResource( 8 ), false, 2, null, "", null, false, -1, null, "Center Left", SubResource( 8 ), false, 3, null, "Center", SubResource( 8 ), false, 4, null, "Center Right", SubResource( 8 ), false, 5, null, "", null, false, -1, null, "Bottom Left", SubResource( 8 ), false, 6, null, "Bottom Center", SubResource( 8 ), false, 7, null, "Bottom Right", SubResource( 8 ), false, 8, null ] +icon = SubResource( 16 ) +items = [ "Top Left", SubResource( 18 ), false, 0, null, "Top Center", SubResource( 18 ), false, 1, null, "Top Right", SubResource( 18 ), false, 2, null, "", null, false, -1, null, "Center Left", SubResource( 18 ), false, 3, null, "Center", SubResource( 18 ), false, 4, null, "Center Right", SubResource( 18 ), false, 5, null, "", null, false, -1, null, "Bottom Left", SubResource( 18 ), false, 6, null, "Bottom Center", SubResource( 18 ), false, 7, null, "Bottom Right", SubResource( 18 ), false, 8, null ] selected = 0 [node name="TLabel6" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 139.0 -margin_right = 119.0 -margin_bottom = 153.0 +margin_top = 384.0 +margin_right = 352.0 +margin_bottom = 434.0 text = "Offset x-y" text_key = "Offset x-y" [node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer"] -margin_left = 129.0 -margin_top = 134.0 -margin_right = 309.0 -margin_bottom = 158.0 +margin_left = 362.0 +margin_top = 374.0 +margin_right = 1010.0 +margin_bottom = 444.0 [node name="ButtonOffsetX" type="SpinBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer3"] -margin_right = 74.0 -margin_bottom = 24.0 +margin_right = 292.0 +margin_bottom = 70.0 rounded = true allow_lesser = true [node name="ButtonOffsetY" type="SpinBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer3"] -margin_left = 78.0 -margin_right = 152.0 -margin_bottom = 24.0 +margin_left = 300.0 +margin_right = 592.0 +margin_bottom = 70.0 rounded = true allow_lesser = true @@ -1813,7 +1857,7 @@ margin_left = 90.0 margin_right = 118.0 margin_bottom = 22.0 size_flags_vertical = 4 -icon = SubResource( 8 ) +icon = SubResource( 18 ) [node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Glossary"] margin_left = 280.0 @@ -1865,7 +1909,7 @@ margin_left = 90.0 margin_right = 118.0 margin_bottom = 22.0 size_flags_vertical = 4 -icon = SubResource( 8 ) +icon = SubResource( 18 ) [node name="TLabel2" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 @@ -1912,7 +1956,7 @@ margin_left = 90.0 margin_right = 118.0 margin_bottom = 22.0 size_flags_vertical = 4 -icon = SubResource( 8 ) +icon = SubResource( 18 ) [node name="TLabel4" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 @@ -1959,7 +2003,7 @@ margin_left = 90.0 margin_right = 118.0 margin_bottom = 22.0 size_flags_vertical = 4 -icon = SubResource( 8 ) +icon = SubResource( 18 ) [node name="TLabel6" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer" instance=ExtResource( 8 )] anchor_right = 0.0 @@ -2185,6 +2229,7 @@ one_shot = true [connection signal="value_changed" from="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer/NamePaddingY" to="." method="_on_name_padding_value_changed"] [connection signal="value_changed" from="VBoxContainer/TabContainer/Name Label/Column3/GridContainer/HBoxContainer5/HorizontalOffset" to="." method="_on_name_BottomGap_value_changed"] [connection signal="value_changed" from="VBoxContainer/TabContainer/Name Label/Column3/GridContainer/HBoxContainer5/BottomGap" to="." method="_on_name_BottomGap_value_changed"] +[connection signal="toggled" from="VBoxContainer/TabContainer/Choice Buttons/Column/VBoxContainer/GridContainer/ChoiceShow" to="." method="_on_choice_show_toggled"] [connection signal="value_changed" from="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer/TextOffsetV" to="." method="_on_ButtonOffset_value_changed"] [connection signal="value_changed" from="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer/TextOffsetH" to="." method="_on_ButtonOffset_value_changed"] [connection signal="value_changed" from="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2/ButtonSizeX" to="." method="_on_ButtonSize_value_changed"]