From a1212b0f7065e54fedd1c2469d65ab99078aa18f Mon Sep 17 00:00:00 2001 From: Arnaud Vergnet Date: Mon, 22 Mar 2021 17:17:08 +0100 Subject: [PATCH] Update Dialogic and remove exp dialog plugin --- Main.gd | 10 +- .../Dialog Editor/Dialog_Editor.tscn | 76 -- .../Dialog Editor/Editor/Editor.tscn | 52 -- .../Dialog Editor/Editor/editor.gd | 21 - .../Nodes/Line/ChoicesList/Choice/Choice.gd | 64 -- .../Nodes/Line/ChoicesList/Choice/Choice.tscn | 107 --- .../Nodes/Line/ChoicesList/ChoicesList.gd | 74 -- .../Nodes/Line/ChoicesList/ChoicesList.tscn | 23 - .../ConditionsList/Condition/Condition.gd | 47 -- .../ConditionsList/Condition/Condition.tscn | 50 -- .../Line/ConditionsList/ConditionsList.gd | 69 -- .../Line/ConditionsList/ConditionsList.tscn | 25 - .../Nodes/Line/Infobox/Infobox.gd | 68 -- .../Nodes/Line/Infobox/Infobox.tscn | 67 -- .../Dialog Editor/Nodes/Line/Line_Node.tscn | 201 ----- .../Nodes/Line/icon_distraction_free.svg | 1 - .../Line/icon_distraction_free.svg.import | 34 - .../Dialog Editor/Nodes/Line/line_node.gd | 184 ----- .../Dialog Editor/dialog_editor.gd | 224 ------ addons/EXP-System-Dialog/Images/de.png | Bin 65358 -> 0 bytes addons/EXP-System-Dialog/Images/de.png.import | 34 - addons/EXP-System-Dialog/Images/icon.png | Bin 701 -> 0 bytes .../EXP-System-Dialog/Images/icon.png.import | 34 - addons/EXP-System-Dialog/Images/se.png | Bin 64479 -> 0 bytes addons/EXP-System-Dialog/Images/se.png.import | 34 - .../Reference_StoryReader/EXP_StoryReader.gd | 83 -- .../Resource_BakedStory/EXP_BakedStory.gd | 6 - .../Resource_EditorStory/EXP_EditorStory.gd | 9 - .../Resource_NodeTemplate/EXP_NodeTemplate.gd | 6 - .../Dialog Record/Dialog_Record.tscn | 109 --- .../Dialog Record/dialog_record.gd | 91 --- .../Rename Record Box/Rename_Record_Box.tscn | 92 --- .../Rename Record Box/rename_record_box.gd | 32 - .../Story Editor/Story_Editor.tscn | 268 ------- .../Story Editor/story_editor.gd | 753 ------------------ addons/EXP-System-Dialog/plugin.cfg | 7 - addons/EXP-System-Dialog/plugin.gd | 87 -- .../Editor/CharacterEditor/CharacterEditor.gd | 21 +- .../Editor/CharacterEditor/PortraitEntry.gd | 2 +- .../DefinitionEditor/DefinitionEditor.gd | 38 +- addons/dialogic/Editor/EditorView.gd | 33 +- .../dialogic/Editor/MasterTree/MasterTree.gd | 8 +- .../dialogic/Editor/Pieces/ChangeTimeline.gd | 5 +- .../Editor/Pieces/CharacterJoinBlock.gd | 2 +- .../Editor/Pieces/CharacterLeaveBlock.gd | 2 +- .../Editor/Pieces/Common/CharacterPicker.gd | 2 +- .../Editor/Pieces/Common/ConditionPicker.gd | 58 ++ .../Editor/Pieces/Common/ConditionPicker.tscn | 13 + .../Editor/Pieces/Common/DefinitionPicker.gd | 4 +- .../Editor/Pieces/Common/DragController.gd | 24 +- addons/dialogic/Editor/Pieces/IfCondition.gd | 10 +- .../dialogic/Editor/Pieces/IfCondition.tscn | 9 +- .../Editor/SettingsEditor/SettingsEditor.gd | 9 +- .../Editor/ThemeEditor/ThemeEditor.gd | 101 +-- .../Editor/ThemeEditor/ThemeEditor.tscn | 17 +- .../Editor/TimelineEditor/TimelineEditor.gd | 43 +- addons/dialogic/Nodes/Portrait.gd | 10 +- addons/dialogic/Nodes/dialog_node.gd | 113 ++- .../{dialogic_class.gd => DialogicClass.gd} | 13 +- addons/dialogic/Other/DialogicResources.gd | 349 ++++++++ addons/dialogic/Other/DialogicUtil.gd | 214 +---- addons/dialogic/dialogic.gd | 5 +- characters/df-2.png | Bin 0 -> 7661 bytes .../{test/nice.png.import => df-2.png.import} | 6 +- characters/test/happy.png | Bin 33309 -> 0 bytes characters/test/happy.png.import | 34 - characters/test/nice.png | Bin 34105 -> 0 bytes characters/test/shock.png | Bin 36743 -> 0 bytes characters/test/shock.png.import | 34 - dialogic/characters/character-1615795338.json | 1 - dialogic/characters/character-1615932195.json | 1 + dialogic/definitions.cfg | 9 +- dialogic/settings.cfg | 2 +- dialogic/themes/theme-1615795528.cfg | 14 - dialogic/themes/theme-1615930210.cfg | 7 + dialogic/timelines/timeline-1615795397.json | 1 - dialogic/timelines/timeline-1615930166.json | 1 + export_presets.cfg | 48 ++ git_api.gdnlib | 16 - git_api.gdns | 9 - json_example.json | 1 - project.godot | 56 +- 82 files changed, 779 insertions(+), 3608 deletions(-) delete mode 100644 addons/EXP-System-Dialog/Dialog Editor/Dialog_Editor.tscn delete mode 100644 addons/EXP-System-Dialog/Dialog Editor/Editor/Editor.tscn delete mode 100644 addons/EXP-System-Dialog/Dialog Editor/Editor/editor.gd delete mode 100644 addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/Choice/Choice.gd delete mode 100644 addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/Choice/Choice.tscn delete mode 100644 addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/ChoicesList.gd delete mode 100644 addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/ChoicesList.tscn delete mode 100644 addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/Condition/Condition.gd delete mode 100644 addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/Condition/Condition.tscn delete mode 100644 addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/ConditionsList.gd delete mode 100644 addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/ConditionsList.tscn delete mode 100644 addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/Infobox/Infobox.gd delete mode 100644 addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/Infobox/Infobox.tscn delete mode 100644 addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/Line_Node.tscn delete mode 100644 addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/icon_distraction_free.svg delete mode 100644 addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/icon_distraction_free.svg.import delete mode 100644 addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/line_node.gd delete mode 100644 addons/EXP-System-Dialog/Dialog Editor/dialog_editor.gd delete mode 100644 addons/EXP-System-Dialog/Images/de.png delete mode 100644 addons/EXP-System-Dialog/Images/de.png.import delete mode 100644 addons/EXP-System-Dialog/Images/icon.png delete mode 100644 addons/EXP-System-Dialog/Images/icon.png.import delete mode 100644 addons/EXP-System-Dialog/Images/se.png delete mode 100644 addons/EXP-System-Dialog/Images/se.png.import delete mode 100644 addons/EXP-System-Dialog/Reference_StoryReader/EXP_StoryReader.gd delete mode 100644 addons/EXP-System-Dialog/Resource_BakedStory/EXP_BakedStory.gd delete mode 100644 addons/EXP-System-Dialog/Resource_EditorStory/EXP_EditorStory.gd delete mode 100644 addons/EXP-System-Dialog/Resource_NodeTemplate/EXP_NodeTemplate.gd delete mode 100644 addons/EXP-System-Dialog/Story Editor/Dialog Record/Dialog_Record.tscn delete mode 100644 addons/EXP-System-Dialog/Story Editor/Dialog Record/dialog_record.gd delete mode 100644 addons/EXP-System-Dialog/Story Editor/Rename Record Box/Rename_Record_Box.tscn delete mode 100644 addons/EXP-System-Dialog/Story Editor/Rename Record Box/rename_record_box.gd delete mode 100644 addons/EXP-System-Dialog/Story Editor/Story_Editor.tscn delete mode 100644 addons/EXP-System-Dialog/Story Editor/story_editor.gd delete mode 100644 addons/EXP-System-Dialog/plugin.cfg delete mode 100644 addons/EXP-System-Dialog/plugin.gd create mode 100644 addons/dialogic/Editor/Pieces/Common/ConditionPicker.gd create mode 100644 addons/dialogic/Editor/Pieces/Common/ConditionPicker.tscn rename addons/dialogic/Other/{dialogic_class.gd => DialogicClass.gd} (67%) create mode 100644 addons/dialogic/Other/DialogicResources.gd create mode 100644 characters/df-2.png rename characters/{test/nice.png.import => df-2.png.import} (71%) delete mode 100644 characters/test/happy.png delete mode 100644 characters/test/happy.png.import delete mode 100644 characters/test/nice.png delete mode 100644 characters/test/shock.png delete mode 100644 characters/test/shock.png.import delete mode 100644 dialogic/characters/character-1615795338.json create mode 100644 dialogic/characters/character-1615932195.json delete mode 100644 dialogic/themes/theme-1615795528.cfg create mode 100644 dialogic/themes/theme-1615930210.cfg delete mode 100644 dialogic/timelines/timeline-1615795397.json create mode 100644 dialogic/timelines/timeline-1615930166.json create mode 100644 export_presets.cfg delete mode 100644 git_api.gdnlib delete mode 100644 git_api.gdns diff --git a/Main.gd b/Main.gd index 37e88ce..08745c8 100644 --- a/Main.gd +++ b/Main.gd @@ -1,17 +1,13 @@ extends Node -# Declare member variables here. Examples: -# var a = 2 -# var b = "text" - # Called when the node enters the scene tree for the first time. func _ready(): var new_dialog = Dialogic.start('timeline1') add_child(new_dialog) + new_dialog.connect('dialogic_signal', self, "_on_Dialogic_signal_received") -# Called every frame. 'delta' is the elapsed time since the previous frame. -#func _process(delta): -# pass +func _on_Dialogic_signal_received(value: String): + print('received ' + value) diff --git a/addons/EXP-System-Dialog/Dialog Editor/Dialog_Editor.tscn b/addons/EXP-System-Dialog/Dialog Editor/Dialog_Editor.tscn deleted file mode 100644 index edcb417..0000000 --- a/addons/EXP-System-Dialog/Dialog Editor/Dialog_Editor.tscn +++ /dev/null @@ -1,76 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[ext_resource path="res://addons/EXP-System-Dialog/Dialog Editor/dialog_editor.gd" type="Script" id=1] - -[node name="Dialog_Editor" type="Control"] -anchor_right = 1.0 -anchor_bottom = 1.0 -rect_min_size = Vector2( 0, 256 ) -script = ExtResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="VBoxContainer" type="VBoxContainer" parent="."] -anchor_right = 1.0 -anchor_bottom = 1.0 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="VBoxContainer" type="HBoxContainer" parent="VBoxContainer"] -margin_right = 1024.0 -margin_bottom = 20.0 - -[node name="Close_BTN" type="Button" parent="VBoxContainer/VBoxContainer"] -margin_right = 47.0 -margin_bottom = 20.0 -hint_tooltip = "Close the Dialog Editor." -text = "Close" - -[node name="Back_BTN" type="Button" parent="VBoxContainer/VBoxContainer"] -margin_left = 51.0 -margin_right = 93.0 -margin_bottom = 20.0 -hint_tooltip = "Return to the Story Editor." -text = "Back" - -[node name="VSeparator" type="VSeparator" parent="VBoxContainer/VBoxContainer"] -margin_left = 97.0 -margin_right = 101.0 -margin_bottom = 20.0 - -[node name="Add_Node_BTN" type="Button" parent="VBoxContainer/VBoxContainer"] -margin_left = 105.0 -margin_right = 180.0 -margin_bottom = 20.0 -hint_tooltip = "Add a new node to the graph." -text = "Add Node" - -[node name="VSeparator2" type="VSeparator" parent="VBoxContainer/VBoxContainer"] -margin_left = 184.0 -margin_right = 188.0 -margin_bottom = 20.0 - -[node name="Human_Readable_LBL" type="Label" parent="VBoxContainer/VBoxContainer"] -margin_left = 192.0 -margin_top = 3.0 -margin_right = 378.0 -margin_bottom = 17.0 -text = "Human Readable Description" - -[node name="GraphEdit" type="GraphEdit" parent="VBoxContainer"] -margin_top = 24.0 -margin_right = 1024.0 -margin_bottom = 600.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -right_disconnects = true -__meta__ = { -"_edit_use_anchors_": false -} -[connection signal="pressed" from="VBoxContainer/VBoxContainer/Close_BTN" to="." method="_on_Close_BTN_pressed"] -[connection signal="pressed" from="VBoxContainer/VBoxContainer/Back_BTN" to="." method="_on_Back_BTN_pressed"] -[connection signal="pressed" from="VBoxContainer/VBoxContainer/Add_Node_BTN" to="." method="_on_Add_Node_BTN_pressed"] -[connection signal="connection_request" from="VBoxContainer/GraphEdit" to="." method="_on_GraphEdit_connection_request"] -[connection signal="disconnection_request" from="VBoxContainer/GraphEdit" to="." method="_on_GraphEdit_disconnection_request"] diff --git a/addons/EXP-System-Dialog/Dialog Editor/Editor/Editor.tscn b/addons/EXP-System-Dialog/Dialog Editor/Editor/Editor.tscn deleted file mode 100644 index 1a1d12f..0000000 --- a/addons/EXP-System-Dialog/Dialog Editor/Editor/Editor.tscn +++ /dev/null @@ -1,52 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[ext_resource path="res://addons/EXP-System-Dialog/Dialog Editor/Editor/editor.gd" type="Script" id=1] - -[node name="WindowDialog" type="WindowDialog"] -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -margin_left = -540.0 -margin_top = -384.0 -margin_right = 540.0 -margin_bottom = 384.0 -window_title = "Node Editor" -resizable = true -script = ExtResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="VBoxContainer" type="VBoxContainer" parent="."] -anchor_right = 1.0 -anchor_bottom = 1.0 -margin_left = 13.0 -margin_top = 13.0 -margin_right = -13.0 -margin_bottom = -13.0 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="TextEdit" type="TextEdit" parent="VBoxContainer"] -margin_right = 1054.0 -margin_bottom = 718.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -smooth_scrolling = true -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="OK_BTN" type="Button" parent="VBoxContainer"] -margin_left = 503.0 -margin_top = 722.0 -margin_right = 550.0 -margin_bottom = 742.0 -hint_tooltip = "Close the node editor." -size_flags_horizontal = 4 -size_flags_vertical = 0 -text = "Close" -[connection signal="text_changed" from="VBoxContainer/TextEdit" to="." method="_on_TextEdit_text_changed"] -[connection signal="pressed" from="VBoxContainer/OK_BTN" to="." method="_on_OK_BTN_pressed"] diff --git a/addons/EXP-System-Dialog/Dialog Editor/Editor/editor.gd b/addons/EXP-System-Dialog/Dialog Editor/Editor/editor.gd deleted file mode 100644 index 99781f9..0000000 --- a/addons/EXP-System-Dialog/Dialog Editor/Editor/editor.gd +++ /dev/null @@ -1,21 +0,0 @@ -tool -extends WindowDialog - -onready var _Text_Editor = self.get_node("VBoxContainer/TextEdit") - -var _Target_Node - -#Public Methods - -func set_target_node(node): - self._Target_Node = node - self._Text_Editor.text = node.get_text() - -#Callback Methods - -func _on_OK_BTN_pressed(): - self.visible = false - - -func _on_TextEdit_text_changed(): - self._Target_Node.set_text(self._Text_Editor.text) diff --git a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/Choice/Choice.gd b/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/Choice/Choice.gd deleted file mode 100644 index 2f3a4b2..0000000 --- a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/Choice/Choice.gd +++ /dev/null @@ -1,64 +0,0 @@ -tool -extends VBoxContainer - -class_name Choice - -signal choice_changed(index, new_json_structure) -signal choice_removed(index) - -onready var _ChoiceTitleLineEdit: LineEdit = self.get_node("HBoxContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer/ChoiceTitleLineEdit") -onready var _ChoiceLabel: Label = self.get_node("HBoxContainer/MarginContainer/VBoxContainer/ChoiceLabel") -onready var _Infobox: Infobox = self.get_node("HBoxContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/VBoxContainer/Infobox") -onready var _ConditionsList: ConditionsList = self.get_node("HBoxContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/VBoxContainer/MarginContainer/ConditionsList") - -var _id : int = 0; - -var _json_structure := { - "title": "", - "conditions": [] -} - -#Callback Methods - -func _on_ChoiceTitleLineEdit_text_changed(new_text): - _json_structure.title = new_text - _emit_changed_signal() - - -func _on_ChoiceRemoveButton_pressed(): - emit_signal("choice_removed", _id) - - -func _on_ConditionsList_conditions_changed(new_json_structure): - _json_structure.conditions = new_json_structure - _emit_changed_signal() - - -func _on_Infobox_infobox_removed(): - _json_structure.erase("infobox") - _emit_changed_signal() - - -func _on_Infobox_infobox_changed(new_json_structure): - _json_structure.infobox = new_json_structure - _emit_changed_signal() - - -#Public Methods - -func set_structure(new_json_structure): - _json_structure = new_json_structure - _ChoiceTitleLineEdit.set_text(_json_structure.title) - if ("infobox" in _json_structure): - _Infobox.set_structure(_json_structure.infobox) - _ConditionsList.set_structure(_json_structure.conditions) - - -func set_id(new_id): - self._id = new_id; - _ChoiceLabel.set_text("Choice #" + str(new_id + 1)) - -#Private Methods - -func _emit_changed_signal(): - emit_signal("choice_changed", _id, _json_structure) diff --git a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/Choice/Choice.tscn b/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/Choice/Choice.tscn deleted file mode 100644 index f3e82a6..0000000 --- a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/Choice/Choice.tscn +++ /dev/null @@ -1,107 +0,0 @@ -[gd_scene load_steps=4 format=2] - -[ext_resource path="res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/Choice/Choice.gd" type="Script" id=1] -[ext_resource path="res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/ConditionsList.tscn" type="PackedScene" id=2] -[ext_resource path="res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/Infobox/Infobox.tscn" type="PackedScene" id=3] - -[node name="Choice" type="VBoxContainer"] -margin_right = 272.0 -margin_bottom = 156.0 -script = ExtResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="HBoxContainer" type="HBoxContainer" parent="."] -margin_right = 272.0 -margin_bottom = 230.0 - -[node name="MarginContainer" type="MarginContainer" parent="HBoxContainer"] -margin_right = 272.0 -margin_bottom = 230.0 -size_flags_horizontal = 3 -custom_constants/margin_right = 5 -custom_constants/margin_top = 5 -custom_constants/margin_left = 5 -custom_constants/margin_bottom = 5 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer/MarginContainer"] -margin_left = 5.0 -margin_top = 5.0 -margin_right = 267.0 -margin_bottom = 225.0 -size_flags_horizontal = 3 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="ChoiceLabel" type="Label" parent="HBoxContainer/MarginContainer/VBoxContainer"] -margin_right = 262.0 -margin_bottom = 14.0 -text = "Choice #1" -align = 1 - -[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer/MarginContainer/VBoxContainer"] -margin_top = 18.0 -margin_right = 262.0 -margin_bottom = 220.0 - -[node name="HBoxContainer2" type="HBoxContainer" parent="HBoxContainer/MarginContainer/VBoxContainer/VBoxContainer"] -margin_right = 262.0 -margin_bottom = 202.0 - -[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2"] -margin_right = 238.0 -margin_bottom = 202.0 -size_flags_horizontal = 3 - -[node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/VBoxContainer"] -margin_right = 238.0 -margin_bottom = 24.0 -size_flags_horizontal = 3 - -[node name="ChoiceTitleLabel" type="Label" parent="HBoxContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer"] -margin_top = 5.0 -margin_right = 32.0 -margin_bottom = 19.0 -text = "Title:" - -[node name="ChoiceTitleLineEdit" type="LineEdit" parent="HBoxContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer"] -margin_left = 36.0 -margin_right = 238.0 -margin_bottom = 24.0 -size_flags_horizontal = 3 - -[node name="Infobox" parent="HBoxContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/VBoxContainer" instance=ExtResource( 3 )] -margin_bottom = 164.0 - -[node name="MarginContainer" type="MarginContainer" parent="HBoxContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/VBoxContainer"] -margin_top = 168.0 -margin_right = 238.0 -margin_bottom = 202.0 -custom_constants/margin_right = 5 -custom_constants/margin_top = 5 -custom_constants/margin_left = 5 -custom_constants/margin_bottom = 5 - -[node name="ConditionsList" parent="HBoxContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/VBoxContainer/MarginContainer" instance=ExtResource( 2 )] -margin_bottom = 29.0 - -[node name="ChoiceRemoveButton" type="Button" parent="HBoxContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2"] -margin_left = 242.0 -margin_right = 262.0 -margin_bottom = 202.0 -text = "X" - -[node name="HSeparator" type="HSeparator" parent="."] -margin_top = 234.0 -margin_right = 272.0 -margin_bottom = 238.0 -[connection signal="text_changed" from="HBoxContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer/ChoiceTitleLineEdit" to="." method="_on_ChoiceTitleLineEdit_text_changed"] -[connection signal="infobox_changed" from="HBoxContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/VBoxContainer/Infobox" to="." method="_on_Infobox_infobox_changed"] -[connection signal="infobox_removed" from="HBoxContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/VBoxContainer/Infobox" to="." method="_on_Infobox_infobox_removed"] -[connection signal="conditions_changed" from="HBoxContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/VBoxContainer/MarginContainer/ConditionsList" to="." method="_on_ConditionsList_conditions_changed"] -[connection signal="pressed" from="HBoxContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/ChoiceRemoveButton" to="." method="_on_ChoiceRemoveButton_pressed"] diff --git a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/ChoicesList.gd b/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/ChoicesList.gd deleted file mode 100644 index 94d1348..0000000 --- a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/ChoicesList.gd +++ /dev/null @@ -1,74 +0,0 @@ -tool -extends VBoxContainer - -class_name ChoicesList - -signal choices_changed(new_json_structure) - -var _choice_scene = preload("res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/Choice/Choice.tscn") - -onready var _VBoxContainer: VBoxContainer = self.get_node("VBoxContainer") - -var _json_structure: Array = [] -var _nodes: Array = [] - -#Callback Methods - -func _on_choice_changed(index, new_structure): - _json_structure[index] = new_structure - _emit_changed_signal() - -func _on_choice_removed(index): - _json_structure.remove(index) - _remove_choice_node(index) - _emit_changed_signal() - -func _on_ChoiceAddButton_pressed(): - add_choice() - - -#Public Methods - -func add_choice(): - _json_structure.append({ - "title": "", - "conditions": [] - }) - _add_choice_node(_json_structure.size() - 1) - _emit_changed_signal() - -func set_structure(new_json_structure): - _json_structure = new_json_structure - _clear_choice_nodes() - for i in range(0, _json_structure.size()): - var node: Choice = _add_choice_node(i) - node.set_structure(_json_structure[i]) - -#Private Methods - -func _emit_changed_signal(): - emit_signal("choices_changed", _json_structure) - -func _add_choice_node(id: int): - var node: Choice = _choice_scene.instance() - _VBoxContainer.add_child(node) - node.set_id(id) - _nodes.append(node) - node.connect("choice_changed", self, "_on_choice_changed") - node.connect("choice_removed", self, "_on_choice_removed") - return node - -func _remove_choice_node(index): - # Remove the node - if (index >= 0 and index < _nodes.size()): - _nodes[index].queue_free() - _nodes.remove(index) - # Update remaining nodes indexes - for i in range(0, _nodes.size()): - _nodes[i].set_id(i) - - -func _clear_choice_nodes(): - _nodes.clear() - for node in _VBoxContainer.get_children(): - node.queue_free() diff --git a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/ChoicesList.tscn b/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/ChoicesList.tscn deleted file mode 100644 index 94bcd6d..0000000 --- a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/ChoicesList.tscn +++ /dev/null @@ -1,23 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[ext_resource path="res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/ChoicesList.gd" type="Script" id=2] - -[node name="ChoicesList" type="VBoxContainer"] -margin_top = 242.0 -margin_right = 272.0 -margin_bottom = 422.0 -script = ExtResource( 2 ) -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="VBoxContainer" type="VBoxContainer" parent="."] -margin_right = 272.0 -size_flags_horizontal = 3 - -[node name="ChoiceAddButton" type="Button" parent="."] -margin_top = 4.0 -margin_right = 272.0 -margin_bottom = 24.0 -text = "Add choice" -[connection signal="pressed" from="ChoiceAddButton" to="." method="_on_ChoiceAddButton_pressed"] diff --git a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/Condition/Condition.gd b/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/Condition/Condition.gd deleted file mode 100644 index cdeab8a..0000000 --- a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/Condition/Condition.gd +++ /dev/null @@ -1,47 +0,0 @@ -tool -extends VBoxContainer - -class_name Condition - -signal condition_changed(index, new_json_structure) -signal condition_removed(index) - -onready var _ConditionLabel: Label = self.get_node("ContitionLabel") -onready var _ContitionNameLineEdit: LineEdit = self.get_node("HBoxContainer2/ContitionNameLineEdit") -onready var _ContitionValueSpinBox: SpinBox = self.get_node("HBoxContainer2/ContitionValueSpinBox") - -var _id : int = 0; - -var _json_structure = { - "id": "", - "value": 0 -} - -#Callback Methods - -func _on_ContitionNameLineEdit_text_changed(new_text): - _json_structure.id = new_text - emit_signal("condition_changed", _id, _json_structure) - - -func _on_ContitionValueSpinBox_value_changed(value): - _json_structure.value = value - emit_signal("condition_changed", _id, _json_structure) - - -func _on_ContitionRemoveButton_pressed(): - emit_signal("condition_removed", _id) - -#Public Methods - -func set_structure(new_json_structure): - _json_structure = new_json_structure - _ContitionNameLineEdit.text = _json_structure.id - _ContitionValueSpinBox.value = _json_structure.value - - - -func set_id(new_id): - self._id = new_id; - _ConditionLabel.set_text("Condition #" + str(new_id + 1)) - diff --git a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/Condition/Condition.tscn b/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/Condition/Condition.tscn deleted file mode 100644 index f525d92..0000000 --- a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/Condition/Condition.tscn +++ /dev/null @@ -1,50 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[ext_resource path="res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/Condition/Condition.gd" type="Script" id=1] - -[node name="Condition" type="VBoxContainer"] -margin_right = 228.0 -margin_bottom = 50.0 -size_flags_horizontal = 3 -script = ExtResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="HSeparator2" type="HSeparator" parent="."] -margin_right = 228.0 -margin_bottom = 4.0 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="ContitionLabel" type="Label" parent="."] -margin_top = 8.0 -margin_right = 228.0 -margin_bottom = 22.0 -text = "Condition #1" - -[node name="HBoxContainer2" type="HBoxContainer" parent="."] -margin_top = 26.0 -margin_right = 228.0 -margin_bottom = 50.0 -size_flags_horizontal = 3 - -[node name="ContitionNameLineEdit" type="LineEdit" parent="HBoxContainer2"] -margin_right = 127.0 -margin_bottom = 24.0 -size_flags_horizontal = 3 - -[node name="ContitionValueSpinBox" type="SpinBox" parent="HBoxContainer2"] -margin_left = 131.0 -margin_right = 205.0 -margin_bottom = 24.0 - -[node name="ContitionRemoveButton" type="Button" parent="HBoxContainer2"] -margin_left = 209.0 -margin_right = 228.0 -margin_bottom = 24.0 -text = "x" -[connection signal="text_changed" from="HBoxContainer2/ContitionNameLineEdit" to="." method="_on_ContitionNameLineEdit_text_changed"] -[connection signal="value_changed" from="HBoxContainer2/ContitionValueSpinBox" to="." method="_on_ContitionValueSpinBox_value_changed"] -[connection signal="pressed" from="HBoxContainer2/ContitionRemoveButton" to="." method="_on_ContitionRemoveButton_pressed"] diff --git a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/ConditionsList.gd b/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/ConditionsList.gd deleted file mode 100644 index 0b99ee8..0000000 --- a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/ConditionsList.gd +++ /dev/null @@ -1,69 +0,0 @@ -tool -extends VBoxContainer - -class_name ConditionsList - -signal conditions_changed(new_json_structure) - -var _condition_scene = preload("res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/Condition/Condition.tscn") - -onready var _VBoxContainer = self.get_node("VBoxContainer") - -var _json_structure = [] -var _nodes = [] - -#Callback Methods - -func _on_condition_changed(index, new_structure): - _json_structure[index] = new_structure - _emit_changed_signal() - -func _on_condition_removed(index): - _json_structure.remove(index) - _remove_choice_node(index) - _emit_changed_signal() - -func _on_ContitionAddButton_pressed(): - add_condition( - { - "id": "", - "value": 0 - }, - _json_structure.size() - 1 - ) - -#Public Methods - -func set_structure(new_json_structure): - _json_structure = new_json_structure - for i in range(0, _json_structure.size()): - add_condition(_json_structure[0], i) - - -func add_condition(structure: Dictionary, id: int): - _json_structure.append(structure) - _add_choice_node(structure, id) - _emit_changed_signal() - -#Private Methods - -func _emit_changed_signal(): - emit_signal("conditions_changed", _json_structure) - -func _add_choice_node(structure: Dictionary, id: int): - var node: Condition = _condition_scene.instance() - _VBoxContainer.add_child(node) - node.set_id(id) - node.set_structure(structure) - _nodes.append(node) - node.connect("condition_changed", self, "_on_condition_changed") - node.connect("condition_removed", self, "_on_condition_removed") - return node - -func _remove_choice_node(index): - # Remove the node - _nodes[index].queue_free() - _nodes.remove(index) - # Update remaining nodes indexes - for i in range(0, _nodes.size()): - _nodes[i].set_id(i) diff --git a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/ConditionsList.tscn b/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/ConditionsList.tscn deleted file mode 100644 index a8d614f..0000000 --- a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/ConditionsList.tscn +++ /dev/null @@ -1,25 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[ext_resource path="res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/ConditionsList.gd" type="Script" id=1] - -[node name="ConditionsList" type="VBoxContainer"] -margin_left = 5.0 -margin_top = 5.0 -margin_right = 233.0 -margin_bottom = 79.0 -size_flags_horizontal = 3 -script = ExtResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="VBoxContainer" type="VBoxContainer" parent="."] -margin_right = 228.0 -size_flags_horizontal = 3 - -[node name="ContitionAddButton" type="Button" parent="."] -margin_top = 4.0 -margin_right = 228.0 -margin_bottom = 24.0 -text = "Add condition" -[connection signal="pressed" from="ContitionAddButton" to="." method="_on_ContitionAddButton_pressed"] diff --git a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/Infobox/Infobox.gd b/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/Infobox/Infobox.gd deleted file mode 100644 index fd8d65c..0000000 --- a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/Infobox/Infobox.gd +++ /dev/null @@ -1,68 +0,0 @@ -tool -extends VBoxContainer - -class_name Infobox - -signal infobox_changed(new_json_structure) -signal infobox_removed() - -onready var _TextEdit: TextEdit = self.get_node("HBoxContainer/VBoxContainer/TextEdit") -onready var _CreateButton: Button = self.get_node("CreateButton") -onready var _HBoxContainer: HBoxContainer = self.get_node("HBoxContainer") -onready var _ConditionsList: ConditionsList = self.get_node("HBoxContainer/VBoxContainer/ConditionsList") - -var _json_structure = { - "text": "", - "conditions": [] -} - -#Virtual Methods - -func _ready(): - _CreateButton.show() - _HBoxContainer.hide() - - -#Callback Methods - -func _on_RemoveInfoboxButton_pressed(): - _disable_infobox() - emit_signal("infobox_removed") - -func _on_ConditionsList_conditions_changed(new_json_structure): - _json_structure.conditions = new_json_structure - _emit_changed_signal() - -func _on_TextEdit_text_changed(): - _json_structure.text = self._TextEdit.get_text() - _emit_changed_signal() - - -func _on_CreateButton_pressed(): - _enable_infobox() - _emit_changed_signal() - -#Public Methods - -func set_structure(new_json_structure): - _json_structure = new_json_structure - _TextEdit.set_text(_json_structure.text) - _ConditionsList.set_structure(_json_structure.conditions) - _enable_infobox() - -#Private Methods - -func _enable_infobox(): - _CreateButton.hide() - _HBoxContainer.show() - - -func _disable_infobox(): - _CreateButton.show() - _HBoxContainer.hide() - - -func _emit_changed_signal(): - emit_signal("infobox_changed", _json_structure) - - diff --git a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/Infobox/Infobox.tscn b/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/Infobox/Infobox.tscn deleted file mode 100644 index 4341e6d..0000000 --- a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/Infobox/Infobox.tscn +++ /dev/null @@ -1,67 +0,0 @@ -[gd_scene load_steps=3 format=2] - -[ext_resource path="res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/Infobox/Infobox.gd" type="Script" id=1] -[ext_resource path="res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/ConditionsList.tscn" type="PackedScene" id=2] - -[node name="Infobox" type="VBoxContainer"] -margin_top = 28.0 -margin_right = 238.0 -margin_bottom = 112.0 -script = ExtResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="HBoxContainer" type="HBoxContainer" parent="."] -margin_right = 238.0 -margin_bottom = 112.0 - -[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer"] -margin_right = 215.0 -margin_bottom = 112.0 -size_flags_horizontal = 3 - -[node name="HSeparator" type="HSeparator" parent="HBoxContainer/VBoxContainer"] -margin_right = 215.0 -margin_bottom = 4.0 - -[node name="Label" type="Label" parent="HBoxContainer/VBoxContainer"] -margin_top = 8.0 -margin_right = 215.0 -margin_bottom = 22.0 -text = "Infobox" -align = 1 - -[node name="TextEdit" type="TextEdit" parent="HBoxContainer/VBoxContainer"] -margin_top = 26.0 -margin_right = 215.0 -margin_bottom = 76.0 -rect_min_size = Vector2( 0, 50 ) -size_flags_horizontal = 3 - -[node name="ConditionsList" parent="HBoxContainer/VBoxContainer" instance=ExtResource( 2 )] -margin_left = 0.0 -margin_top = 80.0 -margin_right = 215.0 -margin_bottom = 104.0 - -[node name="HSeparator2" type="HSeparator" parent="HBoxContainer/VBoxContainer"] -margin_top = 108.0 -margin_right = 215.0 -margin_bottom = 112.0 - -[node name="RemoveInfoboxButton" type="Button" parent="HBoxContainer"] -margin_left = 219.0 -margin_right = 238.0 -margin_bottom = 112.0 -text = "x" - -[node name="CreateButton" type="Button" parent="."] -margin_top = 116.0 -margin_right = 238.0 -margin_bottom = 136.0 -text = "Create Infobox" -[connection signal="text_changed" from="HBoxContainer/VBoxContainer/TextEdit" to="." method="_on_TextEdit_text_changed"] -[connection signal="conditions_changed" from="HBoxContainer/VBoxContainer/ConditionsList" to="." method="_on_ConditionsList_conditions_changed"] -[connection signal="pressed" from="HBoxContainer/RemoveInfoboxButton" to="." method="_on_RemoveInfoboxButton_pressed"] -[connection signal="pressed" from="CreateButton" to="." method="_on_CreateButton_pressed"] diff --git a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/Line_Node.tscn b/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/Line_Node.tscn deleted file mode 100644 index 50388a2..0000000 --- a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/Line_Node.tscn +++ /dev/null @@ -1,201 +0,0 @@ -[gd_scene load_steps=4 format=2] - -[ext_resource path="res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/line_node.gd" type="Script" id=1] -[ext_resource path="res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/icon_distraction_free.svg" type="Texture" id=2] -[ext_resource path="res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/ChoicesList.tscn" type="PackedScene" id=3] - -[node name="Line" type="GraphNode"] -margin_right = 324.0 -margin_bottom = 375.0 -rect_min_size = Vector2( 324, 137 ) -title = "Line" -offset = Vector2( 40, 40 ) -show_close = true -resizable = true -slot/0/left_enabled = true -slot/0/left_type = 0 -slot/0/left_color = Color( 1, 1, 1, 1 ) -slot/0/right_enabled = true -slot/0/right_type = 0 -slot/0/right_color = Color( 1, 1, 1, 1 ) -slot/1/left_enabled = false -slot/1/left_type = 0 -slot/1/left_color = Color( 1, 1, 1, 1 ) -slot/1/right_enabled = false -slot/1/right_type = 0 -slot/1/right_color = Color( 1, 1, 1, 1 ) -script = ExtResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="MarginContainer" type="MarginContainer" parent="."] -margin_left = 16.0 -margin_top = 39.0 -margin_right = 308.0 -margin_bottom = 329.0 -custom_constants/margin_right = 10 -custom_constants/margin_top = 10 -custom_constants/margin_left = 10 -custom_constants/margin_bottom = 10 - -[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] -margin_left = 10.0 -margin_top = 10.0 -margin_right = 282.0 -margin_bottom = 280.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="HBoxContainer3" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] -margin_right = 272.0 -margin_bottom = 70.0 - -[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/VBoxContainer/HBoxContainer3"] -margin_right = 272.0 -margin_bottom = 70.0 -size_flags_horizontal = 3 - -[node name="SpeakerLabel" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer3/VBoxContainer"] -margin_right = 272.0 -margin_bottom = 14.0 -text = "Speaker" -align = 1 - -[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer/HBoxContainer3/VBoxContainer"] -margin_left = 89.0 -margin_top = 18.0 -margin_right = 183.0 -margin_bottom = 42.0 -size_flags_horizontal = 4 - -[node name="SpeakerIdLabel" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer3/VBoxContainer/HBoxContainer"] -margin_top = 5.0 -margin_right = 16.0 -margin_bottom = 19.0 -text = "id:" - -[node name="SpeakerIdSpinBox" type="SpinBox" parent="MarginContainer/VBoxContainer/HBoxContainer3/VBoxContainer/HBoxContainer"] -margin_left = 20.0 -margin_right = 94.0 -margin_bottom = 24.0 - -[node name="HBoxContainer2" type="HBoxContainer" parent="MarginContainer/VBoxContainer/HBoxContainer3/VBoxContainer"] -margin_top = 46.0 -margin_right = 272.0 -margin_bottom = 70.0 - -[node name="SpeakerEmotionLabel" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer3/VBoxContainer/HBoxContainer2"] -margin_top = 5.0 -margin_right = 57.0 -margin_bottom = 19.0 -text = "Emotion:" - -[node name="SpeakerEmotionLineEdit" type="LineEdit" parent="MarginContainer/VBoxContainer/HBoxContainer3/VBoxContainer/HBoxContainer2"] -margin_left = 61.0 -margin_right = 272.0 -margin_bottom = 24.0 -size_flags_horizontal = 3 - -[node name="HSeparator" type="HSeparator" parent="MarginContainer/VBoxContainer"] -margin_top = 74.0 -margin_right = 272.0 -margin_bottom = 78.0 - -[node name="HBoxContainer4" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] -margin_top = 82.0 -margin_right = 272.0 -margin_bottom = 124.0 - -[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/VBoxContainer/HBoxContainer4"] -margin_right = 272.0 -margin_bottom = 42.0 -size_flags_horizontal = 3 - -[node name="SceneLabel" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer4/VBoxContainer"] -margin_right = 272.0 -margin_bottom = 14.0 -text = "Scene" -align = 1 - -[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer/HBoxContainer4/VBoxContainer"] -margin_left = 89.0 -margin_top = 18.0 -margin_right = 183.0 -margin_bottom = 42.0 -size_flags_horizontal = 4 - -[node name="SceneIdLabel" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer4/VBoxContainer/HBoxContainer"] -margin_top = 5.0 -margin_right = 16.0 -margin_bottom = 19.0 -text = "id:" - -[node name="SceneIdSpinBox" type="SpinBox" parent="MarginContainer/VBoxContainer/HBoxContainer4/VBoxContainer/HBoxContainer"] -margin_left = 20.0 -margin_right = 94.0 -margin_bottom = 24.0 - -[node name="HSeparator2" type="HSeparator" parent="MarginContainer/VBoxContainer"] -margin_top = 128.0 -margin_right = 272.0 -margin_bottom = 132.0 - -[node name="HBoxContainer2" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] -margin_top = 136.0 -margin_right = 272.0 -margin_bottom = 234.0 - -[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/VBoxContainer/HBoxContainer2"] -margin_right = 272.0 -margin_bottom = 98.0 -size_flags_horizontal = 3 - -[node name="DialogLabel" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer2/VBoxContainer"] -margin_right = 272.0 -margin_bottom = 14.0 -text = "Message" -align = 1 - -[node name="MessageTextEdit" type="TextEdit" parent="MarginContainer/VBoxContainer/HBoxContainer2/VBoxContainer"] -margin_top = 18.0 -margin_right = 272.0 -margin_bottom = 98.0 -rect_min_size = Vector2( 256, 80 ) -size_flags_horizontal = 3 -size_flags_vertical = 3 -smooth_scrolling = true - -[node name="Editor_BTN" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer2"] -visible = false -margin_left = 260.0 -margin_right = 292.0 -margin_bottom = 82.0 -rect_min_size = Vector2( 32, 0 ) -hint_tooltip = "Expand this node's text editor." -icon = ExtResource( 2 ) -expand_icon = true - -[node name="HSeparator3" type="HSeparator" parent="MarginContainer/VBoxContainer"] -margin_top = 238.0 -margin_right = 272.0 -margin_bottom = 242.0 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="ChoicesList" parent="MarginContainer/VBoxContainer" instance=ExtResource( 3 )] -margin_top = 246.0 -margin_bottom = 270.0 -[connection signal="close_request" from="." to="." method="_on_Line_close_request"] -[connection signal="offset_changed" from="." to="." method="_on_Line_offset_changed"] -[connection signal="resize_request" from="." to="." method="_on_Line_resize_request"] -[connection signal="value_changed" from="MarginContainer/VBoxContainer/HBoxContainer3/VBoxContainer/HBoxContainer/SpeakerIdSpinBox" to="." method="_on_SpeakerIdSpinBox_value_changed"] -[connection signal="text_changed" from="MarginContainer/VBoxContainer/HBoxContainer3/VBoxContainer/HBoxContainer2/SpeakerEmotionLineEdit" to="." method="_on_SpeakerEmotionLineEdit_text_changed"] -[connection signal="value_changed" from="MarginContainer/VBoxContainer/HBoxContainer4/VBoxContainer/HBoxContainer/SceneIdSpinBox" to="." method="_on_SceneIdSpinBox_value_changed"] -[connection signal="text_changed" from="MarginContainer/VBoxContainer/HBoxContainer2/VBoxContainer/MessageTextEdit" to="." method="_on_MessageTextEdit_text_changed"] -[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer2/Editor_BTN" to="." method="_on_Editor_BTN_pressed"] -[connection signal="choices_changed" from="MarginContainer/VBoxContainer/ChoicesList" to="." method="_on_ChoicesList_choices_changed"] diff --git a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/icon_distraction_free.svg b/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/icon_distraction_free.svg deleted file mode 100644 index 8608b33..0000000 --- a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/icon_distraction_free.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/icon_distraction_free.svg.import b/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/icon_distraction_free.svg.import deleted file mode 100644 index 4a8edd8..0000000 --- a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/icon_distraction_free.svg.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="StreamTexture" -path="res://.import/icon_distraction_free.svg-5120bf5545890a3868c1108c903f7cd9.stex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/icon_distraction_free.svg" -dest_files=[ "res://.import/icon_distraction_free.svg-5120bf5545890a3868c1108c903f7cd9.stex" ] - -[params] - -compress/mode=0 -compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 -compress/normal_map=0 -flags/repeat=0 -flags/filter=true -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 -process/fix_alpha_border=true -process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false -stream=false -size_limit=0 -detect_3d=true -svg/scale=1.0 diff --git a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/line_node.gd b/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/line_node.gd deleted file mode 100644 index 2f38824..0000000 --- a/addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/line_node.gd +++ /dev/null @@ -1,184 +0,0 @@ -tool -extends GraphNode - -class_name LineNode - -signal changed_offset(nid, vec2) -signal changed_size(this) -signal changed_slots(this) -signal erased(this) -signal pressed_editor(this) -signal pressed_load(this) -signal pressed_save(this) -signal text_changed(nid, new_text) - - -onready var _SpeakerIdSpinBox: SpinBox = self.get_node("MarginContainer/VBoxContainer/HBoxContainer3/VBoxContainer/HBoxContainer/SpeakerIdSpinBox") -onready var _SpeakerEmotionLineEdit: LineEdit = self.get_node("MarginContainer/VBoxContainer/HBoxContainer3/VBoxContainer/HBoxContainer2/SpeakerEmotionLineEdit") -onready var _SceneIdSpinBox: SpinBox = self.get_node("MarginContainer/VBoxContainer/HBoxContainer4/VBoxContainer/HBoxContainer/SceneIdSpinBox") -onready var _MessageTextEdit : TextEdit= self.get_node("MarginContainer/VBoxContainer/HBoxContainer2/VBoxContainer/MessageTextEdit") -onready var _ChoicesList: ChoicesList = self.get_node("MarginContainer/VBoxContainer/ChoicesList") - -var _nid : int = 0 -var _slot_amount : int = 1 - -var json_structure = { - "speaker": { - "id": 0, - "emotion": "happy" - }, - "scene": { - "id": 0 - }, - "dialog": { - "message": "", - "choices_multiple": [] - } -} - - -#Virtual Methods - -func _ready(): - self._update_slots() - -#Callback Methods - -func _on_Editor_BTN_pressed(): - self.emit_signal("pressed_editor", self) - - -func _on_Line_close_request(): - self.emit_signal("erased", self) - - -func _on_Line_offset_changed(): - self.emit_signal("changed_offset", self._nid, self.offset) - - -func _on_Line_resize_request(new_minsize): - self.rect_size = new_minsize - self.emit_signal("changed_size", self) - - -func _on_Load_BTN_pressed(): - self.emit_signal("pressed_load", self) - - -func _on_Save_BTN_pressed(): - self.emit_signal("pressed_save", self) - - -func _on_MessageTextEdit_text_changed(): - json_structure.dialog.message = self._MessageTextEdit.text - _emit_text() - -func _on_SceneIdSpinBox_value_changed(value): - json_structure.scene.id = value - _emit_text() - - -func _on_SpeakerEmotionLineEdit_text_changed(new_text): - json_structure.speaker.emotion = new_text - _emit_text() - - -func _on_SpeakerIdSpinBox_value_changed(value): - json_structure.speaker.id = value - _emit_text() - -func _on_ChoicesList_choices_changed(new_json_structure): - json_structure.dialog.choices_multiple = new_json_structure - var slot_number = json_structure.dialog.choices_multiple.size() - # Always have at least one slot - if slot_number == 0: - slot_number = 1 - if (self.get_slot_amount() != slot_number): - self.set_slot_amount(slot_number) - self._update_slots() - self.emit_signal("changed_slots", self) - else: - _update_slots_labels() - _emit_text() - - -#Public Methods - -func get_nid() -> int: - return self._nid - - -func get_slot_amount() -> int: - return self._slot_amount - - -func get_text() -> String: - return JSON.print(json_structure, "\t") - - -func set_nid(new_nid): - self._nid = new_nid - var new_name = "NID " + str(new_nid) - self.title = new_name - self.name = new_name - - -func set_slot_amount(new_amount : int): - self._slot_amount = new_amount - - -func set_text(new_text : String): - json_structure = JSON.parse(new_text).get_result() - _update_components() - _emit_text() - -#Private Methods - -func _update_components(): - _SpeakerIdSpinBox.set_value(json_structure.speaker.id) - _SpeakerEmotionLineEdit.set_text(json_structure.speaker.emotion); - _SceneIdSpinBox.set_value(json_structure.scene.id) - _MessageTextEdit.set_text(json_structure.dialog.message) - _ChoicesList.set_structure(json_structure.dialog.choices_multiple) - -func _emit_text(): - self.emit_signal("text_changed", self._nid, get_text()) - - -func _clear_link_labels(): - var children = self.get_children() - for child in children: - if child is Label: - child.queue_free() - - -func _update_slots_labels(): - for slot in range(0, self.get_slot_amount()): - var output_link_label = self.get_children()[slot] - if (output_link_label is Label): - output_link_label.text = self._get_choice_name(slot) - -func _get_choice_name(index): - var choices: Array = json_structure.dialog.choices_multiple; - if (choices.size() > 0): - return choices[index].title - else: - return "Next" - -func _update_slots(): - self.clear_all_slots() - self._clear_link_labels() - self.set_slot(0, true, 0, Color(1.0, 1.0, 1.0, 1.0), true, 0, Color(1.0, 1.0, 1.0, 1.0), null, null) - var base_link_label = Label.new() - base_link_label.text = self._get_choice_name(0) - base_link_label.align = Label.ALIGN_RIGHT - self.add_child(base_link_label) - self.move_child(base_link_label, 0) - var last_output_link_label = base_link_label - for slot in range(1, self._slot_amount): - self.set_slot(slot, false, 0, Color(1.0, 1.0, 1.0, 1.0), true, 0, Color(1.0, 1.0, 1.0, 1.0), null, null) - var output_link_label = Label.new() - output_link_label.text = self._get_choice_name(slot) - output_link_label.align = Label.ALIGN_RIGHT - self.add_child_below_node(last_output_link_label, output_link_label) - last_output_link_label = output_link_label diff --git a/addons/EXP-System-Dialog/Dialog Editor/dialog_editor.gd b/addons/EXP-System-Dialog/Dialog Editor/dialog_editor.gd deleted file mode 100644 index ed36175..0000000 --- a/addons/EXP-System-Dialog/Dialog Editor/dialog_editor.gd +++ /dev/null @@ -1,224 +0,0 @@ -tool -extends Control - -signal back_BTN_pressed -signal close_BTN_pressed - -onready var _Graph = self.get_node("VBoxContainer/GraphEdit") -onready var _Human_Readable_LBL = self.get_node("VBoxContainer/VBoxContainer/Human_Readable_LBL") - -var _Editor_TSCN = preload("res://addons/EXP-System-Dialog/Dialog Editor/Editor/Editor.tscn") -var _LineNode = preload("res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/Line_Node.tscn") -var _NodeTemplate= preload("res://addons/EXP-System-Dialog/Resource_NodeTemplate/EXP_NodeTemplate.gd") - -var _did : int = -1 -var _Editor -var _Load_Template : EditorFileDialog -var _Save_Template_As : EditorFileDialog -var _Story_Editor -var _Target_Node - -#Virtual Methods - -func _ready(): - self._setup_dialogs() - self._Editor = _Editor_TSCN.instance() - self.add_child(self._Editor) - -#Callback Methods - -func _on_Add_Node_BTN_pressed(): - var new_nid = self._Story_Editor.create_node(self._did, "line") - var new_line_node = self._LineNode.instance() - new_line_node.offset += self._Graph.scroll_offset - new_line_node.set_nid(new_nid) - new_line_node.connect("erased", self, "_on_Node_erased") - new_line_node.connect("changed_offset", self, "_on_Node_changed_offset") - new_line_node.connect("text_changed", self, "_on_Node_text_changed") - new_line_node.connect("pressed_save", self, "_on_Node_pressed_save") - new_line_node.connect("pressed_load", self, "_on_Node_pressed_load") - new_line_node.connect("pressed_editor", self, "_on_Node_pressed_editor") - new_line_node.connect("changed_slots", self, "_on_Node_changed_slots") - new_line_node.connect("changed_size", self, "_on_Node_changed_size") - var slot_count = self._Story_Editor.get_node_property(self._did, new_nid, "slot_amount") - self._Story_Editor.set_node_property(self._did, new_nid, "rect_size", new_line_node.rect_size) - new_line_node.set_slot_amount(slot_count) - self._Graph.add_child(new_line_node) - - -func _on_Back_BTN_pressed(): - self.emit_signal("back_BTN_pressed") - - -func _on_Close_BTN_pressed(): - self.emit_signal("close_BTN_pressed") - - -func _on_GraphEdit_connection_request(from, from_slot, to, to_slot): - self._Graph.connect_node(from, from_slot, to, to_slot) - var from_node = self._Graph.get_node(from) - var to_node = self._Graph.get_node(to) - var from_node_nid = from_node.get_nid() - var to_node_nid = to_node.get_nid() - self._Story_Editor.set_link(self._did, from_node_nid, from_slot, to_node_nid) - - -func _on_GraphEdit_disconnection_request(from, from_slot, to, to_slot): - self._Graph.disconnect_node(from, from_slot, to, to_slot) - var from_node = self._Graph.get_node(from) - var from_node_nid = from_node.get_nid() - self._Story_Editor.erase_link(self._did, from_node_nid, from_slot) - - -func _on_Load_Template_file_selected(filename): - var file_data = load(filename) - if not file_data.TYPE == "EXP_Dialog_Node_Template_editor": - return - - self._Target_Node.set_text(file_data.template) - - -func _on_Node_changed_offset(nid, new_offset): - self._Story_Editor.set_node_property(self._did, nid, "graph_offset", new_offset) - - -func _on_Node_changed_size(changed_node): - var changed_node_nid = changed_node.get_nid() - self._Story_Editor.set_node_property(self._did, changed_node_nid, "rect_size", changed_node.rect_size) - - -func _on_Node_changed_slots(changed_node): - var changed_node_nid = changed_node.get_nid() - self._unlink_nid_from_story(changed_node_nid) - self._disconnect_all_from(changed_node) - self._Story_Editor.set_node_property(self._did, changed_node_nid, "slot_amount", - changed_node.get_slot_amount()) - - -func _on_Node_erased(deleted_node): - var deleted_nid = deleted_node.get_nid() - self._unlink_nid_from_story(deleted_nid) - self._Story_Editor.erase_node(self._did, deleted_nid) - self._disconnect_all_from(deleted_node) - deleted_node.queue_free() - - -func _on_Node_pressed_editor(node): - self._Editor.set_target_node(node) - self._Editor.visible = true - - -func _on_Node_pressed_load(node): - self._Target_Node = node - self._Load_Template.popup_centered_ratio(0.7) - - -func _on_Node_pressed_save(node): - self._Target_Node = node - self._Save_Template_As.popup_centered_ratio(0.7) - - -func _on_Node_text_changed(nid, new_text): - self._Story_Editor.set_node_property(self._did, nid, "text", new_text) - - -func _on_Save_Template_As_file_selected(filename): - var save_file = _NodeTemplate.new() - save_file.template = self._Target_Node.get_text() - ResourceSaver.save(filename, save_file) - - -func _on_Story_Editor_dialog_edit_pressed(story_editor, did : int): - self._Story_Editor = story_editor - self._did = did - self._Human_Readable_LBL.text = self._Story_Editor.get_dialog_property(self._did, "human_readable_description") - self._clear_nodes() - self._populate_graph() - self._link_node_connections() - -#Private Methods - -func _clear_nodes(): - self._Graph.clear_connections() - var children = self._Graph.get_children() - for child in children: - if child is GraphNode: - child.free() - - -func _disconnect_all_from(node): - var node_name = node.name - var connection_list = self._Graph.get_connection_list() - for connection in connection_list: - if connection["from"] == node.name or connection["to"] == node.name: - self._Graph.disconnect_node(connection["from"], connection["from_port"], - connection["to"], connection["to_port"]) - - -func _link_node_connections(): - var node_IDs = self._Story_Editor.get_nids(self._did) - for nID in node_IDs: - var slots = self._Story_Editor.get_link_slots(self._did, nID) - for slot in slots: - var to_node_nid = self._Story_Editor.get_nid_link_from(self._did, nID, slot) - var to = "NID " + str(to_node_nid) - var from = "NID " + str(nID) - self._Graph.connect_node(from, slot, to, 0) - - -func _populate_graph(): - var node_IDs = self._Story_Editor.get_nids(self._did) - for nID in node_IDs: - var new_node : GraphNode - match self._Story_Editor.get_node_property(self._did, nID, "type"): - "line": - new_node = _LineNode.instance() - var slot_count = self._Story_Editor.get_node_property(self._did, nID, "slot_amount") - new_node.set_slot_amount(slot_count) - self._Graph.add_child(new_node) - new_node.connect("erased", self, "_on_Node_erased") - var new_text = self._Story_Editor.get_node_property(self._did, nID, "text") - var new_rect_size = self._Story_Editor.get_node_property(self._did, nID, "rect_size") - new_node.rect_size = new_rect_size - new_node.set_text(new_text) - new_node.connect("text_changed", self, "_on_Node_text_changed") - new_node.connect("pressed_save", self, "_on_Node_pressed_save") - new_node.connect("pressed_load", self, "_on_Node_pressed_load") - new_node.connect("pressed_editor", self, "_on_Node_pressed_editor") - new_node.connect("changed_slots", self, "_on_Node_changed_slots") - new_node.connect("changed_size", self, "_on_Node_changed_size") - - new_node.set_nid(nID) - new_node.offset = self._Story_Editor.get_node_property(self._did, nID, "graph_offset") - new_node.connect("changed_offset", self, "_on_Node_changed_offset") - - -func _setup_dialogs(): - self._Load_Template = EditorFileDialog.new() - self._Load_Template.mode = EditorFileDialog.MODE_OPEN_FILE - self._Load_Template.add_filter("*.res ; Template files") - self._Load_Template.resizable = true - self._Load_Template.access = EditorFileDialog.ACCESS_RESOURCES - self._Load_Template.current_dir = "res://" - self._Load_Template.connect("file_selected", self, "_on_Load_Template_file_selected") - self.add_child(self._Load_Template) - - self._Save_Template_As = EditorFileDialog.new() - self._Save_Template_As.mode = EditorFileDialog.MODE_SAVE_FILE - self._Save_Template_As.add_filter("*.res ; Template files") - self._Save_Template_As.resizable = true - self._Save_Template_As.access = EditorFileDialog.ACCESS_RESOURCES - self._Save_Template_As.current_dir = "res://" - self._Save_Template_As.connect("file_selected", self, "_on_Save_Template_As_file_selected") - self.add_child(self._Save_Template_As) - - -func _unlink_nid_from_story(removed_nid): - self._Story_Editor.erase_all_links(self._did, removed_nid) - var nIDs = self._Story_Editor.get_nids(self._did) - for nID in nIDs: - var node_slots = self._Story_Editor.get_link_slots(self._did, nID) - for slot in node_slots: - var to_node_nid = self._Story_Editor.get_nid_link_from(self._did, nID, slot) - if to_node_nid == removed_nid: - self._Story_Editor.erase_link(self._did, nID, slot) diff --git a/addons/EXP-System-Dialog/Images/de.png b/addons/EXP-System-Dialog/Images/de.png deleted file mode 100644 index 7f09dee1ebb2a5cc3566a0dc5e013af98a983f40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65358 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%0A`d<_vm76L77ywgAeO7ykeSpSWCOS6>0T>OKo} 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 T92WZD8hoX9>TfIM%tQVQMbK?p diff --git a/addons/EXP-System-Dialog/Images/de.png.import b/addons/EXP-System-Dialog/Images/de.png.import deleted file mode 100644 index f66284b..0000000 --- a/addons/EXP-System-Dialog/Images/de.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="StreamTexture" -path="res://.import/de.png-fbe4565917c56d102e03dea598024725.stex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/EXP-System-Dialog/Images/de.png" -dest_files=[ "res://.import/de.png-fbe4565917c56d102e03dea598024725.stex" ] - -[params] - -compress/mode=0 -compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 -compress/normal_map=0 -flags/repeat=0 -flags/filter=true -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 -process/fix_alpha_border=true -process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false -stream=false -size_limit=0 -detect_3d=true -svg/scale=1.0 diff --git a/addons/EXP-System-Dialog/Images/icon.png b/addons/EXP-System-Dialog/Images/icon.png deleted file mode 100644 index 93f9b7f04d7198a47c2a88aea3e706b0b0bb3c50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 701 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 uj_S`JH$M)Z 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 Array: - return self._story.keys() - - -func get_did_via_record_name(name : String) -> int: - assert(self._names.has(name)) - return self._names[name] - - -func get_nid_from_slot(did : int, nid : int, slot : int) -> int: - assert(self.has_did(did)) - assert(self.has_nid(did, nid)) - assert(self.has_slot(did, nid, slot)) - return self._story[did]["nodes"][nid]["links"][slot] - - -func get_nid_via_exact_text(did : int, query : String) -> int: - assert(self.has_did(did)) - - for nid in self._story[did]["nodes"].keys(): - if self._story[did]["nodes"][nid]["text"] == query: - return nid - return -1 - - -func get_nids(did : int) -> Array: - assert(self.has_did(did)) - return self._story[did]["nodes"].keys() - - -func get_slot_count(did : int, nid : int) -> int: - assert(self.has_did(did)) - assert(self.has_nid(did, nid)) - return self._story[did]["nodes"][nid]["links"].size() - - -func get_slots(did : int, nid : int) -> Array: - assert(self.has_did(did)) - assert(self.has_nid(did, nid)) - return self._story[did]["nodes"][nid]["links"].keys() - - -func get_text(did : int, nid : int) -> String: - assert(self.has_did(did)) - assert(self.has_nid(did, nid)) - return self._story[did]["nodes"][nid]["text"] - - -func has_did(did : int) -> bool: - return self._story.has(did) - - -func has_nid(did : int, nid : int) -> bool: - assert(self.has_did(did)) - return self._story[did]["nodes"].has(nid) - - -func has_record_name(name : String) -> bool: - return self._names.has(name) - - -func has_slot(did: int, nid : int, slot : int) -> bool: - assert(self.has_did(did)) - assert(self.has_nid(did, nid)) - return self._story[did]["nodes"][nid]["links"].has(slot) - - -func read(file): - if not "TYPE" in file: - print_debug("Story reader failed to open file: ", str(file.filename)) - return - if not file.TYPE == "EXP_Baked_Story" or file.TYPE == "EXP_Story_editor": - print_debug("Story reader failed to open file: ", str(file.filename)) - return - - self._story = file.story - self._names = file.names diff --git a/addons/EXP-System-Dialog/Resource_BakedStory/EXP_BakedStory.gd b/addons/EXP-System-Dialog/Resource_BakedStory/EXP_BakedStory.gd deleted file mode 100644 index 53c929c..0000000 --- a/addons/EXP-System-Dialog/Resource_BakedStory/EXP_BakedStory.gd +++ /dev/null @@ -1,6 +0,0 @@ -tool -extends Resource - -export(String) var TYPE = "EXP_Baked_Story" -export(Dictionary) var story : Dictionary -export(Dictionary) var names : Dictionary diff --git a/addons/EXP-System-Dialog/Resource_EditorStory/EXP_EditorStory.gd b/addons/EXP-System-Dialog/Resource_EditorStory/EXP_EditorStory.gd deleted file mode 100644 index ec28dae..0000000 --- a/addons/EXP-System-Dialog/Resource_EditorStory/EXP_EditorStory.gd +++ /dev/null @@ -1,9 +0,0 @@ -tool -extends Resource - -export(String) var TYPE = "EXP_Story_editor" - -export(Dictionary) var names : Dictionary -export(Dictionary) var story : Dictionary -export(Array) var available_dids : Array -export(Array) var groups : Array diff --git a/addons/EXP-System-Dialog/Resource_NodeTemplate/EXP_NodeTemplate.gd b/addons/EXP-System-Dialog/Resource_NodeTemplate/EXP_NodeTemplate.gd deleted file mode 100644 index 799b585..0000000 --- a/addons/EXP-System-Dialog/Resource_NodeTemplate/EXP_NodeTemplate.gd +++ /dev/null @@ -1,6 +0,0 @@ -tool -extends Resource - -var TYPE = "EXP_Dialog_Node_Template_editor" - -export(String) var template diff --git a/addons/EXP-System-Dialog/Story Editor/Dialog Record/Dialog_Record.tscn b/addons/EXP-System-Dialog/Story Editor/Dialog Record/Dialog_Record.tscn deleted file mode 100644 index aee1865..0000000 --- a/addons/EXP-System-Dialog/Story Editor/Dialog Record/Dialog_Record.tscn +++ /dev/null @@ -1,109 +0,0 @@ -[gd_scene load_steps=4 format=2] - -[ext_resource path="res://addons/EXP-System-Dialog/Story Editor/Dialog Record/dialog_record.gd" type="Script" id=1] - -[sub_resource type="StyleBoxFlat" id=1] -bg_color = Color( 0.6, 0.6, 0.6, 0 ) -border_color = Color( 0.8, 0.8, 0.8, 0 ) -shadow_color = Color( 0, 0, 0, 0 ) - -[sub_resource type="StyleBoxFlat" id=2] -bg_color = Color( 0.6, 0.6, 0.6, 0 ) -border_color = Color( 0.8, 0.8, 0.8, 0 ) -shadow_color = Color( 0, 0, 0, 0 ) - -[node name="Dialog_Record" type="Control"] -anchor_right = 1.0 -rect_min_size = Vector2( 0, 28 ) -script = ExtResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="ColorRect" type="ColorRect" parent="."] -anchor_right = 1.0 -anchor_bottom = 1.0 -rect_min_size = Vector2( 0, 24 ) -size_flags_horizontal = 3 -color = Color( 1, 1, 1, 0.12549 ) -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="HBoxContainer" type="HBoxContainer" parent="ColorRect"] -anchor_right = 1.0 -anchor_bottom = 1.0 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="CheckBox" type="CheckBox" parent="ColorRect/HBoxContainer"] -margin_right = 24.0 -margin_bottom = 28.0 - -[node name="DID_LBL" type="Label" parent="ColorRect/HBoxContainer"] -margin_left = 28.0 -margin_top = 7.0 -margin_right = 85.0 -margin_bottom = 21.0 -text = "DID: 101" - -[node name="VSeparator" type="VSeparator" parent="ColorRect/HBoxContainer"] -margin_left = 89.0 -margin_right = 93.0 -margin_bottom = 28.0 - -[node name="Edit_BTN" type="Button" parent="ColorRect/HBoxContainer"] -margin_left = 97.0 -margin_right = 138.0 -margin_bottom = 28.0 -hint_tooltip = "Edit this dialog record in the Dialog Editor." -text = "EDIT" -flat = true - -[node name="VSeparator4" type="VSeparator" parent="ColorRect/HBoxContainer"] -margin_left = 142.0 -margin_right = 146.0 -margin_bottom = 28.0 - -[node name="Name_BTN" type="Button" parent="ColorRect/HBoxContainer"] -margin_left = 150.0 -margin_right = 200.0 -margin_bottom = 28.0 -hint_tooltip = "Edit this dialog record in the Dialog Editor." -text = "NAME" -flat = true - -[node name="VSeparator2" type="VSeparator" parent="ColorRect/HBoxContainer"] -margin_left = 204.0 -margin_right = 208.0 -margin_bottom = 28.0 - -[node name="Group_BTN" type="OptionButton" parent="ColorRect/HBoxContainer"] -margin_left = 212.0 -margin_right = 274.0 -margin_bottom = 28.0 -hint_tooltip = "View groups applied to this dialog record." -text = "TAGS" -flat = true - -[node name="VSeparator3" type="VSeparator" parent="ColorRect/HBoxContainer"] -margin_left = 278.0 -margin_right = 282.0 -margin_bottom = 28.0 - -[node name="Human_Readable_LineEdit" type="LineEdit" parent="ColorRect/HBoxContainer"] -margin_left = 286.0 -margin_right = 476.0 -margin_bottom = 28.0 -custom_styles/focus = SubResource( 1 ) -custom_styles/normal = SubResource( 2 ) -text = "Human Readable Description" -expand_to_text_length = true -context_menu_enabled = false -[connection signal="toggled" from="ColorRect/HBoxContainer/CheckBox" to="." method="_on_CheckBox_toggled"] -[connection signal="pressed" from="ColorRect/HBoxContainer/Edit_BTN" to="." method="_on_Edit_BTN_pressed"] -[connection signal="pressed" from="ColorRect/HBoxContainer/Name_BTN" to="." method="_on_Name_BTN_pressed"] -[connection signal="pressed" from="ColorRect/HBoxContainer/Group_BTN" to="." method="_on_Group_BTN_pressed"] -[connection signal="focus_exited" from="ColorRect/HBoxContainer/Human_Readable_LineEdit" to="." method="_on_Human_Readable_LineEdit_focus_exited"] -[connection signal="text_changed" from="ColorRect/HBoxContainer/Human_Readable_LineEdit" to="." method="_on_Human_Readable_LineEdit_text_changed"] diff --git a/addons/EXP-System-Dialog/Story Editor/Dialog Record/dialog_record.gd b/addons/EXP-System-Dialog/Story Editor/Dialog Record/dialog_record.gd deleted file mode 100644 index b31f117..0000000 --- a/addons/EXP-System-Dialog/Story Editor/Dialog Record/dialog_record.gd +++ /dev/null @@ -1,91 +0,0 @@ -tool -extends Control - -signal changed_human_readable_text(did, text) -signal checked(this) -signal edit_pressed(did) -signal rename_pressed(this) -signal unchecked(this) - -onready var _DID_LBL = self.get_node("ColorRect/HBoxContainer/DID_LBL") -onready var _Human_Readable_LineEdit = self.get_node("ColorRect/HBoxContainer/Human_Readable_LineEdit") -onready var _Group_List = self.get_node("ColorRect/HBoxContainer/Group_BTN") -onready var _Name_BTN = self.get_node("ColorRect/HBoxContainer/Name_BTN") -onready var _Select_CheckBox = self.get_node("ColorRect/HBoxContainer/CheckBox") - -var _did : int = -1 -var _Story_Editor - -#Virtual Methods - -func _ready(): - self.update_human_readable_description("Human Readable Description") - -#Callback Methods - -func _on_CheckBox_toggled(button_pressed): - if button_pressed: - self.emit_signal("checked", self) - else: - self.emit_signal("unchecked", self) - - -func _on_Edit_BTN_pressed(): - self.emit_signal("edit_pressed", self._did) - - -func _on_Group_BTN_pressed(): - var groups = self._Story_Editor.dialog_get_groups(self._did) - self._Group_List.clear() - self._Group_List.text = "TAGS" - for group in groups: - self._Group_List.get_popup().add_item(group) - for idx in range(self._Group_List.get_item_count()): - self._Group_List.set_item_disabled(idx, true) - - -func _on_Human_Readable_LineEdit_focus_exited(): - self._Human_Readable_LineEdit.deselect() - - -func _on_Human_Readable_LineEdit_text_changed(new_text): - self.emit_signal("changed_human_readable_text", self._did, new_text) - - -func _on_Name_BTN_pressed(): - emit_signal("rename_pressed", self) - -#Public Methods - -func check(): - self._Select_CheckBox.pressed = true - - -func get_did(): - return self._did - - -func get_record_name(): - return self._Name_BTN.text - - -func set_did(new_did : int): - self._did = new_did - self._DID_LBL.text = "DID: " + str(new_did) - - -func set_record_name(rename : String): - self._Name_BTN.text = rename - - -func set_story_editor(editor): - self._Story_Editor = editor - - -func uncheck(): - self._Select_CheckBox.pressed = false - - -func update_human_readable_description(new_text): - self._Human_Readable_LineEdit.text = new_text - self.emit_signal("changed_human_readable_text", self._did, new_text) diff --git a/addons/EXP-System-Dialog/Story Editor/Rename Record Box/Rename_Record_Box.tscn b/addons/EXP-System-Dialog/Story Editor/Rename Record Box/Rename_Record_Box.tscn deleted file mode 100644 index c9e6cbe..0000000 --- a/addons/EXP-System-Dialog/Story Editor/Rename Record Box/Rename_Record_Box.tscn +++ /dev/null @@ -1,92 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[ext_resource path="res://addons/EXP-System-Dialog/Story Editor/Rename Record Box/rename_record_box.gd" type="Script" id=1] - -[node name="Record_Rename_Box" type="WindowDialog"] -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -margin_left = -193.0 -margin_top = -64.0 -margin_right = 193.0 -margin_bottom = 52.0 -rect_min_size = Vector2( 386, 116 ) -size_flags_horizontal = 3 -size_flags_vertical = 3 -window_title = "Rename Dialog Record" -script = ExtResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="MarginContainer" type="MarginContainer" parent="."] -anchor_right = 1.0 -anchor_bottom = 1.0 -margin_left = 8.0 -margin_top = 8.0 -margin_right = -8.0 -margin_bottom = -8.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] -margin_right = 370.0 -margin_bottom = 100.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="Name_LBL" type="Label" parent="MarginContainer/VBoxContainer"] -margin_right = 370.0 -margin_bottom = 14.0 -text = "Name:" - -[node name="Spacer2" type="Control" parent="MarginContainer/VBoxContainer"] -margin_top = 18.0 -margin_right = 370.0 -margin_bottom = 22.0 -rect_min_size = Vector2( 0, 4 ) - -[node name="Name_LineEdit" type="LineEdit" parent="MarginContainer/VBoxContainer"] -margin_top = 26.0 -margin_right = 370.0 -margin_bottom = 50.0 - -[node name="Spacer3" type="Control" parent="MarginContainer/VBoxContainer"] -margin_top = 54.0 -margin_right = 370.0 -margin_bottom = 58.0 -rect_min_size = Vector2( 0, 4 ) - -[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] -margin_top = 62.0 -margin_right = 370.0 -margin_bottom = 82.0 -alignment = 1 - -[node name="Cancel_BTN" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer"] -margin_left = 106.0 -margin_right = 160.0 -margin_bottom = 20.0 -text = "Cancel" - -[node name="Spacer" type="Control" parent="MarginContainer/VBoxContainer/HBoxContainer"] -margin_left = 164.0 -margin_right = 196.0 -margin_bottom = 20.0 -rect_min_size = Vector2( 32, 0 ) - -[node name="Rename_BTN" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer"] -margin_left = 200.0 -margin_right = 264.0 -margin_bottom = 20.0 -text = "Rename" -[connection signal="text_entered" from="MarginContainer/VBoxContainer/Name_LineEdit" to="." method="_on_Name_LineEdit_text_entered"] -[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/Cancel_BTN" to="." method="_on_Cancel_BTN_pressed"] -[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/Rename_BTN" to="." method="_on_Rename_BTN_pressed"] diff --git a/addons/EXP-System-Dialog/Story Editor/Rename Record Box/rename_record_box.gd b/addons/EXP-System-Dialog/Story Editor/Rename Record Box/rename_record_box.gd deleted file mode 100644 index 1550532..0000000 --- a/addons/EXP-System-Dialog/Story Editor/Rename Record Box/rename_record_box.gd +++ /dev/null @@ -1,32 +0,0 @@ -tool -extends WindowDialog - -signal rename_BTN_pressed(text) - -onready var _Name_LineEdit = self.get_node("MarginContainer/VBoxContainer/Name_LineEdit") - -var _Target_Record = null - -#Public Methods - -func get_target_record(): - return self._Target_Record - - -func set_target_record(record): - self._Target_Record = record - self._Name_LineEdit.text = record.get_record_name() - -#Callback Methods - -func _on_Cancel_BTN_pressed(): - self.visible = false - - -func _on_Rename_BTN_pressed(): - self.visible = false - self.emit_signal("rename_BTN_pressed", self._Name_LineEdit.text) - - -func _on_Name_LineEdit_text_entered(new_text): - self._on_Rename_BTN_pressed() diff --git a/addons/EXP-System-Dialog/Story Editor/Story_Editor.tscn b/addons/EXP-System-Dialog/Story Editor/Story_Editor.tscn deleted file mode 100644 index 5f5dafa..0000000 --- a/addons/EXP-System-Dialog/Story Editor/Story_Editor.tscn +++ /dev/null @@ -1,268 +0,0 @@ -[gd_scene load_steps=2 format=2] - -[ext_resource path="res://addons/EXP-System-Dialog/Story Editor/story_editor.gd" type="Script" id=1] - -[node name="Story_Editor" type="Control"] -anchor_right = 1.0 -anchor_bottom = 1.0 -rect_min_size = Vector2( 0, 256 ) -script = ExtResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="VBoxContainer" type="VBoxContainer" parent="."] -anchor_right = 1.0 -anchor_bottom = 1.0 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] -margin_right = 1024.0 -margin_bottom = 20.0 - -[node name="Close_BTN" type="Button" parent="VBoxContainer/HBoxContainer"] -margin_right = 47.0 -margin_bottom = 20.0 -text = "Close" - -[node name="VSeparator5" type="VSeparator" parent="VBoxContainer/HBoxContainer"] -margin_left = 51.0 -margin_right = 55.0 -margin_bottom = 20.0 - -[node name="Story" type="MenuButton" parent="VBoxContainer/HBoxContainer"] -margin_left = 59.0 -margin_right = 103.0 -margin_bottom = 20.0 -text = "Story" -items = [ "New Story", null, 0, false, false, 0, 0, null, "", false, "Load Story", null, 0, false, false, 1, 0, null, "", false, "Save Story As", null, 0, false, false, 2, 0, null, "", false, "Bake Story As", null, 0, false, false, 3, 0, null, "", false, "Save CSV As", null, 0, false, false, 4, 0, null, "", false, "Load CSV", null, 0, false, false, 5, 0, null, "", false ] - -[node name="VSeparator" type="VSeparator" parent="VBoxContainer/HBoxContainer"] -margin_left = 107.0 -margin_right = 111.0 -margin_bottom = 20.0 - -[node name="Label2" type="Label" parent="VBoxContainer/HBoxContainer"] -margin_left = 115.0 -margin_top = 3.0 -margin_right = 163.0 -margin_bottom = 17.0 -text = "Dialog: " - -[node name="Create_Dialog_BTN" type="Button" parent="VBoxContainer/HBoxContainer"] -margin_left = 167.0 -margin_right = 220.0 -margin_bottom = 20.0 -hint_tooltip = "Create a new dialog record." -text = "Create" - -[node name="Delete_Dialog_BTN" type="Button" parent="VBoxContainer/HBoxContainer"] -margin_left = 224.0 -margin_right = 279.0 -margin_bottom = 20.0 -hint_tooltip = "Delete all checked dialog records." -text = "Delete" - -[node name="Check_All_BTN" type="Button" parent="VBoxContainer/HBoxContainer"] -margin_left = 283.0 -margin_right = 354.0 -margin_bottom = 20.0 -hint_tooltip = "Check all currently visible dialog records." -text = "Check All" - -[node name="UnCheck_All_BTN" type="Button" parent="VBoxContainer/HBoxContainer"] -margin_left = 358.0 -margin_right = 447.0 -margin_bottom = 20.0 -hint_tooltip = "Uncheck all currently visible dialog records." -text = "UnCheck All" - -[node name="VSeparator2" type="VSeparator" parent="VBoxContainer/HBoxContainer"] -margin_left = 451.0 -margin_right = 455.0 -margin_bottom = 20.0 - -[node name="Label3" type="Label" parent="VBoxContainer/HBoxContainer"] -margin_left = 459.0 -margin_top = 3.0 -margin_right = 495.0 -margin_bottom = 17.0 -text = "Tags: " - -[node name="Group_Manager_BTN" type="Button" parent="VBoxContainer/HBoxContainer"] -margin_left = 499.0 -margin_right = 590.0 -margin_bottom = 20.0 -hint_tooltip = "Toggles the Group Manager open and closed. Use the Group Manager to add and delete groups that can be applied to dialog records in this story project." -toggle_mode = true -text = "Tag Manager" - -[node name="VSeparator3" type="VSeparator" parent="VBoxContainer/HBoxContainer"] -margin_left = 594.0 -margin_right = 598.0 -margin_bottom = 20.0 - -[node name="Apply_Group_BTN" type="Button" parent="VBoxContainer/HBoxContainer"] -margin_left = 602.0 -margin_right = 650.0 -margin_bottom = 20.0 -hint_tooltip = "Apply the group selected in the Group selector menu to all checked dialog records." -text = "Apply" - -[node name="Remove_Group_BTN" type="Button" parent="VBoxContainer/HBoxContainer"] -margin_left = 654.0 -margin_right = 718.0 -margin_bottom = 20.0 -hint_tooltip = "Remove the group selected in the Group selector menu from all checked dialog records if the group is applied to them." -text = "Remove" - -[node name="Group_Selector_BTN" type="OptionButton" parent="VBoxContainer/HBoxContainer"] -margin_left = 722.0 -margin_right = 779.0 -margin_bottom = 20.0 -hint_tooltip = "Select a group to apply or remove from dialog records." -text = "Tags" - -[node name="VSeparator4" type="VSeparator" parent="VBoxContainer/HBoxContainer"] -margin_left = 783.0 -margin_right = 787.0 -margin_bottom = 20.0 - -[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer"] -margin_top = 24.0 -margin_right = 1024.0 -margin_bottom = 572.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="Panel" type="Panel" parent="VBoxContainer/HBoxContainer3"] -margin_right = 1024.0 -margin_bottom = 548.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="VScrollBar" type="ScrollContainer" parent="VBoxContainer/HBoxContainer3/Panel"] -anchor_right = 1.0 -anchor_bottom = 1.0 -rect_min_size = Vector2( 0, 128 ) -size_flags_vertical = 3 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="Dialog_Record_Root" type="VBoxContainer" parent="VBoxContainer/HBoxContainer3/Panel/VScrollBar"] -margin_right = 1024.0 -margin_bottom = 548.0 -rect_min_size = Vector2( 0, 128 ) -size_flags_horizontal = 3 -size_flags_vertical = 3 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="Group_Manager" type="VBoxContainer" parent="VBoxContainer/HBoxContainer3"] -visible = false -margin_left = 824.0 -margin_right = 1080.0 -margin_bottom = 716.0 -rect_min_size = Vector2( 256, 0 ) -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/Group_Manager"] -margin_right = 256.0 -margin_bottom = 24.0 - -[node name="Add_Group_LineEdit" type="LineEdit" parent="VBoxContainer/HBoxContainer3/Group_Manager/HBoxContainer"] -margin_right = 156.0 -margin_bottom = 24.0 -rect_min_size = Vector2( 128, 0 ) -size_flags_horizontal = 3 - -[node name="Add_Group_BTN" type="Button" parent="VBoxContainer/HBoxContainer3/Group_Manager/HBoxContainer"] -margin_left = 160.0 -margin_right = 197.0 -margin_bottom = 24.0 -hint_tooltip = "Add a group to this story project." -text = "Add" -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="Delete_Group_BTN" type="Button" parent="VBoxContainer/HBoxContainer3/Group_Manager/HBoxContainer"] -margin_left = 201.0 -margin_right = 256.0 -margin_bottom = 24.0 -hint_tooltip = "Remove the selected group from this story project." -text = "Delete" - -[node name="Group_ItemList" type="ItemList" parent="VBoxContainer/HBoxContainer3/Group_Manager"] -margin_top = 28.0 -margin_right = 256.0 -margin_bottom = 716.0 -size_flags_vertical = 3 - -[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"] -margin_top = 576.0 -margin_right = 1024.0 -margin_bottom = 600.0 -rect_min_size = Vector2( 0, 24 ) - -[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer2"] -margin_top = 5.0 -margin_right = 65.0 -margin_bottom = 19.0 -text = "Search by " - -[node name="Search_OptionButton" type="OptionButton" parent="VBoxContainer/HBoxContainer2"] -margin_left = 69.0 -margin_right = 233.0 -margin_bottom = 24.0 -text = "Human Readable LBL" -items = [ "Human Readable LBL", null, false, 0, null, "DID", null, false, 1, null ] -selected = 0 - -[node name="Search_LineEdit" type="LineEdit" parent="VBoxContainer/HBoxContainer2"] -margin_left = 237.0 -margin_right = 493.0 -margin_bottom = 24.0 -rect_min_size = Vector2( 256, 0 ) - -[node name="Filter_MenuButton" type="MenuButton" parent="VBoxContainer/HBoxContainer2"] -margin_left = 497.0 -margin_right = 537.0 -margin_bottom = 24.0 -hint_tooltip = "Select the groups that appear listed in the story editor." -keep_pressed_outside = true -text = "Tags" -flat = false -items = [ "-No Tags-", null, 1, true, false, 0, 0, null, "", false ] - -[node name="VSeparator" type="VSeparator" parent="VBoxContainer/HBoxContainer2"] -margin_left = 541.0 -margin_right = 545.0 -margin_bottom = 24.0 - -[node name="Filename_LBL" type="Label" parent="VBoxContainer/HBoxContainer2"] -margin_left = 549.0 -margin_top = 5.0 -margin_right = 640.0 -margin_bottom = 19.0 -text = "Unsaved Story" -[connection signal="pressed" from="VBoxContainer/HBoxContainer/Close_BTN" to="." method="_on_Close_BTN_pressed"] -[connection signal="pressed" from="VBoxContainer/HBoxContainer/Create_Dialog_BTN" to="." method="_on_Create_Dialog_BTN_pressed"] -[connection signal="pressed" from="VBoxContainer/HBoxContainer/Delete_Dialog_BTN" to="." method="_on_Delete_Dialog_BTN_pressed"] -[connection signal="pressed" from="VBoxContainer/HBoxContainer/Check_All_BTN" to="." method="_on_Check_All_BTN_pressed"] -[connection signal="pressed" from="VBoxContainer/HBoxContainer/UnCheck_All_BTN" to="." method="_on_Uncheck_All_BTN_pressed"] -[connection signal="toggled" from="VBoxContainer/HBoxContainer/Group_Manager_BTN" to="." method="_on_Group_Manager_BTN_toggled"] -[connection signal="pressed" from="VBoxContainer/HBoxContainer/Apply_Group_BTN" to="." method="_on_Apply_Group_BTN_pressed"] -[connection signal="pressed" from="VBoxContainer/HBoxContainer/Remove_Group_BTN" to="." method="_on_Remove_Group_BTN_pressed"] -[connection signal="pressed" from="VBoxContainer/HBoxContainer/Group_Selector_BTN" to="." method="_on_Group_Selector_BTN_pressed"] -[connection signal="text_entered" from="VBoxContainer/HBoxContainer3/Group_Manager/HBoxContainer/Add_Group_LineEdit" to="." method="_on_Add_Group_LineEdit_text_entered"] -[connection signal="pressed" from="VBoxContainer/HBoxContainer3/Group_Manager/HBoxContainer/Add_Group_BTN" to="." method="_on_Add_Group_BTN_pressed"] -[connection signal="pressed" from="VBoxContainer/HBoxContainer3/Group_Manager/HBoxContainer/Delete_Group_BTN" to="." method="_on_Delete_Group_BTN_pressed"] -[connection signal="item_selected" from="VBoxContainer/HBoxContainer2/Search_OptionButton" to="." method="_on_Search_OptionButton_item_selected"] -[connection signal="text_changed" from="VBoxContainer/HBoxContainer2/Search_LineEdit" to="." method="_on_Search_LineEdit_text_changed"] diff --git a/addons/EXP-System-Dialog/Story Editor/story_editor.gd b/addons/EXP-System-Dialog/Story Editor/story_editor.gd deleted file mode 100644 index 030a6b2..0000000 --- a/addons/EXP-System-Dialog/Story Editor/story_editor.gd +++ /dev/null @@ -1,753 +0,0 @@ -tool -extends Control - -signal changed_story -signal close_pressed -signal dialog_edit_pressed(story, did) - -onready var _Dialog_Record_Root = self.get_node("VBoxContainer/HBoxContainer3/Panel/VScrollBar/Dialog_Record_Root") -onready var _Dir = Directory.new() -onready var _Filename_LBL = self.get_node("VBoxContainer/HBoxContainer2/Filename_LBL") -onready var _Filter_Menu = self.get_node("VBoxContainer/HBoxContainer2/Filter_MenuButton") -onready var _Group_List = self.get_node("VBoxContainer/HBoxContainer3/Group_Manager/Group_ItemList") -onready var _Group_Manager_Panel = self.get_node("VBoxContainer/HBoxContainer3/Group_Manager") -onready var _Group_Selector = self.get_node("VBoxContainer/HBoxContainer/Group_Selector_BTN") -onready var _New_Group_LineEdit = self.get_node("VBoxContainer/HBoxContainer3/Group_Manager/HBoxContainer/Add_Group_LineEdit") -onready var _Search_LineEdit = self.get_node("VBoxContainer/HBoxContainer2/Search_LineEdit") -onready var _Search_Option_BTN = self.get_node("VBoxContainer/HBoxContainer2/Search_OptionButton") -onready var _Story_Menu = self.get_node("VBoxContainer/HBoxContainer/Story") - -var _Dialog_Record = preload("res://addons/EXP-System-Dialog/Story Editor/Dialog Record/Dialog_Record.tscn") -var _EXP_Baked_Story = preload("res://addons/EXP-System-Dialog/Resource_BakedStory/EXP_BakedStory.gd") -var _EXP_Story = preload("res://addons/EXP-System-Dialog/Resource_EditorStory/EXP_EditorStory.gd") -var _Record_Rename_Box_TSCN = preload("res://addons/EXP-System-Dialog/Story Editor/Rename Record Box/Rename_Record_Box.tscn") - -var _available_dids : Array -var _Bake_Story_As : EditorFileDialog -var _checked_dialogs : Array = [] -var _groups : Array -var _Load_CSV : EditorFileDialog -var _Load_Story : EditorFileDialog -var _record_names : Dictionary -var _Record_Rename_Box -var _Save_CSV_As : EditorFileDialog -var _Save_Story_As : EditorFileDialog -var _story : Dictionary - -#Virtual Methods - -func _ready(): - self._create_rename_box() - self._populate_story_menu() - self._setup_dialogs() - self._Filter_Menu.get_popup().connect("index_pressed", self, "_on_Filter_Menu_index_pressed") - self._Filter_Menu.get_popup().hide_on_checkable_item_selection = false - self._populate_filter_menu() - self._populate_searchby_menu() - -#Callback Methods - -func _on_Add_Group_BTN_pressed(): - self._add_group() - - -func _on_Add_Group_LineEdit_text_entered(new_text): - self._add_group() - - -func _on_Apply_Group_BTN_pressed(): - var id = self._Group_Selector.get_selected_id() - if id == -1: - return - - var idx = self._Group_Selector.get_item_index(id) - var group = self._Group_Selector.get_popup().get_item_text(idx) - for record in self._checked_dialogs.duplicate(): - var did = record.get_did() - self._dialog_apply_group(did, group) - record.uncheck() - self.emit_signal("changed_story") - - -func _on_Bake_Story_As_file_selected(filename : String): - self._bake_data_to(filename) - - -func _on_Bake_Story_BTN_pressed(): - self._Bake_Story_As.popup_centered_ratio(0.7) - - -func _on_Check_All_BTN_pressed(): - var records = self._Dialog_Record_Root.get_children() - for record in records: - if record.visible: - record.check() - - -func _on_Close_BTN_pressed(): - self.emit_signal("close_pressed") - - -func _on_Create_Dialog_BTN_pressed(): - self._create_dialog_record() - - -func _on_Delete_Dialog_BTN_pressed(): - self._delete_checked_dialogs() - - -func _on_Delete_Group_BTN_pressed(): - var idxs = self._Group_List.get_selected_items() - var group - for idx in idxs: - group = self._Group_List.get_item_text(idx) - self._Group_List.remove_item(idx) - self._delete_group(group) - self._populate_group_selector() - self._populate_filter_menu() - - -func _on_Dialog_changed_human_readable_text(did : int, new_text : String): - self.set_dialog_property(did, "human_readable_description", new_text) - self.emit_signal("changed_story") - - -func _on_Dialog_checked(dialog): - self._checked_dialogs.push_front(dialog) - - -func _on_Dialog_edit_pressed(did : int): - self.emit_signal("dialog_edit_pressed", self, did) - - -func _on_Dialog_unchecked(dialog): - self._checked_dialogs.erase(dialog) - - -func _on_Filter_Menu_index_pressed(idx): - var checked = self._Filter_Menu.get_popup().is_item_checked(idx) - if not checked: - self._Filter_Menu.get_popup().set_item_checked(idx, true) - else: - self._Filter_Menu.get_popup().set_item_checked(idx, false) - self._update_filter() - - -func _on_Group_Manager_BTN_toggled(button_pressed : bool): - if button_pressed: - self._Group_Manager_Panel.visible = true - else: - self._Group_Manager_Panel.visible = false - - -func _on_Group_Selector_BTN_pressed(): - self._populate_group_selector() - - -func _on_Load_CSV_BTN_pressed(): - self._Load_CSV.popup_centered_ratio(0.7) - - -func _on_Load_CSV_file_selected(filepath : String): - var csv_file = File.new() - var status = csv_file.open(filepath, File.READ) - - if not status == OK: - print_debug("EXP_Story_Editor: Error loading file \"" + filepath + "\".") - return - - csv_file.get_csv_line() - - while not csv_file.eof_reached(): - var line = csv_file.get_csv_line() - - if line.empty(): - continue - - var did = int(line[0]) - var nid = int(line[1]) - var dialog = String(line[2]) - - if not self._story.has(did): - continue - if not self._story[did]["nodes"].has(nid): - continue - - self._story[did]["nodes"][nid]["text"] = dialog - - csv_file.close() - - -func _on_Load_Story_BTN_pressed(): - self._Load_Story.popup_centered_ratio(0.7) - - -func _on_Load_Story_file_selected(filename : String): - var file_data = load(filename) - if not file_data.TYPE == "EXP_Story_editor": - return - - self._clear_story() - self._load_data_from(file_data) - self._Filename_LBL.text = filename.get_file() - - for group in self._groups: - self._Group_List.add_item(group) - self._populate_filter_menu() - - for did in self.get_dids(): - var new_dialog_record = _Dialog_Record.instance() - self._Dialog_Record_Root.add_child(new_dialog_record) - new_dialog_record.set_story_editor(self) - new_dialog_record.connect("checked", self, "_on_Dialog_checked") - new_dialog_record.connect("unchecked", self, "_on_Dialog_unchecked") - new_dialog_record.connect("changed_human_readable_text", self, - "_on_Dialog_changed_human_readable_text") - new_dialog_record.connect("edit_pressed", self, "_on_Dialog_edit_pressed") - new_dialog_record.connect("rename_pressed", self, "_on_Record_Rename_pressed") - - new_dialog_record.set_did(did) - var human_readable_description = self.get_dialog_property(did, "human_readable_description") - new_dialog_record.update_human_readable_description(human_readable_description) - - if self._story[did].has("name"): - var record_name = self._story[did]["name"] - new_dialog_record.set_record_name(record_name) - - -func _on_New_Story_BTN_pressed(): - self._clear_story() - - -func _on_Record_Rename_pressed(record): - self._Record_Rename_Box.set_target_record(record) - self._Record_Rename_Box.visible = true - - -func _on_Remove_Group_BTN_pressed(): - var id = self._Group_Selector.get_selected_id() - if id == -1: - return - - var idx = self._Group_Selector.get_item_index(id) - var group = self._Group_Selector.get_popup().get_item_text(idx) - for record in self._checked_dialogs.duplicate(): - var did = record.get_did() - self._dialog_remove_group(did, group) - record.uncheck() - self.emit_signal("changed_story") - - -func _on_Rename_Box_Rename(rename : String): - var record = self._Record_Rename_Box.get_target_record() - var old_name = record.get_record_name() - var record_did = record.get_did() - - if rename.empty() or rename == "NAME": - record.set_record_name("NAME") - self._story[record_did].erase("name") - self._record_names.erase(old_name) - return - - if self._record_names.has(rename): - return - - self._record_names.erase(old_name) - - self._record_names[rename] = record_did - self._story[record_did]["name"] = rename - record.set_record_name(rename) - - -func _on_Save_CSV_BTN_pressed(): - self._Save_CSV_As.popup_centered_ratio(0.7) - - -func _on_Save_CVS_As_file_selected(filepath : String): - var csv_file = File.new() - var status = csv_file.open(filepath, File.WRITE) - - if not status == OK: - print_debug("EXP_Story_Editor: Error saving csv file \"" + filepath + "\".") - return - - csv_file.store_csv_line(["DID", "NID", "Dialog"], ",") - - for did in self._story.keys(): - for nid in self._story[did]["nodes"].keys(): - var dialog = self._story[did]["nodes"][nid]["text"] - csv_file.store_csv_line([did, nid, dialog], ",") - - csv_file.close() - - -func _on_Save_Story_As_file_selected(filename : String): - self._save_data_to(filename) - self._Filename_LBL.text = filename.get_file() - - -func _on_Save_Story_BTN_pressed(): - self._Save_Story_As.popup_centered_ratio(0.7) - - -func _on_Search_LineEdit_text_changed(new_text : String): - self._update_filter() - - -func _on_Search_OptionButton_item_selected(id): - self._update_filter() - - -func _on_story_menu_option_pressed(id): - match id: - 0: - self._on_New_Story_BTN_pressed() - 1: - self._on_Load_Story_BTN_pressed() - 2: - self._on_Save_Story_BTN_pressed() - 3: - self._on_Bake_Story_BTN_pressed() - 4: - self._on_Save_CSV_BTN_pressed() - 5: - self._on_Load_CSV_BTN_pressed() - - -func _on_Uncheck_All_BTN_pressed(): - var records = self._Dialog_Record_Root.get_children() - for record in records: - if record.visible: - record.uncheck() - -#Public Methods - -func create_node(did : int, type : String) -> int: - var new_nid = self._generate_nid(did) - var node_data = {"type": type, "text": "", "graph_offset": Vector2(40, 40), - "rect_size": Vector2(0,0) ,"links": {}, "slot_amount": 1} - self._story[did]["nodes"][new_nid] = node_data - return new_nid - -func dialog_get_groups(did : int): - return self._story[did]["groups"] - - -func erase_all_links(did: int, nid : int): - self._story[did]["nodes"][nid]["links"].clear() - - -func erase_dialog(did : int): - self._story.erase(did) - self._make_did_available(did) - - -func erase_link(did : int, nid : int, slot : int): - self._story[did]["nodes"][nid]["links"].erase(slot) - - -func erase_node(did :int, nid :int): - self._story[did]["nodes"].erase(nid) - self._make_nid_available(did, nid) - - -func get_dialog_property(did : int, property: String): - return self._story[did][property] - - -func get_dids(): - return self._story.keys() - - -func get_link_slots(did : int, nid : int): - return self._story[did]["nodes"][nid]["links"].keys() - - -func get_nid_link_from(did : int, nid: int, slot : int): - return self._story[did]["nodes"][nid]["links"][slot] - - -func get_nids(did : int): - return self._story[did]["nodes"].keys() - - -func get_node_property(did : int, nid : int, property: String): - return self._story[did]["nodes"][nid][property] - - -func set_dialog_property(did : int, property : String , data): - self._story[did][property] = data - - -func set_link(did : int, this_nid : int, slot : int, that_nid : int): - self._story[did]["nodes"][this_nid]["links"][slot] = that_nid - - -func set_node_property(did : int, nid : int, property : String , data): - self._story[did]["nodes"][nid][property] = data - - -func set_node_slot_count(did : int, nid : int, amount : int): - self._story[did]["nodes"][nid]["slot_amount"] = amount - -#Private Methods - -func _add_group(): - var new_group_name = self._New_Group_LineEdit.text - if new_group_name == "" or self._groups.has(new_group_name): - return - - self._groups.push_back(new_group_name) - self._New_Group_LineEdit.text = "" - self._Group_List.add_item(new_group_name) - self._populate_filter_menu() - - var sort_list : Array - for idx in range(self._Group_List.get_item_count()): - var group = self._Group_List.get_item_text(idx) - sort_list.push_back(group) - sort_list.sort() - self._Group_List.clear() - for group in sort_list: - self._Group_List.add_item(group) - - -func _bake_data() : - var baked_story = self._story.duplicate(true) - for did in baked_story.keys(): - baked_story[did].erase("name") - baked_story[did].erase("groups") - baked_story[did].erase("available_nid") - baked_story[did].erase("human_readable_description") - for nid in baked_story[did]["nodes"].keys(): - baked_story[did]["nodes"][nid].erase("type") - baked_story[did]["nodes"][nid].erase("graph_offset") - baked_story[did]["nodes"][nid].erase("rect_size") - baked_story[did]["nodes"][nid].erase("slot_amount") - return baked_story.duplicate(true) - - -func _bake_data_to(filename): - var file_data - if self._Dir.file_exists(filename): - file_data = load(filename) - if file_data.TYPE == "EXP_Baked_Story": - file_data.story = self._bake_data() - file_data.names = self._record_names.duplicate(true) - ResourceSaver.save(filename, file_data) - else: - file_data = _EXP_Baked_Story.new() - file_data.story = self._bake_data() - file_data.names = self._record_names.duplicate(true) - ResourceSaver.save(filename, file_data) - - -func _clear_group_manager(): - self._groups.clear() - for idx in range(self._Group_List.get_item_count()): - self._Group_List.remove_item(0) - self._populate_group_selector() - self._Filter_Menu.get_popup().clear() - - -func _clear_story(): - self._remove_all_records() - self._clear_group_manager() - self._populate_filter_menu() - self._story.clear() - self._available_dids.clear() - self._checked_dialogs.clear() - self._record_names.clear() - self._Filename_LBL.text = "Unsaved Story" - self.emit_signal("changed_story") - - -func _create_dialog() -> int: - var new_did = self._generate_did() - var dialog_data = {"human_readable_description": - "New Dialog - Enter Human Readable Description", - "groups": [], - "available_nid": [], - "nodes": {}} - self._story[new_did] = dialog_data - return new_did - - -func _create_dialog_record(): - var new_did = self._create_dialog() - - var new_dialog_record = _Dialog_Record.instance() - self._Dialog_Record_Root.add_child(new_dialog_record) - new_dialog_record.set_story_editor(self) - - new_dialog_record.connect("checked", self, "_on_Dialog_checked") - new_dialog_record.connect("unchecked", self, "_on_Dialog_unchecked") - new_dialog_record.connect("changed_human_readable_text", self, - "_on_Dialog_changed_human_readable_text") - new_dialog_record.connect("edit_pressed", self, "_on_Dialog_edit_pressed") - new_dialog_record.connect("rename_pressed", self, "_on_Record_Rename_pressed") - - new_dialog_record.set_did(new_did) - new_dialog_record.update_human_readable_description( - "New Dialog - Enter Human Readable Description.") - - -func _create_rename_box(): - self._Record_Rename_Box = _Record_Rename_Box_TSCN.instance() - self._Record_Rename_Box.connect("rename_BTN_pressed", self, "_on_Rename_Box_Rename") - self.add_child(self._Record_Rename_Box) - - -func _delete_checked_dialogs(): - for dialog in self._checked_dialogs: - self._delete_dialog(dialog) - self._checked_dialogs.clear() - self.emit_signal("changed_story") - - -func _delete_dialog(dialog): - var did = dialog.get_did() - self.erase_dialog(did) - self._remove_record(dialog) - - -func _delete_group(group): - self._groups.erase(group) - self._remove_group_from_story(group) - - -func _dialog_apply_group(did : int, group : String): - if not self._story[did]["groups"].has(group): - self._story[did]["groups"].push_back(group) - - -func _dialog_remove_group(did : int, group : String): - if self._story[did]["groups"].has(group): - self._story[did]["groups"].erase(group) - - -func _generate_did() -> int: - if not self._available_dids.empty(): - return self._available_dids.pop_front() - else: - return self._story.size() + 1 - - -func _generate_nid(did : int) -> int: - if not self._story[did]["available_nid"].empty(): - return self._story[did]["available_nid"].pop_front() - else: - return self._story[did]["nodes"].size() + 1 - - -func _load_data_from(new_story): - self._story = new_story.story.duplicate(true) - self._available_dids = new_story.available_dids.duplicate(true) - self._groups = new_story.groups.duplicate(true) - self._record_names = new_story.names.duplicate(true) - - - -func _make_did_available(did : int): - self._available_dids.push_front(did) - self._available_dids.sort() - - -func _make_nid_available(did : int, nid : int): - self._story[did]["available_nid"].push_front(nid) - self._story[did]["available_nid"].sort() - - -func _make_records_visible(): - var children = self._Dialog_Record_Root.get_children() - for child in children: - child.visible = true - - -func _populate_filter_menu(): - self._Filter_Menu.get_popup().clear() - self._Filter_Menu.get_popup().add_check_item("-No Tags-") - for group in self._groups: - self._Filter_Menu.get_popup().add_check_item(group) - for idx in range(self._Filter_Menu.get_popup().get_item_count()): - self._Filter_Menu.get_popup().set_item_checked(idx, true) - - -func _populate_group_selector(): - self._Group_Selector.clear() - self._Group_Selector.text = "Tags" - for group in self._groups: - self._Group_Selector.get_popup().add_item(group) - - -func _populate_searchby_menu(): - self._Search_Option_BTN.clear() - self._Search_Option_BTN.get_popup().add_item("Human Readable LBL", 0) - self._Search_Option_BTN.get_popup().add_item("DID", 1) - self._Search_Option_BTN.get_popup().add_item("Record Name", 2) - self._Search_Option_BTN.select(0) - -func _populate_story_menu(): - self._Story_Menu.get_popup().clear() - self._Story_Menu.get_popup().add_item("New Story", 0) - self._Story_Menu.get_popup().add_item("Load Story", 1) - self._Story_Menu.get_popup().add_item("Save Story As", 2) - self._Story_Menu.get_popup().add_item("Bake Story As", 3) - self._Story_Menu.get_popup().add_item("Save CSV As", 4) - self._Story_Menu.get_popup().add_item("Load CSV", 5) - self._Story_Menu.get_popup().connect("id_pressed", self, "_on_story_menu_option_pressed") - - -func _remove_all_records(): - var dialog_records = self._Dialog_Record_Root.get_children() - for record in dialog_records: - self._remove_record(record) - - -func _remove_group_from_story(group : String): - for did in self._story: - if self._story[did]["groups"].has(group): - self._story[did]["groups"].erase(group) - - -func _remove_record(dialog_record): - dialog_record.disconnect("checked", self, "_on_Dialog_checked") - dialog_record.disconnect("unchecked", self, "_on_Dialog_unchecked") - dialog_record.disconnect("changed_human_readable_text", self, - "_on_Dialog_changed_human_readable_text") - dialog_record.disconnect("rename_pressed", self, "_on_Record_Rename_pressed") - var record_name = dialog_record.get_record_name() - if not record_name == "NAME": - self._record_names.erase(record_name) - - dialog_record.free() - - -func _save_data_to(filename): - var file_data - if self._Dir.file_exists(filename): - file_data = load(filename) - if file_data.TYPE == "EXP_Story_editor": - file_data.names = self._record_names.duplicate(true) - file_data.story = self._story.duplicate(true) - file_data.available_dids = self._available_dids.duplicate(true) - file_data.groups = self._groups.duplicate(true) - ResourceSaver.save(filename, file_data) - else: - file_data = _EXP_Story.new() - file_data.names = self._record_names.duplicate(true) - file_data.story = self._story.duplicate(true) - file_data.available_dids = self._available_dids.duplicate(true) - file_data.groups = self._groups.duplicate(true) - ResourceSaver.save(filename, file_data) - - -func _setup_dialogs(): - self._Load_Story = EditorFileDialog.new() - self._Load_Story.mode = EditorFileDialog.MODE_OPEN_FILE - self._Load_Story.add_filter("*.tres ; Story files") - self._Load_Story.resizable = true - self._Load_Story.access = EditorFileDialog.ACCESS_RESOURCES - self._Load_Story.current_dir = "res://" - self._Load_Story.connect("file_selected", self, "_on_Load_Story_file_selected") - self.add_child(self._Load_Story) - - self._Save_Story_As = EditorFileDialog.new() - self._Save_Story_As.mode = EditorFileDialog.MODE_SAVE_FILE - self._Save_Story_As.add_filter("*.tres ; Story files") - self._Save_Story_As.resizable = true - self._Save_Story_As.access = EditorFileDialog.ACCESS_RESOURCES - self._Save_Story_As.current_dir = "res://" - self._Save_Story_As.connect("file_selected", self, "_on_Save_Story_As_file_selected") - self.add_child(self._Save_Story_As) - - self._Bake_Story_As = EditorFileDialog.new() - self._Bake_Story_As.mode = EditorFileDialog.MODE_SAVE_FILE - self._Bake_Story_As.add_filter("*.tres ; Baked Story files") - self._Bake_Story_As.resizable = true - self._Bake_Story_As.access = EditorFileDialog.ACCESS_RESOURCES - self._Bake_Story_As.current_dir = "res://" - self._Bake_Story_As.connect("file_selected", self, "_on_Bake_Story_As_file_selected") - self.add_child(self._Bake_Story_As) - - self._Save_CSV_As = EditorFileDialog.new() - self._Save_CSV_As.mode = EditorFileDialog.MODE_SAVE_FILE - self._Save_CSV_As.add_filter("*.csv ; CSV files") - self._Save_CSV_As.resizable = true - self._Save_CSV_As.access = EditorFileDialog.ACCESS_FILESYSTEM - self._Save_CSV_As.current_dir = "res://" - self._Save_CSV_As.connect("file_selected", self, "_on_Save_CVS_As_file_selected") - self.add_child(self._Save_CSV_As) - - self._Load_CSV = EditorFileDialog.new() - self._Load_CSV .mode = EditorFileDialog.MODE_OPEN_FILE - self._Load_CSV .add_filter("*.csv ; CSV files") - self._Load_CSV .resizable = true - self._Load_CSV .access = EditorFileDialog.ACCESS_FILESYSTEM - self._Load_CSV .current_dir = "res://" - self._Load_CSV .connect("file_selected", self, "_on_Load_CSV_file_selected") - self.add_child(self._Load_CSV) - - -func _update_filter(): - var new_text = self._Search_LineEdit.text - self._make_records_visible() - - var filter_groups : Array - for idx in range(self._Filter_Menu.get_popup().get_item_count()): - if self._Filter_Menu.get_popup().is_item_checked(idx): - var group = self._Filter_Menu.get_popup().get_item_text(idx) - filter_groups.push_back(group) - - var children = self._Dialog_Record_Root.get_children() - - var search_option = self._Search_Option_BTN.selected - - match search_option: - 0: #Human Readable Search - for child in children: - var did = child.get_did() - var human_readable_description = self.get_dialog_property(did, "human_readable_description") - if human_readable_description.find(new_text) == -1 and not new_text.empty(): - child.visible = false - else: - child.visible = false - if self._Filter_Menu.get_popup().get_item_count() == 0: - child.visible = true - var dialog_groups = self.dialog_get_groups(did) - if dialog_groups.empty() and filter_groups.has("-No Tags-"): - child.visible = true - for group in dialog_groups: - if filter_groups.has(group): - child.visible = true - 1: #DID Search - for child in children: - var did = child.get_did() - if not new_text == str(did) and not new_text.empty(): - child.visible = false - else: - child.visible = false - if self._Filter_Menu.get_popup().get_item_count() == 0: - child.visible = true - var dialog_groups = self.dialog_get_groups(did) - if dialog_groups.empty() and filter_groups.has("-No Tags-"): - child.visible = true - for group in dialog_groups: - if filter_groups.has(group): - child.visible = true - 2: #Record Name Search - for child in children: - var did = child.get_did() - var record_name = child.get_record_name() - if record_name.find(new_text) == -1 and not new_text.empty(): - child.visible = false - else: - child.visible = false - if self._Filter_Menu.get_popup().get_item_count() == 0: - child.visible = true - var dialog_groups = self.dialog_get_groups(did) - if dialog_groups.empty() and filter_groups.has("-No Tags-"): - child.visible = true - for group in dialog_groups: - if filter_groups.has(group): - child.visible = true diff --git a/addons/EXP-System-Dialog/plugin.cfg b/addons/EXP-System-Dialog/plugin.cfg deleted file mode 100644 index 0c6b026..0000000 --- a/addons/EXP-System-Dialog/plugin.cfg +++ /dev/null @@ -1,7 +0,0 @@ -[plugin] - -name="EXP_Dialog" -description="EXPWorld's dialog technology." -author="David Lipps @ EXPWorlds" -version="1.1.0" -script="plugin.gd" diff --git a/addons/EXP-System-Dialog/plugin.gd b/addons/EXP-System-Dialog/plugin.gd deleted file mode 100644 index 5df9e39..0000000 --- a/addons/EXP-System-Dialog/plugin.gd +++ /dev/null @@ -1,87 +0,0 @@ -tool -extends EditorPlugin - -var _Story_Editor = preload("res://addons/EXP-System-Dialog/Story Editor/Story_Editor.tscn") -var _Story_Editor_Instance -var _Story_Editor_BTN : ToolButton -var _Dialog_Editor = preload("res://addons/EXP-System-Dialog/Dialog Editor/Dialog_Editor.tscn") -var _Dialog_Editor_Instance -var _Dialog_Editor_BTN : ToolButton - - -func _enter_tree(): - - self._Story_Editor_Instance = self._Story_Editor.instance() - self._Story_Editor_Instance.connect("close_pressed", self, "_on_StoryFile_Editor_close_pressed") - self._Story_Editor_BTN = self.add_control_to_bottom_panel(self._Story_Editor_Instance, "EXP StoryFile Editor") - self._Story_Editor_Instance.visible = false - self._Story_Editor_BTN.visible = false - self.add_tool_menu_item("EXP StoryFile Editor", self, "_on_StoryFile_Editor_opened") - - self._Dialog_Editor_Instance = self._Dialog_Editor.instance() - self._Dialog_Editor_BTN = self.add_control_to_bottom_panel(self._Dialog_Editor_Instance, "EXP Dialog Editor") - self._Dialog_Editor_BTN.visible = false - - self._Story_Editor_Instance.connect("dialog_edit_pressed", - self, "_on_Story_Editor_dialog_edit_pressed") - self._Story_Editor_Instance.connect("dialog_edit_pressed", - self._Dialog_Editor_Instance, "_on_Story_Editor_dialog_edit_pressed") - self._Dialog_Editor_Instance.connect("close_BTN_pressed", self, - "_on_Dialog_Editor_close_BTN_pressed") - self._Dialog_Editor_Instance.connect("back_BTN_pressed", self, - "_on_Dialog_Editor_back_BTN_pressed") - self._Story_Editor_Instance.connect("changed_story", self, - "_on_Story_Editor_changed_story") - - -func _exit_tree(): - - self._Story_Editor_Instance.disconnect("dialog_edit_pressed", - self, "_on_Story_Editor_dialog_edit_pressed") - self._Story_Editor_Instance.disconnect("dialog_edit_pressed", - self._Dialog_Editor_Instance, "_on_Story_Editor_dialog_edit_pressed") - self._Dialog_Editor_Instance.disconnect("close_BTN_pressed", self, - "_on_Dialog_Editor_close_BTN_pressed") - self._Dialog_Editor_Instance.disconnect("back_BTN_pressed", self, - "_on_Dialog_Editor_back_BTN_pressed") - self._Story_Editor_Instance.disconnect("changed_story", self, - "_on_Story_Editor_changed_story") - - self.remove_control_from_bottom_panel(self._Story_Editor_Instance) - self._Story_Editor_Instance.queue_free() - self.remove_control_from_bottom_panel(self._Dialog_Editor_Instance) - self._Dialog_Editor_Instance.queue_free() - self.remove_tool_menu_item("EXP StoryFile Editor") - - -func _on_Story_Editor_dialog_edit_pressed(story, did): - self._Dialog_Editor_BTN.visible = true - self._Story_Editor_BTN.pressed = false - self._Dialog_Editor_BTN.pressed = true - self._Dialog_Editor_BTN.emit_signal("pressed") - - -func _on_Dialog_Editor_close_BTN_pressed(): - self._Dialog_Editor_BTN.pressed = false - self._Dialog_Editor_BTN.visible = false - - -func _on_Story_Editor_changed_story(): - self._Dialog_Editor_BTN.visible = false - - -func _on_Dialog_Editor_back_BTN_pressed(): - self._Story_Editor_BTN.pressed = true - self._Dialog_Editor_BTN.pressed = false - self._Story_Editor_BTN.emit_signal("pressed") - - -func _on_StoryFile_Editor_opened(trash_parameter): - self._Story_Editor_BTN.visible = true - - -func _on_StoryFile_Editor_close_pressed(): - self._Story_Editor_Instance.visible = false - self._Story_Editor_BTN.visible = false - self._Dialog_Editor_Instance.visible = false - self._Dialog_Editor_BTN.visible = false diff --git a/addons/dialogic/Editor/CharacterEditor/CharacterEditor.gd b/addons/dialogic/Editor/CharacterEditor/CharacterEditor.gd index 1ff9424..3cfe405 100644 --- a/addons/dialogic/Editor/CharacterEditor/CharacterEditor.gd +++ b/addons/dialogic/Editor/CharacterEditor/CharacterEditor.gd @@ -71,15 +71,7 @@ func create_character(): 'default_speaker': false, 'portraits': [] } - var directory = Directory.new() - if not directory.dir_exists(DialogicUtil.get_path('WORKING_DIR')): - directory.make_dir(DialogicUtil.get_path('WORKING_DIR')) - if not directory.dir_exists(DialogicUtil.get_path('CHAR_DIR')): - directory.make_dir(DialogicUtil.get_path('CHAR_DIR')) - var file = File.new() - file.open(DialogicUtil.get_path('CHAR_DIR', character_file), File.WRITE) - file.store_line(to_json(character)) - file.close() + DialogicResources.set_character(character) character['metadata'] = {'file': character_file} return character @@ -118,19 +110,16 @@ func generate_character_data_to_save(): func save_character(): - var path = DialogicUtil.get_path('CHAR_DIR', nodes['file'].text) var info_to_save = generate_character_data_to_save() if info_to_save['id']: - var file = File.new() - file.open(path, File.WRITE) - file.store_line(to_json(info_to_save)) - file.close() + DialogicResources.set_character(info_to_save) opened_character_data = info_to_save -func load_character(path): - var data = DialogicUtil.load_json(path) + +func load_character(filename: String): clear_character_editor() + var data = DialogicResources.get_character_json(filename) opened_character_data = data nodes['file'].text = data['id'] nodes['default_speaker'].pressed = false diff --git a/addons/dialogic/Editor/CharacterEditor/PortraitEntry.gd b/addons/dialogic/Editor/CharacterEditor/PortraitEntry.gd index 19ccc0e..2f3c48a 100644 --- a/addons/dialogic/Editor/CharacterEditor/PortraitEntry.gd +++ b/addons/dialogic/Editor/CharacterEditor/PortraitEntry.gd @@ -29,7 +29,7 @@ func _on_file_selected(path, target): update_preview(path) $PathEdit.text = path if $NameEdit.text == '': - $NameEdit.text = DialogicUtil.get_filename_from_path(path) + $NameEdit.text = DialogicResources.get_filename_from_path(path) func _on_focus_entered(): diff --git a/addons/dialogic/Editor/DefinitionEditor/DefinitionEditor.gd b/addons/dialogic/Editor/DefinitionEditor/DefinitionEditor.gd index 2714783..ff3190a 100644 --- a/addons/dialogic/Editor/DefinitionEditor/DefinitionEditor.gd +++ b/addons/dialogic/Editor/DefinitionEditor/DefinitionEditor.gd @@ -70,43 +70,23 @@ func show_sub_editor(type): nodes['extra_editor'].visible = true -func get_definition(key, default): +func get_definition(key: String, default): if current_section != '': - var config = ConfigFile.new() - config.load(DialogicUtil.get_path('DEFINITIONS_FILE')) - if config.has_section(current_section): - return config.get_value(current_section, key, default) + return DialogicResources.get_default_definition_key(current_section, key, default) else: return default func new_definition(): - var config = ConfigFile.new() var section = DialogicUtil.generate_random_id() - var err = config.load(DialogicUtil.get_path('DEFINITIONS_FILE')) - if err == OK: - config.set_value(section, 'name', 'New definition') - config.set_value(section, 'type', 0) - config.set_value(section, 'value', '') - config.save(DialogicUtil.get_path('DEFINITIONS_FILE')) - master_tree.add_definition({'section': section,'name': 'New definition', 'type': 0}, true) - else: - print('Error loading definitions') + DialogicResources.add_default_definition_variable(section, 'New definition', 0, '') + master_tree.add_definition({'section': section,'name': 'New definition', 'type': 0}, true) func save_definition(): if current_section != '': - var config = ConfigFile.new() - var err = config.load(DialogicUtil.get_path('DEFINITIONS_FILE')) - if err == OK: - config.set_value(current_section, 'name', nodes['name'].text) - var type = nodes['type'].selected - config.set_value(current_section, 'type', type) - if type == 0: - config.set_value(current_section, 'value', nodes['value'].text) - if type == 1: - config.set_value(current_section, 'extra_title', nodes['extra_title'].text) - config.set_value(current_section, 'extra_text', nodes['extra_text'].text) - config.set_value(current_section, 'extra_extra', nodes['extra_extra'].text) - - config.save(DialogicUtil.get_path('DEFINITIONS_FILE')) + var type: int = nodes['type'].selected + if type == 0: + DialogicResources.set_default_definition_variable(current_section, nodes['name'].text, nodes['value'].text) + if type == 1: + DialogicResources.set_default_definition_glossary(current_section, nodes['name'].text, nodes['extra_title'].text, nodes['extra_text'].text, nodes['extra_extra'].text) diff --git a/addons/dialogic/Editor/EditorView.gd b/addons/dialogic/Editor/EditorView.gd index 4719044..08aa949 100644 --- a/addons/dialogic/Editor/EditorView.gd +++ b/addons/dialogic/Editor/EditorView.gd @@ -1,7 +1,6 @@ tool extends Control -var plugin_reference var debug_mode: bool = true # For printing info var editor_file_dialog # EditorFileDialog var file_picker_data: Dictionary = {'method': '', 'node': self} @@ -59,7 +58,7 @@ func _ready(): # Timeline context menu func _on_TimelinePopupMenu_id_pressed(id): if id == 0: # View files - OS.shell_open(ProjectSettings.globalize_path(DialogicUtil.get_path('TIMELINE_DIR'))) + OS.shell_open(ProjectSettings.globalize_path(DialogicResources.get_path('TIMELINE_DIR'))) if id == 1: # Copy to clipboard OS.set_clipboard($MainPanel/TimelineEditor.timeline_name) if id == 2: # Remove @@ -78,7 +77,7 @@ func _on_RemoveTimelineConfirmation_confirmed(): # Character context menu func _on_CharacterPopupMenu_id_pressed(id): if id == 0: - OS.shell_open(ProjectSettings.globalize_path(DialogicUtil.get_path('CHAR_DIR'))) + OS.shell_open(ProjectSettings.globalize_path(DialogicResources.get_path('CHAR_DIR'))) if id == 1: $RemoveCharacterConfirmation.popup_centered() @@ -86,7 +85,7 @@ func _on_CharacterPopupMenu_id_pressed(id): # Theme context menu func _on_ThemePopupMenu_id_pressed(id): if id == 0: - OS.shell_open(ProjectSettings.globalize_path(DialogicUtil.get_path('THEME_DIR'))) + OS.shell_open(ProjectSettings.globalize_path(DialogicResources.get_path('THEME_DIR'))) if id == 1: $RemoveThemeConfirmation.popup_centered() @@ -94,38 +93,28 @@ func _on_ThemePopupMenu_id_pressed(id): # Definition context menu func _on_DefinitionPopupMenu_id_pressed(id): if id == 0: - OS.shell_open(ProjectSettings.globalize_path(DialogicUtil.get_path('DEFINITIONS_FILE'))) + OS.shell_open(ProjectSettings.globalize_path(DialogicResources.get_path('DEFAULT_DEFINITIONS_FILE'))) if id == 1: $RemoveDefinitionConfirmation.popup_centered() func _on_RemoveDefinitionConfirmation_confirmed(): var target = $MainPanel/DefinitionEditor.current_section - var config = ConfigFile.new() - var err = config.load(DialogicUtil.get_path('DEFINITIONS_FILE')) - if err == OK: - config.erase_section(target) - config.save(DialogicUtil.get_path('DEFINITIONS_FILE')) - $MainPanel/MasterTree.remove_selected() - $MainPanel/MasterTree.hide_all_editors(true) - else: - print('Error loading definitions') + DialogicResources.delete_default_definition(target) + $MainPanel/MasterTree.remove_selected() + $MainPanel/MasterTree.hide_all_editors(true) func _on_RemoveCharacterConfirmation_confirmed(): - var dir = Directory.new() - print($MainPanel/CharacterEditor.opened_character_data) - var target = DialogicUtil.get_path('CHAR_DIR', $MainPanel/CharacterEditor.opened_character_data['id']) - dir.remove(target) + var filename = DialogicResources.get_path('CHAR_DIR', $MainPanel/CharacterEditor.opened_character_data['id']) + DialogicResources.delete_character(filename) $MainPanel/MasterTree.remove_selected() $MainPanel/MasterTree.hide_all_editors(true) func _on_RemoveThemeConfirmation_confirmed(): - var dir = Directory.new() - var filepath = $MainPanel/MasterTree.get_selected().get_metadata(0)['file'] - var target = DialogicUtil.get_path('THEME_DIR', filepath) - dir.remove(target) + var filename = $MainPanel/MasterTree.get_selected().get_metadata(0)['file'] + DialogicResources.delete_timeline(filename) $MainPanel/MasterTree.remove_selected() $MainPanel/MasterTree.hide_all_editors(true) diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd index b0f2453..509c222 100644 --- a/addons/dialogic/Editor/MasterTree/MasterTree.gd +++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -69,7 +69,7 @@ func _ready(): add_character(c) # Adding Definitions - for d in DialogicUtil.get_definition_list(): + for d in DialogicUtil.get_default_definition_list(): add_definition(d) # Adding Themes @@ -149,10 +149,10 @@ func _on_item_selected(): hide_all_editors() if metadata['editor'] == 'Timeline': timeline_editor.visible = true - timeline_editor.load_timeline(DialogicUtil.get_path('TIMELINE_DIR', metadata['file'])) + timeline_editor.load_timeline(metadata['file']) if metadata['editor'] == 'Character': character_editor.visible = true - character_editor.load_character(DialogicUtil.get_path('CHAR_DIR', metadata['file'])) + character_editor.load_character(metadata['file']) if metadata['editor'] == 'Definition': definition_editor.visible = true definition_editor.load_definition(metadata['section']) @@ -221,7 +221,7 @@ func _on_item_edited(): if metadata['editor'] == 'Timeline': timeline_editor.timeline_name = item.get_text(0) if metadata['editor'] == 'Theme': - DialogicUtil.set_theme_value(metadata['file'], 'settings', 'name', item.get_text(0)) + DialogicResources.set_theme_value(metadata['file'], 'settings', 'name', item.get_text(0)) if metadata['editor'] == 'Character': character_editor.nodes['name'].text = item.get_text(0) if metadata['editor'] == 'Definition': diff --git a/addons/dialogic/Editor/Pieces/ChangeTimeline.gd b/addons/dialogic/Editor/Pieces/ChangeTimeline.gd index 140009b..a6b8638 100644 --- a/addons/dialogic/Editor/Pieces/ChangeTimeline.gd +++ b/addons/dialogic/Editor/Pieces/ChangeTimeline.gd @@ -28,10 +28,7 @@ func _on_MenuButton_about_to_show(): Dropdown.get_popup().clear() var index = 0 for c in DialogicUtil.get_timeline_list(): - if c['file'].replace('.json', '') == DialogicUtil.get_filename_from_path(editor_reference.get_node('MainPanel/TimelineEditor').working_timeline_file): - Dropdown.get_popup().add_item('(Current) ' + c['name']) - else: - Dropdown.get_popup().add_item(c['name']) + Dropdown.get_popup().add_item(c['name']) Dropdown.get_popup().set_item_metadata(index, {'file': c['file'], 'color': c['color']}) index += 1 diff --git a/addons/dialogic/Editor/Pieces/CharacterJoinBlock.gd b/addons/dialogic/Editor/Pieces/CharacterJoinBlock.gd index cddaa7b..e629e8d 100644 --- a/addons/dialogic/Editor/Pieces/CharacterJoinBlock.gd +++ b/addons/dialogic/Editor/Pieces/CharacterJoinBlock.gd @@ -78,7 +78,7 @@ func check_active_position(active_color = Color("#ffffff")): func load_data(data): event_data = data if data['character'] != '': - var character_data = DialogicUtil.load_json(DialogicUtil.get_path('CHAR_DIR', data['character'])) + var character_data = DialogicResources.get_character_json(data['character']) $PanelContainer/VBoxContainer/Header/CharacterPicker.set_data(character_data['name'], Color(character_data['color'])) portrait_picker.set_character(data['character'], data['portrait']) current_color = Color(character_data['color']) diff --git a/addons/dialogic/Editor/Pieces/CharacterLeaveBlock.gd b/addons/dialogic/Editor/Pieces/CharacterLeaveBlock.gd index 5446fc1..d5b8412 100644 --- a/addons/dialogic/Editor/Pieces/CharacterLeaveBlock.gd +++ b/addons/dialogic/Editor/Pieces/CharacterLeaveBlock.gd @@ -37,6 +37,6 @@ func load_data(data): event_data = data if data['character'] != '[All]': if data['character'] != '': - var character_data = DialogicUtil.load_json(DialogicUtil.get_path('CHAR_DIR', data['character'])) + var character_data = DialogicResources.get_character_json(data['character']) if character_data.has('name'): $PanelContainer/VBoxContainer/Header/CharacterDropdown.text = character_data['name'] diff --git a/addons/dialogic/Editor/Pieces/Common/CharacterPicker.gd b/addons/dialogic/Editor/Pieces/Common/CharacterPicker.gd index 13287c9..d6c5be9 100644 --- a/addons/dialogic/Editor/Pieces/Common/CharacterPicker.gd +++ b/addons/dialogic/Editor/Pieces/Common/CharacterPicker.gd @@ -37,7 +37,7 @@ func _on_character_selected(index: int): func set_data_by_file(file_name): # This method is used when you don't know the character's color - var character = DialogicUtil.load_json(DialogicUtil.get_path('CHAR_DIR', file_name)) + var character = DialogicResources.get_character_json(file_name) set_data(character['name'], Color(character['color'])) diff --git a/addons/dialogic/Editor/Pieces/Common/ConditionPicker.gd b/addons/dialogic/Editor/Pieces/Common/ConditionPicker.gd new file mode 100644 index 0000000..d8df8f4 --- /dev/null +++ b/addons/dialogic/Editor/Pieces/Common/ConditionPicker.gd @@ -0,0 +1,58 @@ +tool +extends MenuButton + +var options = [ + { + "text": "[ Equal to ]", + "condition": "==" + }, + { + "text": "[ Different from ]", + "condition": "!=" + }, + { + "text": "[ Greater than ]", + "condition": ">" + }, + { + "text": "[ Greater or equal to ]", + "condition": ">=" + }, + { + "text": "[ Less than ]", + "condition": "<" + }, + { + "text": "[ Less or equal to ]", + "condition": "<=" + } +] + +func _ready(): + get_popup().connect("index_pressed", self, '_on_entry_selected') + get_popup().clear() + connect("about_to_show", self, "_on_MenuButton_about_to_show") + + +func _on_MenuButton_about_to_show(): + get_popup().clear() + var index = 0 + for o in options: + get_popup().add_item(o['text']) + get_popup().set_item_metadata(index, o) + index += 1 + + +func _on_entry_selected(index): + var _text = get_popup().get_item_text(index) + var metadata = get_popup().get_item_metadata(index) + text = _text + + +func load_condition(condition): + if condition != '': + for o in options: + if (o['condition'] == condition): + text = o['text'] + else: + text = options[0]['text'] diff --git a/addons/dialogic/Editor/Pieces/Common/ConditionPicker.tscn b/addons/dialogic/Editor/Pieces/Common/ConditionPicker.tscn new file mode 100644 index 0000000..6bbd160 --- /dev/null +++ b/addons/dialogic/Editor/Pieces/Common/ConditionPicker.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/ConditionPicker.gd" type="Script" id=1] + +[node name="ConditionPicker" type="MenuButton"] +margin_left = 173.0 +margin_right = 252.0 +margin_bottom = 28.0 +text = "[ Equal to ]" +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/addons/dialogic/Editor/Pieces/Common/DefinitionPicker.gd b/addons/dialogic/Editor/Pieces/Common/DefinitionPicker.gd index 04f3c82..b3c9090 100644 --- a/addons/dialogic/Editor/Pieces/Common/DefinitionPicker.gd +++ b/addons/dialogic/Editor/Pieces/Common/DefinitionPicker.gd @@ -12,7 +12,7 @@ func _ready(): func _on_MenuButton_about_to_show(): get_popup().clear() var index = 0 - for d in DialogicUtil.get_definition_list(): + for d in DialogicUtil.get_default_definition_list(): if d['type'] == 0: get_popup().add_item(d['name']) get_popup().set_item_metadata(index, { @@ -29,7 +29,7 @@ func _on_entry_selected(index): func load_definition(section): if section != '': - for d in DialogicUtil.get_definition_list(): + for d in DialogicUtil.get_default_definition_list(): if d['section'] == section: text = d['name'] else: diff --git a/addons/dialogic/Editor/Pieces/Common/DragController.gd b/addons/dialogic/Editor/Pieces/Common/DragController.gd index 41e9e1e..b918fb2 100644 --- a/addons/dialogic/Editor/Pieces/Common/DragController.gd +++ b/addons/dialogic/Editor/Pieces/Common/DragController.gd @@ -2,10 +2,12 @@ tool extends Control var moving +var hover = false func _ready(): get_parent().connect("gui_input", self, '_on_gui_input') - + get_parent().connect("mouse_entered", self, '_on_mouse_entered') + get_parent().connect("mouse_exited", self, '_on_mouse_exited') func _process(delta): if moving: @@ -17,6 +19,18 @@ func _process(delta): get_parent().get_node("PanelContainer/VBoxContainer/Header/OptionButton")._on_OptionSelected(0) if current_position.y > node_position + height: get_parent().get_node("PanelContainer/VBoxContainer/Header/OptionButton")._on_OptionSelected(1) + + # TODO: I have to figure out a way to modify only an instance's theme. + # This code modifies the custom theme of all the same kind of scenes. + + #if hover: + # get_parent().get_node("PanelContainer").self_modulate = Color("#dd42ff") + # var panel = get_parent().get_node("PanelContainer").get('custom_styles/panel') + # panel.set('border_color', '#ffffff') + #else: + # get_parent().get_node("PanelContainer").self_modulate = Color("#ffffff") + # var panel = get_parent().get_node("PanelContainer").get('custom_styles/panel') + # panel.set('border_color', '#202020') func _on_gui_input(event): @@ -25,3 +39,11 @@ func _on_gui_input(event): moving = false else: moving = true + + +func _on_mouse_entered(): + hover = true + + +func _on_mouse_exited(): + hover = false diff --git a/addons/dialogic/Editor/Pieces/IfCondition.gd b/addons/dialogic/Editor/Pieces/IfCondition.gd index f8fe91c..825d01b 100644 --- a/addons/dialogic/Editor/Pieces/IfCondition.gd +++ b/addons/dialogic/Editor/Pieces/IfCondition.gd @@ -7,17 +7,19 @@ var editorPopup # This is the information of this event and it will get parsed and saved to the JSON file. var event_data = { - 'condition': '', + 'condition': '==', 'definition': '', 'value': '' } onready var nodes = { 'definition_picker': $PanelContainer/VBoxContainer/Header/DefinitionPicker, + 'condition_picker': $PanelContainer/VBoxContainer/Header/ConditionPicker, } func _ready(): nodes['definition_picker'].get_popup().connect("index_pressed", self, '_on_definition_entry_selected') + nodes['condition_picker'].get_popup().connect("index_pressed", self, '_on_condition_entry_selected') $PanelContainer/VBoxContainer/Header/CustomLineEdit.connect("text_changed", self, '_on_text_changed') @@ -29,8 +31,14 @@ func load_data(data): event_data = data $PanelContainer/VBoxContainer/Header/CustomLineEdit.text = event_data['value'] nodes['definition_picker'].load_definition(data['definition']) + nodes['condition_picker'].load_condition(data['condition']) func _on_definition_entry_selected(index): var metadata = nodes['definition_picker'].get_popup().get_item_metadata(index) event_data['definition'] = metadata['section'] + + +func _on_condition_entry_selected(index): + var metadata = nodes['condition_picker'].get_popup().get_item_metadata(index) + event_data['condition'] = metadata['condition'] diff --git a/addons/dialogic/Editor/Pieces/IfCondition.tscn b/addons/dialogic/Editor/Pieces/IfCondition.tscn index 68c94e4..7e06c45 100644 --- a/addons/dialogic/Editor/Pieces/IfCondition.tscn +++ b/addons/dialogic/Editor/Pieces/IfCondition.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=8 format=2] +[gd_scene load_steps=9 format=2] [ext_resource path="res://addons/dialogic/Images/condition.svg" type="Texture" id=1] [ext_resource path="res://addons/dialogic/Editor/Pieces/IfCondition.gd" type="Script" id=2] +[ext_resource path="res://addons/dialogic/Editor/Pieces/Common/ConditionPicker.tscn" type="PackedScene" id=3] [ext_resource path="res://addons/dialogic/Editor/Pieces/Common/PieceExtraSettings.tscn" type="PackedScene" id=4] [ext_resource path="res://addons/dialogic/Editor/Pieces/Common/DragController.tscn" type="PackedScene" id=5] [ext_resource path="res://addons/dialogic/Editor/Pieces/Common/CustomLineEdit.tscn" type="PackedScene" id=6] @@ -70,11 +71,7 @@ margin_left = 26.0 margin_right = 169.0 margin_bottom = 28.0 -[node name="MenuButton2" type="MenuButton" parent="PanelContainer/VBoxContainer/Header"] -margin_left = 173.0 -margin_right = 252.0 -margin_bottom = 28.0 -text = "[ Equal to ]" +[node name="ConditionPicker" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 3 )] [node name="CustomLineEdit" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 6 )] margin_left = 256.0 diff --git a/addons/dialogic/Editor/SettingsEditor/SettingsEditor.gd b/addons/dialogic/Editor/SettingsEditor/SettingsEditor.gd index dea4abc..c0fc317 100644 --- a/addons/dialogic/Editor/SettingsEditor/SettingsEditor.gd +++ b/addons/dialogic/Editor/SettingsEditor/SettingsEditor.gd @@ -17,7 +17,7 @@ func _ready(): func update_data(): - var settings = DialogicUtil.get_settings() + var settings = DialogicResources.get_settings_config() refresh_themes(settings) dialog_options(settings) @@ -71,9 +71,4 @@ func _on_auto_color_names_toggled(value): # Reading and saving data to the settings file func set_value(section, key, value): - var config = ConfigFile.new() - var file = DialogicUtil.get_path('SETTINGS_FILE') - var err = config.load(file) - if err == OK: - config.set_value(section, key, value) - config.save(file) + DialogicResources.set_settings_value(section, key, value) diff --git a/addons/dialogic/Editor/ThemeEditor/ThemeEditor.gd b/addons/dialogic/Editor/ThemeEditor/ThemeEditor.gd index e2a1c7e..4dda6bf 100644 --- a/addons/dialogic/Editor/ThemeEditor/ThemeEditor.gd +++ b/addons/dialogic/Editor/ThemeEditor/ThemeEditor.gd @@ -62,16 +62,16 @@ func _ready(): func load_theme(filename): current_theme = filename - var theme = DialogicUtil.get_theme(filename) + var theme = DialogicResources.get_theme_config(filename) # Settings n['theme_action_key'].text = theme.get_value('settings', 'action_key', 'ui_accept') # Background - n['theme_background_image'].text = DialogicUtil.get_filename_from_path(theme.get_value('background', 'image', 'res://addons/dialogic/Images/background/background-2.png')) + n['theme_background_image'].text = DialogicResources.get_filename_from_path(theme.get_value('background', 'image', 'res://addons/dialogic/Images/background/background-2.png')) n['background_texture_button_visible'].pressed = theme.get_value('background', 'use_image', true) n['theme_background_color'].color = Color(theme.get_value('background', 'color', '#ff000000')) n['theme_background_color_visible'].pressed = theme.get_value('background', 'use_color', false) - n['theme_next_image'].text = DialogicUtil.get_filename_from_path(theme.get_value('next_indicator', 'image', 'res://addons/dialogic/Images/next-indicator.png')) + n['theme_next_image'].text = DialogicResources.get_filename_from_path(theme.get_value('next_indicator', 'image', 'res://addons/dialogic/Images/next-indicator.png')) var size_value = theme.get_value('box', 'size', Vector2(910, 167)) n['size_w'].value = size_value.x @@ -84,7 +84,7 @@ func load_theme(filename): n['button_text_color'].color = Color(theme.get_value('buttons', 'text_color', "#ffffffff")) n['button_background'].color = Color(theme.get_value('buttons', 'background_color', "#ff000000")) n['button_background_visible'].pressed = theme.get_value('buttons', 'use_background_color', false) - n['button_image'].text = DialogicUtil.get_filename_from_path(theme.get_value('buttons', 'image', 'res://addons/dialogic/Images/background/background-2.png')) + n['button_image'].text = DialogicResources.get_filename_from_path(theme.get_value('buttons', 'image', 'res://addons/dialogic/Images/background/background-2.png')) n['button_image_visible'].pressed = theme.get_value('buttons', 'use_image', true) n['button_offset_x'].value = theme.get_value('buttons', 'padding', Vector2(5,5)).x n['button_offset_y'].value = theme.get_value('buttons', 'padding', Vector2(5,5)).y @@ -92,11 +92,11 @@ func load_theme(filename): # Definitions n['glossary_color'].color = Color(theme.get_value('definitions', 'color', "#ffffffff")) - n['glossary_font'].text = DialogicUtil.get_filename_from_path(theme.get_value('definitions', 'font', "res://addons/dialogic/Fonts/GlossaryFont.tres")) + n['glossary_font'].text = DialogicResources.get_filename_from_path(theme.get_value('definitions', 'font', "res://addons/dialogic/Fonts/GlossaryFont.tres")) # Text n['theme_text_speed'].value = theme.get_value('text','speed', 2) - n['theme_font'].text = DialogicUtil.get_filename_from_path(theme.get_value('text', 'font', 'res://addons/dialogic/Fonts/DefaultFont.tres')) + n['theme_font'].text = DialogicResources.get_filename_from_path(theme.get_value('text', 'font', 'res://addons/dialogic/Fonts/DefaultFont.tres')) n['theme_text_color'].color = Color(theme.get_value('text', 'color', '#ffffffff')) n['theme_text_shadow'].pressed = theme.get_value('text', 'shadow', false) n['theme_text_shadow_color'].color = Color(theme.get_value('text', 'shadow_color', '#9e000000')) @@ -112,11 +112,14 @@ func load_theme(filename): n['alignment'].select(1) 'Right': n['alignment'].select(2) - + + # Preview text + n['text_preview'].text = theme.get_value('text', 'preview', 'This is preview text. You can use [color=#A5EFAC]BBCode[/color] to style it.\n[wave amp=50 freq=2]You can even use effects![/wave]') + func new_theme(): var theme_file = 'theme-' + str(OS.get_unix_time()) + '.cfg' - DialogicUtil.create_empty_file(DialogicUtil.get_path('THEME_DIR', theme_file)) + DialogicResources.add_theme(theme_file) master_tree.add_theme({'file': theme_file, 'name': theme_file}) load_theme(theme_file) # Check if it is the only theme to set as default @@ -131,8 +134,8 @@ func _on_BackgroundTextureButton_pressed(): func _on_background_selected(path, target): - DialogicUtil.set_theme_value(current_theme, 'background','image', path) - n['theme_background_image'].text = DialogicUtil.get_filename_from_path(path) + DialogicResources.set_theme_value(current_theme, 'background','image', path) + n['theme_background_image'].text = DialogicResources.get_filename_from_path(path) func _on_NextIndicatorButton_pressed(): @@ -141,24 +144,24 @@ func _on_NextIndicatorButton_pressed(): func _on_indicator_selected(path, target): - DialogicUtil.set_theme_value(current_theme, 'next_indicator','image', path) - n['theme_next_image'].text = DialogicUtil.get_filename_from_path(path) + DialogicResources.set_theme_value(current_theme, 'next_indicator','image', path) + n['theme_next_image'].text = DialogicResources.get_filename_from_path(path) func _on_ColorPickerButton_color_changed(color): - DialogicUtil.set_theme_value(current_theme, 'text','color', '#' + color.to_html()) + DialogicResources.set_theme_value(current_theme, 'text','color', '#' + color.to_html()) func _on_ColorPickerButtonShadow_color_changed(color): - DialogicUtil.set_theme_value(current_theme, 'text','shadow_color', '#' + color.to_html()) + DialogicResources.set_theme_value(current_theme, 'text','shadow_color', '#' + color.to_html()) func _on_CheckBoxShadow_toggled(button_pressed): - DialogicUtil.set_theme_value(current_theme, 'text','shadow', button_pressed) + DialogicResources.set_theme_value(current_theme, 'text','shadow', button_pressed) func _on_ShadowOffset_value_changed(_value): - DialogicUtil.set_theme_value(current_theme, 'text','shadow_offset', Vector2(n['theme_shadow_offset_x'].value,n['theme_shadow_offset_y'].value)) + DialogicResources.set_theme_value(current_theme, 'text','shadow_offset', Vector2(n['theme_shadow_offset_x'].value,n['theme_shadow_offset_y'].value)) func _on_PreviewButton_pressed(): @@ -172,24 +175,24 @@ func _on_PreviewButton_pressed(): preview_dialog.dialog_script['events'] = [{ "character":"", "portrait":"", - "text": n['text_preview'].text + "text": preview_dialog.parse_definitions(n['text_preview'].text) }] # Settings - preview_dialog.settings = DialogicUtil.get_settings() + preview_dialog.settings = DialogicResources.get_settings_config() # Alignment - preview_dialog.dialog_script = preview_dialog.parse_definitions(preview_dialog.dialog_script) - preview_dialog.dialog_script = preview_dialog.parse_text_lines(preview_dialog.dialog_script) n['preview_panel'].add_child(preview_dialog) # Not sure why but I need to reload the theme again for it to work properly - preview_dialog.current_theme = preview_dialog.load_theme(current_theme) preview_dialog.load_dialog() + preview_dialog.current_theme = preview_dialog.load_theme(current_theme) # maintaining the preview panel big enough for the dialog box + n['preview_panel'].rect_min_size.y = preview_dialog.current_theme.get_value('box', 'size', Vector2(910, 167)).y + 90 + preview_dialog.current_theme.get_value('box', 'bottom_gap', 40) - n['preview_panel'].rect_size = Vector2(0,0) + n['preview_panel'].rect_size.y = 0 + func _on_ActionOptionButton_item_selected(index): - DialogicUtil.set_theme_value(current_theme, 'settings','action_key', n['theme_action_key'].text) + DialogicResources.set_theme_value(current_theme, 'settings','action_key', n['theme_action_key'].text) func _on_ActionOptionButton_pressed(): @@ -206,12 +209,12 @@ func _on_FontButton_pressed(): func _on_Font_selected(path, target): - DialogicUtil.set_theme_value(current_theme, 'text','font', path) - n['theme_font'].text = DialogicUtil.get_filename_from_path(path) + DialogicResources.set_theme_value(current_theme, 'text','font', path) + n['theme_font'].text = DialogicResources.get_filename_from_path(path) func _on_textSpeed_value_changed(value): - DialogicUtil.set_theme_value(current_theme, 'text','speed', value) + DialogicResources.set_theme_value(current_theme, 'text','speed', value) func _on_TextMargin_value_changed(value): @@ -219,27 +222,27 @@ func _on_TextMargin_value_changed(value): n['theme_text_margin'].value, n['theme_text_margin_h'].value ) - DialogicUtil.set_theme_value(current_theme, 'text', 'margin', final_vector) + DialogicResources.set_theme_value(current_theme, 'text', 'margin', final_vector) func _on_BackgroundColor_CheckBox_toggled(button_pressed): - DialogicUtil.set_theme_value(current_theme, 'background', 'use_color', button_pressed) + DialogicResources.set_theme_value(current_theme, 'background', 'use_color', button_pressed) func _on_BackgroundColor_ColorPickerButton_color_changed(color): - DialogicUtil.set_theme_value(current_theme, 'background', 'color', '#' + color.to_html()) + DialogicResources.set_theme_value(current_theme, 'background', 'color', '#' + color.to_html()) func _on_BackgroundTexture_CheckBox_toggled(button_pressed): - DialogicUtil.set_theme_value(current_theme, 'background', 'use_image', button_pressed) + DialogicResources.set_theme_value(current_theme, 'background', 'use_image', button_pressed) func _on_button_background_visible_toggled(button_pressed): - DialogicUtil.set_theme_value(current_theme, 'buttons', 'use_background_color', button_pressed) + DialogicResources.set_theme_value(current_theme, 'buttons', 'use_background_color', button_pressed) func _on_button_background_color_color_changed(color): - DialogicUtil.set_theme_value(current_theme, 'buttons', 'background_color', '#' + color.to_html()) + DialogicResources.set_theme_value(current_theme, 'buttons', 'background_color', '#' + color.to_html()) func _on_ButtonOffset_value_changed(value): @@ -247,15 +250,15 @@ func _on_ButtonOffset_value_changed(value): n['button_offset_x'].value, n['button_offset_y'].value ) - DialogicUtil.set_theme_value(current_theme, 'buttons', 'padding', final_vector) + DialogicResources.set_theme_value(current_theme, 'buttons', 'padding', final_vector) func _on_VerticalSeparation_value_changed(value): - DialogicUtil.set_theme_value(current_theme, 'buttons', 'gap', n['button_separation'].value) + DialogicResources.set_theme_value(current_theme, 'buttons', 'gap', n['button_separation'].value) func _on_button_texture_toggled(button_pressed): - DialogicUtil.set_theme_value(current_theme, 'buttons', 'use_image', button_pressed) + DialogicResources.set_theme_value(current_theme, 'buttons', 'use_image', button_pressed) func _on_ButtonTextureButton_pressed(): @@ -264,20 +267,20 @@ func _on_ButtonTextureButton_pressed(): func _on_button_texture_selected(path, target): - DialogicUtil.set_theme_value(current_theme, 'buttons', 'image', path) - n['button_image'].text = DialogicUtil.get_filename_from_path(path) + DialogicResources.set_theme_value(current_theme, 'buttons', 'image', path) + n['button_image'].text = DialogicResources.get_filename_from_path(path) func _on_ButtonTextColor_color_changed(color): - DialogicUtil.set_theme_value(current_theme, 'buttons', 'text_color', '#' + color.to_html()) + DialogicResources.set_theme_value(current_theme, 'buttons', 'text_color', '#' + color.to_html()) func _on_Custom_Button_Color_toggled(button_pressed): - DialogicUtil.set_theme_value(current_theme, 'buttons', 'text_color_enabled', button_pressed) + DialogicResources.set_theme_value(current_theme, 'buttons', 'text_color_enabled', button_pressed) func _on_GlossaryColorPicker_color_changed(color): - DialogicUtil.set_theme_value(current_theme, 'definitions', 'color', '#' + color.to_html()) + DialogicResources.set_theme_value(current_theme, 'definitions', 'color', '#' + color.to_html()) func _on_GlossaryFontButton_pressed(): @@ -285,8 +288,8 @@ func _on_GlossaryFontButton_pressed(): editor_reference.godot_dialog_connect(self, "_on_Glossary_Font_selected") func _on_Glossary_Font_selected(path, target): - DialogicUtil.set_theme_value(current_theme, 'definitions', 'font', path) - n['glossary_font'].text = DialogicUtil.get_filename_from_path(path) + DialogicResources.set_theme_value(current_theme, 'definitions', 'font', path) + n['glossary_font'].text = DialogicResources.get_filename_from_path(path) func _on_visibility_changed(): @@ -302,18 +305,22 @@ func _on_visibility_changed(): func _on_BoxSize_value_changed(value): var size_value = Vector2(n['size_w'].value, n['size_h'].value) - DialogicUtil.set_theme_value(current_theme, 'box', 'size', size_value) + DialogicResources.set_theme_value(current_theme, 'box', 'size', size_value) func _on_BottomGap_value_changed(value): - DialogicUtil.set_theme_value(current_theme, 'box', 'bottom_gap', value) + DialogicResources.set_theme_value(current_theme, 'box', 'bottom_gap', value) func _on_Alignment_item_selected(index): if index == 0: - DialogicUtil.set_theme_value(current_theme, 'text', 'alignment', 'Left') + DialogicResources.set_theme_value(current_theme, 'text', 'alignment', 'Left') elif index == 1: - DialogicUtil.set_theme_value(current_theme, 'text', 'alignment', 'Center') + DialogicResources.set_theme_value(current_theme, 'text', 'alignment', 'Center') elif index == 2: - DialogicUtil.set_theme_value(current_theme, 'text', 'alignment', 'Right') + DialogicResources.set_theme_value(current_theme, 'text', 'alignment', 'Right') + + +func _on_Preview_text_changed(): + DialogicUtil.set_theme_value(current_theme, 'text', 'preview', n['text_preview'].text) diff --git a/addons/dialogic/Editor/ThemeEditor/ThemeEditor.tscn b/addons/dialogic/Editor/ThemeEditor/ThemeEditor.tscn index 7d8cb1f..c8e8d22 100644 --- a/addons/dialogic/Editor/ThemeEditor/ThemeEditor.tscn +++ b/addons/dialogic/Editor/ThemeEditor/ThemeEditor.tscn @@ -626,8 +626,15 @@ margin_right = 1048.0 margin_bottom = 293.0 custom_constants/separation = 10 +[node name="PreviewButton" type="Button" parent="VBoxContainer/HBoxContainer3"] +margin_right = 152.0 +margin_bottom = 60.0 +text = " Preview changes " +icon = ExtResource( 1 ) + [node name="TextEdit" type="TextEdit" parent="VBoxContainer/HBoxContainer3"] -margin_right = 886.0 +margin_left = 162.0 +margin_right = 1048.0 margin_bottom = 60.0 rect_min_size = Vector2( 400, 60 ) size_flags_horizontal = 3 @@ -635,13 +642,6 @@ text = "This is preview text. You can use [color=#A5EFAC]BBCode[/color] to styl [wave amp=50 freq=2]You can even use effects![/wave]" wrap_enabled = true -[node name="PreviewButton" type="Button" parent="VBoxContainer/HBoxContainer3"] -margin_left = 896.0 -margin_right = 1048.0 -margin_bottom = 60.0 -text = " Preview changes " -icon = ExtResource( 1 ) - [node name="Panel" type="Panel" parent="VBoxContainer"] margin_top = 308.0 margin_right = 1048.0 @@ -694,3 +694,4 @@ size_flags_vertical = 3 [connection signal="value_changed" from="VBoxContainer/HBoxContainer2/Glossary/GridContainer/HBoxContainer/ShadowOffsetX" to="." method="_on_ShadowOffset_value_changed"] [connection signal="value_changed" from="VBoxContainer/HBoxContainer2/Glossary/GridContainer/HBoxContainer/ShadowOffsetY" to="." method="_on_ShadowOffset_value_changed"] [connection signal="pressed" from="VBoxContainer/HBoxContainer3/PreviewButton" to="." method="_on_PreviewButton_pressed"] +[connection signal="text_changed" from="VBoxContainer/HBoxContainer3/TextEdit" to="." method="_on_Preview_text_changed"] diff --git a/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd b/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd index 0417de6..292001a 100644 --- a/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd +++ b/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd @@ -2,9 +2,8 @@ tool extends HSplitContainer var editor_reference -var timeline_name -var working_timeline_file: String = '' - +var timeline_name: String = '' +var timeline_file: String = '' var current_timeline: Dictionary = {} onready var master_tree = get_node('../MasterTree') @@ -100,14 +99,14 @@ func indent_events() -> void: starter = false -func load_timeline(path): +func load_timeline(filename: String): print('---------------------------') - print('Loading: ',path) + print('Loading: ', filename) clear_timeline() var start_time = OS.get_system_time_msecs() - working_timeline_file = path + timeline_file = filename - var data = DialogicUtil.load_json(path) + var data = DialogicResources.get_timeline_json(filename) if data['metadata'].has('name'): timeline_name = data['metadata']['name'] else: @@ -177,9 +176,8 @@ func move_block(block, direction): return false -# Create timeline func create_timeline(): - var timeline_file = 'timeline-' + str(OS.get_unix_time()) + '.json' + timeline_file = 'timeline-' + str(OS.get_unix_time()) + '.json' var timeline = { "events": [], "metadata":{ @@ -187,15 +185,7 @@ func create_timeline(): "file": timeline_file } } - var directory = Directory.new() - if not directory.dir_exists(DialogicUtil.get_path('WORKING_DIR')): - directory.make_dir(DialogicUtil.get_path('WORKING_DIR')) - if not directory.dir_exists(DialogicUtil.get_path('TIMELINE_DIR')): - directory.make_dir(DialogicUtil.get_path('TIMELINE_DIR')) - var file = File.new() - file.open(DialogicUtil.get_path('TIMELINE_DIR') + '/' + timeline_file, File.WRITE) - file.store_line(to_json(timeline)) - file.close() + DialogicResources.set_timeline(timeline) return timeline @@ -206,15 +196,11 @@ func new_timeline(): # Saving func generate_save_data(): - var t_name = timeline_name - var f_name = DialogicUtil.get_filename_from_path(working_timeline_file) - if t_name == '': - timeline_name = f_name var info_to_save = { 'metadata': { 'dialogic-version': editor_reference.version_string, - 'name': t_name, - 'file': f_name + 'name': timeline_name, + 'file': timeline_file }, 'events': [] } @@ -225,13 +211,10 @@ func generate_save_data(): func save_timeline() -> void: - if working_timeline_file != '': + if timeline_file != '': var info_to_save = generate_save_data() - var file = File.new() - file.open(working_timeline_file, File.WRITE) - file.store_line(to_json(info_to_save)) - file.close() - #print('[+] Saving: ' , working_timeline_file) + DialogicResources.set_timeline(info_to_save) + #print('[+] Saving: ' , timeline_file) # Utilities diff --git a/addons/dialogic/Nodes/Portrait.gd b/addons/dialogic/Nodes/Portrait.gd index c6d84cc..3946619 100644 --- a/addons/dialogic/Nodes/Portrait.gd +++ b/addons/dialogic/Nodes/Portrait.gd @@ -6,7 +6,12 @@ var character_data = { 'color': Color(0.973511, 1, 0.152344), 'file': '' } -var positions = {'left': Vector2(-400,0), 'right': Vector2(+400,0), 'center': Vector2(0,0), 'center_right': Vector2(200,0), 'center_left': Vector2(-200,0)} +var positions = { + 'left': Vector2(-400,-130), + 'right': Vector2(+400,-130), + 'center': Vector2(0,-130), + 'center_right': Vector2(200,-130), + 'center_left': Vector2(-200,-130)} var direction = 'left' var debug = false @@ -50,8 +55,7 @@ func set_portrait(expression: String) -> void: var portraits = character_data['portraits'] for p in portraits: if p['name'] == expression: - var directory = Directory.new(); - if directory.file_exists(p['path']): + if ResourceLoader.exists(p['path']): $TextureRect.texture = load(p['path']) else: $TextureRect.texture = Texture.new() diff --git a/addons/dialogic/Nodes/dialog_node.gd b/addons/dialogic/Nodes/dialog_node.gd index 8dba4f3..701f643 100644 --- a/addons/dialogic/Nodes/dialog_node.gd +++ b/addons/dialogic/Nodes/dialog_node.gd @@ -17,6 +17,7 @@ var settings var current_theme export(String, "TimelineDropdown") var timeline: String +export(bool) var reset_saves = true export(bool) var debug_mode = true signal event_start(type, event) signal event_end(type) @@ -34,10 +35,12 @@ func _ready(): # Loading the config files load_config_files() - + # Make sure saves are ready + DialogicResources.init_definitions_saves(reset_saves) + # Checking if the dialog should read the code from a external file if timeline != '': - dialog_script = set_current_dialog('/' + timeline + '.json') + dialog_script = set_current_dialog(timeline + '.json') # Connecting resize signal get_viewport().connect("size_changed", self, "resize_main") @@ -58,7 +61,7 @@ func _ready(): func load_config_files(): definitions = DialogicUtil.get_definition_list() - settings = DialogicUtil.get_settings() + settings = DialogicResources.get_settings_config() var theme_file = 'res://addons/dialogic/Editor/ThemeEditor/default-theme.cfg' if settings.has_section('theme'): theme_file = settings.get_value('theme', 'default') @@ -78,7 +81,7 @@ func resize_main(): func set_current_dialog(dialog_path): - var dialog_script = DialogicUtil.load_json(DialogicUtil.get_path('TIMELINE_DIR', dialog_path)) + var dialog_script = DialogicResources.get_timeline_json(dialog_path) # All this parse events should be happening in the same loop ideally # But until performance is not an issue I will probably stay lazy # And keep adding different functions for each parsing operation. @@ -89,7 +92,6 @@ func set_current_dialog(dialog_path): dialog_script = parse_characters(dialog_script) dialog_script = parse_text_lines(dialog_script) - dialog_script = parse_definitions(dialog_script) dialog_script = parse_branches(dialog_script) return dialog_script @@ -213,34 +215,40 @@ func parse_branches(dialog_script: Dictionary) -> Dictionary: return dialog_script -func parse_definitions(dialog_script): +func parse_definitions(text: String): var words = [] var definition_list = DialogicUtil.get_definition_list() if Engine.is_editor_hint(): # Loading variables again to avoid issues in the preview dialog load_config_files() - + var final_text: String; + final_text = _insert_variable_definitions(text) + final_text = _insert_glossary_definitions(final_text) + return final_text + +func _insert_variable_definitions(text: String): + var final_text := text; + for d in definitions: + if d['type'] == 0: + var name : String = d['name']; + var value = DialogicUtil.get_var(name) + final_text = final_text.replace('[' + name + ']', value) + return final_text; + + +func _insert_glossary_definitions(text: String): + var color = self.current_theme.get_value('definitions', 'color', '#ffbebebe') + var final_text := text; + # I should use regex here, but this is way easier :) for d in definitions: if d['type'] == 1: - words.append(d) - - # I should use regex here, but this is way easier :) - if words.size() > 0: - var color = current_theme.get_value('definitions', 'color', '#ffbebebe') - var index = 0 - for t in dialog_script['events']: - if t.has('text') and t.has('character') and t.has('portrait'): - for d in definitions: - if d['type'] == 1: - dialog_script['events'][index]['text'] = t['text'].replace(d['name'], - '[url=' + d['section'] + ']' + - '[color=' + color + ']' + d['name'] + '[/color]' + - '[/url]' - ) - index += 1 - - return dialog_script + final_text = final_text.replace(d['name'], + '[url=' + d['section'] + ']' + + '[color=' + color + ']' + d['name'] + '[/color]' + + '[/url]' + ) + return final_text; func _process(_delta): @@ -292,7 +300,7 @@ func update_name(character, color='#FFFFFF'): func update_text(text): # Updating the text and starting the animation from 0 - $TextBubble/RichTextLabel.bbcode_text = text + $TextBubble/RichTextLabel.bbcode_text = self.parse_definitions(text) $TextBubble/RichTextLabel.percent_visible = 0 # The call to this function needs to be deferred. @@ -338,6 +346,9 @@ func get_character(character_id): func event_handler(event: Dictionary): # Handling an event and updating the available nodes accordingly. reset_dialog_extras() + # Updating the settings and definitions in case that they were modified by a timelien + load_config_files() + dprint('[D] Current Event: ', event) match event: {'text', 'character', 'portrait'}: @@ -440,7 +451,7 @@ func event_handler(event: Dictionary): wait_seconds(event['wait_seconds']) waiting = true {'change_timeline'}: - dialog_script = set_current_dialog('/' + event['change_timeline']) + dialog_script = set_current_dialog(event['change_timeline']) dialog_index = -1 go_to_next_event() {'condition', 'definition', 'value', 'question_id', ..}: @@ -449,25 +460,21 @@ func event_handler(event: Dictionary): var current_question = questions[event['question_id']] for d in definitions: if d['section'] == event['definition']: - #if d['config'].has_section('runtime_value'): - # def_value = d['config'].get_value(event['definition'], 'runtime_value', null) - #else: - def_value = d['config'].get_value(event['definition'], 'value', null) - if def_value != null: - if def_value != event['value']: - current_question['answered'] = true # This will abort the current conditional branch - - if current_question['answered']: - # If the option is for an answered question, skip to the end of it. + def_value = DialogicUtil.get_var(d['name']) + + var condition_met = self._compare_definitions(def_value, event['value'], event['condition']); + + current_question['answered'] = !condition_met + if !condition_met: + # condition not met, skipping branch dialog_index = current_question['end_id'] load_dialog(true) else: - # It should never get here, but if it does, go to the next place. + # condition met, entering branch go_to_next_event() {'set_value', 'definition'}: emit_signal("event_start", "set_value", event) - #DialogicUtil.set_definition(event['definition'], 'runtime_value', event['set_value']) - DialogicUtil.set_definition(event['definition'], 'value', event['set_value']) + DialogicResources.set_saved_definition_variable_value(event['definition'], event['set_value']) go_to_next_event() _: visible = false @@ -617,7 +624,7 @@ func deferred_resize(current_size, result): resize_main() func load_theme(filename): - var theme = DialogicUtil.get_theme(filename) + var theme = DialogicResources.get_theme_config(filename) # Box size call_deferred('deferred_resize', $TextBubble.rect_size, theme.get_value('box', 'size', Vector2(910, 167))) @@ -726,3 +733,27 @@ func dprint(string, arg1='', arg2='', arg3='', arg4='' ): # I ask myself the same question :') if debug_mode: print(str(string) + str(arg1) + str(arg2) + str(arg3) + str(arg4)) + + +func _compare_definitions(def_value: String, event_value: String, condition: String): + var condition_met = false; + if def_value != null and event_value != null: + var converted_def_value = def_value + var converted_event_value = event_value + if def_value.is_valid_float() and event_value.is_valid_float(): + converted_def_value = float(def_value) + converted_event_value = float(event_value) + match condition: + "==": + condition_met = converted_def_value == converted_event_value + "!=": + condition_met = converted_def_value != converted_event_value + ">": + condition_met = converted_def_value > converted_event_value + ">=": + condition_met = converted_def_value >= converted_event_value + "<": + condition_met = converted_def_value < converted_event_value + "<=": + condition_met = converted_def_value <= converted_event_value + return condition_met diff --git a/addons/dialogic/Other/dialogic_class.gd b/addons/dialogic/Other/DialogicClass.gd similarity index 67% rename from addons/dialogic/Other/dialogic_class.gd rename to addons/dialogic/Other/DialogicClass.gd index 4a1fe1e..f8f8837 100644 --- a/addons/dialogic/Other/dialogic_class.gd +++ b/addons/dialogic/Other/DialogicClass.gd @@ -2,8 +2,8 @@ extends Node class_name Dialogic -static func start(timeline: String, debug_mode=true): - var dialog = load("res://addons/dialogic/Dialog.tscn") +static func start(timeline: String, dialog_scene_path: String="res://addons/dialogic/Dialog.tscn", debug_mode: bool=false): + var dialog = load(dialog_scene_path) var d = dialog.instance() d.debug_mode = debug_mode for t in DialogicUtil.get_timeline_list(): @@ -17,12 +17,13 @@ static func start(timeline: String, debug_mode=true): return d +static func reset_saves(): + DialogicResources.init_definitions_saves(true) + + static func get_var(variable: String): return DialogicUtil.get_var(variable) static func set_var(variable: String, value): - for d in DialogicUtil.get_definition_list(): - if d['name'] == variable: - DialogicUtil.set_definition(d['section'], 'value', value) - return value + DialogicUtil.set_var(variable, value) diff --git a/addons/dialogic/Other/DialogicResources.gd b/addons/dialogic/Other/DialogicResources.gd new file mode 100644 index 0000000..02727e7 --- /dev/null +++ b/addons/dialogic/Other/DialogicResources.gd @@ -0,0 +1,349 @@ +tool +class_name DialogicResources + + +const RESOURCES_DIR: String = "res://dialogic" # Readonly, used for static data +const WORKING_DIR: String = "user://dialogic" # Readwrite, used for saves + + +static func load_json(path: String) -> Dictionary: + # An easy function to load json files and handle common errors. + var file:File = File.new() + if file.open(path, File.READ) != OK: + file.close() + return {'error':'file read error'} + var data_text: String = file.get_as_text() + file.close() + var data_parse:JSONParseResult = JSON.parse(data_text) + if data_parse.error != OK: + return {'error':'data parse error'} + + var final_data = data_parse.result + if typeof(final_data) == TYPE_DICTIONARY: + return final_data + + # If everything else fails + return {'error':'data parse error'} + + +static func init_dialogic_files() -> void: + # This functions makes sure that the needed files and folders + # exists when the plugin is loaded. If they don't, we create + # them. + # WARNING: only call while in the editor + var directory = Directory.new() + var paths = get_working_directories() + var files = get_config_files_paths() + # Create directories + for dir in paths: + if not directory.dir_exists(paths[dir]): + directory.make_dir_recursive(paths[dir]) + # Create empty files + for f in files: + if not directory.file_exists(files[f]): + create_empty_file(files[f]) + + +static func get_working_directories() -> Dictionary: + return { + 'RESOURCES_DIR': RESOURCES_DIR, + 'WORKING_DIR': WORKING_DIR, + 'TIMELINE_DIR': RESOURCES_DIR + "/timelines", + 'THEME_DIR': RESOURCES_DIR + "/themes", + 'CHAR_DIR': RESOURCES_DIR + "/characters", + } + + +static func get_config_files_paths() -> Dictionary: + return { + 'SETTINGS_FILE': RESOURCES_DIR + "/settings.cfg", + 'DEFAULT_DEFINITIONS_FILE': RESOURCES_DIR + "/definitions.cfg", + 'SAVED_DEFINITIONS_FILE': WORKING_DIR + "/definitions.cfg", + } + + +static func init_definitions_saves(overwrite: bool=true): + var directory := Directory.new() + var source := File.new() + var sink := File.new() + var paths := get_config_files_paths() + + var err := directory.make_dir_recursive(get_working_directories()['WORKING_DIR']) + + if err == OK: + if not directory.file_exists(paths["SAVED_DEFINITIONS_FILE"]): + err = sink.open(paths["SAVED_DEFINITIONS_FILE"], File.WRITE) + print('Saved definitions not present, creating file: ' + str(err)) + if err == OK: + sink.store_string('') + sink.close() + else: + print('Error opening saved definitions file: ' + str(err)) + + err = sink.open(paths["SAVED_DEFINITIONS_FILE"], File.READ_WRITE) + if err == OK: + if overwrite or sink.get_len() == 0: + err = source.open(paths["DEFAULT_DEFINITIONS_FILE"], File.READ) + if err == OK: + sink.store_string(source.get_as_text()) + else: + print('Error opening default definitions file: ' + str(err)) + else: + print('Did not overwrite previous saved definitions') + else: + print('Error opening saved definitions file: ' + str(err)) + else: + print('Error creating working directory: ' + str(err)) + + source.close() + sink.close() + + +static func get_path(name: String, extra: String ='') -> String: + var paths: Dictionary = get_working_directories() + if extra != '': + return paths[name] + '/' + extra + else: + return paths[name] + + +static func get_filename_from_path(path: String, extension = false) -> String: + var file_name: String = path.split('/')[-1] + if extension == false: + file_name = file_name.split('.')[0] + return file_name + + +static func listdir(path: String) -> Array: + # https://docs.godotengine.org/en/stable/classes/class_directory.html#description + var files: Array = [] + var dir := Directory.new() + var err = dir.open(path) + if err == OK: + dir.list_dir_begin() + var file_name = dir.get_next() + while file_name != "": + if not dir.current_is_dir() and not file_name.begins_with("."): + files.append(file_name) + file_name = dir.get_next() + dir.list_dir_end() + else: + print("Error while accessing path " + path + " - Error: " + str(err)) + return files + + +static func create_empty_file(path): + var file = File.new() + file.open(path, File.WRITE) + file.store_string('') + file.close() + + +# CONFIG UTIL + + +static func get_config(id: String) -> ConfigFile: + var paths := get_config_files_paths() + var config := ConfigFile.new() + if id in paths.keys(): + var err = config.load(paths[id]) + if err != OK: + print("Error while opening config file " + paths[id] + ". Error: " + str(err)) + return config + + +# FILE UTIL + + +static func remove_file(path: String): + var dir = Directory.new() + dir.remove(path) + + +# JSON UTIL + + +static func get_json(dir_id: String, path: String): + return load_json(get_path(dir_id, path)) + + +static func set_json(dir_id: String, path: String, data: Dictionary): + var directory = Directory.new() + var base_path := get_path(dir_id) + if not directory.dir_exists(base_path): + directory.make_dir_recursive(base_path) + var file = File.new() + file.open(get_path(dir_id, path), File.WRITE) + file.store_line(to_json(data)) + file.close() + + +# TIMELINE + +static func get_timeline_json(path: String): + return get_json('TIMELINE_DIR', path) + + +static func set_timeline(timeline: Dictionary): + # WARNING: For use in the editor only + set_json('TIMELINE_DIR', timeline['metadata']['file'], timeline) + + +static func delete_timeline(filename: String): + # WARNING: For use in the editor only + remove_file(get_path('TIMELINE_DIR', filename)) + + +# CHARACTER + + +static func get_character_json(path: String): + return get_json('CHAR_DIR', path) + + +static func set_character(character: Dictionary): + # WARNING: For use in the editor only + set_json('CHAR_DIR', character['id'], character) + + +static func delete_character(filename: String): + # WARNING: For use in the editor only + remove_file(get_path('CHAR_DIR', filename)) + + +# THEME + + +static func get_theme_config(filename: String): + var config = ConfigFile.new() + var path + if filename.begins_with('res://'): + path = filename + else: + path = get_path('THEME_DIR', filename) + var err = config.load(path) + if err == OK: + return config + + +static func set_theme_value(filename, section, key, value): + # WARNING: For use in the editor only + print('=> theme update') + print(filename) + var config = get_theme_config(filename) + config.set_value(section, key, value) + config.save(get_path('THEME_DIR', filename)) + + +static func add_theme(filename: String): + create_empty_file(get_path('THEME_DIR', filename)) + + +# SETTINGS + + +static func get_settings_config(): + return get_config("SETTINGS_FILE") + + +static func set_settings_value(section: String, key: String, value): + var config = get_settings_config() + config.set_value(section, key, value) + config.save(get_config_files_paths()['SETTINGS_FILE']) + + +# DEFINITIONS UTIL +# used by default and saved definitions + +static func get_definition_key(config_id: String, section: String, key: String, default): + var config = get_config(config_id) + if config.has_section(section): + return config.get_value(section, key, default) + else: + return default + + +static func set_definition_variable(config_id: String, section: String, name: String, value): + var config = get_config(config_id) + config.set_value(section, 'name', name) + config.set_value(section, 'type', 0) + config.set_value(section, 'value', str(value)) + return config.save(get_config_files_paths()[config_id]) + + +static func set_definition_glossary(config_id: String, section: String, name: String, extra_title: String, extra_text: String, extra_extra: String): + var config = get_config(config_id) + config.set_value(section, 'name', name) + config.set_value(section, 'type', 1) + config.set_value(section, 'extra_title', extra_title) + config.set_value(section, 'extra_text', extra_text) + config.set_value(section, 'extra_extra', extra_extra) + return config.save(get_config_files_paths()[config_id]) + + +static func add_definition_variable(config_id: String, section: String, name: String, type: int, value): + var config = get_config(config_id) + config.set_value(section, 'name', name) + config.set_value(section, 'type', type) + config.set_value(section, 'value', str(value)) + return config.save(get_config_files_paths()[config_id]) + + +static func delete_definition(config_id: String, section: String): + var config = get_config(config_id) + config.erase_section(section) + return config.save(get_config_files_paths()[config_id]) + + + +# DEFAULT DEFINITIONS +# Can only be edited in the editor + +static func get_default_definitions_config(): + return get_config('DEFAULT_DEFINITIONS_FILE') + + +static func get_default_definition_key(section: String, key: String, default): + return get_definition_key('DEFAULT_DEFINITIONS_FILE', section, key, default) + + +static func set_default_definition_variable(section: String, name: String, value): + # WARNING: For use in the editor only + return set_definition_variable('DEFAULT_DEFINITIONS_FILE', section, name, value) + + +static func set_default_definition_glossary(section: String, name: String, extra_title: String, extra_text: String, extra_extra: String): + # WARNING: For use in the editor only + return set_definition_glossary('DEFAULT_DEFINITIONS_FILE', section, name, extra_title, extra_text, extra_extra) + + +static func add_default_definition_variable(section: String, name: String, type: int, value): + # WARNING: For use in the editor only + return add_definition_variable('DEFAULT_DEFINITIONS_FILE', section, name, type, value) + + +static func delete_default_definition(section: String): + # WARNING: For use in the editor only + return delete_definition('DEFAULT_DEFINITIONS_FILE', section) + + +# SAVED DEFINITIONS +# Can be edited at runtime, and will persist across runs + + +static func get_saved_definitions_config(): + return get_config("SAVED_DEFINITIONS_FILE") + + +static func set_saved_definition_variable(section: String, name: String, value): + return set_definition_variable('SAVED_DEFINITIONS_FILE', section, name, value) + + +static func set_saved_definition_variable_value(section: String, value): + var config = get_saved_definitions_config() + return set_definition_variable('SAVED_DEFINITIONS_FILE', section, config.get_value(section, 'name', section), value) + + +static func set_saved_definition_glossary(section: String, name: String, extra_title: String, extra_text: String, extra_extra: String): + return set_definition_glossary('SAVED_DEFINITIONS_FILE', section, name, extra_title, extra_text, extra_extra) + diff --git a/addons/dialogic/Other/DialogicUtil.gd b/addons/dialogic/Other/DialogicUtil.gd index 041c103..3744f50 100644 --- a/addons/dialogic/Other/DialogicUtil.gd +++ b/addons/dialogic/Other/DialogicUtil.gd @@ -1,105 +1,12 @@ tool class_name DialogicUtil -# This class was initially for doing small things... but after a while -# it ended up being one of the corner stones of the plugin. -# It should probably be split into several other classes and leave -# just the basic stuff here, but I'll keep working like this until I have -# some extra time to burn. -# A good point to start would be to add a "resource manager" instead of -# handling most of that here. But who knows? (: - -static func init_dialogic_files() -> void: - # This functions makes sure that the needed files and folders - # exists when the plugin is loaded. If they don't, we create - # them. - var directory = Directory.new() - var paths = get_working_directories() - for dir in paths: - if 'settings.cfg' in paths[dir]: - if directory.file_exists(paths['SETTINGS_FILE']) == false: - create_empty_file(paths['SETTINGS_FILE']) - elif 'definitions.cfg' in paths[dir]: - if directory.file_exists(paths['DEFINITIONS_FILE']) == false: - create_empty_file(paths['DEFINITIONS_FILE']) - else: - if directory.dir_exists(paths[dir]) == false: - directory.make_dir(paths[dir]) - - -static func load_json(path: String) -> Dictionary: - # An easy function to load json files and handle common errors. - var file:File = File.new() - if file.open(path, File.READ) != OK: - file.close() - return {'error':'file read error'} - var data_text: String = file.get_as_text() - file.close() - var data_parse:JSONParseResult = JSON.parse(data_text) - if data_parse.error != OK: - return {'error':'data parse error'} - - var final_data = data_parse.result - if typeof(final_data) == TYPE_DICTIONARY: - return final_data - - # If everything else fails - return {'error':'data parse error'} - - -static func get_working_directories() -> Dictionary: - var WORKING_DIR: String = "res://dialogic" - var paths: Dictionary = { - 'WORKING_DIR': WORKING_DIR, - 'TIMELINE_DIR': WORKING_DIR + "/timelines", - 'THEME_DIR': WORKING_DIR + "/themes", - 'CHAR_DIR': WORKING_DIR + "/characters", - 'DEFINITIONS_FILE': WORKING_DIR + "/definitions.cfg", - 'SETTINGS_FILE': WORKING_DIR + "/settings.cfg", - } - return paths - - -static func get_path(name: String, extra: String ='') -> String: - var paths: Dictionary = get_working_directories() - if extra != '': - return paths[name] + '/' + extra - else: - return paths[name] - - -static func get_filename_from_path(path: String, extension = false) -> String: - var file_name: String = path.split('/')[-1] - if extension == false: - file_name = file_name.split('.')[0] - return file_name - - -static func listdir(path: String) -> Array: - # https://godotengine.org/qa/5175/how-to-get-all-the-files-inside-a-folder - var files: Array = [] - var dir: Directory = Directory.new() - dir.open(path) - dir.list_dir_begin() - while true: - var file = dir.get_next() - if file == "": - break - elif not file.begins_with("."): - files.append(file) - dir.list_dir_end() - return files - static func get_character_list() -> Array: var characters: Array = [] - var directory = Directory.new(); - if directory.dir_exists(get_path('CHAR_DIR')) == false: - return characters - - for file in listdir(get_path('CHAR_DIR')): + for file in DialogicResources.listdir(DialogicResources.get_path('CHAR_DIR')): if '.json' in file: - var data: Dictionary = load_json(get_path('CHAR_DIR', file)) + var data: Dictionary = DialogicResources.get_character_json(file) var color: Color = Color("#ffffff") var c_name: String = data['id'] var default_speaker = false @@ -134,9 +41,9 @@ static func get_character_list() -> Array: static func get_timeline_list() -> Array: var timelines: Array = [] - for file in listdir(get_path('TIMELINE_DIR')): + for file in DialogicResources.listdir(DialogicResources.get_path('TIMELINE_DIR')): if '.json' in file: - var data = load_json(get_path('TIMELINE_DIR', file)) + var data = DialogicResources.get_timeline_json(file) if data.has('error') == false: var metadata = data['metadata'] var color = Color("#ffffff") @@ -147,43 +54,57 @@ static func get_timeline_list() -> Array: return timelines -static func get_definition_list() -> Array: - var definitions: Array = [] - var config = ConfigFile.new() - var err = config.load(get_path('DEFINITIONS_FILE')) - if err == OK: - for section in config.get_sections(): - definitions.append({ - 'section': section, - 'name': config.get_value(section, 'name', section), - 'config': config, - 'type': config.get_value(section, 'type', 0), +static func get_theme_list() -> Array: + var themes: Array = [] + for file in DialogicResources.listdir(DialogicResources.get_path('THEME_DIR')): + if '.cfg' in file: + var config = ConfigFile.new() + var err = DialogicResources.get_theme_config(file) + themes.append({ + 'file': file, + 'name': config.get_value('settings','name', file), + 'config': config }) + return themes + + +static func get_default_definition_list() -> Array: + var definitions: Array = [] + var config = DialogicResources.get_default_definitions_config() + for section in config.get_sections(): + definitions.append({ + 'section': section, + 'name': config.get_value(section, 'name', section), + 'config': config, + 'type': config.get_value(section, 'type', 0), + }) return definitions -static func set_definition(current_section: String, key, value) -> void: - var config = ConfigFile.new() - var err = config.load(get_path('DEFINITIONS_FILE')) - if err == OK: - config.set_value(current_section, key, str(value)) - config.save(get_path('DEFINITIONS_FILE')) +static func get_definition_list() -> Array: + var definitions: Array = [] + var config = DialogicResources.get_saved_definitions_config() + for section in config.get_sections(): + definitions.append({ + 'section': section, + 'name': config.get_value(section, 'name', section), + 'config': config, + 'type': config.get_value(section, 'type', 0), + }) + return definitions -static func get_var(variable: String): - print(get_definition_list()) +static func get_var(variable: String) -> String: for d in get_definition_list(): if d['name'] == variable: return d['config'].get_value(d['section'], 'value') return '' -static func set_var(variable: String): - print(get_definition_list()) +static func set_var(variable: String, value) -> void: for d in get_definition_list(): if d['name'] == variable: - return d['config'].get_value(d['section'], 'value') - return '' + DialogicResources.set_saved_definition_variable(d['section'], d['name'], value) static func generate_random_id() -> String: @@ -199,56 +120,3 @@ static func compare_dicts(dict_1: Dictionary, dict_2: Dictionary) -> bool: return false -static func get_theme_list() -> Array: - var themes: Array = [] - for file in listdir(get_path('THEME_DIR')): - if '.cfg' in file: - var config = ConfigFile.new() - var err = config.load(get_path('THEME_DIR', file)) - if err == OK: # If not, something went wrong with the file loading - themes.append({ - 'file': file, - 'name': config.get_value('settings','name', file), - 'config': config - }) - else: - print('Error loading ',file , ' - Error: ', err) - return themes - - -static func get_theme(filename): - var config = ConfigFile.new() - var path - if 'res://' in filename: - path = filename - else: - path = get_path('THEME_DIR', filename) - var err = config.load(path) - if err == OK: - return config - - -static func set_theme_value(filename, section, key, value): - var config = ConfigFile.new() - var file = get_path('THEME_DIR', filename) - var err = config.load(file) - if err == OK: - config.set_value(section, key, value) - config.save(file) - - -static func create_empty_file(path): - var file = File.new() - file.open(path, File.WRITE) - file.store_string('') - file.close() - - -static func get_settings(): - var directory = Directory.new() - var config = ConfigFile.new() - if directory.file_exists(get_path('SETTINGS_FILE')): - var err = config.load(get_path('SETTINGS_FILE')) - if err == OK: - return config - return config diff --git a/addons/dialogic/dialogic.gd b/addons/dialogic/dialogic.gd index f2526dc..4581c94 100644 --- a/addons/dialogic/dialogic.gd +++ b/addons/dialogic/dialogic.gd @@ -15,9 +15,10 @@ func _enter_tree() -> void: func _ready(): if Engine.editor_hint: # Make sure the core files exist - DialogicUtil.init_dialogic_files() + DialogicResources.init_dialogic_files() # Force Godot to show the dialogic folder get_editor_interface().get_resource_filesystem().scan() + func _exit_tree() -> void: @@ -44,7 +45,7 @@ func get_plugin_icon(): func _add_custom_editor_view(): _editor_view = preload("res://addons/dialogic/Editor/EditorView.tscn").instance() - _editor_view.plugin_reference = self + #_editor_view.plugin_reference = self func _remove_custom_editor_view(): diff --git a/characters/df-2.png b/characters/df-2.png new file mode 100644 index 0000000000000000000000000000000000000000..441c740eaaf7bd3f7b4d397f8a0bf03a5a1d63f8 GIT binary patch literal 7661 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⁣l(`%F*{d) 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%0A}5 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 N002ovPDHLkV1j28mzMwl diff --git a/characters/test/shock.png b/characters/test/shock.png deleted file mode 100644 index c4473993101cd89838d11284ee4579bb34e9b249..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36743 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 diff --git a/characters/test/shock.png.import b/characters/test/shock.png.import deleted file mode 100644 index 8998f0d..0000000 --- a/characters/test/shock.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="StreamTexture" -path="res://.import/shock.png-a8c62a852aea125c35d6b3bd7987a7fc.stex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://characters/test/shock.png" -dest_files=[ "res://.import/shock.png-a8c62a852aea125c35d6b3bd7987a7fc.stex" ] - -[params] - -compress/mode=0 -compress/lossy_quality=0.7 -compress/hdr_mode=0 -compress/bptc_ldr=0 -compress/normal_map=0 -flags/repeat=0 -flags/filter=true -flags/mipmaps=false -flags/anisotropic=false -flags/srgb=2 -process/fix_alpha_border=true -process/premult_alpha=false -process/HDR_as_SRGB=false -process/invert_color=false -stream=false -size_limit=0 -detect_3d=true -svg/scale=1.0 diff --git a/dialogic/characters/character-1615795338.json b/dialogic/characters/character-1615795338.json deleted file mode 100644 index cb3dda7..0000000 --- a/dialogic/characters/character-1615795338.json +++ /dev/null @@ -1 +0,0 @@ -{"color":"#ffffffff","default_speaker":true,"description":"","display_name":"","display_name_bool":false,"id":"character-1615795338.json","name":"Test","offset_x":0,"offset_y":-100,"portraits":[{"name":"Default","path":"res://characters/test/happy.png"},{"name":"nice","path":"res://characters/test/nice.png"},{"name":"shock","path":"res://characters/test/shock.png"}],"scale":100} diff --git a/dialogic/characters/character-1615932195.json b/dialogic/characters/character-1615932195.json new file mode 100644 index 0000000..7ac1c7f --- /dev/null +++ b/dialogic/characters/character-1615932195.json @@ -0,0 +1 @@ +{"color":"#ffbe1616","default_speaker":true,"description":"","display_name":"","display_name_bool":false,"id":"character-1615932195.json","name":"Test","offset_x":0,"offset_y":0,"portraits":[{"name":"Default","path":"res://characters/df-2.png"}],"scale":100} diff --git a/dialogic/definitions.cfg b/dialogic/definitions.cfg index aed4279..cc7c394 100644 --- a/dialogic/definitions.cfg +++ b/dialogic/definitions.cfg @@ -1,5 +1,8 @@ -[1615795512-648] +[1615930196-648] -name="New definition" -type=0 +name="Hello" +type=1 value="" +extra_title="Hello" +extra_text="When you say hi" +extra_extra="" diff --git a/dialogic/settings.cfg b/dialogic/settings.cfg index 0e0d834..3a9c3dd 100644 --- a/dialogic/settings.cfg +++ b/dialogic/settings.cfg @@ -1,3 +1,3 @@ [theme] -default="theme-1615795528.cfg" +default="theme-1615930210.cfg" diff --git a/dialogic/themes/theme-1615795528.cfg b/dialogic/themes/theme-1615795528.cfg deleted file mode 100644 index 88ab4af..0000000 --- a/dialogic/themes/theme-1615795528.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[box] - -size=Vector2( 910, 167 ) - -[text] - -margin=Vector2( 20, 10 ) -shadow=false -speed=4.0 - -[background] - -use_color=false -use_image=true diff --git a/dialogic/themes/theme-1615930210.cfg b/dialogic/themes/theme-1615930210.cfg new file mode 100644 index 0000000..3505650 --- /dev/null +++ b/dialogic/themes/theme-1615930210.cfg @@ -0,0 +1,7 @@ +[box] + +size=Vector2( 910, 167 ) + +[text] + +margin=Vector2( 20, 10 ) diff --git a/dialogic/timelines/timeline-1615795397.json b/dialogic/timelines/timeline-1615795397.json deleted file mode 100644 index c4f3432..0000000 --- a/dialogic/timelines/timeline-1615795397.json +++ /dev/null @@ -1 +0,0 @@ -{"events":[{"action":"join","character":"character-1615795338.json","portrait":"Default","position":{"0":false,"1":true,"2":false,"3":false,"4":false}},{"background":"res://backgrounds/office_background.jpg"},{"character":"character-1615795338.json","portrait":"","text":"Bonjour"},{"options":[],"question":"Coucou ?"},{"choice":"Oui !"},{"character":"character-1615795338.json","portrait":"nice","text":"Noice"},{"choice":"Non"},{"character":"character-1615795338.json","portrait":"shock","text":"Bah t'es nul"},{"endbranch":""},{"action":"leaveall","character":"[All]"}],"metadata":{"dialogic-version":"1.0","file":"timeline-1615795397","name":"timeline1"}} diff --git a/dialogic/timelines/timeline-1615930166.json b/dialogic/timelines/timeline-1615930166.json new file mode 100644 index 0000000..39dfcd2 --- /dev/null +++ b/dialogic/timelines/timeline-1615930166.json @@ -0,0 +1 @@ +{"events":[{"background":"res://backgrounds/office_background.jpg"},{"action":"join","character":"character-1615932195.json","portrait":"","position":{"0":false,"1":true,"2":false,"3":false,"4":false}},{"character":"character-1615932195.json","portrait":"","text":"Hello"},{"character":"character-1615932195.json","portrait":"happy","text":"Hi"},{"character":"character-1615932195.json","portrait":"","text":"Bye"},{"action":"leaveall","character":"[All]"},{"wait_seconds":1},{"close_dialog":""}],"metadata":{"dialogic-version":"1.0","file":"timeline-1615930166.json","name":"timeline1"}} diff --git a/export_presets.cfg b/export_presets.cfg new file mode 100644 index 0000000..fdfc67f --- /dev/null +++ b/export_presets.cfg @@ -0,0 +1,48 @@ +[preset.0] + +name="Linux/X11" +platform="Linux/X11" +runnable=true +custom_features="" +export_filter="all_resources" +include_filter="*.json" +exclude_filter="" +export_path="build/linux/Pir-serious-game-ethics.x86_64" +patch_list=PoolStringArray( ) +script_export_mode=1 +script_encryption_key="" + +[preset.0.options] + +texture_format/bptc=false +texture_format/s3tc=true +texture_format/etc=false +texture_format/etc2=false +texture_format/no_bptc_fallbacks=true +binary_format/64_bits=true +binary_format/embed_pck=true +custom_template/release="" +custom_template/debug="" + +[preset.1] + +name="HTML5" +platform="HTML5" +runnable=true +custom_features="" +export_filter="all_resources" +include_filter="*.json" +exclude_filter="" +export_path="build/html/Pir-serious-game-ethics.html" +patch_list=PoolStringArray( ) +script_export_mode=1 +script_encryption_key="" + +[preset.1.options] + +vram_texture_compression/for_desktop=true +vram_texture_compression/for_mobile=false +html/custom_html_shell="" +html/head_include="" +custom_template/release="" +custom_template/debug="" diff --git a/git_api.gdnlib b/git_api.gdnlib deleted file mode 100644 index 42f2fb6..0000000 --- a/git_api.gdnlib +++ /dev/null @@ -1,16 +0,0 @@ -[general] - -singleton=true -load_once=true -symbol_prefix="godot_" -reloadable=false - -[entry] - -Windows.64="res://bin/win64/release/libgitapi.dll" -X11.64="res://bin/x11/release/libgitapi.so" - -[dependencies] - -Windows.64=[ ] -X11.64=[ ] diff --git a/git_api.gdns b/git_api.gdns deleted file mode 100644 index adab80a..0000000 --- a/git_api.gdns +++ /dev/null @@ -1,9 +0,0 @@ -[gd_resource type="NativeScript" load_steps=2 format=2] - -[ext_resource path="res://git_api.gdnlib" type="GDNativeLibrary" id=1] - -[resource] -resource_name = "GitAPI" -class_name = "GitAPI" -library = ExtResource( 1 ) -script_class_name = "GitAPI" diff --git a/json_example.json b/json_example.json index 9cef869..9a7b984 100644 --- a/json_example.json +++ b/json_example.json @@ -15,7 +15,6 @@ choices_multiple: [ { title: "choix 1", - arc: 0, infobox: { title: "coucou !", text: "ça va ?", diff --git a/project.godot b/project.godot index 1e4dc86..22d801c 100644 --- a/project.godot +++ b/project.godot @@ -9,61 +9,25 @@ config_version=4 _global_script_classes=[ { -"base": "VBoxContainer", -"class": "Choice", -"language": "GDScript", -"path": "res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/Choice/Choice.gd" -}, { -"base": "VBoxContainer", -"class": "ChoicesList", -"language": "GDScript", -"path": "res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ChoicesList/ChoicesList.gd" -}, { -"base": "VBoxContainer", -"class": "Condition", -"language": "GDScript", -"path": "res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/Condition/Condition.gd" -}, { -"base": "VBoxContainer", -"class": "ConditionsList", -"language": "GDScript", -"path": "res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/ConditionsList/ConditionsList.gd" -}, { "base": "Node", "class": "Dialogic", "language": "GDScript", -"path": "res://addons/dialogic/Other/dialogic_class.gd" +"path": "res://addons/dialogic/Other/DialogicClass.gd" +}, { +"base": "Reference", +"class": "DialogicResources", +"language": "GDScript", +"path": "res://addons/dialogic/Other/DialogicResources.gd" }, { "base": "Reference", "class": "DialogicUtil", "language": "GDScript", "path": "res://addons/dialogic/Other/DialogicUtil.gd" -}, { -"base": "", -"class": "GitAPI", -"language": "NativeScript", -"path": "res://git_api.gdns" -}, { -"base": "VBoxContainer", -"class": "Infobox", -"language": "GDScript", -"path": "res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/Infobox/Infobox.gd" -}, { -"base": "GraphNode", -"class": "LineNode", -"language": "GDScript", -"path": "res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/line_node.gd" } ] _global_script_class_icons={ -"Choice": "", -"ChoicesList": "", -"Condition": "", -"ConditionsList": "", "Dialogic": "", -"DialogicUtil": "", -"GitAPI": "", -"Infobox": "", -"LineNode": "" +"DialogicResources": "", +"DialogicUtil": "" } [application] @@ -74,11 +38,11 @@ config/icon="res://icon.png" [editor_plugins] -enabled=PoolStringArray( "EXP-System-Dialog", "Todo_Manager", "dialogic" ) +enabled=PoolStringArray( "Todo_Manager", "dialogic" ) [gdnative] -singletons=[ "res://git_api.gdnlib" ] +singletons=[ ] [rendering]