From 4510f9712611b72e263bcc4b445396442c117150 Mon Sep 17 00:00:00 2001 From: BounceU Date: Fri, 10 Oct 2025 18:23:22 -0400 Subject: [PATCH] Generate tilemap on enter key being pressed --- godot/Rust.gdextension | 4 +- .../Asset_Drawer/AssetDrawerShortcut.tres | 7 - godot/addons/Asset_Drawer/FileSystem.gd | 110 - godot/addons/Asset_Drawer/FileSystem.gd.uid | 1 - godot/addons/Asset_Drawer/LICENSE | 21 - godot/addons/Asset_Drawer/plugin.cfg | 7 - godot/addons/Gedis/core/gedis_core.gd | 212 -- godot/addons/Gedis/core/gedis_core.gd.uid | 1 - godot/addons/Gedis/core/gedis_debugger.gd | 162 -- godot/addons/Gedis/core/gedis_debugger.gd.uid | 1 - godot/addons/Gedis/core/gedis_expiry.gd | 98 - godot/addons/Gedis/core/gedis_expiry.gd.uid | 1 - godot/addons/Gedis/core/gedis_hashes.gd | 132 - godot/addons/Gedis/core/gedis_hashes.gd.uid | 1 - godot/addons/Gedis/core/gedis_lists.gd | 293 --- godot/addons/Gedis/core/gedis_lists.gd.uid | 1 - godot/addons/Gedis/core/gedis_pubsub.gd | 106 - godot/addons/Gedis/core/gedis_pubsub.gd.uid | 1 - godot/addons/Gedis/core/gedis_sets.gd | 216 -- godot/addons/Gedis/core/gedis_sets.gd.uid | 1 - godot/addons/Gedis/core/gedis_sorted_sets.gd | 415 --- .../Gedis/core/gedis_sorted_sets.gd.uid | 1 - godot/addons/Gedis/core/gedis_strings.gd | 139 - godot/addons/Gedis/core/gedis_strings.gd.uid | 1 - godot/addons/Gedis/core/gedis_utils.gd | 43 - godot/addons/Gedis/core/gedis_utils.gd.uid | 1 - .../gedis_json_snapshot_backend.gd | 107 - .../gedis_json_snapshot_backend.gd.uid | 1 - .../persistence/gedis_persistence_backend.gd | 29 - .../gedis_persistence_backend.gd.uid | 1 - .../gedis_process_delta_time_source.gd | 15 - .../gedis_process_delta_time_source.gd.uid | 1 - .../time_sources/gedis_tick_time_source.gd | 6 - .../gedis_tick_time_source.gd.uid | 1 - .../core/time_sources/gedis_time_source.gd | 12 - .../time_sources/gedis_time_source.gd.uid | 1 - .../time_sources/gedis_unix_time_source.gd | 6 - .../gedis_unix_time_source.gd.uid | 1 - .../Gedis/debugger/gedis_debugger_panel.gd | 22 - .../debugger/gedis_debugger_panel.gd.uid | 1 - .../Gedis/debugger/gedis_debugger_panel.tscn | 102 - godot/addons/Gedis/gedis.gd | 567 ---- godot/addons/Gedis/gedis.gd.uid | 1 - godot/addons/Gedis/icon.png | Bin 99432 -> 0 bytes godot/addons/Gedis/plugin.cfg | 7 - godot/addons/Gedis/plugin.gd | 412 --- godot/addons/Gedis/plugin.gd.uid | 1 - godot/addons/GedisQueue/GedisQueue.gd | 274 -- godot/addons/GedisQueue/GedisQueue.gd.uid | 1 - godot/addons/GedisQueue/GedisQueueJob.gd | 51 - godot/addons/GedisQueue/GedisQueueJob.gd.uid | 1 - godot/addons/GedisQueue/GedisQueueWorker.gd | 106 - .../addons/GedisQueue/GedisQueueWorker.gd.uid | 1 - .../debugger/gedis_queue_debugger_panel.gd | 67 - .../gedis_queue_debugger_panel.gd.uid | 1 - .../debugger/gedis_queue_debugger_panel.tscn | 48 - godot/addons/GedisQueue/icon.png | Bin 105347 -> 0 bytes godot/addons/GedisQueue/icon.png.import | 40 - godot/addons/GedisQueue/plugin.cfg | 7 - godot/addons/GedisQueue/plugin.gd | 87 - godot/addons/GedisQueue/plugin.gd.uid | 1 - godot/addons/PaletteTools/Images/Blank.png | Bin 115 -> 0 bytes .../PaletteTools/Images/Blank.png.import | 40 - godot/addons/PaletteTools/Images/Plus.png | Bin 146 -> 0 bytes .../PaletteTools/Images/Plus.png.import | 40 - godot/addons/PaletteTools/Images/checked.png | Bin 4754 -> 0 bytes .../PaletteTools/Images/checked.png.import | 40 - .../addons/PaletteTools/Images/checked_4k.png | Bin 5405 -> 0 bytes .../PaletteTools/Images/checked_4k.png.import | 40 - godot/addons/PaletteTools/Images/spyglass.png | Bin 170 -> 0 bytes .../PaletteTools/Images/spyglass.png.import | 40 - .../addons/PaletteTools/Images/unchecked.png | Bin 4376 -> 0 bytes .../PaletteTools/Images/unchecked.png.import | 40 - .../PaletteTools/Images/unchecked_4k.png | Bin 4532 -> 0 bytes .../Images/unchecked_4k.png.import | 40 - godot/addons/PaletteTools/LICENSE.md | 19 - godot/addons/PaletteTools/README.md | 63 - .../Resources/section_label_settings.tres | 9 - .../section_label_settings_contrast.tres | 8 - .../Scenes/browse_palette_preview.tscn | 83 - .../PaletteTools/Scenes/color_sample.tscn | 70 - .../PaletteTools/Scenes/custom_palette.tscn | 20 - .../PaletteTools/Scenes/custom_picker.tscn | 140 - .../PaletteTools/Scenes/palette_tools.tscn | 647 ----- .../addons/PaletteTools/Scenes/plus_box.tscn | 31 - .../PaletteTools/Scripts/alert_popup_panel.gd | 17 - .../Scripts/alert_popup_panel.gd.uid | 1 - .../Scripts/browse_palette_preview.gd | 14 - .../Scripts/browse_palette_preview.gd.uid | 1 - .../PaletteTools/Scripts/browse_popup.gd | 94 - .../PaletteTools/Scripts/browse_popup.gd.uid | 1 - .../PaletteTools/Scripts/color_sample.gd | 6 - .../PaletteTools/Scripts/color_sample.gd.uid | 1 - .../PaletteTools/Scripts/custom_picker.gd | 15 - .../PaletteTools/Scripts/custom_picker.gd.uid | 1 - .../PaletteTools/Scripts/custom_property.gd | 67 - .../Scripts/custom_property.gd.uid | 1 - .../PaletteTools/Scripts/get_from_url.gd | 29 - .../PaletteTools/Scripts/get_from_url.gd.uid | 1 - .../Scripts/loading_palettes_screen.gd | 17 - .../Scripts/loading_palettes_screen.gd.uid | 1 - .../Scripts/palette_inspector_script.gd | 73 - .../Scripts/palette_inspector_script.gd.uid | 1 - .../PaletteTools/Scripts/palette_tool.gd | 310 --- .../PaletteTools/Scripts/palette_tool.gd.uid | 1 - .../Shaders/rainbow_shader.gdshader | 34 - .../Shaders/rainbow_shader.gdshader.uid | 1 - godot/addons/PaletteTools/icon.png | Bin 74171 -> 0 bytes godot/addons/PaletteTools/icon.png.import | 40 - godot/addons/PaletteTools/palette_tools.gd | 99 - .../addons/PaletteTools/palette_tools.gd.uid | 1 - godot/addons/PaletteTools/plugin.cfg | 7 - godot/addons/PaletteTools/temp_palette.txt | 0 godot/addons/beehave/LICENSE | 21 - godot/addons/beehave/blackboard.gd | 55 - godot/addons/beehave/blackboard.gd.uid | 1 - godot/addons/beehave/debug/debugger.gd | 99 - godot/addons/beehave/debug/debugger.gd.uid | 1 - .../addons/beehave/debug/debugger_messages.gd | 33 - .../beehave/debug/debugger_messages.gd.uid | 1 - godot/addons/beehave/debug/debugger_tab.gd | 215 -- .../addons/beehave/debug/debugger_tab.gd.uid | 1 - godot/addons/beehave/debug/global_debugger.gd | 70 - .../beehave/debug/global_debugger.gd.uid | 1 - .../beehave/debug/icons/horizontal_layout.svg | 1 - .../debug/icons/horizontal_layout.svg.import | 44 - .../beehave/debug/icons/port_bottom.svg | 1 - .../debug/icons/port_bottom.svg.import | 44 - .../addons/beehave/debug/icons/port_left.svg | 1 - .../beehave/debug/icons/port_left.svg.import | 44 - .../addons/beehave/debug/icons/port_right.svg | 1 - .../beehave/debug/icons/port_right.svg.import | 44 - godot/addons/beehave/debug/icons/port_top.svg | 1 - .../beehave/debug/icons/port_top.svg.import | 44 - .../beehave/debug/icons/vertical_layout.svg | 1 - .../debug/icons/vertical_layout.svg.import | 44 - godot/addons/beehave/debug/new_frames.gd | 69 - godot/addons/beehave/debug/new_frames.gd.uid | 1 - godot/addons/beehave/debug/new_graph_edit.gd | 319 --- .../beehave/debug/new_graph_edit.gd.uid | 1 - godot/addons/beehave/debug/new_graph_node.gd | 192 -- .../beehave/debug/new_graph_node.gd.uid | 1 - .../beehave/debug/new_node_blackboard.gd | 81 - .../beehave/debug/new_node_blackboard.gd.uid | 1 - godot/addons/beehave/debug/old_frames.gd | 47 - godot/addons/beehave/debug/old_frames.gd.uid | 1 - godot/addons/beehave/debug/old_graph_edit.gd | 286 --- .../beehave/debug/old_graph_edit.gd.uid | 1 - godot/addons/beehave/debug/old_graph_node.gd | 166 -- .../beehave/debug/old_graph_node.gd.uid | 1 - godot/addons/beehave/debug/tree_node.gd | 275 -- godot/addons/beehave/debug/tree_node.gd.uid | 1 - godot/addons/beehave/icons/action.svg | 38 - godot/addons/beehave/icons/action.svg.import | 44 - godot/addons/beehave/icons/blackboard.svg | 38 - .../beehave/icons/blackboard.svg.import | 44 - godot/addons/beehave/icons/category_bt.svg | 38 - .../beehave/icons/category_bt.svg.import | 44 - .../beehave/icons/category_composite.svg | 38 - .../icons/category_composite.svg.import | 44 - .../beehave/icons/category_decorator.svg | 38 - .../icons/category_decorator.svg.import | 44 - godot/addons/beehave/icons/category_leaf.svg | 38 - .../beehave/icons/category_leaf.svg.import | 44 - godot/addons/beehave/icons/condition.svg | 38 - .../addons/beehave/icons/condition.svg.import | 44 - godot/addons/beehave/icons/cooldown.svg | 38 - .../addons/beehave/icons/cooldown.svg.import | 43 - godot/addons/beehave/icons/delayer.svg | 39 - godot/addons/beehave/icons/delayer.svg.import | 43 - godot/addons/beehave/icons/failer.svg | 38 - godot/addons/beehave/icons/failer.svg.import | 44 - godot/addons/beehave/icons/inverter.svg | 38 - .../addons/beehave/icons/inverter.svg.import | 44 - godot/addons/beehave/icons/limiter.svg | 38 - godot/addons/beehave/icons/limiter.svg.import | 44 - godot/addons/beehave/icons/repeater.svg | 40 - .../addons/beehave/icons/repeater.svg.import | 43 - godot/addons/beehave/icons/selector.svg | 38 - .../addons/beehave/icons/selector.svg.import | 44 - .../addons/beehave/icons/selector_random.svg | 35 - .../beehave/icons/selector_random.svg.import | 44 - .../beehave/icons/selector_reactive.svg | 45 - .../icons/selector_reactive.svg.import | 44 - godot/addons/beehave/icons/sequence.svg | 38 - .../addons/beehave/icons/sequence.svg.import | 44 - .../addons/beehave/icons/sequence_random.svg | 38 - .../beehave/icons/sequence_random.svg.import | 44 - .../beehave/icons/sequence_reactive.svg | 60 - .../icons/sequence_reactive.svg.import | 44 - .../addons/beehave/icons/simple_parallel.svg | 13 - .../beehave/icons/simple_parallel.svg.import | 43 - godot/addons/beehave/icons/succeeder.svg | 38 - .../addons/beehave/icons/succeeder.svg.import | 44 - godot/addons/beehave/icons/tree.svg | 38 - godot/addons/beehave/icons/tree.svg.import | 44 - godot/addons/beehave/icons/until_fail.svg | 45 - .../beehave/icons/until_fail.svg.import | 43 - .../beehave/metrics/beehave_global_metrics.gd | 54 - .../metrics/beehave_global_metrics.gd.uid | 1 - godot/addons/beehave/nodes/beehave_node.gd | 54 - .../addons/beehave/nodes/beehave_node.gd.uid | 1 - godot/addons/beehave/nodes/beehave_tree.gd | 323 --- .../addons/beehave/nodes/beehave_tree.gd.uid | 1 - .../beehave/nodes/composites/composite.gd | 57 - .../beehave/nodes/composites/composite.gd.uid | 1 - .../nodes/composites/randomized_composite.gd | 176 -- .../composites/randomized_composite.gd.uid | 1 - .../beehave/nodes/composites/selector.gd | 102 - .../beehave/nodes/composites/selector.gd.uid | 1 - .../nodes/composites/selector_random.gd | 85 - .../nodes/composites/selector_random.gd.uid | 1 - .../nodes/composites/selector_reactive.gd | 95 - .../nodes/composites/selector_reactive.gd.uid | 1 - .../beehave/nodes/composites/sequence.gd | 92 - .../beehave/nodes/composites/sequence.gd.uid | 1 - .../nodes/composites/sequence_random.gd | 99 - .../nodes/composites/sequence_random.gd.uid | 1 - .../nodes/composites/sequence_reactive.gd | 81 - .../nodes/composites/sequence_reactive.gd.uid | 1 - .../beehave/nodes/composites/sequence_star.gd | 86 - .../nodes/composites/sequence_star.gd.uid | 1 - .../nodes/composites/simple_parallel.gd | 119 - .../nodes/composites/simple_parallel.gd.uid | 1 - .../beehave/nodes/decorators/cooldown.gd | 55 - .../beehave/nodes/decorators/cooldown.gd.uid | 1 - .../beehave/nodes/decorators/decorator.gd | 34 - .../beehave/nodes/decorators/decorator.gd.uid | 1 - .../beehave/nodes/decorators/delayer.gd | 57 - .../beehave/nodes/decorators/delayer.gd.uid | 1 - .../addons/beehave/nodes/decorators/failer.gd | 35 - .../beehave/nodes/decorators/failer.gd.uid | 1 - .../beehave/nodes/decorators/inverter.gd | 43 - .../beehave/nodes/decorators/inverter.gd.uid | 1 - .../beehave/nodes/decorators/limiter.gd | 77 - .../beehave/nodes/decorators/limiter.gd.uid | 1 - .../beehave/nodes/decorators/repeater.gd | 66 - .../beehave/nodes/decorators/repeater.gd.uid | 1 - .../beehave/nodes/decorators/succeeder.gd | 35 - .../beehave/nodes/decorators/succeeder.gd.uid | 1 - .../beehave/nodes/decorators/time_limiter.gd | 68 - .../nodes/decorators/time_limiter.gd.uid | 1 - .../beehave/nodes/decorators/until_fail.gd | 35 - .../nodes/decorators/until_fail.gd.uid | 1 - godot/addons/beehave/nodes/leaves/action.gd | 14 - .../addons/beehave/nodes/leaves/action.gd.uid | 1 - .../nodes/leaves/blackboard_compare.gd | 65 - .../nodes/leaves/blackboard_compare.gd.uid | 1 - .../beehave/nodes/leaves/blackboard_erase.gd | 25 - .../nodes/leaves/blackboard_erase.gd.uid | 1 - .../beehave/nodes/leaves/blackboard_has.gd | 23 - .../nodes/leaves/blackboard_has.gd.uid | 1 - .../beehave/nodes/leaves/blackboard_set.gd | 33 - .../nodes/leaves/blackboard_set.gd.uid | 1 - .../addons/beehave/nodes/leaves/condition.gd | 12 - .../beehave/nodes/leaves/condition.gd.uid | 1 - godot/addons/beehave/nodes/leaves/leaf.gd | 48 - godot/addons/beehave/nodes/leaves/leaf.gd.uid | 1 - godot/addons/beehave/plugin.cfg | 7 - godot/addons/beehave/plugin.gd | 40 - godot/addons/beehave/plugin.gd.uid | 1 - godot/addons/beehave/utils/utils.gd | 21 - godot/addons/beehave/utils/utils.gd.uid | 1 - .../dialogic/Core/DialogicGameHandler.gd | 469 ---- .../dialogic/Core/DialogicGameHandler.gd.uid | 1 - .../dialogic/Core/DialogicResourceUtil.gd | 376 --- .../dialogic/Core/DialogicResourceUtil.gd.uid | 1 - godot/addons/dialogic/Core/DialogicUtil.gd | 803 ------ .../addons/dialogic/Core/DialogicUtil.gd.uid | 1 - .../dialogic/Core/Dialogic_Subsystem.gd | 41 - .../dialogic/Core/Dialogic_Subsystem.gd.uid | 1 - godot/addons/dialogic/Core/index_class.gd | 152 -- godot/addons/dialogic/Core/index_class.gd.uid | 1 - .../char_edit_p_section_exports.gd | 91 - .../char_edit_p_section_exports.gd.uid | 1 - .../char_edit_p_section_exports.tscn | 16 - .../char_edit_p_section_layout.gd | 44 - .../char_edit_p_section_layout.gd.uid | 1 - .../char_edit_p_section_layout.tscn | 65 - .../char_edit_p_section_main.gd | 101 - .../char_edit_p_section_main.gd.uid | 1 - .../char_edit_p_section_main.tscn | 72 - .../char_edit_p_section_main_exports.gd | 80 - .../char_edit_p_section_main_exports.gd.uid | 1 - .../char_edit_p_section_main_exports.tscn | 15 - .../char_edit_section_general.gd | 53 - .../char_edit_section_general.gd.uid | 1 - .../char_edit_section_general.tscn | 114 - .../char_edit_section_portraits.gd | 76 - .../char_edit_section_portraits.gd.uid | 1 - .../char_edit_section_portraits.tscn | 71 - .../CharacterEditor/character_editor.gd | 694 ----- .../CharacterEditor/character_editor.gd.uid | 1 - .../CharacterEditor/character_editor.tscn | 456 ---- .../character_editor_main_settings_section.gd | 42 - ...racter_editor_main_settings_section.gd.uid | 1 - ...racter_editor_portrait_settings_section.gd | 48 - ...er_editor_portrait_settings_section.gd.uid | 1 - .../character_editor_portrait_tree.gd | 142 - .../character_editor_portrait_tree.gd.uid | 1 - .../character_prefix_suffix.gd | 79 - .../character_prefix_suffix.gd.uid | 1 - .../character_prefix_suffix.tscn | 48 - .../CharacterEditor/portrait_scene_browser.gd | 126 - .../portrait_scene_browser.gd.uid | 1 - .../portrait_scene_browser.tscn | 260 -- .../dialogic/Editor/Common/BrowserItem.gd | 86 - .../dialogic/Editor/Common/BrowserItem.gd.uid | 1 - .../dialogic/Editor/Common/BrowserItem.tscn | 154 -- godot/addons/dialogic/Editor/Common/DCSS.gd | 47 - .../addons/dialogic/Editor/Common/DCSS.gd.uid | 1 - .../ReferenceManager_AddReplacementPanel.gd | 122 - ...eferenceManager_AddReplacementPanel.gd.uid | 1 - .../Editor/Common/TitleBgStylebox.tres | 8 - .../Editor/Common/broken_reference_manager.gd | 391 --- .../Common/broken_reference_manager.gd.uid | 1 - .../Editor/Common/hint_tooltip_icon.gd | 12 - .../Editor/Common/hint_tooltip_icon.gd.uid | 1 - .../Editor/Common/hint_tooltip_icon.tscn | 21 - .../Editor/Common/reference_manager.gd | 38 - .../Editor/Common/reference_manager.gd.uid | 1 - .../Editor/Common/reference_manager.tscn | 333 --- .../Editor/Common/reference_manager_window.gd | 196 -- .../Common/reference_manager_window.gd.uid | 1 - .../dialogic/Editor/Common/side_bar.tscn | 211 -- .../addons/dialogic/Editor/Common/sidebar.gd | 529 ---- .../dialogic/Editor/Common/sidebar.gd.uid | 1 - .../addons/dialogic/Editor/Common/toolbar.gd | 46 - .../dialogic/Editor/Common/toolbar.gd.uid | 1 - .../Common/unique_identifiers_manager.gd | 95 - .../Common/unique_identifiers_manager.gd.uid | 1 - .../Editor/Common/update_install_window.gd | 179 -- .../Common/update_install_window.gd.uid | 1 - .../Editor/Common/update_install_window.tscn | 308 --- .../dialogic/Editor/Common/update_manager.gd | 190 -- .../Editor/Common/update_manager.gd.uid | 1 - .../dialogic/Editor/Events/BranchEnd.gd | 85 - .../dialogic/Editor/Events/BranchEnd.gd.uid | 1 - .../dialogic/Editor/Events/BranchEnd.tscn | 48 - .../Editor/Events/EventBlock/event_block.gd | 430 ---- .../Events/EventBlock/event_block.gd.uid | 1 - .../Editor/Events/EventBlock/event_block.tscn | 133 - .../EventBlock/event_right_click_menu.gd | 24 - .../EventBlock/event_right_click_menu.gd.uid | 1 - .../Editor/Events/Fields/array_part.gd | 28 - .../Editor/Events/Fields/array_part.gd.uid | 1 - .../Editor/Events/Fields/array_part.tscn | 39 - .../Editor/Events/Fields/dictionary_part.gd | 43 - .../Events/Fields/dictionary_part.gd.uid | 1 - .../Editor/Events/Fields/dictionary_part.tscn | 54 - .../Editor/Events/Fields/field_array.gd | 48 - .../Editor/Events/Fields/field_array.gd.uid | 1 - .../Editor/Events/Fields/field_array.tscn | 28 - .../Events/Fields/field_audio_preview.gd | 52 - .../Events/Fields/field_audio_preview.gd.uid | 1 - .../Events/Fields/field_audio_preview.tscn | 12 - .../Editor/Events/Fields/field_bool_button.gd | 38 - .../Events/Fields/field_bool_button.gd.uid | 1 - .../Events/Fields/field_bool_button.tscn | 13 - .../Editor/Events/Fields/field_bool_check.gd | 30 - .../Events/Fields/field_bool_check.gd.uid | 1 - .../Events/Fields/field_bool_check.tscn | 8 - .../Editor/Events/Fields/field_color.gd | 30 - .../Editor/Events/Fields/field_color.gd.uid | 1 - .../Editor/Events/Fields/field_color.tscn | 12 - .../Editor/Events/Fields/field_condition.gd | 266 -- .../Events/Fields/field_condition.gd.uid | 1 - .../Editor/Events/Fields/field_condition.tscn | 101 - .../Editor/Events/Fields/field_dictionary.gd | 60 - .../Events/Fields/field_dictionary.gd.uid | 1 - .../Events/Fields/field_dictionary.tscn | 28 - .../Editor/Events/Fields/field_file.gd | 152 -- .../Editor/Events/Fields/field_file.gd.uid | 1 - .../Editor/Events/Fields/field_file.tscn | 78 - .../Editor/Events/Fields/field_flex_value.gd | 154 -- .../Events/Fields/field_flex_value.gd.uid | 1 - .../Events/Fields/field_flex_value.tscn | 15 - .../Events/Fields/field_image_preview.gd | 64 - .../Events/Fields/field_image_preview.gd.uid | 1 - .../Events/Fields/field_image_preview.tscn | 23 - .../Editor/Events/Fields/field_number.gd | 204 -- .../Editor/Events/Fields/field_number.gd.uid | 1 - .../Editor/Events/Fields/field_number.tscn | 160 -- .../Events/Fields/field_options_dynamic.gd | 369 --- .../Fields/field_options_dynamic.gd.uid | 1 - .../Events/Fields/field_options_dynamic.tscn | 144 -- .../Events/Fields/field_options_fixed.gd | 67 - .../Events/Fields/field_options_fixed.gd.uid | 1 - .../Events/Fields/field_options_fixed.tscn | 13 - .../Events/Fields/field_text_multiline.gd | 74 - .../Events/Fields/field_text_multiline.gd.uid | 1 - .../Events/Fields/field_text_multiline.tscn | 28 - .../Events/Fields/field_text_singleline.gd | 40 - .../Fields/field_text_singleline.gd.uid | 1 - .../Events/Fields/field_text_singleline.tscn | 10 - .../Editor/Events/Fields/field_vector2.gd | 31 - .../Editor/Events/Fields/field_vector2.gd.uid | 1 - .../Editor/Events/Fields/field_vector2.tscn | 31 - .../Editor/Events/Fields/field_vector3.gd | 34 - .../Editor/Events/Fields/field_vector3.gd.uid | 1 - .../Editor/Events/Fields/field_vector3.tscn | 17 - .../Editor/Events/Fields/field_vector4.gd | 37 - .../Editor/Events/Fields/field_vector4.gd.uid | 1 - .../Editor/Events/Fields/field_vector4.tscn | 25 - .../Editor/Events/Fields/field_vector_base.gd | 47 - .../Events/Fields/field_vector_base.gd.uid | 1 - .../dialogic/Editor/Events/event_field.gd | 36 - .../dialogic/Editor/Events/event_field.gd.uid | 1 - .../Events/styles/InputFieldsStyle.tres | 50 - .../Events/styles/ResourceMenuHover.tres | 11 - .../Events/styles/ResourceMenuNormal.tres | 13 - .../styles/ResourceMenuPanelBackground.tres | 17 - .../Editor/Events/styles/SectionPanel.tres | 17 - .../Events/styles/SimpleButtonHover.tres | 17 - .../Events/styles/SimpleButtonNormal.tres | 17 - .../Editor/Events/styles/TextBackground.tres | 12 - .../Events/styles/selected_styleboxflat.tres | 16 - .../Events/styles/unselected_stylebox.tres | 7 - .../dialogic/Editor/HomePage/home_page.gd | 86 - .../dialogic/Editor/HomePage/home_page.gd.uid | 1 - .../dialogic/Editor/HomePage/home_page.tscn | 373 --- .../dialogic/Editor/HomePage/icon_bg.png | Bin 150354 -> 0 bytes .../Editor/HomePage/icon_bg.png.import | 40 - .../addons/dialogic/Editor/HomePage/tips.txt | 11 - .../Editor/Images/Dropdown/default.svg | 3 - .../Editor/Images/Dropdown/default.svg.import | 44 - .../Editor/Images/Dropdown/divide.svg | 10 - .../Editor/Images/Dropdown/divide.svg.import | 44 - .../dialogic/Editor/Images/Dropdown/join.svg | 3 - .../Editor/Images/Dropdown/join.svg.import | 44 - .../dialogic/Editor/Images/Dropdown/leave.svg | 3 - .../Editor/Images/Dropdown/leave.svg.import | 44 - .../dialogic/Editor/Images/Dropdown/minus.svg | 10 - .../Editor/Images/Dropdown/minus.svg.import | 44 - .../Editor/Images/Dropdown/multiply.svg | 10 - .../Images/Dropdown/multiply.svg.import | 44 - .../dialogic/Editor/Images/Dropdown/plus.svg | 10 - .../Editor/Images/Dropdown/plus.svg.import | 44 - .../dialogic/Editor/Images/Dropdown/set.svg | 10 - .../Editor/Images/Dropdown/set.svg.import | 44 - .../Editor/Images/Dropdown/update.svg | 5 - .../Editor/Images/Dropdown/update.svg.import | 44 - .../Images/Interactable/decrement_icon.svg | 1 - .../Interactable/decrement_icon.svg.import | 44 - .../Images/Interactable/increment_icon.svg | 1 - .../Interactable/increment_icon.svg.import | 44 - .../Editor/Images/Pieces/add-folder.svg | 4 - .../Images/Pieces/add-folder.svg.import | 44 - .../Editor/Images/Pieces/close-icon.svg | 1 - .../Images/Pieces/close-icon.svg.import | 44 - .../Editor/Images/Pieces/closed-icon.svg | 3 - .../Images/Pieces/closed-icon.svg.import | 44 - .../Editor/Images/Pieces/expand-icon.svg | 5 - .../Images/Pieces/expand-icon.svg.import | 44 - .../Editor/Images/Pieces/open-icon.svg | 3 - .../Editor/Images/Pieces/open-icon.svg.import | 44 - .../Editor/Images/Pieces/variable.svg | 3 - .../Editor/Images/Pieces/variable.svg.import | 44 - .../Editor/Images/Pieces/variable_icon.png | Bin 639 -> 0 bytes .../Images/Pieces/variable_icon.png.import | 40 - .../dialogic/Editor/Images/Pieces/warning.svg | 3 - .../Editor/Images/Pieces/warning.svg.import | 44 - .../Editor/Images/Resources/character.svg | 4 - .../Images/Resources/character.svg.import | 44 - .../Images/Resources/icon_character.png | Bin 569 -> 0 bytes .../Resources/icon_character.png.import | 40 - .../Editor/Images/Resources/portrait.svg | 9 - .../Images/Resources/portrait.svg.import | 44 - .../Editor/Images/Resources/timeline.svg | 115 - .../Images/Resources/timeline.svg.import | 43 - .../Editor/Images/Toolbar/add-character.svg | 4 - .../Images/Toolbar/add-character.svg.import | 44 - .../Editor/Images/Toolbar/add-timeline.svg | 61 - .../Images/Toolbar/add-timeline.svg.import | 44 - .../addons/dialogic/Editor/Images/Unknown.png | Bin 3331 -> 0 bytes .../dialogic/Editor/Images/Unknown.png.import | 40 - .../dialogic/Editor/Images/dialogic-logo.svg | 18 - .../Editor/Images/dialogic-logo.svg.import | 43 - .../dialogic/Editor/Images/plugin-icon.svg | 3 - .../Editor/Images/plugin-icon.svg.import | 44 - .../Editor/Images/preview_character.png | Bin 63720 -> 0 bytes .../Images/preview_character.png.import | 40 - .../Images/preview_character_speaker.png | Bin 40709 -> 0 bytes .../preview_character_speaker.png.import | 40 - .../Editor/Inspector/inspector_plugin.gd | 15 - .../Editor/Inspector/inspector_plugin.gd.uid | 1 - .../Inspector/timeline_inspector_field.gd | 82 - .../Inspector/timeline_inspector_field.gd.uid | 1 - .../Settings/CoreSettingsPages/csv_file.gd | 356 --- .../CoreSettingsPages/csv_file.gd.uid | 1 - .../CoreSettingsPages/settings_editor.gd | 154 -- .../CoreSettingsPages/settings_editor.gd.uid | 1 - .../CoreSettingsPages/settings_editor.tscn | 161 -- .../CoreSettingsPages/settings_general.gd | 177 -- .../CoreSettingsPages/settings_general.gd.uid | 1 - .../CoreSettingsPages/settings_general.tscn | 234 -- .../CoreSettingsPages/settings_modules.gd | 442 ---- .../CoreSettingsPages/settings_modules.gd.uid | 1 - .../CoreSettingsPages/settings_modules.tscn | 236 -- .../CoreSettingsPages/settings_tools.gd | 80 - .../CoreSettingsPages/settings_tools.gd.uid | 1 - .../CoreSettingsPages/settings_translation.gd | 659 ----- .../settings_translation.gd.uid | 1 - .../settings_translation.tscn | 368 --- .../Settings/CoreSettingsPages/tool_resave.gd | 32 - .../CoreSettingsPages/tool_resave.gd.uid | 1 - .../Editor/Settings/HintLabelStylingScript.gd | 13 - .../Settings/HintLabelStylingScript.gd.uid | 1 - .../Editor/Settings/settings_editor.gd | 169 -- .../Editor/Settings/settings_editor.gd.uid | 1 - .../Editor/Settings/settings_editor.tscn | 59 - .../dialogic/Editor/Settings/settings_page.gd | 36 - .../Editor/Settings/settings_page.gd.uid | 1 - .../dialogic/Editor/Theme/MainTheme.tres | 3 - .../dialogic/Editor/Theme/PickerTheme.tres | 7 - .../TextEditor/CodeCompletionHelper.gd | 333 --- .../TextEditor/CodeCompletionHelper.gd.uid | 1 - .../TextEditor/syntax_highlighter.gd | 212 -- .../TextEditor/syntax_highlighter.gd.uid | 1 - .../TextEditor/timeline_editor_text.gd | 362 --- .../TextEditor/timeline_editor_text.gd.uid | 1 - .../TextEditor/timeline_editor_text.tscn | 32 - .../VisualEditor/AddEventButton.gd | 63 - .../VisualEditor/AddEventButton.gd.uid | 1 - .../VisualEditor/AddEventButton.tscn | 46 - .../VisualEditor/TimelineArea.gd | 204 -- .../VisualEditor/TimelineArea.gd.uid | 1 - .../VisualEditor/timeline_editor_visual.gd | 1438 ----------- .../timeline_editor_visual.gd.uid | 1 - .../VisualEditor/timeline_editor_visual.tscn | 116 - .../Editor/TimelineEditor/shortcut_popup.gd | 118 - .../TimelineEditor/shortcut_popup.gd.uid | 1 - .../TimelineEditor/test_timeline_scene.gd | 44 - .../TimelineEditor/test_timeline_scene.gd.uid | 1 - .../TimelineEditor/test_timeline_scene.tscn | 25 - .../Editor/TimelineEditor/timeline_editor.gd | 321 --- .../TimelineEditor/timeline_editor.gd.uid | 1 - .../TimelineEditor/timeline_editor.tscn | 315 --- .../addons/dialogic/Editor/dialogic_editor.gd | 67 - .../dialogic/Editor/dialogic_editor.gd.uid | 1 - godot/addons/dialogic/Editor/editor_main.gd | 310 --- .../addons/dialogic/Editor/editor_main.gd.uid | 1 - godot/addons/dialogic/Editor/editor_main.tscn | 161 -- .../addons/dialogic/Editor/editors_manager.gd | 284 -- .../dialogic/Editor/editors_manager.gd.uid | 1 - .../dialogic/Example Assets/Fonts/LICENSE.txt | 202 -- .../Example Assets/Fonts/Roboto-Bold.ttf | Bin 170348 -> 0 bytes .../Fonts/Roboto-Bold.ttf.import | 36 - .../Example Assets/Fonts/Roboto-Italic.ttf | Bin 173516 -> 0 bytes .../Fonts/Roboto-Italic.ttf.import | 36 - .../Example Assets/Fonts/Roboto-Regular.ttf | Bin 171272 -> 0 bytes .../Fonts/Roboto-Regular.ttf.import | 36 - .../Example Assets/already_read_indicator.gd | 12 - .../already_read_indicator.gd.uid | 1 - .../Example Assets/backgrounds/BubbleEnd.png | Bin 1619 -> 0 bytes .../backgrounds/BubbleEnd.png.import | 40 - .../backgrounds/new-default-dialog.png.import | 34 - .../Example Assets/backgrounds/rpg_box.webp | Bin 1812 -> 0 bytes .../backgrounds/rpg_box.webp.import | 40 - .../bbcode_transition_effect.gd | 84 - .../bbcode_transition_effect.gd.uid | 1 - .../bbcode_transitions/fade_in.tres | 17 - .../bbcode_transitions/fade_scale_in.tres | 24 - .../bbcode_transitions/fancy_in.tres | 35 - .../bbcode_transitions/shaky_in.tres | 35 - .../dialogic/Example Assets/default_event.gd | 51 - .../Example Assets/default_event.gd.uid | 1 - .../next-indicator-dialogic-1.png | Bin 2825 -> 0 bytes .../next-indicator-dialogic-1.png.import | 40 - .../next-indicator/next-indicator.png | Bin 4189 -> 0 bytes .../next-indicator/next-indicator.png.import | 40 - .../portraits/Antonio/pl5 blink.png | Bin 64904 -> 0 bytes .../portraits/Antonio/pl5 blink.png.import | 40 - .../portraits/Antonio/pl5 doubt.png | Bin 65461 -> 0 bytes .../portraits/Antonio/pl5 doubt.png.import | 40 - .../portraits/Antonio/pl5 hate.png | Bin 67008 -> 0 bytes .../portraits/Antonio/pl5 hate.png.import | 40 - .../portraits/Antonio/pl5 plot.png | Bin 65154 -> 0 bytes .../portraits/Antonio/pl5 plot.png.import | 40 - .../portraits/Antonio/pl5 sad.png | Bin 66584 -> 0 bytes .../portraits/Antonio/pl5 sad.png.import | 40 - .../portraits/Antonio/pl5 scoff.png | Bin 66038 -> 0 bytes .../portraits/Antonio/pl5 scoff.png.import | 40 - .../portraits/Antonio/pl5 shy.png | Bin 67080 -> 0 bytes .../portraits/Antonio/pl5 shy.png.import | 40 - .../portraits/Antonio/pl5 surprise.png | Bin 66519 -> 0 bytes .../portraits/Antonio/pl5 surprise.png.import | 40 - .../Example Assets/portraits/Antonio/pl5.png | Bin 65862 -> 0 bytes .../portraits/Antonio/pl5.png.import | 40 - .../CustomPortrait_AnimatedSprite.gd | 18 - .../CustomPortrait_AnimatedSprite.gd.uid | 1 - .../CustomPortrait_AnimatedSprite.tscn | 56 - .../portraits/CustomPortrait_FaceAtlas.gd | 70 - .../portraits/CustomPortrait_FaceAtlas.gd.uid | 1 - .../portraits/CustomPortrait_FaceAtlas.tscn | 67 - .../portraits/Jane/pl3 avoid.png | Bin 83484 -> 0 bytes .../portraits/Jane/pl3 avoid.png.import | 40 - .../portraits/Jane/pl3 blink.png | Bin 83051 -> 0 bytes .../portraits/Jane/pl3 blink.png.import | 40 - .../portraits/Jane/pl3 concept.png | Bin 84581 -> 0 bytes .../portraits/Jane/pl3 concept.png.import | 40 - .../portraits/Jane/pl3 confusion.png | Bin 83708 -> 0 bytes .../portraits/Jane/pl3 confusion.png.import | 40 - .../portraits/Jane/pl3 doubt.png | Bin 83418 -> 0 bytes .../portraits/Jane/pl3 doubt.png.import | 40 - .../portraits/Jane/pl3 happy.png | Bin 83641 -> 0 bytes .../portraits/Jane/pl3 happy.png.import | 40 - .../portraits/Jane/pl3 plot.png | Bin 83605 -> 0 bytes .../portraits/Jane/pl3 plot.png.import | 40 - .../Example Assets/portraits/Jane/pl3 sad.png | Bin 84668 -> 0 bytes .../portraits/Jane/pl3 sad.png.import | 40 - .../Example Assets/portraits/Jane/pl3 shy.png | Bin 84186 -> 0 bytes .../portraits/Jane/pl3 shy.png.import | 40 - .../portraits/Jane/pl3 surprise.png | Bin 83571 -> 0 bytes .../portraits/Jane/pl3 surprise.png.import | 40 - .../Example Assets/portraits/Portrait1.png | Bin 33867 -> 0 bytes .../portraits/Portrait1.png.import | 40 - .../Example Assets/portraits/Portrait2.png | Bin 37957 -> 0 bytes .../portraits/Portrait2.png.import | 40 - .../portraits/Princess/anger.png | Bin 20766 -> 0 bytes .../portraits/Princess/anger.png.import | 40 - .../portraits/Princess/frown.png | Bin 18664 -> 0 bytes .../portraits/Princess/frown.png.import | 40 - .../Example Assets/portraits/Princess/joy.png | Bin 14174 -> 0 bytes .../portraits/Princess/joy.png.import | 40 - .../portraits/Princess/neutral.png | Bin 19825 -> 0 bytes .../portraits/Princess/neutral.png.import | 40 - .../portraits/Princess/princess_blank.png | Bin 744931 -> 0 bytes .../Princess/princess_blank.png.import | 40 - .../portraits/Princess/shock.png | Bin 21616 -> 0 bytes .../portraits/Princess/shock.png.import | 40 - .../portraits/Princess/smile.png | Bin 19829 -> 0 bytes .../portraits/Princess/smile.png.import | 40 - .../portraits/rpg_portraits/base1.png | Bin 1329 -> 0 bytes .../portraits/rpg_portraits/base1.png.import | 40 - .../portraits/rpg_portraits/base2.png | Bin 1312 -> 0 bytes .../portraits/rpg_portraits/base2.png.import | 40 - .../portraits/rpg_portraits/base3.png | Bin 1127 -> 0 bytes .../portraits/rpg_portraits/base3.png.import | 40 - .../portraits/rpg_portraits/base4.png | Bin 1358 -> 0 bytes .../portraits/rpg_portraits/base4.png.import | 40 - .../Example Assets/sound-effects/LICENSE.txt | 4 - .../Example Assets/sound-effects/typing1.wav | Bin 25516 -> 0 bytes .../sound-effects/typing1.wav.import | 24 - .../Example Assets/sound-effects/typing2.wav | Bin 21932 -> 0 bytes .../sound-effects/typing2.wav.import | 24 - .../Example Assets/sound-effects/typing3.wav | Bin 21356 -> 0 bytes .../sound-effects/typing3.wav.import | 24 - .../Example Assets/sound-effects/typing4.wav | Bin 23404 -> 0 bytes .../sound-effects/typing4.wav.import | 24 - .../Example Assets/sound-effects/typing5.wav | Bin 24876 -> 0 bytes .../sound-effects/typing5.wav.import | 24 - .../dialogic/Modules/Audio/event_audio.gd | 397 --- .../dialogic/Modules/Audio/event_audio.gd.uid | 1 - .../dialogic/Modules/Audio/icon_music.png | Bin 552 -> 0 bytes .../Modules/Audio/icon_music.png.import | 40 - .../dialogic/Modules/Audio/icon_sound.png | Bin 524 -> 0 bytes .../Modules/Audio/icon_sound.png.import | 40 - godot/addons/dialogic/Modules/Audio/index.gd | 14 - .../dialogic/Modules/Audio/index.gd.uid | 1 - .../dialogic/Modules/Audio/settings_audio.gd | 241 -- .../Modules/Audio/settings_audio.gd.uid | 1 - .../Modules/Audio/settings_audio.tscn | 113 - .../dialogic/Modules/Audio/subsystem_audio.gd | 284 -- .../Modules/Audio/subsystem_audio.gd.uid | 1 - .../default_background.gd | 31 - .../default_background.gd.uid | 1 - .../default_background.tscn | 29 - .../Transitions/Defaults/push_down.gd | 7 - .../Transitions/Defaults/push_down.gd.uid | 1 - .../Transitions/Defaults/push_left.gd | 7 - .../Transitions/Defaults/push_left.gd.uid | 1 - .../Transitions/Defaults/push_right.gd | 7 - .../Transitions/Defaults/push_right.gd.uid | 1 - .../Transitions/Defaults/push_up.gd | 7 - .../Transitions/Defaults/push_up.gd.uid | 1 - .../Transitions/Defaults/simple_fade.gd | 13 - .../Transitions/Defaults/simple_fade.gd.uid | 1 - .../Transitions/Defaults/simple_fade.tres | 8 - .../Defaults/swipe_diagonal_up_left.gd | 8 - .../Defaults/swipe_diagonal_up_left.gd.uid | 1 - .../Defaults/swipe_left_to_right.gd | 10 - .../Defaults/swipe_left_to_right.gd.uid | 1 - .../Defaults/swipe_right_to_left.gd | 8 - .../Defaults/swipe_right_to_left.gd.uid | 1 - .../class_dialogic_background_transition.gd | 57 - ...lass_dialogic_background_transition.gd.uid | 1 - .../default_transition_shader.gdshader | 36 - .../default_transition_shader.gdshader.uid | 1 - .../push_transition_shader.gdshader | 17 - .../push_transition_shader.gdshader.uid | 1 - .../Transitions/simple_push_transitions.gd | 9 - .../simple_push_transitions.gd.uid | 1 - .../Transitions/simple_swipe_gradient.tres | 7 - .../Transitions/simple_swipe_transitions.gd | 14 - .../simple_swipe_transitions.gd.uid | 1 - .../Modules/Background/dialogic_background.gd | 38 - .../Background/dialogic_background.gd.uid | 1 - .../Modules/Background/event_background.gd | 164 -- .../Background/event_background.gd.uid | 1 - .../dialogic/Modules/Background/icon.png | Bin 512 -> 0 bytes .../Modules/Background/icon.png.import | 40 - .../dialogic/Modules/Background/index.gd | 13 - .../dialogic/Modules/Background/index.gd.uid | 1 - .../Background/node_background_holder.gd | 6 - .../Background/node_background_holder.gd.uid | 1 - .../Background/subsystem_backgrounds.gd | 194 -- .../Background/subsystem_backgrounds.gd.uid | 1 - .../dialogic/Modules/Call/event_call.gd | 235 -- .../dialogic/Modules/Call/event_call.gd.uid | 1 - godot/addons/dialogic/Modules/Call/icon.png | Bin 554 -> 0 bytes .../dialogic/Modules/Call/icon.png.import | 40 - godot/addons/dialogic/Modules/Call/index.gd | 6 - .../addons/dialogic/Modules/Call/index.gd.uid | 1 - .../Character/DefaultAnimations/bounce.gd | 16 - .../Character/DefaultAnimations/bounce.gd.uid | 1 - .../DefaultAnimations/bounce_in_out.gd | 39 - .../DefaultAnimations/bounce_in_out.gd.uid | 1 - .../DefaultAnimations/fade_down_in_out.gd | 44 - .../DefaultAnimations/fade_down_in_out.gd.uid | 1 - .../DefaultAnimations/fade_in_out.gd | 34 - .../DefaultAnimations/fade_in_out.gd.uid | 1 - .../DefaultAnimations/fade_up_in_out.gd | 44 - .../DefaultAnimations/fade_up_in_out.gd.uid | 1 - .../Character/DefaultAnimations/heartbeat.gd | 13 - .../DefaultAnimations/heartbeat.gd.uid | 1 - .../DefaultAnimations/instant_in_out.gd | 12 - .../DefaultAnimations/instant_in_out.gd.uid | 1 - .../Character/DefaultAnimations/shake_x.gd | 20 - .../DefaultAnimations/shake_x.gd.uid | 1 - .../Character/DefaultAnimations/shake_y.gd | 23 - .../DefaultAnimations/shake_y.gd.uid | 1 - .../DefaultAnimations/slide_down_in_out.gd | 27 - .../slide_down_in_out.gd.uid | 1 - .../DefaultAnimations/slide_left_in_out.gd | 27 - .../slide_left_in_out.gd.uid | 1 - .../DefaultAnimations/slide_right_in_out.gd | 24 - .../slide_right_in_out.gd.uid | 1 - .../DefaultAnimations/slide_up_in.gd | 26 - .../DefaultAnimations/slide_up_in.gd.uid | 1 - .../Character/DefaultAnimations/tada.gd | 25 - .../Character/DefaultAnimations/tada.gd.uid | 1 - .../DefaultAnimations/zoom_center_in_out.gd | 36 - .../zoom_center_in_out.gd.uid | 1 - .../DefaultAnimations/zoom_in_out.gd | 35 - .../DefaultAnimations/zoom_in_out.gd.uid | 1 - .../DialogicPortraitAnimationsUtil.gd | 47 - .../DialogicPortraitAnimationsUtil.gd.uid | 1 - .../Character/class_dialogic_animation.gd | 102 - .../Character/class_dialogic_animation.gd.uid | 1 - .../Character/custom_portrait_thumbnail.png | Bin 2888 -> 0 bytes .../custom_portrait_thumbnail.png.import | 40 - .../Modules/Character/default_portrait.gd | 15 - .../Modules/Character/default_portrait.gd.uid | 1 - .../Modules/Character/default_portrait.tscn | 9 - .../Character/default_portrait_thumbnail.png | Bin 5647 -> 0 bytes .../default_portrait_thumbnail.png.import | 40 - .../Modules/Character/dialogic_portrait.gd | 121 - .../Character/dialogic_portrait.gd.uid | 1 - .../Modules/Character/event_character.gd | 581 ----- .../Modules/Character/event_character.gd.uid | 1 - .../Modules/Character/icon.png.import | 34 - .../dialogic/Modules/Character/icon.svg | 4 - .../Modules/Character/icon.svg.import | 44 - .../Modules/Character/icon_position.png | Bin 1017 -> 0 bytes .../Character/icon_position.png.import | 40 - .../dialogic/Modules/Character/index.gd | 58 - .../dialogic/Modules/Character/index.gd.uid | 1 - .../Character/node_portrait_container.gd | 258 -- .../Character/node_portrait_container.gd.uid | 1 - .../Modules/Character/portrait_position.svg | 8 - .../Character/portrait_position.svg.import | 44 - .../Modules/Character/preview_character.tres | 32 - .../Modules/Character/settings_portraits.gd | 92 - .../Character/settings_portraits.gd.uid | 1 - .../Modules/Character/settings_portraits.tscn | 157 -- .../simple_image_portrait_thumbnail.png | Bin 3462 -> 0 bytes ...simple_image_portrait_thumbnail.png.import | 40 - .../Modules/Character/subsystem_containers.gd | 285 --- .../Character/subsystem_containers.gd.uid | 1 - .../Modules/Character/subsystem_portraits.gd | 729 ------ .../Character/subsystem_portraits.gd.uid | 1 - .../Modules/Character/update_mirror.svg | 18 - .../Character/update_mirror.svg.import | 44 - .../Modules/Character/update_portrait.svg | 9 - .../Character/update_portrait.svg.import | 44 - .../Modules/Character/update_position.svg | 18 - ...ate_position.svg.2023_09_23_08_37_47.0.svg | 18 - ...ition.svg.2023_09_23_08_37_47.0.svg.import | 44 - .../Character/update_position.svg.import | 44 - .../Modules/Character/update_z_index.svg | 14 - .../Character/update_z_index.svg.import | 44 - .../dialogic/Modules/Choice/event_choice.gd | 236 -- .../Modules/Choice/event_choice.gd.uid | 1 - godot/addons/dialogic/Modules/Choice/icon.svg | 10 - .../dialogic/Modules/Choice/icon.svg.import | 44 - godot/addons/dialogic/Modules/Choice/index.gd | 14 - .../dialogic/Modules/Choice/index.gd.uid | 1 - .../Modules/Choice/node_button_sound.gd | 52 - .../Modules/Choice/node_button_sound.gd.uid | 1 - .../Modules/Choice/node_choice_button.gd | 120 - .../Modules/Choice/node_choice_button.gd.uid | 1 - .../Modules/Choice/settings_choices.gd | 67 - .../Modules/Choice/settings_choices.gd.uid | 1 - .../Modules/Choice/settings_choices.tscn | 176 -- .../Modules/Choice/subsystem_choices.gd | 301 --- .../Modules/Choice/subsystem_choices.gd.uid | 1 - .../dialogic/Modules/Choice/ui_choice_end.gd | 28 - .../Modules/Choice/ui_choice_end.gd.uid | 1 - .../Modules/Choice/ui_choice_end.tscn | 20 - .../Modules/Clear/clear_background.svg | 2 - .../Modules/Clear/clear_background.svg.import | 44 - .../Modules/Clear/clear_characters.svg | 16 - .../Modules/Clear/clear_characters.svg.import | 44 - .../dialogic/Modules/Clear/clear_music.svg | 2 - .../Modules/Clear/clear_music.svg.import | 44 - .../Modules/Clear/clear_positions.svg | 2 - .../Modules/Clear/clear_positions.svg.import | 44 - .../dialogic/Modules/Clear/clear_style.svg | 2 - .../Modules/Clear/clear_style.svg.import | 44 - .../dialogic/Modules/Clear/clear_textbox.svg | 2 - .../Modules/Clear/clear_textbox.svg.import | 44 - .../dialogic/Modules/Clear/event_clear.gd | 114 - .../dialogic/Modules/Clear/event_clear.gd.uid | 1 - godot/addons/dialogic/Modules/Clear/icon.png | Bin 558 -> 0 bytes .../dialogic/Modules/Clear/icon.png.import | 40 - godot/addons/dialogic/Modules/Clear/index.gd | 6 - .../dialogic/Modules/Clear/index.gd.uid | 1 - .../dialogic/Modules/Comment/event_comment.gd | 65 - .../Modules/Comment/event_comment.gd.uid | 1 - .../addons/dialogic/Modules/Comment/icon.png | Bin 398 -> 0 bytes .../dialogic/Modules/Comment/icon.png.import | 40 - .../addons/dialogic/Modules/Comment/index.gd | 6 - .../dialogic/Modules/Comment/index.gd.uid | 1 - .../Modules/Condition/event_condition.gd | 137 - .../Modules/Condition/event_condition.gd.uid | 1 - .../dialogic/Modules/Condition/icon.svg | 12 - .../Modules/Condition/icon.svg.import | 44 - .../dialogic/Modules/Condition/index.gd | 6 - .../dialogic/Modules/Condition/index.gd.uid | 1 - .../Modules/Condition/ui_condition_end.gd | 51 - .../Modules/Condition/ui_condition_end.gd.uid | 1 - .../Modules/Condition/ui_condition_end.tscn | 26 - .../dialogic/Modules/Core/event_end_branch.gd | 81 - .../Modules/Core/event_end_branch.gd.uid | 1 - godot/addons/dialogic/Modules/Core/icon.png | Bin 558 -> 0 bytes .../dialogic/Modules/Core/icon.png.import | 40 - godot/addons/dialogic/Modules/Core/index.gd | 27 - .../addons/dialogic/Modules/Core/index.gd.uid | 1 - .../Modules/Core/subsystem_animation.gd | 42 - .../Modules/Core/subsystem_animation.gd.uid | 1 - .../Modules/Core/subsystem_expression.gd | 103 - .../Modules/Core/subsystem_expression.gd.uid | 1 - .../dialogic/Modules/Core/subsystem_input.gd | 217 -- .../Modules/Core/subsystem_input.gd.uid | 1 - .../Base_Default/default_layout_base.gd | 21 - .../Base_Default/default_layout_base.gd.uid | 1 - .../Base_Default/default_layout_base.tscn | 6 - .../Base_Default/part_config.cfg | 6 - .../Base_TextBubble/part_config.cfg | 6 - .../Base_TextBubble/text_bubble_base.gd | 95 - .../Base_TextBubble/text_bubble_base.gd.uid | 1 - .../Base_TextBubble/text_bubble_base.tscn | 55 - .../background_layer_icon.svg | 7 - .../background_layer_icon.svg.import | 44 - .../full_background_layer.gd | 2 - .../full_background_layer.gd.uid | 1 - .../full_background_layer.tscn | 25 - .../Layer_FullBackground/part_config.cfg | 7 - .../Layer_FullBackground/preview.png | Bin 924 -> 0 bytes .../Layer_FullBackground/preview.png.import | 40 - .../Layer_Glossary/glossary_popup_layer.gd | 177 -- .../glossary_popup_layer.gd.uid | 1 - .../Layer_Glossary/glossary_popup_layer.tscn | 87 - .../Layer_Glossary/part_config.cfg | 7 - .../popup_glossary_layer_icon.svg | 20 - .../popup_glossary_layer_icon.svg.import | 44 - .../Layer_Glossary/preview.png | Bin 12796 -> 0 bytes .../Layer_Glossary/preview.png.import | 40 - .../Layer_History/example_history_item.gd | 30 - .../Layer_History/example_history_item.gd.uid | 1 - .../Layer_History/example_history_item.tscn | 46 - .../Layer_History/history_icon.svg | 23 - .../Layer_History/history_icon.svg.import | 44 - .../Layer_History/history_layer.gd | 151 -- .../Layer_History/history_layer.gd.uid | 1 - .../Layer_History/history_layer.tscn | 93 - .../Layer_History/part_config.cfg | 7 - .../Layer_History/preview.png | Bin 11740 -> 0 bytes .../Layer_History/preview.png.import | 40 - .../Layer_Input/full_advance_input_layer.gd | 4 - .../full_advance_input_layer.gd.uid | 1 - .../Layer_Input/full_advance_input_layer.tscn | 24 - .../Layer_Input/input_layer_icon.svg | 14 - .../Layer_Input/input_layer_icon.svg.import | 44 - .../Layer_Input/part_config.cfg | 7 - .../Layer_Input/preview.png | Bin 2258 -> 0 bytes .../Layer_Input/preview.png.import | 40 - .../default_stylebox.tres | 13 - .../part_config.cfg | 7 - .../Layer_SpeakerPortraitTextbox/preview.png | Bin 7997 -> 0 bytes .../preview.png.import | 40 - .../speaker-textbox-icon.svg | 19 - .../speaker-textbox-icon.svg.import | 44 - .../speaker_portrait_textbox_layer.gd | 129 - .../speaker_portrait_textbox_layer.gd.uid | 1 - .../textbox_with_speaker_portrait.tscn | 124 - .../Layer_TextInput/part_config.cfg | 7 - .../Layer_TextInput/preview.png | Bin 4097 -> 0 bytes .../Layer_TextInput/preview.png.import | 40 - .../Layer_TextInput/text_input_layer.gd | 14 - .../Layer_TextInput/text_input_layer.gd.uid | 1 - .../Layer_TextInput/text_input_layer.tscn | 76 - .../Layer_TextInput/text_input_layer_icon.svg | 23 - .../text_input_layer_icon.svg.import | 44 - .../Layer_Textbubble/part_config.cfg | 7 - .../Layer_Textbubble/preview.png | Bin 7302 -> 0 bytes .../Layer_Textbubble/preview.png.import | 40 - .../Layer_Textbubble/speech_bubble.gdshader | 17 - .../speech_bubble.gdshader.uid | 1 - .../Layer_Textbubble/text_bubble.gd | 246 -- .../Layer_Textbubble/text_bubble.gd.uid | 1 - .../Layer_Textbubble/text_bubble.gdshader | 17 - .../Layer_Textbubble/text_bubble.gdshader.uid | 1 - .../Layer_Textbubble/text_bubble.tscn | 112 - .../Layer_Textbubble/text_bubble_layer.gd | 191 -- .../Layer_Textbubble/text_bubble_layer.gd.uid | 1 - .../Layer_Textbubble/text_bubble_layer.tscn | 9 - .../text_bubble_layer_icon.svg | 14 - .../text_bubble_layer_icon.svg.import | 44 - .../Layer_VN_Choices/choice_panel_focus.tres | 15 - .../Layer_VN_Choices/choice_panel_hover.tres | 18 - .../Layer_VN_Choices/choice_panel_normal.tres | 12 - .../Layer_VN_Choices/choices_layer_icon.svg | 11 - .../choices_layer_icon.svg.import | 44 - .../Layer_VN_Choices/part_config.cfg | 7 - .../Layer_VN_Choices/preview.png | Bin 8238 -> 0 bytes .../Layer_VN_Choices/preview.png.import | 40 - .../Layer_VN_Choices/vn_choice_layer.gd | 143 -- .../Layer_VN_Choices/vn_choice_layer.gd.uid | 1 - .../Layer_VN_Choices/vn_choice_layer.tscn | 43 - .../Layer_VN_Portraits/part_config.cfg | 7 - .../portrait_layer_icon.svg | 22 - .../portrait_layer_icon.svg.import | 44 - .../Layer_VN_Portraits/preview.png | Bin 49117 -> 0 bytes .../Layer_VN_Portraits/preview.png.import | 40 - .../Layer_VN_Portraits/vn_portrait_layer.gd | 14 - .../vn_portrait_layer.gd.uid | 1 - .../Layer_VN_Portraits/vn_portrait_layer.tscn | 84 - .../Layer_VN_Textbox/animations.gd | 93 - .../Layer_VN_Textbox/animations.gd.uid | 1 - .../Layer_VN_Textbox/autoadvance_indicator.gd | 13 - .../autoadvance_indicator.gd.uid | 1 - .../Layer_VN_Textbox/next.svg | 12 - .../Layer_VN_Textbox/next.svg.import | 43 - .../Layer_VN_Textbox/part_config.cfg | 7 - .../Layer_VN_Textbox/preview.png | Bin 3353 -> 0 bytes .../Layer_VN_Textbox/preview.png.import | 40 - .../Layer_VN_Textbox/textbox_layer_icon.svg | 13 - .../textbox_layer_icon.svg.import | 44 - .../vn_textbox_default_panel.tres | 12 - .../Layer_VN_Textbox/vn_textbox_layer.gd | 278 -- .../Layer_VN_Textbox/vn_textbox_layer.gd.uid | 1 - .../Layer_VN_Textbox/vn_textbox_layer.tscn | 345 --- .../vn_textbox_name_label_panel.tres | 12 - .../Style_SpeakerTextbox/part_config.cfg | 6 - .../Style_SpeakerTextbox/preview.png | Bin 1094641 -> 0 bytes .../Style_SpeakerTextbox/preview.png.import | 40 - .../speaker_textbox_style.tres | 68 - .../Style_TextBubbles/part_config.cfg | 6 - .../Style_TextBubbles/preview.png | Bin 19024 -> 0 bytes .../Style_TextBubbles/preview.png.import | 40 - .../Style_TextBubbles/textbubble_style.tres | 35 - .../Style_VN_Default/default_vn_style.tres | 75 - .../Style_VN_Default/part_config.cfg | 6 - .../Style_VN_Default/preview.png | Bin 1150972 -> 0 bytes .../Style_VN_Default/preview.png.import | 40 - .../Modules/DefaultLayoutParts/index.gd | 6 - .../Modules/DefaultLayoutParts/index.gd.uid | 1 - .../addons/dialogic/Modules/End/event_end.gd | 44 - .../dialogic/Modules/End/event_end.gd.uid | 1 - godot/addons/dialogic/Modules/End/icon.png | Bin 558 -> 0 bytes .../dialogic/Modules/End/icon.png.import | 40 - godot/addons/dialogic/Modules/End/index.gd | 6 - .../addons/dialogic/Modules/End/index.gd.uid | 1 - .../Modules/Glossary/add-glossary.svg | 4 - .../Modules/Glossary/add-glossary.svg.import | 44 - .../Modules/Glossary/event_glossary.gd | 42 - .../Modules/Glossary/event_glossary.gd.uid | 1 - .../Modules/Glossary/glossary_editor.gd | 461 ---- .../Modules/Glossary/glossary_editor.gd.uid | 1 - .../Modules/Glossary/glossary_editor.tscn | 319 --- .../Modules/Glossary/glossary_resource.gd | 340 --- .../Modules/Glossary/glossary_resource.gd.uid | 1 - .../dialogic/Modules/Glossary/icon.png.import | 34 - .../addons/dialogic/Modules/Glossary/icon.svg | 3 - .../dialogic/Modules/Glossary/icon.svg.import | 44 - .../addons/dialogic/Modules/Glossary/index.gd | 14 - .../dialogic/Modules/Glossary/index.gd.uid | 1 - .../Modules/Glossary/subsystem_glossary.gd | 174 -- .../Glossary/subsystem_glossary.gd.uid | 1 - .../highlight_portrait_thumbnail.png | Bin 5955 -> 0 bytes .../highlight_portrait_thumbnail.png.import | 40 - .../Modules/HighlightPortrait/index.gd | 17 - .../Modules/HighlightPortrait/index.gd.uid | 1 - .../simple_highlight_portrait.gd | 34 - .../simple_highlight_portrait.gd.uid | 1 - .../simple_highlight_portrait.tscn | 9 - .../dialogic/Modules/History/definition.svg | 3 - .../Modules/History/definition.svg.import | 44 - .../dialogic/Modules/History/event_history.gd | 76 - .../Modules/History/event_history.gd.uid | 1 - .../addons/dialogic/Modules/History/icon.svg | 11 - .../dialogic/Modules/History/icon.svg.import | 44 - .../addons/dialogic/Modules/History/index.gd | 13 - .../dialogic/Modules/History/index.gd.uid | 1 - .../Modules/History/settings_history.gd | 29 - .../Modules/History/settings_history.gd.uid | 1 - .../Modules/History/settings_history.tscn | 176 -- .../Modules/History/subsystem_history.gd | 305 --- .../Modules/History/subsystem_history.gd.uid | 1 - .../dialogic/Modules/Jump/event_jump.gd | 166 -- .../dialogic/Modules/Jump/event_jump.gd.uid | 1 - .../dialogic/Modules/Jump/event_label.gd | 114 - .../dialogic/Modules/Jump/event_label.gd.uid | 1 - .../dialogic/Modules/Jump/event_return.gd | 73 - .../dialogic/Modules/Jump/event_return.gd.uid | 1 - .../dialogic/Modules/Jump/icon.png.import | 34 - .../dialogic/Modules/Jump/icon_jump.png | Bin 730 -> 0 bytes .../Modules/Jump/icon_jump.png.import | 40 - .../dialogic/Modules/Jump/icon_label.png | Bin 466 -> 0 bytes .../Modules/Jump/icon_label.png.import | 40 - .../dialogic/Modules/Jump/icon_return.svg | 8 - .../Modules/Jump/icon_return.svg.import | 44 - godot/addons/dialogic/Modules/Jump/index.gd | 9 - .../addons/dialogic/Modules/Jump/index.gd.uid | 1 - .../dialogic/Modules/Jump/subsystem_jump.gd | 123 - .../Modules/Jump/subsystem_jump.gd.uid | 1 - .../custom_layered_portrait.gd | 3 - .../custom_layered_portrait.gd.uid | 1 - .../dialogic/Modules/LayeredPortrait/index.gd | 17 - .../Modules/LayeredPortrait/index.gd.uid | 1 - .../LayeredPortrait/layered_portrait.gd | 252 -- .../LayeredPortrait/layered_portrait.gd.uid | 1 - .../LayeredPortrait/layered_portrait.tscn | 14 - .../layered_portrait_thumbnail.png | Bin 7448 -> 0 bytes .../layered_portrait_thumbnail.png.import | 40 - .../dialogic/Modules/Save/event_save.gd | 65 - .../dialogic/Modules/Save/event_save.gd.uid | 1 - godot/addons/dialogic/Modules/Save/icon.svg | 8 - .../dialogic/Modules/Save/icon.svg.import | 44 - godot/addons/dialogic/Modules/Save/index.gd | 14 - .../addons/dialogic/Modules/Save/index.gd.uid | 1 - .../dialogic/Modules/Save/settings_save.gd | 57 - .../Modules/Save/settings_save.gd.uid | 1 - .../dialogic/Modules/Save/settings_save.tscn | 143 -- .../dialogic/Modules/Save/subsystem_save.gd | 519 ---- .../Modules/Save/subsystem_save.gd.uid | 1 - .../Modules/Settings/event_setting.gd | 243 -- .../Modules/Settings/event_setting.gd.uid | 1 - .../addons/dialogic/Modules/Settings/icon.svg | 18 - .../dialogic/Modules/Settings/icon.svg.import | 44 - .../addons/dialogic/Modules/Settings/index.gd | 10 - .../dialogic/Modules/Settings/index.gd.uid | 1 - .../Modules/Settings/subsystem_settings.gd | 98 - .../Settings/subsystem_settings.gd.uid | 1 - .../dialogic/Modules/Signal/event_signal.gd | 83 - .../Modules/Signal/event_signal.gd.uid | 1 - godot/addons/dialogic/Modules/Signal/icon.png | Bin 700 -> 0 bytes .../dialogic/Modules/Signal/icon.png.import | 40 - godot/addons/dialogic/Modules/Signal/index.gd | 7 - .../dialogic/Modules/Signal/index.gd.uid | 1 - .../Modules/Style/DialogicStylesUtil.gd | 79 - .../Modules/Style/DialogicStylesUtil.gd.uid | 1 - .../Modules/Style/character_settings_style.gd | 34 - .../Style/character_settings_style.gd.uid | 1 - .../Style/character_settings_style.tscn | 22 - .../dialogic/Modules/Style/event_style.gd | 71 - .../dialogic/Modules/Style/event_style.gd.uid | 1 - godot/addons/dialogic/Modules/Style/icon.png | Bin 553 -> 0 bytes .../dialogic/Modules/Style/icon.png.import | 40 - godot/addons/dialogic/Modules/Style/index.gd | 14 - .../dialogic/Modules/Style/index.gd.uid | 1 - .../dialogic/Modules/Style/node_style.gd | 13 - .../dialogic/Modules/Style/node_style.gd.uid | 1 - .../Modules/Style/subsystem_styles.gd | 183 -- .../Modules/Style/subsystem_styles.gd.uid | 1 - .../StyleEditor/Components/style_browser.gd | 113 - .../Components/style_browser.gd.uid | 1 - .../StyleEditor/Components/style_browser.tscn | 243 -- .../Components/style_browser_window.gd | 22 - .../Components/style_browser_window.gd.uid | 1 - .../Components/style_layer_tree.gd | 53 - .../Components/style_layer_tree.gd.uid | 1 - .../dialogic/Modules/StyleEditor/index.gd | 5 - .../dialogic/Modules/StyleEditor/index.gd.uid | 1 - .../Modules/StyleEditor/style_editor.gd | 401 --- .../Modules/StyleEditor/style_editor.gd.uid | 1 - .../Modules/StyleEditor/style_editor.tscn | 446 ---- .../Modules/StyleEditor/style_layer_editor.gd | 542 ---- .../StyleEditor/style_layer_editor.gd.uid | 1 - .../Modules/StyleEditor/styles_icon.svg | 1 - .../StyleEditor/styles_icon.svg.import | 44 - .../Text/DNextIndicator_icon.svg.import | 39 - .../dialogic/Modules/Text/auto_advance.gd | 232 -- .../dialogic/Modules/Text/auto_advance.gd.uid | 1 - .../addons/dialogic/Modules/Text/auto_skip.gd | 70 - .../dialogic/Modules/Text/auto_skip.gd.uid | 1 - .../character_moods_settings.gd | 231 -- .../character_moods_settings.gd.uid | 1 - .../character_moods_settings.tscn | 235 -- .../character_portrait_mood_settings.gd | 37 - .../character_portrait_mood_settings.gd.uid | 1 - .../character_portrait_mood_settings.tscn | 25 - .../dialogic/Modules/Text/event_text.gd | 551 ---- .../dialogic/Modules/Text/event_text.gd.uid | 1 - godot/addons/dialogic/Modules/Text/icon.svg | 3 - .../dialogic/Modules/Text/icon.svg.import | 44 - godot/addons/dialogic/Modules/Text/index.gd | 38 - .../addons/dialogic/Modules/Text/index.gd.uid | 1 - .../dialogic/Modules/Text/manual_advance.gd | 60 - .../Modules/Text/manual_advance.gd.uid | 1 - .../dialogic/Modules/Text/node_dialog_text.gd | 190 -- .../Modules/Text/node_dialog_text.gd.uid | 1 - .../Modules/Text/node_dialog_text_icon.svg | 9 - .../Text/node_dialog_text_icon.svg.import | 43 - .../dialogic/Modules/Text/node_input.gd | 21 - .../dialogic/Modules/Text/node_input.gd.uid | 1 - .../dialogic/Modules/Text/node_name_label.gd | 25 - .../Modules/Text/node_name_label.gd.uid | 1 - .../Modules/Text/node_name_label_icon.svg | 3 - .../Text/node_name_label_icon.svg.import | 43 - .../Modules/Text/node_next_indicator.gd | 89 - .../Modules/Text/node_next_indicator.gd.uid | 1 - .../Modules/Text/node_next_indicator_icon.svg | 3 - .../Text/node_next_indicator_icon.svg.import | 44 - .../dialogic/Modules/Text/node_type_sound.gd | 138 - .../Modules/Text/node_type_sound.gd.uid | 1 - .../dialogic/Modules/Text/settings_text.gd | 249 -- .../Modules/Text/settings_text.gd.uid | 1 - .../dialogic/Modules/Text/settings_text.tscn | 489 ---- .../dialogic/Modules/Text/subsystem_text.gd | 677 ----- .../Modules/Text/subsystem_text.gd.uid | 1 - .../Modules/TextInput/event_text_input.gd | 113 - .../Modules/TextInput/event_text_input.gd.uid | 1 - .../dialogic/Modules/TextInput/icon.png | Bin 437 -> 0 bytes .../Modules/TextInput/icon.png.import | 40 - .../dialogic/Modules/TextInput/index.gd | 11 - .../dialogic/Modules/TextInput/index.gd.uid | 1 - .../Modules/TextInput/node_text_input.gd | 58 - .../Modules/TextInput/node_text_input.gd.uid | 1 - .../Modules/TextInput/subsystem_text_input.gd | 38 - .../TextInput/subsystem_text_input.gd.uid | 1 - .../Modules/Variable/add-variable.svg | 4 - .../Modules/Variable/add-variable.svg.import | 44 - .../Modules/Variable/event_variable.gd | 392 --- .../Modules/Variable/event_variable.gd.uid | 1 - .../addons/dialogic/Modules/Variable/icon.png | Bin 639 -> 0 bytes .../dialogic/Modules/Variable/icon.png.import | 40 - .../addons/dialogic/Modules/Variable/index.gd | 12 - .../dialogic/Modules/Variable/index.gd.uid | 1 - .../Modules/Variable/subsystem_variables.gd | 279 -- .../Variable/subsystem_variables.gd.uid | 1 - .../dialogic/Modules/Variable/variable.svg | 3 - .../Modules/Variable/variable.svg.import | 44 - .../variables_editor/variable_tree.gd | 545 ---- .../variables_editor/variable_tree.gd.uid | 1 - .../variables_editor/variables_editor.gd | 62 - .../variables_editor/variables_editor.gd.uid | 1 - .../variables_editor/variables_editor.tscn | 197 -- .../dialogic/Modules/Voice/event_voice.gd | 82 - .../dialogic/Modules/Voice/event_voice.gd.uid | 1 - godot/addons/dialogic/Modules/Voice/icon.png | Bin 1808 -> 0 bytes .../dialogic/Modules/Voice/icon.png.import | 40 - godot/addons/dialogic/Modules/Voice/index.gd | 10 - .../dialogic/Modules/Voice/index.gd.uid | 1 - .../dialogic/Modules/Voice/subsystem_voice.gd | 137 - .../Modules/Voice/subsystem_voice.gd.uid | 1 - .../dialogic/Modules/Wait/event_wait.gd | 96 - .../dialogic/Modules/Wait/event_wait.gd.uid | 1 - godot/addons/dialogic/Modules/Wait/icon.svg | 3 - .../dialogic/Modules/Wait/icon.svg.import | 44 - godot/addons/dialogic/Modules/Wait/index.gd | 6 - .../addons/dialogic/Modules/Wait/index.gd.uid | 1 - .../Modules/WaitInput/event_wait_input.gd | 48 - .../Modules/WaitInput/event_wait_input.gd.uid | 1 - .../dialogic/Modules/WaitInput/icon.svg | 13 - .../Modules/WaitInput/icon.svg.import | 44 - .../dialogic/Modules/WaitInput/index.gd | 6 - .../dialogic/Modules/WaitInput/index.gd.uid | 1 - .../Resources/CharacterResourceLoader.gd | 74 - .../Resources/CharacterResourceLoader.gd.uid | 1 - .../Resources/CharacterResourceSaver.gd | 34 - .../Resources/CharacterResourceSaver.gd.uid | 1 - .../Resources/TimelineResourceLoader.gd | 67 - .../Resources/TimelineResourceLoader.gd.uid | 1 - .../Resources/TimelineResourceSaver.gd | 33 - .../Resources/TimelineResourceSaver.gd.uid | 1 - godot/addons/dialogic/Resources/character.gd | 157 -- .../dialogic/Resources/character.gd.uid | 1 - .../dialogic_identifiable_resource.gd | 36 - .../dialogic_identifiable_resource.gd.uid | 1 - .../Resources/dialogic_layout_base.gd | 80 - .../Resources/dialogic_layout_base.gd.uid | 1 - .../Resources/dialogic_layout_layer.gd | 44 - .../Resources/dialogic_layout_layer.gd.uid | 1 - .../dialogic/Resources/dialogic_style.gd | 298 --- .../dialogic/Resources/dialogic_style.gd.uid | 1 - .../Resources/dialogic_style_layer.gd | 21 - .../Resources/dialogic_style_layer.gd.uid | 1 - godot/addons/dialogic/Resources/event.gd | 590 ----- godot/addons/dialogic/Resources/event.gd.uid | 1 - godot/addons/dialogic/Resources/timeline.gd | 207 -- .../addons/dialogic/Resources/timeline.gd.uid | 1 - godot/addons/dialogic/plugin.cfg | 8 - godot/addons/dialogic/plugin.gd | 157 -- godot/addons/dialogic/plugin.gd.uid | 1 - godot/addons/glogging/LICENSE.md | 7 - godot/addons/glogging/glogging.gd | 106 - godot/addons/glogging/glogging.gd.uid | 1 - godot/addons/glogging/plugin.cfg | 19 - godot/addons/glogging/plugin.gd | 8 - godot/addons/glogging/plugin.gd.uid | 1 - .../csharp/ResourceGroup.cs | 157 -- .../csharp/ResourceGroupBackgroundLoader.cs | 50 - .../godot_resource_groups.gd | 62 - .../godot_resource_groups.gd.uid | 1 - .../godot_resource_groups_export_plugin.gd | 14 - ...godot_resource_groups_export_plugin.gd.uid | 1 - .../godot_resource_groups/path_verifier.gd | 146 -- .../path_verifier.gd.uid | 1 - godot/addons/godot_resource_groups/plugin.cfg | 7 - .../godot_resource_groups/resource_group.gd | 103 - .../resource_group.gd.uid | 1 - .../godot_resource_groups/resource_group.svg | 32 - .../resource_group.svg.import | 43 - .../resource_group_background_loader.gd | 126 - .../resource_group_background_loader.gd.uid | 1 - .../resource_group_scanner.gd | 33 - .../resource_group_scanner.gd.uid | 1 - .../godot_resource_groups/resource_scanner.gd | 61 - .../resource_scanner.gd.uid | 1 - godot/addons/icon_explorer/LICENSE.md | 7 - godot/addons/icon_explorer/icon.svg | 43 - godot/addons/icon_explorer/icon.svg.import | 43 - .../internal/ext/bootstrap/collection.gd | 146 -- .../internal/ext/bootstrap/collection.gd.uid | 1 - .../internal/ext/bootstrap/details_panel.gd | 15 - .../ext/bootstrap/details_panel.gd.uid | 1 - .../internal/ext/bootstrap/details_panel.tscn | 29 - .../internal/ext/bootstrap/icon.gd | 17 - .../internal/ext/bootstrap/icon.gd.uid | 1 - .../ext/country_flag_icons/collection.gd | 114 - .../ext/country_flag_icons/collection.gd.uid | 1 - .../ext/country_flag_icons/details_panel.gd | 11 - .../country_flag_icons/details_panel.gd.uid | 1 - .../ext/country_flag_icons/details_panel.tscn | 17 - .../internal/ext/country_flag_icons/icon.gd | 11 - .../ext/country_flag_icons/icon.gd.uid | 1 - .../internal/ext/font_awesome/collection.gd | 99 - .../ext/font_awesome/collection.gd.uid | 1 - .../ext/font_awesome/details_panel.gd | 13 - .../ext/font_awesome/details_panel.gd.uid | 1 - .../ext/font_awesome/details_panel.tscn | 23 - .../internal/ext/font_awesome/icon.gd | 19 - .../internal/ext/font_awesome/icon.gd.uid | 1 - .../internal/ext/icon_tabler/collection.gd | 109 - .../ext/icon_tabler/collection.gd.uid | 1 - .../internal/ext/icon_tabler/details_panel.gd | 17 - .../ext/icon_tabler/details_panel.gd.uid | 1 - .../ext/icon_tabler/details_panel.tscn | 33 - .../internal/ext/icon_tabler/icon.gd | 19 - .../internal/ext/icon_tabler/icon.gd.uid | 1 - .../ext/material_design/collection.gd | 105 - .../ext/material_design/collection.gd.uid | 1 - .../ext/material_design/details_panel.gd | 19 - .../ext/material_design/details_panel.gd.uid | 1 - .../ext/material_design/details_panel.tscn | 49 - .../internal/ext/material_design/icon.gd | 22 - .../internal/ext/material_design/icon.gd.uid | 1 - .../internal/ext/simple_icons/collection.gd | 176 -- .../ext/simple_icons/collection.gd.uid | 1 - .../ext/simple_icons/details_panel.gd | 23 - .../ext/simple_icons/details_panel.gd.uid | 1 - .../ext/simple_icons/details_panel.tscn | 39 - .../internal/ext/simple_icons/icon.gd | 19 - .../internal/ext/simple_icons/icon.gd.uid | 1 - .../internal/scripts/collection.gd | 96 - .../internal/scripts/collection.gd.uid | 1 - .../internal/scripts/database.gd | 151 -- .../internal/scripts/database.gd.uid | 1 - .../icon_explorer/internal/scripts/icon.gd | 50 - .../internal/scripts/icon.gd.uid | 1 - .../internal/scripts/tools/io.gd | 67 - .../internal/scripts/tools/io.gd.uid | 1 - .../internal/scripts/tools/zip_extractor.gd | 145 -- .../scripts/tools/zip_extractor.gd.uid | 1 - .../scripts/tools/zip_extractor_threaded.gd | 144 -- .../tools/zip_extractor_threaded.gd.uid | 1 - .../internal/ui/detail_panel/color_field.gd | 29 - .../ui/detail_panel/color_field.gd.uid | 1 - .../internal/ui/detail_panel/color_field.tscn | 32 - .../internal/ui/detail_panel/detail_panel.gd | 146 -- .../ui/detail_panel/detail_panel.gd.uid | 1 - .../ui/detail_panel/detail_panel.tscn | 125 - .../internal/ui/detail_panel/field.gd | 17 - .../internal/ui/detail_panel/field.gd.uid | 1 - .../internal/ui/detail_panel/field_title.gd | 21 - .../ui/detail_panel/field_title.gd.uid | 1 - .../internal/ui/detail_panel/field_title.tscn | 17 - .../internal/ui/detail_panel/list_field.gd | 19 - .../ui/detail_panel/list_field.gd.uid | 1 - .../internal/ui/detail_panel/list_field.tscn | 30 - .../internal/ui/detail_panel/text_field.gd | 35 - .../ui/detail_panel/text_field.gd.uid | 1 - .../internal/ui/detail_panel/text_field.tscn | 36 - .../internal/ui/detail_panel/toolbar.gd | 27 - .../internal/ui/detail_panel/toolbar.gd.uid | 1 - .../internal/ui/explorer/explorer.gd | 185 -- .../internal/ui/explorer/explorer.gd.uid | 1 - .../internal/ui/explorer/explorer.tscn | 126 - .../internal/ui/explorer/filter_options.gd | 14 - .../ui/explorer/filter_options.gd.uid | 1 - .../internal/ui/explorer/option_popup.gd | 6 - .../internal/ui/explorer/option_popup.gd.uid | 1 - .../internal/ui/explorer_dialog.gd | 24 - .../internal/ui/explorer_dialog.gd.uid | 1 - .../internal/ui/explorer_dialog.tscn | 19 - .../icon_explorer/internal/ui/main_screen.gd | 16 - .../internal/ui/main_screen.gd.uid | 1 - .../internal/ui/main_screen.tscn | 20 - .../ui/options/collection_management.gd | 180 -- .../ui/options/collection_management.gd.uid | 1 - .../internal/ui/options/options.gd | 45 - .../internal/ui/options/options.gd.uid | 1 - .../internal/ui/options/options.tscn | 113 - godot/addons/icon_explorer/plugin.cfg | 19 - godot/addons/icon_explorer/plugin.gd | 94 - godot/addons/icon_explorer/plugin.gd.uid | 1 - godot/addons/net.yarvis.pixel_pen/LICENSE.txt | 21 - godot/addons/net.yarvis.pixel_pen/README.md | 46 - .../bin/libpixelpen.android.debug.arm32.so | Bin 729464 -> 0 bytes .../bin/libpixelpen.android.debug.arm64.so | Bin 763248 -> 0 bytes .../bin/libpixelpen.android.release.arm32.so | Bin 647864 -> 0 bytes .../bin/libpixelpen.android.release.arm64.so | Bin 711824 -> 0 bytes .../bin/libpixelpen.linux.debug.x86_64.so | Bin 842816 -> 0 bytes .../bin/libpixelpen.linux.release.x86_64.so | Bin 830008 -> 0 bytes .../libpixelpen.macos.debug | Bin 562712 -> 0 bytes .../libpixelpen.macos.release | Bin 562712 -> 0 bytes .../bin/libpixelpen.web.debug.wasm32.wasm | Bin 985905 -> 0 bytes .../bin/libpixelpen.web.release.wasm32.wasm | Bin 982914 -> 0 bytes .../bin/libpixelpen.windows.debug.x86_32.dll | Bin 391680 -> 0 bytes .../bin/libpixelpen.windows.debug.x86_32.exp | Bin 771 -> 0 bytes .../bin/libpixelpen.windows.debug.x86_32.lib | Bin 2122 -> 0 bytes .../bin/libpixelpen.windows.debug.x86_64.dll | Bin 460800 -> 0 bytes .../bin/libpixelpen.windows.debug.x86_64.exp | Bin 769 -> 0 bytes .../bin/libpixelpen.windows.debug.x86_64.lib | Bin 2126 -> 0 bytes .../libpixelpen.windows.release.x86_32.dll | Bin 364032 -> 0 bytes .../libpixelpen.windows.release.x86_32.exp | Bin 775 -> 0 bytes .../libpixelpen.windows.release.x86_32.lib | Bin 2148 -> 0 bytes .../libpixelpen.windows.release.x86_64.dll | Bin 414720 -> 0 bytes .../libpixelpen.windows.release.x86_64.exp | Bin 773 -> 0 bytes .../libpixelpen.windows.release.x86_64.lib | Bin 2152 -> 0 bytes .../classes/animation_cell.gd | 34 - .../classes/animation_cell.gd.uid | 1 - .../classes/editor_shorcut.gd | 117 - .../classes/editor_shorcut.gd.uid | 1 - .../net.yarvis.pixel_pen/classes/frame.gd | 76 - .../net.yarvis.pixel_pen/classes/frame.gd.uid | 1 - .../classes/indexed_color_image.gd | 180 -- .../classes/indexed_color_image.gd.uid | 1 - .../classes/indexed_palette.gd | 204 -- .../classes/indexed_palette.gd.uid | 1 - .../classes/mask_selection.gd | 111 - .../classes/mask_selection.gd.uid | 1 - .../classes/pixel_pen_project.gd | 910 ------- .../classes/pixel_pen_project.gd.uid | 1 - .../net.yarvis.pixel_pen/classes/pixelpen.gd | 6 - .../classes/pixelpen.gd.uid | 1 - .../classes/pixelpen_enum.gd | 149 -- .../classes/pixelpen_enum.gd.uid | 1 - .../classes/pixelpen_state.gd | 147 -- .../classes/pixelpen_state.gd.uid | 1 - .../classes/project_packer.gd | 81 - .../classes/project_packer.gd.uid | 1 - .../classes/theme_config.gd | 112 - .../classes/theme_config.gd.uid | 1 - .../classes/undo_redo_manager.gd | 150 -- .../classes/undo_redo_manager.gd.uid | 1 - .../classes/user_config.gd | 102 - .../classes/user_config.gd.uid | 1 - .../editor/edit_canvas_size.tscn | 100 - .../editor/edit_canvas_size/anchor_view.gd | 69 - .../edit_canvas_size/anchor_view.gd.uid | 1 - .../edit_canvas_size/edit_canvas_size.gd | 34 - .../edit_canvas_size/edit_canvas_size.gd.uid | 1 - .../editor/editor_canvas.tscn | 114 - .../editor/editor_canvas/brush_tool.gd | 223 -- .../editor/editor_canvas/brush_tool.gd.uid | 1 - .../editor/editor_canvas/canvas_paint.gd | 188 -- .../editor/editor_canvas/canvas_paint.gd.uid | 1 - .../editor/editor_canvas/color_picker_tool.gd | 49 - .../editor_canvas/color_picker_tool.gd.uid | 1 - .../editor/editor_canvas/cursor.gd | 16 - .../editor/editor_canvas/cursor.gd.uid | 1 - .../editor/editor_canvas/editor_canvas.gd | 551 ---- .../editor/editor_canvas/editor_canvas.gd.uid | 1 - .../editor/editor_canvas/ellipse_tool.gd | 161 -- .../editor/editor_canvas/ellipse_tool.gd.uid | 1 - .../editor/editor_canvas/fill_tool.gd | 85 - .../editor/editor_canvas/fill_tool.gd.uid | 1 - .../editor/editor_canvas/line_tool.gd | 164 -- .../editor/editor_canvas/line_tool.gd.uid | 1 - .../editor/editor_canvas/magnet_tool.gd | 232 -- .../editor/editor_canvas/magnet_tool.gd.uid | 1 - .../editor/editor_canvas/move_tool.gd | 729 ------ .../editor/editor_canvas/move_tool.gd.uid | 1 - .../editor/editor_canvas/pan_tool.gd | 32 - .../editor/editor_canvas/pan_tool.gd.uid | 1 - .../editor/editor_canvas/pen_tool.gd | 183 -- .../editor/editor_canvas/pen_tool.gd.uid | 1 - .../editor/editor_canvas/rectangle_tool.gd | 157 -- .../editor_canvas/rectangle_tool.gd.uid | 1 - .../editor/editor_canvas/select_tool.gd | 88 - .../editor/editor_canvas/select_tool.gd.uid | 1 - .../editor/editor_canvas/selection_tool.gd | 199 -- .../editor_canvas/selection_tool.gd.uid | 1 - .../editor/editor_canvas/stamp_tool.gd | 150 -- .../editor/editor_canvas/stamp_tool.gd.uid | 1 - .../editor/editor_canvas/tool.gd | 428 ---- .../editor/editor_canvas/tool.gd.uid | 1 - .../editor/editor_canvas/zoom_tool.gd | 67 - .../editor/editor_canvas/zoom_tool.gd.uid | 1 - .../editor/editor_layer/layer.gd | 124 - .../editor/editor_layer/layer.gd.uid | 1 - .../editor/editor_main_ui.tscn | 918 ------- .../editor/editor_main_ui/animation_box.gd | 513 ---- .../editor_main_ui/animation_box.gd.uid | 1 - .../editor/editor_main_ui/button_hover.gd | 77 - .../editor/editor_main_ui/button_hover.gd.uid | 1 - .../editor/editor_main_ui/debug_label.gd | 46 - .../editor/editor_main_ui/debug_label.gd.uid | 1 - .../editor/editor_main_ui/editor_main_ui.gd | 1793 ------------- .../editor_main_ui/editor_main_ui.gd.uid | 1 - .../editor/editor_main_ui/grid_pallete.gd | 300 --- .../editor/editor_main_ui/grid_pallete.gd.uid | 1 - .../editor/editor_main_ui/layers.gd | 90 - .../editor/editor_main_ui/layers.gd.uid | 1 - .../editor/editor_main_ui/layers_tools.gd | 294 --- .../editor/editor_main_ui/layers_tools.gd.uid | 1 - .../editor/editor_main_ui/pickable.gd | 70 - .../editor/editor_main_ui/pickable.gd.uid | 1 - .../editor_main_ui/preview_play_pause.gd | 61 - .../editor_main_ui/preview_play_pause.gd.uid | 1 - .../editor/editor_main_ui/sub_tool.gd | 608 ----- .../editor/editor_main_ui/sub_tool.gd.uid | 1 - .../editor/editor_main_ui/sub_viewport.gd | 46 - .../editor/editor_main_ui/sub_viewport.gd.uid | 1 - .../editor/editor_main_ui/tool_box.gd | 104 - .../editor/editor_main_ui/tool_box.gd.uid | 1 - .../editor/editor_main_ui/visible_callback.gd | 10 - .../editor_main_ui/visible_callback.gd.uid | 1 - .../editor/editor_window.tscn | 14 - .../editor/editor_window/editor_window.gd | 33 - .../editor/editor_window/editor_window.gd.uid | 1 - .../editor/export_manager.tscn | 340 --- .../editor/export_sheet/canvas_export_2d.gd | 37 - .../export_sheet/canvas_export_2d.gd.uid | 1 - .../editor/export_sheet/export_sheet.gd | 128 - .../editor/export_sheet/export_sheet.gd.uid | 1 - .../editor/frame_preview.tscn | 85 - .../editor/frame_preview/frame_preview.gd | 258 -- .../editor/frame_preview/frame_preview.gd.uid | 1 - .../editor/frame_preview/sample_border.gd | 22 - .../editor/frame_preview/sample_border.gd.uid | 1 - .../editor/image_option_btn.tscn | 95 - .../editor/image_option_btn/border_draw.gd | 19 - .../image_option_btn/border_draw.gd.uid | 1 - .../image_option_btn/image_option_btn.gd | 137 - .../image_option_btn/image_option_btn.gd.uid | 1 - .../editor/import_window.tscn | 158 -- .../editor/import_window/import_window.gd | 80 - .../editor/import_window/import_window.gd.uid | 1 - .../import_window/import_window_grid.gd | 83 - .../import_window/import_window_grid.gd.uid | 1 - .../editor/import_window/input_control.gd | 14 - .../editor/import_window/input_control.gd.uid | 1 - .../net.yarvis.pixel_pen/editor/layer.tscn | 208 -- .../editor/layer_properties.tscn | 39 - .../layer_properties/layer_properties.gd | 81 - .../layer_properties/layer_properties.gd.uid | 1 - .../editor/new_project_dialog.tscn | 165 -- .../new_project_dialog/new_project_dialog.gd | 74 - .../new_project_dialog.gd.uid | 1 - .../panels/color_wheel/color_wheel.tscn | 88 - .../color_wheel_script/alpha_slider.gd | 59 - .../color_wheel_script/alpha_slider.gd.uid | 1 - .../color_wheel_script/color_wheel.gd | 75 - .../color_wheel_script/color_wheel.gd.uid | 1 - .../color_wheel_script/hue_slider.gd | 54 - .../color_wheel_script/hue_slider.gd.uid | 1 - .../color_wheel_script/sv_slider.gd | 60 - .../color_wheel_script/sv_slider.gd.uid | 1 - .../color_wheel/shader/alpha_slider.gdshader | 21 - .../shader/alpha_slider.gdshader.uid | 1 - .../color_wheel/shader/hue_slider.gdshader | 17 - .../shader/hue_slider.gdshader.uid | 1 - .../color_wheel/shader/sv_slider.gdshader | 16 - .../color_wheel/shader/sv_slider.gdshader.uid | 1 - .../editor/preferences.tscn | 187 -- .../editor/preferences/general_preferences.gd | 148 -- .../preferences/general_preferences.gd.uid | 1 - .../editor/preferences/preferences.gd | 16 - .../editor/preferences/preferences.gd.uid | 1 - .../editor/preferences/shorcut_listener.gd | 17 - .../preferences/shorcut_listener.gd.uid | 1 - .../preferences/shorcuts_preferences.gd | 210 -- .../preferences/shorcuts_preferences.gd.uid | 1 - .../editor/startup_window.tscn | 64 - .../editor/startup_window/startup_window.gd | 41 - .../startup_window/startup_window.gd.uid | 1 - .../editor/window_reference.tscn | 24 - .../window_reference/window_reference.gd | 29 - .../window_reference/window_reference.gd.uid | 1 - .../net.yarvis.pixel_pen/pixelpen.gdextension | 26 - .../pixelpen.gdextension.uid | 1 - .../net.yarvis.pixel_pen/pixelpen_plugin.gd | 55 - .../pixelpen_plugin.gd.uid | 1 - godot/addons/net.yarvis.pixel_pen/plugin.cfg | 7 - .../resources/default_theme.tres | 1192 --------- .../resources/editor_canvas.gdshader | 20 - .../resources/editor_canvas.gdshader.uid | 1 - .../resources/editor_canvas_cursor.gdshader | 14 - .../editor_canvas_cursor.gdshader.uid | 1 - .../resources/editor_shorcut.tres | 443 ---- .../resources/fonts/inter/OFL.txt | 93 - .../resources/fonts/inter/README.txt | 72 - .../fonts/inter/static/Inter-Bold.ttf | Bin 316584 -> 0 bytes .../fonts/inter/static/Inter-Bold.ttf.import | 36 - .../fonts/inter/static/Inter-Regular.ttf | Bin 310252 -> 0 bytes .../inter/static/Inter-Regular.ttf.import | 36 - .../fonts/inter/static/Inter-SemiBold.ttf | Bin 316220 -> 0 bytes .../inter/static/Inter-SemiBold.ttf.import | 36 - .../fonts/inter/static/Inter-Thin.ttf | Bin 310984 -> 0 bytes .../fonts/inter/static/Inter-Thin.ttf.import | 36 - .../resources/grayscale.gdshader | 15 - .../resources/grayscale.gdshader.uid | 1 - .../resources/icon/Icon.png | Bin 246 -> 0 bytes .../resources/icon/Icon.png.import | 40 - .../resources/icon/add_24.svg | 1 - .../resources/icon/add_24.svg.import | 43 - .../resources/icon/arrow-expand-down.svg | 1 - .../icon/arrow-expand-down.svg.import | 43 - .../resources/icon/arrow-expand-left.svg | 1 - .../icon/arrow-expand-left.svg.import | 43 - .../resources/icon/arrow-expand-right.svg | 1 - .../icon/arrow-expand-right.svg.import | 43 - .../resources/icon/arrow-expand-up.svg | 1 - .../resources/icon/arrow-expand-up.svg.import | 43 - .../resources/icon/arrow_selector_24.svg | 1 - .../icon/arrow_selector_24.svg.import | 43 - .../resources/icon/brush_24.svg | 1 - .../resources/icon/brush_24.svg.import | 43 - .../resources/icon/cancel.svg | 1 - .../resources/icon/cancel.svg.import | 43 - .../resources/icon/check-circle-outline.svg | 1 - .../icon/check-circle-outline.svg.import | 43 - .../resources/icon/chevron-down.svg | 1 - .../resources/icon/chevron-down.svg.import | 43 - .../resources/icon/circle-outline.svg | 1 - .../resources/icon/circle-outline.svg.import | 43 - .../resources/icon/color_picker_24.svg | 1 - .../resources/icon/color_picker_24.svg.import | 43 - .../resources/icon/color_picker_plus.svg | 1 - .../icon/color_picker_plus.svg.import | 43 - .../resources/icon/content-copy.svg | 1 - .../resources/icon/content-copy.svg.import | 43 - .../resources/icon/content-cut.svg | 1 - .../resources/icon/content-cut.svg.import | 43 - .../icon/content-save-alert-outline.svg | 1 - .../content-save-alert-outline.svg.import | 43 - .../resources/icon/content-save.svg | 1 - .../resources/icon/content-save.svg.import | 43 - .../resources/icon/crop_free_24.svg | 1 - .../resources/icon/crop_free_24.svg.import | 43 - .../resources/icon/delete_24.svg | 1 - .../resources/icon/delete_24.svg.import | 43 - .../resources/icon/delete_in_selection.svg | 1 - .../icon/delete_in_selection.svg.import | 43 - .../resources/icon/eye_20.svg | 1 - .../resources/icon/eye_20.svg.import | 43 - .../resources/icon/fit-to-screen-outline.svg | 1 - .../icon/fit-to-screen-outline.svg.import | 43 - .../resources/icon/flip-horizontal.svg | 1 - .../resources/icon/flip-horizontal.svg.import | 43 - .../resources/icon/flip-vertical.svg | 1 - .../resources/icon/flip-vertical.svg.import | 43 - .../resources/icon/folder-outline.svg | 1 - .../resources/icon/folder-outline.svg.import | 43 - .../resources/icon/folder_24.svg | 1 - .../resources/icon/folder_24.svg.import | 43 - .../resources/icon/grid_3x3_24.svg | 1 - .../resources/icon/grid_3x3_24.svg.import | 43 - .../icon/image-filter-black-white.svg | 1 - .../icon/image-filter-black-white.svg.import | 43 - .../resources/icon/index_24.svg | 1 - .../resources/icon/index_24.svg.import | 43 - .../resources/icon/information-outline.svg | 1 - .../icon/information-outline.svg.import | 43 - .../resources/icon/ink_24.svg | 1 - .../resources/icon/ink_24.svg.import | 43 - .../resources/icon/ink_eraser_24.svg | 1 - .../resources/icon/ink_eraser_24.svg.import | 43 - .../resources/icon/layers-search-outline.svg | 1 - .../icon/layers-search-outline.svg.import | 43 - .../resources/icon/line_24.svg | 1 - .../resources/icon/line_24.svg.import | 43 - .../resources/icon/magnet-on.svg | 1 - .../resources/icon/magnet-on.svg.import | 43 - .../resources/icon/magnet.svg | 1 - .../resources/icon/magnet.svg.import | 43 - .../resources/icon/menu_24.svg | 1 - .../resources/icon/menu_24.svg.import | 43 - .../resources/icon/move_24.svg | 1 - .../resources/icon/move_24.svg.import | 43 - .../resources/icon/palette_24.svg | 1 - .../resources/icon/palette_24.svg.import | 43 - .../resources/icon/pan_24.svg | 1 - .../resources/icon/pan_24.svg.import | 43 - .../resources/icon/pause.svg | 1 - .../resources/icon/pause.svg.import | 43 - .../resources/icon/pen.svg | 1 - .../resources/icon/pen.svg.import | 43 - .../resources/icon/play.svg | 1 - .../resources/icon/play.svg.import | 43 - .../resources/icon/rect_24.svg | 1 - .../resources/icon/rect_24.svg.import | 43 - .../resources/icon/redo.svg | 1 - .../resources/icon/redo.svg.import | 43 - .../resources/icon/remove_selection_24.svg | 1 - .../icon/remove_selection_24.svg.import | 43 - .../resources/icon/rotate-left.svg | 1 - .../resources/icon/rotate-left.svg.import | 43 - .../resources/icon/rotate-right.svg | 1 - .../resources/icon/rotate-right.svg.import | 43 - .../resources/icon/rotate_24.svg | 1 - .../resources/icon/rotate_24.svg.import | 43 - .../resources/icon/select-color.svg | 1 - .../resources/icon/select-color.svg.import | 43 - .../resources/icon/select-inverse.svg | 1 - .../resources/icon/select-inverse.svg.import | 43 - .../resources/icon/selection_24.svg | 1 - .../resources/icon/selection_24.svg.import | 43 - .../resources/icon/skip-backward.svg | 1 - .../resources/icon/skip-backward.svg.import | 43 - .../resources/icon/skip-forward.svg | 1 - .../resources/icon/skip-forward.svg.import | 43 - .../resources/icon/stamp.svg | 1 - .../resources/icon/stamp.svg.import | 43 - .../resources/icon/step-backward.svg | 1 - .../resources/icon/step-backward.svg.import | 43 - .../resources/icon/step-forward.svg | 1 - .../resources/icon/step-forward.svg.import | 43 - .../resources/icon/undo.svg | 1 - .../resources/icon/undo.svg.import | 43 - .../resources/icon/vector-difference-ba.svg | 1 - .../icon/vector-difference-ba.svg.import | 43 - .../resources/icon/vector-intersection.svg | 1 - .../icon/vector-intersection.svg.import | 43 - .../resources/icon/vector-union.svg | 1 - .../resources/icon/vector-union.svg.import | 43 - .../resources/icon/visibility_24.svg | 1 - .../resources/icon/visibility_24.svg.import | 43 - .../resources/icon/zoom_in_24.svg | 1 - .../resources/icon/zoom_in_24.svg.import | 43 - .../resources/icon/zoom_out_24.svg | 1 - .../resources/icon/zoom_out_24.svg.import | 43 - .../resources/indexed_layer.gdshader | 22 - .../resources/indexed_layer.gdshader.uid | 1 - .../resources/marching_ant.gdshader | 47 - .../resources/marching_ant.gdshader.uid | 1 - .../resources/marching_ant_filled.gdshader | 72 - .../marching_ant_filled.gdshader.uid | 1 - .../resources/skinning_tint.gdshader | 11 - .../resources/skinning_tint.gdshader.uid | 1 - .../resources/tile_transparant_material.tres | 9 - .../resources/tint_color.gdshader | 9 - .../resources/tint_color.gdshader.uid | 1 - .../thirdparty/gdgifexporter/LICENSE | 21 - .../thirdparty/gdgifexporter/converter.gd | 53 - .../thirdparty/gdgifexporter/converter.gd.uid | 1 - .../thirdparty/gdgifexporter/exporter.gd | 286 --- .../thirdparty/gdgifexporter/exporter.gd.uid | 1 - .../thirdparty/gdgifexporter/gif-lzw/LICENSE | 21 - .../gdgifexporter/gif-lzw/lsbbitpacker.gd | 31 - .../gdgifexporter/gif-lzw/lsbbitpacker.gd.uid | 1 - .../gdgifexporter/gif-lzw/lsbbitunpacker.gd | 41 - .../gif-lzw/lsbbitunpacker.gd.uid | 1 - .../thirdparty/gdgifexporter/gif-lzw/lzw.gd | 102 - .../gdgifexporter/gif-lzw/lzw.gd.uid | 1 - .../thirdparty/gdgifexporter/little_endian.gd | 5 - .../gdgifexporter/little_endian.gd.uid | 1 - .../gdgifexporter/lookup_color.gdshader | 19 - .../gdgifexporter/lookup_color.gdshader.uid | 1 - .../gdgifexporter/lookup_similar.gdshader | 22 - .../gdgifexporter/lookup_similar.gdshader.uid | 1 - .../gdgifexporter/quantization/median_cut.gd | 161 -- .../quantization/median_cut.gd.uid | 1 - .../gdgifexporter/quantization/uniform.gd | 82 - .../gdgifexporter/quantization/uniform.gd.uid | 1 - .../ui/layout_split/branch.gd | 77 - .../ui/layout_split/branch.gd.uid | 1 - .../ui/layout_split/data_branch.gd | 13 - .../ui/layout_split/data_branch.gd.uid | 1 - .../ui/layout_split/layout_split.gd | 271 -- .../ui/layout_split/layout_split.gd.uid | 1 - .../ui/tree_properties/toggle_button.gd | 101 - .../ui/tree_properties/toggle_button.gd.uid | 1 - .../ui/tree_properties/tree_properties.gd | 666 ----- .../ui/tree_properties/tree_properties.gd.uid | 1 - .../ui/tree_properties/tree_row.gd | 215 -- .../ui/tree_properties/tree_row.gd.uid | 1 - godot/addons/panku_console/LICENSE | 20 - godot/addons/panku_console/README.md | 1 - .../common/buffered_rich_text.gd | 35 - .../common/buffered_rich_text.gd.uid | 1 - godot/addons/panku_console/common/config.gd | 126 - .../addons/panku_console/common/config.gd.uid | 1 - .../addons/panku_console/common/gdexprenv.gd | 276 -- .../panku_console/common/gdexprenv.gd.uid | 1 - .../common/lynx_window2/border.gd | 9 - .../common/lynx_window2/border.gd.uid | 1 - .../common/lynx_window2/lynx_window_2.gd | 298 --- .../common/lynx_window2/lynx_window_2.gd.uid | 1 - .../common/lynx_window2/lynx_window_2.tscn | 204 -- .../lynx_window_shader_material.tres | 8 - .../lynx_window2/lynx_windows_manager_2.gd | 80 - .../lynx_windows_manager_2.gd.uid | 1 - .../panku_console/common/module_manager.gd | 54 - .../common/module_manager.gd.uid | 1 - .../panku_console/common/module_options.gd | 11 - .../common/module_options.gd.uid | 1 - .../panku_console/common/panku_button.gd | 39 - .../panku_console/common/panku_button.gd.uid | 1 - .../panku_console/common/panku_button.tscn | 42 - .../panku_console/common/panku_module.gd | 101 - .../panku_console/common/panku_module.gd.uid | 1 - .../common/repl_base_instance.gd | 23 - .../common/repl_base_instance.gd.uid | 1 - .../common/smooth_scroll/smooth_scroll.gd | 57 - .../common/smooth_scroll/smooth_scroll.gd.uid | 1 - .../common/smooth_scroll/smooth_scroll.tscn | 30 - godot/addons/panku_console/common/utils.gd | 43 - .../addons/panku_console/common/utils.gd.uid | 1 - godot/addons/panku_console/console.gd | 86 - godot/addons/panku_console/console.gd.uid | 1 - godot/addons/panku_console/console.tscn | 22 - .../panku_console/default_panku_config.cfg | 80 - godot/addons/panku_console/logo.svg | 25 - godot/addons/panku_console/logo.svg.import | 43 - .../panku_console/modules/about/about.gd | 26 - .../panku_console/modules/about/about.gd.uid | 1 - .../panku_console/modules/about/about.tscn | 215 -- .../addons/panku_console/modules/about/env.gd | 5 - .../panku_console/modules/about/env.gd.uid | 1 - .../panku_console/modules/about/module.gd | 15 - .../panku_console/modules/about/module.gd.uid | 1 - .../panku_console/modules/about/url_button.gd | 9 - .../modules/about/url_button.gd.uid | 1 - .../modules/about/url_button.tscn | 17 - .../modules/check_latest_release/env.gd | 5 - .../modules/check_latest_release/env.gd.uid | 1 - .../modules/check_latest_release/module.gd | 32 - .../check_latest_release/module.gd.uid | 1 - .../modules/check_latest_release/network.gd | 59 - .../check_latest_release/network.gd.uid | 1 - .../modules/check_latest_release/opt.gd | 8 - .../modules/check_latest_release/opt.gd.uid | 1 - .../panku_console/modules/engine_tools/env.gd | 30 - .../modules/engine_tools/env.gd.uid | 1 - .../modules/engine_tools/module.gd | 72 - .../modules/engine_tools/module.gd.uid | 1 - .../panku_console/modules/engine_tools/opt.gd | 40 - .../modules/engine_tools/opt.gd.uid | 1 - .../modules/expression_monitor/env.gd | 4 - .../modules/expression_monitor/env.gd.uid | 1 - .../expression_monitor/expression_item.gd | 33 - .../expression_monitor/expression_item.gd.uid | 1 - .../expression_monitor/expression_item.tscn | 46 - .../expression_monitor/expression_monitor2.gd | 24 - .../expression_monitor2.gd.uid | 1 - .../expression_monitor2.tscn | 30 - .../modules/expression_monitor/module.gd | 29 - .../modules/expression_monitor/module.gd.uid | 1 - .../expression_monitor/monitor_group_ui.gd | 133 - .../monitor_group_ui.gd.uid | 1 - .../expression_monitor/monitor_group_ui.tscn | 145 -- .../expression_monitor/monitor_groups_ui.gd | 50 - .../monitor_groups_ui.gd.uid | 1 - .../expression_monitor/monitor_groups_ui.tscn | 31 - .../modules/general_settings/env.gd | 4 - .../modules/general_settings/env.gd.uid | 1 - .../modules/general_settings/module.gd | 68 - .../modules/general_settings/module.gd.uid | 1 - .../modules/general_settings/opt.gd | 49 - .../modules/general_settings/opt.gd.uid | 1 - .../modules/history_manager/env.gd | 4 - .../modules/history_manager/env.gd.uid | 1 - .../modules/history_manager/exp_history.gd | 206 -- .../history_manager/exp_history.gd.uid | 1 - .../modules/history_manager/exp_history.tscn | 149 -- .../history_manager/exp_history_item.gd | 5 - .../history_manager/exp_history_item.gd.uid | 1 - .../history_manager/exp_history_item.tscn | 27 - .../modules/history_manager/module.gd | 26 - .../modules/history_manager/module.gd.uid | 1 - .../modules/history_manager/opt.gd | 7 - .../modules/history_manager/opt.gd.uid | 1 - .../console_logs/console_logs.gd | 29 - .../console_logs/console_logs.gd.uid | 1 - .../console_logs/console_logs.tscn | 48 - .../console_ui/help_bar.tscn | 21 - .../console_ui/panku_console_ui.gd | 54 - .../console_ui/panku_console_ui.gd.uid | 1 - .../console_ui/panku_console_ui.tscn | 111 - .../console_ui/remote_control_node.gd | 15 - .../console_ui/remote_control_node.gd.uid | 1 - .../interactive_shell/console_ui/repl.gd | 102 - .../interactive_shell/console_ui/repl.gd.uid | 1 - .../interactive_shell/console_ui/repl.tscn | 6 - .../console_ui/side_buttons_controller.gd | 30 - .../console_ui/side_buttons_controller.gd.uid | 1 - .../modules/interactive_shell/env.gd | 11 - .../modules/interactive_shell/env.gd.uid | 1 - .../interactive_shell/hints_list/hint.gd | 8 - .../interactive_shell/hints_list/hint.gd.uid | 1 - .../interactive_shell/hints_list/hint.tscn | 44 - .../hints_list/hints_list.gd | 54 - .../hints_list/hints_list.gd.uid | 1 - .../hints_list/hints_list.tscn | 19 - .../input_field/input_area.gd | 34 - .../input_field/input_area.gd.uid | 1 - .../input_field/input_area.tscn | 41 - .../input_field/input_field.gd | 45 - .../input_field/input_field.gd.uid | 1 - .../modules/interactive_shell/mini_repl_2.gd | 13 - .../interactive_shell/mini_repl_2.gd.uid | 1 - .../interactive_shell/mini_repl_2.tscn | 61 - .../modules/interactive_shell/module.gd | 171 -- .../modules/interactive_shell/module.gd.uid | 1 - .../modules/interactive_shell/opt.gd | 31 - .../modules/interactive_shell/opt.gd.uid | 1 - .../interactive_shell/side_menu_config.json | 36 - .../modules/keyboard_shortcuts/env.gd | 4 - .../modules/keyboard_shortcuts/env.gd.uid | 1 - .../keyboard_shortcuts/exp_key_item.gd | 19 - .../keyboard_shortcuts/exp_key_item.gd.uid | 1 - .../keyboard_shortcuts/exp_key_item.tscn | 34 - .../keyboard_shortcuts/exp_key_mapper_2.gd | 92 - .../exp_key_mapper_2.gd.uid | 1 - .../keyboard_shortcuts/exp_key_mapper_2.tscn | 61 - .../modules/keyboard_shortcuts/module.gd | 34 - .../modules/keyboard_shortcuts/module.gd.uid | 1 - .../modules/keyboard_shortcuts/opt.gd | 8 - .../modules/keyboard_shortcuts/opt.gd.uid | 1 - .../keyboard_shortcuts/remap_button.gd | 27 - .../keyboard_shortcuts/remap_button.gd.uid | 1 - .../modules/native_logger/env.gd | 13 - .../modules/native_logger/env.gd.uid | 1 - .../native_logger/godot_log_monitor.gd | 59 - .../native_logger/godot_log_monitor.gd.uid | 1 - .../modules/native_logger/log_overlay.tscn | 21 - .../modules/native_logger/log_view_tag.gd | 12 - .../modules/native_logger/log_view_tag.gd.uid | 1 - .../modules/native_logger/log_view_tag.tscn | 47 - .../modules/native_logger/logger_view.gd | 150 -- .../modules/native_logger/logger_view.gd.uid | 1 - .../modules/native_logger/logger_view.tscn | 136 - .../modules/native_logger/module.gd | 99 - .../modules/native_logger/module.gd.uid | 1 - .../modules/native_logger/opt.gd | 67 - .../modules/native_logger/opt.gd.uid | 1 - .../screen_crt_effect/crt_effect_layer.tscn | 18 - .../modules/screen_crt_effect/env.gd | 5 - .../modules/screen_crt_effect/env.gd.uid | 1 - .../modules/screen_crt_effect/module.gd | 11 - .../modules/screen_crt_effect/module.gd.uid | 1 - .../modules/screen_crt_effect/opt.gd | 16 - .../modules/screen_crt_effect/opt.gd.uid | 1 - .../modules/screen_notifier/env.gd | 5 - .../modules/screen_notifier/env.gd.uid | 1 - .../modules/screen_notifier/log_item.gd | 54 - .../modules/screen_notifier/log_item.gd.uid | 1 - .../modules/screen_notifier/log_item.tscn | 83 - .../modules/screen_notifier/module.gd | 12 - .../modules/screen_notifier/module.gd.uid | 1 - .../modules/screen_notifier/resident_logs.gd | 57 - .../screen_notifier/resident_logs.gd.uid | 1 - .../screen_notifier/resident_logs.tscn | 30 - .../addons/panku_console/modules/snake/env.gd | 11 - .../panku_console/modules/snake/env.gd.uid | 1 - .../panku_console/modules/snake/module.gd | 37 - .../panku_console/modules/snake/module.gd.uid | 1 - .../panku_console/modules/snake/snake.gd | 71 - .../panku_console/modules/snake/snake.gd.uid | 1 - .../panku_console/modules/snake/snake.tscn | 20 - .../modules/snake/snake_gradient.tres | 4 - .../panku_console/modules/snake/snake_ui.gd | 66 - .../modules/snake/snake_ui.gd.uid | 1 - .../modules/system_report/env.gd | 9 - .../modules/system_report/env.gd.uid | 1 - .../modules/system_report/module.gd | 1 - .../modules/system_report/module.gd.uid | 1 - .../modules/system_report/os_report.gd | 168 -- .../modules/system_report/os_report.gd.uid | 1 - .../modules/texture_viewer/module.gd | 21 - .../modules/texture_viewer/module.gd.uid | 1 - .../modules/texture_viewer/texture_viewer.gd | 13 - .../texture_viewer/texture_viewer.gd.uid | 1 - .../texture_viewer/texture_viewer.tscn | 21 - .../modules/variable_tracker/module.gd | 172 -- .../modules/variable_tracker/module.gd.uid | 1 - .../modules/variable_tracker/opt.gd | 32 - .../modules/variable_tracker/opt.gd.uid | 1 - godot/addons/panku_console/plugin.cfg | 7 - godot/addons/panku_console/plugin.gd | 89 - godot/addons/panku_console/plugin.gd.uid | 1 - .../res/effect/square_shadow.png | Bin 14905 -> 0 bytes .../res/effect/square_shadow.png.import | 40 - .../panku_console/res/green_gradient_1d.tres | 4 - godot/addons/panku_console/res/icons2/add.svg | 1 - .../panku_console/res/icons2/add.svg.import | 43 - .../res/icons2/arrow-down-svgrepo-com.svg | 12 - .../icons2/arrow-down-svgrepo-com.svg.import | 43 - .../res/icons2/arrow-up-md-svgrepo-com.svg | 12 - .../icons2/arrow-up-md-svgrepo-com.svg.import | 43 - ...elete-remove-trash-garbage-svgrepo-com.svg | 12 - ...emove-trash-garbage-svgrepo-com.svg.import | 43 - .../icons2/bookmark-filled-svgrepo-com.svg | 16 - .../bookmark-filled-svgrepo-com.svg.import | 43 - .../res/icons2/bookmark-svgrepo-com.svg | 16 - .../icons2/bookmark-svgrepo-com.svg.import | 43 - .../res/icons2/check-svgrepo-com.svg | 4 - .../res/icons2/check-svgrepo-com.svg.import | 43 - .../res/icons2/checkbox_checked.svg | 22 - .../res/icons2/checkbox_checked.svg.import | 43 - .../res/icons2/checkbox_unchecked.svg | 19 - .../res/icons2/checkbox_unchecked.svg.import | 43 - .../res/icons2/chevron_right.svg | 1 - .../res/icons2/chevron_right.svg.import | 43 - .../addons/panku_console/res/icons2/close.svg | 1 - .../panku_console/res/icons2/close.svg.import | 43 - .../panku_console/res/icons2/close_20x.svg | 1 - .../res/icons2/close_20x.svg.import | 43 - .../panku_console/res/icons2/expand_more.svg | 1 - .../res/icons2/expand_more.svg.import | 43 - godot/addons/panku_console/res/icons2/eye.svg | 1 - .../panku_console/res/icons2/eye.svg.import | 43 - .../panku_console/res/icons2/favorite.svg | 1 - .../res/icons2/favorite.svg.import | 43 - .../res/icons2/fold-svgrepo-com.svg | 16 - .../res/icons2/fold-svgrepo-com.svg.import | 43 - .../addons/panku_console/res/icons2/gear.svg | 10 - .../panku_console/res/icons2/gear.svg.import | 43 - .../panku_console/res/icons2/history.svg | 9 - .../res/icons2/history.svg.import | 43 - .../addons/panku_console/res/icons2/info.svg | 1 - .../panku_console/res/icons2/info.svg.import | 43 - .../addons/panku_console/res/icons2/info2.svg | 9 - .../panku_console/res/icons2/info2.svg.import | 43 - .../panku_console/res/icons2/keyboard.svg | 9 - .../res/icons2/keyboard.svg.import | 43 - .../addons/panku_console/res/icons2/menu.svg | 1 - .../panku_console/res/icons2/menu.svg.import | 43 - .../panku_console/res/icons2/more_horiz.svg | 1 - .../res/icons2/more_horiz.svg.import | 43 - .../panku_console/res/icons2/open_with.svg | 1 - .../res/icons2/open_with.svg.import | 43 - .../res/icons2/pause-1010-svgrepo-com.svg | 19 - .../icons2/pause-1010-svgrepo-com.svg.import | 43 - .../res/icons2/play-1001-svgrepo-com.svg | 19 - .../icons2/play-1001-svgrepo-com.svg.import | 43 - .../res/icons2/pop-out-svgrepo-com.svg | 14 - .../res/icons2/pop-out-svgrepo-com.svg.import | 43 - .../panku_console/res/icons2/question.svg | 15 - .../res/icons2/question.svg.import | 43 - .../panku_console/res/icons2/remove.svg | 1 - .../res/icons2/remove.svg.import | 43 - .../res/icons2/rename-svgrepo-com.svg | 114 - .../res/icons2/rename-svgrepo-com.svg.import | 43 - .../addons/panku_console/res/icons2/reply.svg | 1 - .../panku_console/res/icons2/reply.svg.import | 43 - .../res/icons2/resize-svgrepo-com.svg | 9 - .../res/icons2/resize-svgrepo-com.svg.import | 43 - .../panku_console/res/icons2/search.svg | 1 - .../res/icons2/search.svg.import | 43 - .../panku_console/res/icons2/swap_horiz.svg | 1 - .../res/icons2/swap_horiz.svg.import | 43 - .../res/panku_console_theme.tres | 137 - .../res/shader/mattias_crt.gdshader | 63 - .../res/shader/mattias_crt.gdshader.uid | 1 - .../res/shader/simple_fast_blur.gdshader | 10 - .../res/shader/simple_fast_blur.gdshader.uid | 1 - .../assets/PhantomCameraBtnPrimaryDefault.png | Bin 10296 -> 0 bytes .../PhantomCameraBtnPrimaryDefault.png.import | 40 - .../assets/PhantomCameraBtnPrimaryHover.png | Bin 9931 -> 0 bytes .../PhantomCameraBtnPrimaryHover.png.import | 40 - .../phantom_camera/examples/credits.txt | 7 - .../2D-4.3/2d_example_scene.tscn | 249 -- .../2d_follow_framed_example_scene.tscn | 251 -- .../2D-4.3/2d_follow_group_example_scene.tscn | 261 -- .../2D-4.3/2d_follow_path_example_scene.tscn | 269 -- .../2D-4.3/2d_limit_example_scene.tscn | 319 --- .../2D-4.3/2d_noise_example_scene.tscn | 289 --- .../2D-4.3/2d_tweening_example_scene.tscn | 402 --- .../example_scenes/2D/2d_example_scene.tscn | 245 -- .../2D/2d_follow_framed_example_scene.tscn | 245 -- .../2D/2d_follow_group_example_scene.tscn | 255 -- .../2D/2d_follow_path_example_scene.tscn | 263 -- .../2D/2d_limit_example_scene.tscn | 324 --- .../2D/2d_tweening_example_scene.tscn | 397 --- .../2D/sub_scenes/playable_character_2d.tscn | 120 - .../3D-4.4/3d_example_scene.tscn | 413 --- .../3d_follow_framed_example_scene.tscn | 158 -- .../3D-4.4/3d_follow_glued_example_scene.tscn | 211 -- .../3D-4.4/3d_follow_group_example_scene.tscn | 180 -- .../3D-4.4/3d_follow_path_example_scene.tscn | 245 -- .../3d_follow_simple_example_scene.tscn | 164 -- ...third_person_attribtues_example_scene.tscn | 220 -- .../3d_follow_third_person_example_scene.tscn | 191 -- .../3D-4.4/3d_look_at_example_scene.tscn | 200 -- .../3D-4.4/3d_noise_example_scene.tscn | 195 -- .../3D-4.4/3d_tweening_example_scene.tscn | 293 --- .../sub_scenes/playable_character_3d.tscn | 31 - .../playable_character_third_person_3d.tscn | 43 - .../example_scenes/3D/3d_example_scene.tscn | 412 --- .../3D/3d_follow_framed_example_scene.tscn | 156 -- .../3D/3d_follow_glued_example_scene.tscn | 208 -- .../3D/3d_follow_group_example_scene.tscn | 180 -- .../3D/3d_follow_path_example_scene.tscn | 244 -- .../3D/3d_follow_simple_example_scene.tscn | 163 -- ...third_person_attribtues_example_scene.tscn | 220 -- .../3d_follow_third_person_example_scene.tscn | 191 -- .../3D/3d_look_at_example_scene.tscn | 198 -- .../3D/3d_noise_example_scene.tscn | 210 -- .../3D/3d_tweening_example_scene.tscn | 291 --- .../3D/sub_scenes/playable_character_3d.tscn | 30 - .../playable_character_third_person_3d.tscn | 43 - .../examples/models/3d_cube_dark.tscn | 15 - .../resources/tween/fixed_camera_tween.tres | 9 - .../inventory_phantom_camera_2d_tween.tres | 9 - .../item_focus_phantom_camera_2d_tween.tres | 9 - .../tween/player_phantom_camera_2d_tween.tres | 9 - .../tween/player_phantom_camera_3d_tween.tres | 9 - .../scripts/2D/2d_room_limit_tween.gd | 36 - .../scripts/2D/2d_room_limit_tween.gd.uid | 1 - .../scripts/2D/2d_room_limit_tween_4.3.gd | 36 - .../scripts/2D/2d_room_limit_tween_4.3.gd.uid | 1 - .../examples/scripts/2D/2d_trigger_area.gd | 16 - .../scripts/2D/2d_trigger_area.gd.uid | 1 - .../scripts/2D/player_character_body_2d.gd | 189 -- .../2D/player_character_body_2d.gd.uid | 1 - .../2D/player_character_body_2d_4.3.gd | 179 -- .../2D/player_character_body_2d_4.3.gd.uid | 1 - .../examples/scripts/3D/3d_trigger_area.gd | 26 - .../scripts/3D/3d_trigger_area.gd.uid | 1 - .../phantom_camera/examples/scripts/3D/npc.gd | 71 - .../examples/scripts/3D/npc.gd.uid | 1 - .../examples/scripts/3D/path_follow.gd | 17 - .../examples/scripts/3D/path_follow.gd.uid | 1 - .../examples/scripts/3D/player_controller.gd | 103 - .../scripts/3D/player_controller.gd.uid | 1 - .../scripts/3D/player_controller_4.4.gd | 84 - .../scripts/3D/player_controller_4.4.gd.uid | 1 - .../3D/player_controller_first_person.gd | 54 - .../3D/player_controller_first_person.gd.uid | 1 - .../3D/player_controller_first_person_4.4.gd | 54 - .../player_controller_first_person_4.4.gd.uid | 1 - .../3D/player_controller_third_person.gd | 87 - .../3D/player_controller_third_person.gd.uid | 1 - .../3D/player_controller_third_person_4.4.gd | 86 - .../player_controller_third_person_4.4.gd.uid | 1 - .../textures/2D/inventory_container.png | Bin 68739 -> 0 bytes .../2D/inventory_container.png.import | 40 - .../textures/2D/level_spritesheet.png | Bin 10314 -> 0 bytes .../textures/2D/level_spritesheet.png.import | 40 - .../textures/2D/phantom_camera_2d_sprite.png | Bin 1584 -> 0 bytes .../2D/phantom_camera_2d_sprite.png.import | 40 - .../examples/textures/2D/player_sprite.svg | 4 - .../textures/2D/player_sprite.svg.import | 43 - .../examples/textures/2D/sign_prompt.png | Bin 175934 -> 0 bytes .../textures/2D/sign_prompt.png.import | 40 - .../textures/3D/checker_pattern_dark.png | Bin 2861 -> 0 bytes .../3D/checker_pattern_dark.png.import | 41 - .../examples/textures/3D/target.png | Bin 96068 -> 0 bytes .../examples/ui/ui_inventory.tscn | 37 - .../phantom_camera/examples/ui/ui_sign.tscn | 83 - .../phantom_camera/fonts/Nunito-Black.ttf | Bin 131568 -> 0 bytes .../fonts/Nunito-Black.ttf.import | 36 - .../phantom_camera/fonts/Nunito-Regular.ttf | Bin 131736 -> 0 bytes .../fonts/Nunito-Regular.ttf.import | 36 - .../icons/misc/PriorityOverride.svg | 14 - .../icons/misc/PriorityOverride.svg.import | 43 - .../icons/phantom_camera_2d.svg | 1 - .../icons/phantom_camera_2d.svg.import | 43 - .../icons/phantom_camera_3d.svg | 1 - .../icons/phantom_camera_3d.svg.import | 43 - .../phantom_camera_camera_3d_resource.svg | 3 - ...antom_camera_camera_3d_resource.svg.import | 43 - .../icons/phantom_camera_gizmo.svg | 1 - .../icons/phantom_camera_gizmo.svg.import | 44 - .../icons/phantom_camera_glow_logo.png | Bin 25499 -> 0 bytes .../icons/phantom_camera_glow_logo.png.import | 40 - .../icons/phantom_camera_host.svg | 1 - .../icons/phantom_camera_host.svg.import | 44 - .../icons/phantom_camera_logo.png | Bin 70905 -> 0 bytes .../icons/phantom_camera_logo.png.import | 40 - .../icons/phantom_camera_noise_emitter_2d.svg | 4 - ...phantom_camera_noise_emitter_2d.svg.import | 43 - .../icons/phantom_camera_noise_emitter_3d.svg | 4 - ...phantom_camera_noise_emitter_3d.svg.import | 44 - .../phantom_camera_noise_emitter_gizmo.svg | 4 - ...ntom_camera_noise_emitter_gizmo.svg.import | 44 - .../icons/phantom_camera_noise_resource.svg | 5 - .../phantom_camera_noise_resource.svg.import | 43 - .../icons/phantom_camera_tween.svg | 1 - .../icons/phantom_camera_tween.svg.import | 44 - .../phantom_camera_updater_panel_icon.svg | 3 - ...antom_camera_updater_panel_icon.svg.import | 43 - .../icons/viewfinder/Camera2DIcon.svg | 3 - .../icons/viewfinder/Camera2DIcon.svg.import | 43 - .../icons/viewfinder/Camera3DIcon.svg | 3 - .../icons/viewfinder/Camera3DIcon.svg.import | 43 - .../icons/viewfinder/SceneTypesIcon.svg | 4 - .../viewfinder/SceneTypesIcon.svg.import | 43 - .../icons/viewfinder/Select.svg | 3 - .../icons/viewfinder/Select.svg.import | 43 - godot/addons/phantom_camera/icons/warning.svg | 4 - .../phantom_camera/icons/warning.svg.import | 43 - .../phantom_camera_inspector_plugin.gd | 46 - .../phantom_camera_inspector_plugin.gd.uid | 1 - .../addons/phantom_camera/panel/editor.gd.uid | 1 - godot/addons/phantom_camera/panel/editor.tscn | 23 - .../panel/updater/download_update_panel.tscn | 253 -- .../panel/updater/update_button.tscn | 101 - .../panel/viewfinder/deadzone_style_box.tres | 14 - .../panel/viewfinder/host_list/host_list.tscn | 87 - .../viewfinder/host_list/host_list_item.tscn | 68 - .../host_list/host_list_item_group.tres | 3 - .../panel/viewfinder/viewfinder_panel.tscn | 563 ---- godot/addons/phantom_camera/plugin.cfg | 7 - godot/addons/phantom_camera/plugin.gd | 181 -- godot/addons/phantom_camera/plugin.gd.uid | 1 - .../scripts/gizmos/phantom_camera_3d_gizmo.gd | 84 - .../gizmos/phantom_camera_3d_gizmo.gd.uid | 1 - .../gizmos/phantom_camera_3d_gizmo_plugin.gd | 37 - .../phantom_camera_3d_gizmo_plugin.gd.uid | 1 - ...om_camera_noise_emitter_gizmo_plugin_3d.gd | 29 - ...amera_noise_emitter_gizmo_plugin_3d.gd.uid | 1 - .../scripts/managers/PhantomCameraManager.cs | 36 - .../managers/PhantomCameraManager.cs.uid | 1 - .../managers/phantom_camera_manager.gd | 149 -- .../managers/phantom_camera_manager.gd.uid | 1 - .../phantom_camera/scripts/panel/editor.gd | 23 - .../scripts/panel/editor.gd.uid | 1 - .../panel/updater/download_update_panel.gd | 162 -- .../updater/download_update_panel.gd.uid | 1 - .../scripts/panel/updater/update_button.gd | 177 -- .../panel/updater/update_button.gd.uid | 1 - .../panel/updater/updater_constants.gd | 8 - .../panel/updater/updater_constants.gd.uid | 1 - .../scripts/panel/viewfinder/host_list.gd | 112 - .../scripts/panel/viewfinder/host_list.gd.uid | 1 - .../panel/viewfinder/host_list_item.gd | 58 - .../panel/viewfinder/host_list_item.gd.uid | 1 - .../scripts/panel/viewfinder/viewfinder.gd | 605 ----- .../panel/viewfinder/viewfinder.gd.uid | 1 - .../scripts/phantom_camera/PhantomCamera.cs | 253 -- .../phantom_camera/PhantomCamera.cs.uid | 1 - .../scripts/phantom_camera/PhantomCamera2D.cs | 351 --- .../phantom_camera/PhantomCamera2D.cs.uid | 1 - .../scripts/phantom_camera/PhantomCamera3D.cs | 493 ---- .../phantom_camera/PhantomCamera3D.cs.uid | 1 - .../PhantomCameraNoiseEmitter2D.cs | 83 - .../PhantomCameraNoiseEmitter2D.cs.uid | 1 - .../PhantomCameraNoiseEmitter3D.cs | 83 - .../PhantomCameraNoiseEmitter3D.cs.uid | 1 - .../phantom_camera/phantom_camera_2d.gd | 1726 ------------- .../phantom_camera/phantom_camera_2d.gd.uid | 1 - .../phantom_camera/phantom_camera_3d.gd | 2279 ----------------- .../phantom_camera/phantom_camera_3d.gd.uid | 1 - .../phantom_camera_constants.gd | 29 - .../phantom_camera_constants.gd.uid | 1 - .../phantom_camera_noise_emitter_2d.gd | 264 -- .../phantom_camera_noise_emitter_2d.gd.uid | 1 - .../phantom_camera_noise_emitter_3d.gd | 265 -- .../phantom_camera_noise_emitter_3d.gd.uid | 1 - .../phantom_camera_host/PhantomCameraHost.cs | 128 - .../PhantomCameraHost.cs.uid | 1 - .../phantom_camera_host.gd | 1416 ---------- .../phantom_camera_host.gd.uid | 1 - .../scripts/resources/Camera3DResource.cs | 117 - .../scripts/resources/Camera3DResource.cs.uid | 1 - .../scripts/resources/PhantomCameraNoise2D.cs | 92 - .../resources/PhantomCameraNoise2D.cs.uid | 1 - .../scripts/resources/PhantomCameraNoise3D.cs | 119 - .../resources/PhantomCameraNoise3D.cs.uid | 1 - .../scripts/resources/PhantomCameraTween.cs | 64 - .../resources/PhantomCameraTween.cs.uid | 1 - .../scripts/resources/camera_3d_resource.gd | 110 - .../resources/camera_3d_resource.gd.uid | 1 - .../resources/phantom_camera_noise_2d.gd | 228 -- .../resources/phantom_camera_noise_2d.gd.uid | 1 - .../resources/phantom_camera_noise_3d.gd | 301 --- .../resources/phantom_camera_noise_3d.gd.uid | 1 - .../scripts/resources/tween_resource.gd | 41 - .../scripts/resources/tween_resource.gd.uid | 1 - .../phantom_camera/themes/button_focus.tres | 17 - .../phantom_camera/themes/button_hover.tres | 13 - .../phantom_camera/themes/button_normal.tres | 17 - godot/addons/phantom_camera/themes/theme.tres | 102 - .../resources_spreadsheet_view/LICENSE.md | 9 - .../editor_color_setter.gd | 6 - .../editor_color_setter.gd.uid | 1 - .../editor_icon_button.gd | 12 - .../editor_icon_button.gd.uid | 1 - .../editor_resource_array_picker.gd | 69 - .../editor_resource_array_picker.gd.uid | 1 - .../resources_spreadsheet_view/editor_view.gd | 537 ---- .../editor_view.gd.uid | 1 - .../editor_view.tscn | 606 ----- .../import_export/formats_edit/edit_base.gd | 36 - .../formats_edit/edit_base.gd.uid | 1 - .../import_export/formats_edit/edit_csv.gd | 88 - .../formats_edit/edit_csv.gd.uid | 1 - .../import_export/formats_edit/edit_tres.gd | 148 -- .../formats_edit/edit_tres.gd.uid | 1 - .../formats_export/export_csv.gd | 34 - .../formats_export/export_csv.gd.uid | 1 - .../formats_import/import_csv.gd | 57 - .../formats_import/import_csv.gd.uid | 1 - .../import_export/import_export_dialog.gd | 245 -- .../import_export/import_export_dialog.gd.uid | 1 - .../import_export/import_export_dialog.tscn | 240 -- .../import_export_enum_format.gd | 30 - .../import_export_enum_format.gd.uid | 1 - .../import_export_enum_format.tscn | 68 - .../import_export/property_list_item.gd | 12 - .../import_export/property_list_item.gd.uid | 1 - .../import_export/property_list_item.tscn | 36 - .../import_export/spreadsheet_import.gd | 446 ---- .../import_export/spreadsheet_import.gd.uid | 1 - .../main_screen/class_filter.gd | 146 -- .../main_screen/class_filter.gd.uid | 1 - .../main_screen/column_header_manager.gd | 182 -- .../main_screen/column_header_manager.gd.uid | 1 - .../main_screen/custom_grid_container.gd | 73 - .../main_screen/custom_grid_container.gd.uid | 1 - .../main_screen/expression_textfield.gd | 173 -- .../main_screen/expression_textfield.gd.uid | 1 - .../main_screen/frozen_columns.gd | 60 - .../main_screen/frozen_columns.gd.uid | 1 - .../main_screen/input_handler.gd | 148 -- .../main_screen/input_handler.gd.uid | 1 - .../main_screen/recent_paths.gd | 54 - .../main_screen/recent_paths.gd.uid | 1 - .../main_screen/selection_actions.gd | 191 -- .../main_screen/selection_actions.gd.uid | 1 - .../main_screen/selection_actions.tscn | 191 -- .../main_screen/selection_manager.gd | 320 --- .../main_screen/selection_manager.gd.uid | 1 - .../main_screen/table_header.gd | 72 - .../main_screen/table_header.gd.uid | 1 - .../main_screen/table_header.tscn | 23 - .../main_screen/table_pages.gd | 118 - .../main_screen/table_pages.gd.uid | 1 - .../resources_spreadsheet_view/plugin.cfg | 9 - .../resources_spreadsheet_view/plugin.gd | 43 - .../resources_spreadsheet_view/plugin.gd.uid | 1 - .../settings_grid.gd | 39 - .../settings_grid.gd.uid | 1 - .../settings_grid.tscn | 141 - .../text_editing_utils.gd | 192 -- .../text_editing_utils.gd.uid | 1 - .../typed_cells/array.tscn | 36 - .../typed_cells/basic.tscn | 33 - .../typed_cells/cell_editor.gd | 46 - .../typed_cells/cell_editor.gd.uid | 1 - .../typed_cells/cell_editor_array.gd | 64 - .../typed_cells/cell_editor_array.gd.uid | 1 - .../typed_cells/cell_editor_bool.gd | 34 - .../typed_cells/cell_editor_bool.gd.uid | 1 - .../typed_cells/cell_editor_color.gd | 43 - .../typed_cells/cell_editor_color.gd.uid | 1 - .../typed_cells/cell_editor_dict.gd | 51 - .../typed_cells/cell_editor_dict.gd.uid | 1 - .../typed_cells/cell_editor_enum.gd | 38 - .../typed_cells/cell_editor_enum.gd.uid | 1 - .../typed_cells/cell_editor_enum_array.gd | 39 - .../typed_cells/cell_editor_enum_array.gd.uid | 1 - .../typed_cells/cell_editor_number.gd | 13 - .../typed_cells/cell_editor_number.gd.uid | 1 - .../typed_cells/cell_editor_resource.gd | 73 - .../typed_cells/cell_editor_resource.gd.uid | 1 - .../typed_cells/cell_editor_string.gd | 29 - .../typed_cells/cell_editor_string.gd.uid | 1 - .../typed_cells/resource.tscn | 45 - .../typed_editors/dock_array.gd | 252 -- .../typed_editors/dock_array.gd.uid | 1 - .../typed_editors/dock_array.tscn | 195 -- .../typed_editors/dock_base.gd | 50 - .../typed_editors/dock_base.gd.uid | 1 - .../typed_editors/dock_color.gd | 139 - .../typed_editors/dock_color.gd.uid | 1 - .../typed_editors/dock_color.tscn | 295 --- .../typed_editors/dock_dict.gd | 201 -- .../typed_editors/dock_dict.gd.uid | 1 - .../typed_editors/dock_dict.tscn | 226 -- .../typed_editors/dock_enum_array.gd | 137 - .../typed_editors/dock_enum_array.gd.uid | 1 - .../typed_editors/dock_enum_array.tscn | 117 - .../typed_editors/dock_number.gd | 188 -- .../typed_editors/dock_number.gd.uid | 1 - .../typed_editors/dock_number.tscn | 265 -- .../typed_editors/dock_texture.gd | 39 - .../typed_editors/dock_texture.gd.uid | 1 - .../typed_editors/dock_texture.tscn | 101 - godot/addons/snappy/plugin.cfg | 7 - godot/addons/snappy/snappy.gd | 124 - godot/addons/snappy/snappy.gd.uid | 1 - .../assets/icons/folder_open-white-18dp.svg | 1 - .../icons/folder_open-white-18dp.svg.import | 43 - .../assets/icons/format-color-text.png | Bin 480 -> 0 bytes .../assets/icons/format-color-text.png.import | 40 - .../icons/format_align_center-white-18dp.svg | 1 - .../format_align_center-white-18dp.svg.import | 43 - .../icons/format_align_left-white-18dp.svg | 1 - .../format_align_left-white-18dp.svg.import | 43 - .../icons/format_align_right-white-18dp.svg | 1 - .../format_align_right-white-18dp.svg.import | 43 - .../assets/icons/format_bold-white-18dp.svg | 1 - .../icons/format_bold-white-18dp.svg.import | 43 - .../assets/icons/format_clear-white-18dp.svg | 1 - .../icons/format_clear-white-18dp.svg.import | 43 - .../icons/format_color_reset-white-18dp.svg | 1 - .../format_color_reset-white-18dp.svg.import | 43 - .../assets/icons/format_italic-white-18dp.svg | 1 - .../icons/format_italic-white-18dp.svg.import | 43 - .../icons/format_underlined-white-18dp.svg | 1 - .../format_underlined-white-18dp.svg.import | 43 - .../ui_design_tool/assets/icons/marker.png | Bin 483 -> 0 bytes .../assets/icons/marker.png.import | 40 - .../assets/icons/more_horiz-white-18dp.svg | 1 - .../icons/more_horiz-white-18dp.svg.import | 43 - .../assets/icons/more_vert-white-18dp.svg | 1 - .../icons/more_vert-white-18dp.svg.import | 43 - .../photo_size_select_small-white-18dp.svg | 1 - ...to_size_select_small-white-18dp.svg.import | 43 - .../assets/icons/refresh-white-18dp.svg | 1 - .../icons/refresh-white-18dp.svg.import | 43 - .../vertical_align_bottom-white-18dp.svg | 1 - ...ertical_align_bottom-white-18dp.svg.import | 43 - .../vertical_align_center-white-18dp.svg | 1 - ...ertical_align_center-white-18dp.svg.import | 43 - .../icons/vertical_align_top-white-18dp.svg | 1 - .../vertical_align_top-white-18dp.svg.import | 43 - godot/addons/ui_design_tool/plugin.cfg | 7 - godot/addons/ui_design_tool/plugin.gd | 85 - godot/addons/ui_design_tool/plugin.gd.uid | 1 - .../ui_design_tool/scenes/OverlayTextEdit.gd | 58 - .../scenes/OverlayTextEdit.gd.uid | 1 - .../scenes/OverlayTextEdit.tscn | 31 - godot/addons/ui_design_tool/scenes/Toolbar.gd | 899 ------- .../ui_design_tool/scenes/Toolbar.gd.uid | 1 - .../addons/ui_design_tool/scenes/Toolbar.tscn | 384 --- .../ui_design_tool/scripts/FontManager.gd | 240 -- .../ui_design_tool/scripts/FontManager.gd.uid | 1 - godot/addons/ui_design_tool/scripts/Utils.gd | 61 - .../ui_design_tool/scripts/Utils.gd.uid | 1 - godot/addons/your_buil/CHANGELOG.md | 20 - godot/addons/your_buil/LICENSE.txt | 22 - godot/addons/your_buil/exporter.gd | 74 - godot/addons/your_buil/exporter.gd.uid | 1 - godot/addons/your_buil/plugin.cfg | 7 - godot/addons/your_buil/plugin.gd | 12 - godot/addons/your_buil/plugin.gd.uid | 1 - godot/addons/your_buil/wrapper.gd | 187 -- godot/addons/your_buil/wrapper.gd.uid | 1 - godot/art/House In a Forest Loop.ogg | Bin 1430743 -> 0 bytes godot/art/House In a Forest Loop.ogg.import | 19 - godot/art/enemyFlyingAlt_1.png | Bin 4547 -> 0 bytes godot/art/enemyFlyingAlt_1.png.import | 40 - godot/art/enemyFlyingAlt_2.png | Bin 3837 -> 0 bytes godot/art/enemyFlyingAlt_2.png.import | 40 - godot/art/enemySwimming_1.png | Bin 3545 -> 0 bytes godot/art/enemySwimming_1.png.import | 40 - godot/art/enemySwimming_2.png | Bin 3891 -> 0 bytes godot/art/enemySwimming_2.png.import | 40 - godot/art/enemyWalking_1.png | Bin 3472 -> 0 bytes godot/art/enemyWalking_1.png.import | 40 - godot/art/enemyWalking_2.png | Bin 3748 -> 0 bytes godot/art/enemyWalking_2.png.import | 40 - godot/art/gameover.wav | Bin 423450 -> 0 bytes godot/art/gameover.wav.import | 24 - godot/art/lilhornet.png | Bin 0 -> 8244 bytes .../lilhornet.png.import} | 8 +- godot/art/minecraft_atlas.png | Bin 0 -> 115654 bytes .../minecraft_atlas.png.import} | 8 +- godot/art/playerGrey_up1.png | Bin 4954 -> 0 bytes godot/art/playerGrey_up1.png.import | 40 - godot/art/playerGrey_up2.png | Bin 4717 -> 0 bytes godot/art/playerGrey_up2.png.import | 40 - godot/art/playerGrey_walk1.png | Bin 4812 -> 0 bytes godot/art/playerGrey_walk1.png.import | 40 - godot/art/playerGrey_walk2.png | Bin 5302 -> 0 bytes godot/art/playerGrey_walk2.png.import | 40 - godot/project.godot | 5 +- godot/trymap.tscn | 35 + rust/build.rs | 2 +- rust/src/Mappy.rs | 194 ++ rust/src/lib.rs | 2 +- rust/src/player.rs | 61 - 2422 files changed, 243 insertions(+), 132309 deletions(-) delete mode 100644 godot/addons/Asset_Drawer/AssetDrawerShortcut.tres delete mode 100644 godot/addons/Asset_Drawer/FileSystem.gd delete mode 100644 godot/addons/Asset_Drawer/FileSystem.gd.uid delete mode 100644 godot/addons/Asset_Drawer/LICENSE delete mode 100644 godot/addons/Asset_Drawer/plugin.cfg delete mode 100644 godot/addons/Gedis/core/gedis_core.gd delete mode 100644 godot/addons/Gedis/core/gedis_core.gd.uid delete mode 100644 godot/addons/Gedis/core/gedis_debugger.gd delete mode 100644 godot/addons/Gedis/core/gedis_debugger.gd.uid delete mode 100644 godot/addons/Gedis/core/gedis_expiry.gd delete mode 100644 godot/addons/Gedis/core/gedis_expiry.gd.uid delete mode 100644 godot/addons/Gedis/core/gedis_hashes.gd delete mode 100644 godot/addons/Gedis/core/gedis_hashes.gd.uid delete mode 100644 godot/addons/Gedis/core/gedis_lists.gd delete mode 100644 godot/addons/Gedis/core/gedis_lists.gd.uid delete mode 100644 godot/addons/Gedis/core/gedis_pubsub.gd delete mode 100644 godot/addons/Gedis/core/gedis_pubsub.gd.uid delete mode 100644 godot/addons/Gedis/core/gedis_sets.gd delete mode 100644 godot/addons/Gedis/core/gedis_sets.gd.uid delete mode 100644 godot/addons/Gedis/core/gedis_sorted_sets.gd delete mode 100644 godot/addons/Gedis/core/gedis_sorted_sets.gd.uid delete mode 100644 godot/addons/Gedis/core/gedis_strings.gd delete mode 100644 godot/addons/Gedis/core/gedis_strings.gd.uid delete mode 100644 godot/addons/Gedis/core/gedis_utils.gd delete mode 100644 godot/addons/Gedis/core/gedis_utils.gd.uid delete mode 100644 godot/addons/Gedis/core/persistence/gedis_json_snapshot_backend.gd delete mode 100644 godot/addons/Gedis/core/persistence/gedis_json_snapshot_backend.gd.uid delete mode 100644 godot/addons/Gedis/core/persistence/gedis_persistence_backend.gd delete mode 100644 godot/addons/Gedis/core/persistence/gedis_persistence_backend.gd.uid delete mode 100644 godot/addons/Gedis/core/time_sources/gedis_process_delta_time_source.gd delete mode 100644 godot/addons/Gedis/core/time_sources/gedis_process_delta_time_source.gd.uid delete mode 100644 godot/addons/Gedis/core/time_sources/gedis_tick_time_source.gd delete mode 100644 godot/addons/Gedis/core/time_sources/gedis_tick_time_source.gd.uid delete mode 100644 godot/addons/Gedis/core/time_sources/gedis_time_source.gd delete mode 100644 godot/addons/Gedis/core/time_sources/gedis_time_source.gd.uid delete mode 100644 godot/addons/Gedis/core/time_sources/gedis_unix_time_source.gd delete mode 100644 godot/addons/Gedis/core/time_sources/gedis_unix_time_source.gd.uid delete mode 100644 godot/addons/Gedis/debugger/gedis_debugger_panel.gd delete mode 100644 godot/addons/Gedis/debugger/gedis_debugger_panel.gd.uid delete mode 100644 godot/addons/Gedis/debugger/gedis_debugger_panel.tscn delete mode 100644 godot/addons/Gedis/gedis.gd delete mode 100644 godot/addons/Gedis/gedis.gd.uid delete mode 100644 godot/addons/Gedis/icon.png delete mode 100644 godot/addons/Gedis/plugin.cfg delete mode 100644 godot/addons/Gedis/plugin.gd delete mode 100644 godot/addons/Gedis/plugin.gd.uid delete mode 100644 godot/addons/GedisQueue/GedisQueue.gd delete mode 100644 godot/addons/GedisQueue/GedisQueue.gd.uid delete mode 100644 godot/addons/GedisQueue/GedisQueueJob.gd delete mode 100644 godot/addons/GedisQueue/GedisQueueJob.gd.uid delete mode 100644 godot/addons/GedisQueue/GedisQueueWorker.gd delete mode 100644 godot/addons/GedisQueue/GedisQueueWorker.gd.uid delete mode 100644 godot/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd delete mode 100644 godot/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd.uid delete mode 100644 godot/addons/GedisQueue/debugger/gedis_queue_debugger_panel.tscn delete mode 100644 godot/addons/GedisQueue/icon.png delete mode 100644 godot/addons/GedisQueue/icon.png.import delete mode 100644 godot/addons/GedisQueue/plugin.cfg delete mode 100644 godot/addons/GedisQueue/plugin.gd delete mode 100644 godot/addons/GedisQueue/plugin.gd.uid delete mode 100644 godot/addons/PaletteTools/Images/Blank.png delete mode 100644 godot/addons/PaletteTools/Images/Blank.png.import delete mode 100644 godot/addons/PaletteTools/Images/Plus.png delete mode 100644 godot/addons/PaletteTools/Images/Plus.png.import delete mode 100755 godot/addons/PaletteTools/Images/checked.png delete mode 100644 godot/addons/PaletteTools/Images/checked.png.import delete mode 100644 godot/addons/PaletteTools/Images/checked_4k.png delete mode 100644 godot/addons/PaletteTools/Images/checked_4k.png.import delete mode 100644 godot/addons/PaletteTools/Images/spyglass.png delete mode 100644 godot/addons/PaletteTools/Images/spyglass.png.import delete mode 100755 godot/addons/PaletteTools/Images/unchecked.png delete mode 100644 godot/addons/PaletteTools/Images/unchecked.png.import delete mode 100644 godot/addons/PaletteTools/Images/unchecked_4k.png delete mode 100644 godot/addons/PaletteTools/Images/unchecked_4k.png.import delete mode 100644 godot/addons/PaletteTools/LICENSE.md delete mode 100644 godot/addons/PaletteTools/README.md delete mode 100644 godot/addons/PaletteTools/Resources/section_label_settings.tres delete mode 100644 godot/addons/PaletteTools/Resources/section_label_settings_contrast.tres delete mode 100644 godot/addons/PaletteTools/Scenes/browse_palette_preview.tscn delete mode 100644 godot/addons/PaletteTools/Scenes/color_sample.tscn delete mode 100644 godot/addons/PaletteTools/Scenes/custom_palette.tscn delete mode 100644 godot/addons/PaletteTools/Scenes/custom_picker.tscn delete mode 100644 godot/addons/PaletteTools/Scenes/palette_tools.tscn delete mode 100644 godot/addons/PaletteTools/Scenes/plus_box.tscn delete mode 100644 godot/addons/PaletteTools/Scripts/alert_popup_panel.gd delete mode 100644 godot/addons/PaletteTools/Scripts/alert_popup_panel.gd.uid delete mode 100644 godot/addons/PaletteTools/Scripts/browse_palette_preview.gd delete mode 100644 godot/addons/PaletteTools/Scripts/browse_palette_preview.gd.uid delete mode 100644 godot/addons/PaletteTools/Scripts/browse_popup.gd delete mode 100644 godot/addons/PaletteTools/Scripts/browse_popup.gd.uid delete mode 100644 godot/addons/PaletteTools/Scripts/color_sample.gd delete mode 100644 godot/addons/PaletteTools/Scripts/color_sample.gd.uid delete mode 100644 godot/addons/PaletteTools/Scripts/custom_picker.gd delete mode 100644 godot/addons/PaletteTools/Scripts/custom_picker.gd.uid delete mode 100644 godot/addons/PaletteTools/Scripts/custom_property.gd delete mode 100644 godot/addons/PaletteTools/Scripts/custom_property.gd.uid delete mode 100644 godot/addons/PaletteTools/Scripts/get_from_url.gd delete mode 100644 godot/addons/PaletteTools/Scripts/get_from_url.gd.uid delete mode 100644 godot/addons/PaletteTools/Scripts/loading_palettes_screen.gd delete mode 100644 godot/addons/PaletteTools/Scripts/loading_palettes_screen.gd.uid delete mode 100644 godot/addons/PaletteTools/Scripts/palette_inspector_script.gd delete mode 100644 godot/addons/PaletteTools/Scripts/palette_inspector_script.gd.uid delete mode 100644 godot/addons/PaletteTools/Scripts/palette_tool.gd delete mode 100644 godot/addons/PaletteTools/Scripts/palette_tool.gd.uid delete mode 100644 godot/addons/PaletteTools/Shaders/rainbow_shader.gdshader delete mode 100644 godot/addons/PaletteTools/Shaders/rainbow_shader.gdshader.uid delete mode 100644 godot/addons/PaletteTools/icon.png delete mode 100644 godot/addons/PaletteTools/icon.png.import delete mode 100644 godot/addons/PaletteTools/palette_tools.gd delete mode 100644 godot/addons/PaletteTools/palette_tools.gd.uid delete mode 100644 godot/addons/PaletteTools/plugin.cfg delete mode 100644 godot/addons/PaletteTools/temp_palette.txt delete mode 100644 godot/addons/beehave/LICENSE delete mode 100644 godot/addons/beehave/blackboard.gd delete mode 100644 godot/addons/beehave/blackboard.gd.uid delete mode 100644 godot/addons/beehave/debug/debugger.gd delete mode 100644 godot/addons/beehave/debug/debugger.gd.uid delete mode 100644 godot/addons/beehave/debug/debugger_messages.gd delete mode 100644 godot/addons/beehave/debug/debugger_messages.gd.uid delete mode 100644 godot/addons/beehave/debug/debugger_tab.gd delete mode 100644 godot/addons/beehave/debug/debugger_tab.gd.uid delete mode 100644 godot/addons/beehave/debug/global_debugger.gd delete mode 100644 godot/addons/beehave/debug/global_debugger.gd.uid delete mode 100644 godot/addons/beehave/debug/icons/horizontal_layout.svg delete mode 100644 godot/addons/beehave/debug/icons/horizontal_layout.svg.import delete mode 100644 godot/addons/beehave/debug/icons/port_bottom.svg delete mode 100644 godot/addons/beehave/debug/icons/port_bottom.svg.import delete mode 100644 godot/addons/beehave/debug/icons/port_left.svg delete mode 100644 godot/addons/beehave/debug/icons/port_left.svg.import delete mode 100644 godot/addons/beehave/debug/icons/port_right.svg delete mode 100644 godot/addons/beehave/debug/icons/port_right.svg.import delete mode 100644 godot/addons/beehave/debug/icons/port_top.svg delete mode 100644 godot/addons/beehave/debug/icons/port_top.svg.import delete mode 100644 godot/addons/beehave/debug/icons/vertical_layout.svg delete mode 100644 godot/addons/beehave/debug/icons/vertical_layout.svg.import delete mode 100644 godot/addons/beehave/debug/new_frames.gd delete mode 100644 godot/addons/beehave/debug/new_frames.gd.uid delete mode 100644 godot/addons/beehave/debug/new_graph_edit.gd delete mode 100644 godot/addons/beehave/debug/new_graph_edit.gd.uid delete mode 100644 godot/addons/beehave/debug/new_graph_node.gd delete mode 100644 godot/addons/beehave/debug/new_graph_node.gd.uid delete mode 100644 godot/addons/beehave/debug/new_node_blackboard.gd delete mode 100644 godot/addons/beehave/debug/new_node_blackboard.gd.uid delete mode 100644 godot/addons/beehave/debug/old_frames.gd delete mode 100644 godot/addons/beehave/debug/old_frames.gd.uid delete mode 100644 godot/addons/beehave/debug/old_graph_edit.gd delete mode 100644 godot/addons/beehave/debug/old_graph_edit.gd.uid delete mode 100644 godot/addons/beehave/debug/old_graph_node.gd delete mode 100644 godot/addons/beehave/debug/old_graph_node.gd.uid delete mode 100644 godot/addons/beehave/debug/tree_node.gd delete mode 100644 godot/addons/beehave/debug/tree_node.gd.uid delete mode 100644 godot/addons/beehave/icons/action.svg delete mode 100644 godot/addons/beehave/icons/action.svg.import delete mode 100644 godot/addons/beehave/icons/blackboard.svg delete mode 100644 godot/addons/beehave/icons/blackboard.svg.import delete mode 100644 godot/addons/beehave/icons/category_bt.svg delete mode 100644 godot/addons/beehave/icons/category_bt.svg.import delete mode 100644 godot/addons/beehave/icons/category_composite.svg delete mode 100644 godot/addons/beehave/icons/category_composite.svg.import delete mode 100644 godot/addons/beehave/icons/category_decorator.svg delete mode 100644 godot/addons/beehave/icons/category_decorator.svg.import delete mode 100644 godot/addons/beehave/icons/category_leaf.svg delete mode 100644 godot/addons/beehave/icons/category_leaf.svg.import delete mode 100644 godot/addons/beehave/icons/condition.svg delete mode 100644 godot/addons/beehave/icons/condition.svg.import delete mode 100644 godot/addons/beehave/icons/cooldown.svg delete mode 100644 godot/addons/beehave/icons/cooldown.svg.import delete mode 100644 godot/addons/beehave/icons/delayer.svg delete mode 100644 godot/addons/beehave/icons/delayer.svg.import delete mode 100644 godot/addons/beehave/icons/failer.svg delete mode 100644 godot/addons/beehave/icons/failer.svg.import delete mode 100644 godot/addons/beehave/icons/inverter.svg delete mode 100644 godot/addons/beehave/icons/inverter.svg.import delete mode 100644 godot/addons/beehave/icons/limiter.svg delete mode 100644 godot/addons/beehave/icons/limiter.svg.import delete mode 100644 godot/addons/beehave/icons/repeater.svg delete mode 100644 godot/addons/beehave/icons/repeater.svg.import delete mode 100644 godot/addons/beehave/icons/selector.svg delete mode 100644 godot/addons/beehave/icons/selector.svg.import delete mode 100644 godot/addons/beehave/icons/selector_random.svg delete mode 100644 godot/addons/beehave/icons/selector_random.svg.import delete mode 100644 godot/addons/beehave/icons/selector_reactive.svg delete mode 100644 godot/addons/beehave/icons/selector_reactive.svg.import delete mode 100644 godot/addons/beehave/icons/sequence.svg delete mode 100644 godot/addons/beehave/icons/sequence.svg.import delete mode 100644 godot/addons/beehave/icons/sequence_random.svg delete mode 100644 godot/addons/beehave/icons/sequence_random.svg.import delete mode 100644 godot/addons/beehave/icons/sequence_reactive.svg delete mode 100644 godot/addons/beehave/icons/sequence_reactive.svg.import delete mode 100644 godot/addons/beehave/icons/simple_parallel.svg delete mode 100644 godot/addons/beehave/icons/simple_parallel.svg.import delete mode 100644 godot/addons/beehave/icons/succeeder.svg delete mode 100644 godot/addons/beehave/icons/succeeder.svg.import delete mode 100644 godot/addons/beehave/icons/tree.svg delete mode 100644 godot/addons/beehave/icons/tree.svg.import delete mode 100644 godot/addons/beehave/icons/until_fail.svg delete mode 100644 godot/addons/beehave/icons/until_fail.svg.import delete mode 100644 godot/addons/beehave/metrics/beehave_global_metrics.gd delete mode 100644 godot/addons/beehave/metrics/beehave_global_metrics.gd.uid delete mode 100644 godot/addons/beehave/nodes/beehave_node.gd delete mode 100644 godot/addons/beehave/nodes/beehave_node.gd.uid delete mode 100644 godot/addons/beehave/nodes/beehave_tree.gd delete mode 100644 godot/addons/beehave/nodes/beehave_tree.gd.uid delete mode 100644 godot/addons/beehave/nodes/composites/composite.gd delete mode 100644 godot/addons/beehave/nodes/composites/composite.gd.uid delete mode 100644 godot/addons/beehave/nodes/composites/randomized_composite.gd delete mode 100644 godot/addons/beehave/nodes/composites/randomized_composite.gd.uid delete mode 100644 godot/addons/beehave/nodes/composites/selector.gd delete mode 100644 godot/addons/beehave/nodes/composites/selector.gd.uid delete mode 100644 godot/addons/beehave/nodes/composites/selector_random.gd delete mode 100644 godot/addons/beehave/nodes/composites/selector_random.gd.uid delete mode 100644 godot/addons/beehave/nodes/composites/selector_reactive.gd delete mode 100644 godot/addons/beehave/nodes/composites/selector_reactive.gd.uid delete mode 100644 godot/addons/beehave/nodes/composites/sequence.gd delete mode 100644 godot/addons/beehave/nodes/composites/sequence.gd.uid delete mode 100644 godot/addons/beehave/nodes/composites/sequence_random.gd delete mode 100644 godot/addons/beehave/nodes/composites/sequence_random.gd.uid delete mode 100644 godot/addons/beehave/nodes/composites/sequence_reactive.gd delete mode 100644 godot/addons/beehave/nodes/composites/sequence_reactive.gd.uid delete mode 100644 godot/addons/beehave/nodes/composites/sequence_star.gd delete mode 100644 godot/addons/beehave/nodes/composites/sequence_star.gd.uid delete mode 100644 godot/addons/beehave/nodes/composites/simple_parallel.gd delete mode 100644 godot/addons/beehave/nodes/composites/simple_parallel.gd.uid delete mode 100644 godot/addons/beehave/nodes/decorators/cooldown.gd delete mode 100644 godot/addons/beehave/nodes/decorators/cooldown.gd.uid delete mode 100644 godot/addons/beehave/nodes/decorators/decorator.gd delete mode 100644 godot/addons/beehave/nodes/decorators/decorator.gd.uid delete mode 100644 godot/addons/beehave/nodes/decorators/delayer.gd delete mode 100644 godot/addons/beehave/nodes/decorators/delayer.gd.uid delete mode 100644 godot/addons/beehave/nodes/decorators/failer.gd delete mode 100644 godot/addons/beehave/nodes/decorators/failer.gd.uid delete mode 100644 godot/addons/beehave/nodes/decorators/inverter.gd delete mode 100644 godot/addons/beehave/nodes/decorators/inverter.gd.uid delete mode 100644 godot/addons/beehave/nodes/decorators/limiter.gd delete mode 100644 godot/addons/beehave/nodes/decorators/limiter.gd.uid delete mode 100644 godot/addons/beehave/nodes/decorators/repeater.gd delete mode 100644 godot/addons/beehave/nodes/decorators/repeater.gd.uid delete mode 100644 godot/addons/beehave/nodes/decorators/succeeder.gd delete mode 100644 godot/addons/beehave/nodes/decorators/succeeder.gd.uid delete mode 100644 godot/addons/beehave/nodes/decorators/time_limiter.gd delete mode 100644 godot/addons/beehave/nodes/decorators/time_limiter.gd.uid delete mode 100644 godot/addons/beehave/nodes/decorators/until_fail.gd delete mode 100644 godot/addons/beehave/nodes/decorators/until_fail.gd.uid delete mode 100644 godot/addons/beehave/nodes/leaves/action.gd delete mode 100644 godot/addons/beehave/nodes/leaves/action.gd.uid delete mode 100644 godot/addons/beehave/nodes/leaves/blackboard_compare.gd delete mode 100644 godot/addons/beehave/nodes/leaves/blackboard_compare.gd.uid delete mode 100644 godot/addons/beehave/nodes/leaves/blackboard_erase.gd delete mode 100644 godot/addons/beehave/nodes/leaves/blackboard_erase.gd.uid delete mode 100644 godot/addons/beehave/nodes/leaves/blackboard_has.gd delete mode 100644 godot/addons/beehave/nodes/leaves/blackboard_has.gd.uid delete mode 100644 godot/addons/beehave/nodes/leaves/blackboard_set.gd delete mode 100644 godot/addons/beehave/nodes/leaves/blackboard_set.gd.uid delete mode 100644 godot/addons/beehave/nodes/leaves/condition.gd delete mode 100644 godot/addons/beehave/nodes/leaves/condition.gd.uid delete mode 100644 godot/addons/beehave/nodes/leaves/leaf.gd delete mode 100644 godot/addons/beehave/nodes/leaves/leaf.gd.uid delete mode 100644 godot/addons/beehave/plugin.cfg delete mode 100644 godot/addons/beehave/plugin.gd delete mode 100644 godot/addons/beehave/plugin.gd.uid delete mode 100644 godot/addons/beehave/utils/utils.gd delete mode 100644 godot/addons/beehave/utils/utils.gd.uid delete mode 100644 godot/addons/dialogic/Core/DialogicGameHandler.gd delete mode 100644 godot/addons/dialogic/Core/DialogicGameHandler.gd.uid delete mode 100644 godot/addons/dialogic/Core/DialogicResourceUtil.gd delete mode 100644 godot/addons/dialogic/Core/DialogicResourceUtil.gd.uid delete mode 100644 godot/addons/dialogic/Core/DialogicUtil.gd delete mode 100644 godot/addons/dialogic/Core/DialogicUtil.gd.uid delete mode 100644 godot/addons/dialogic/Core/Dialogic_Subsystem.gd delete mode 100644 godot/addons/dialogic/Core/Dialogic_Subsystem.gd.uid delete mode 100644 godot/addons/dialogic/Core/index_class.gd delete mode 100644 godot/addons/dialogic/Core/index_class.gd.uid delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_exports.gd delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_exports.gd.uid delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_exports.tscn delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_layout.gd delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_layout.gd.uid delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_layout.tscn delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main.gd delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main.gd.uid delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main.tscn delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main_exports.gd delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main_exports.gd.uid delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main_exports.tscn delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_general.gd delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_general.gd.uid delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_general.tscn delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_portraits.gd delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_portraits.gd.uid delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_portraits.tscn delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/character_editor.gd delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/character_editor.gd.uid delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/character_editor.tscn delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/character_editor_main_settings_section.gd delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/character_editor_main_settings_section.gd.uid delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/character_editor_portrait_settings_section.gd delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/character_editor_portrait_settings_section.gd.uid delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/character_editor_portrait_tree.gd delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/character_editor_portrait_tree.gd.uid delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/character_prefix_suffix.gd delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/character_prefix_suffix.gd.uid delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/character_prefix_suffix.tscn delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/portrait_scene_browser.gd delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/portrait_scene_browser.gd.uid delete mode 100644 godot/addons/dialogic/Editor/CharacterEditor/portrait_scene_browser.tscn delete mode 100644 godot/addons/dialogic/Editor/Common/BrowserItem.gd delete mode 100644 godot/addons/dialogic/Editor/Common/BrowserItem.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Common/BrowserItem.tscn delete mode 100644 godot/addons/dialogic/Editor/Common/DCSS.gd delete mode 100644 godot/addons/dialogic/Editor/Common/DCSS.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Common/ReferenceManager_AddReplacementPanel.gd delete mode 100644 godot/addons/dialogic/Editor/Common/ReferenceManager_AddReplacementPanel.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Common/TitleBgStylebox.tres delete mode 100644 godot/addons/dialogic/Editor/Common/broken_reference_manager.gd delete mode 100644 godot/addons/dialogic/Editor/Common/broken_reference_manager.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Common/hint_tooltip_icon.gd delete mode 100644 godot/addons/dialogic/Editor/Common/hint_tooltip_icon.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Common/hint_tooltip_icon.tscn delete mode 100644 godot/addons/dialogic/Editor/Common/reference_manager.gd delete mode 100644 godot/addons/dialogic/Editor/Common/reference_manager.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Common/reference_manager.tscn delete mode 100644 godot/addons/dialogic/Editor/Common/reference_manager_window.gd delete mode 100644 godot/addons/dialogic/Editor/Common/reference_manager_window.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Common/side_bar.tscn delete mode 100644 godot/addons/dialogic/Editor/Common/sidebar.gd delete mode 100644 godot/addons/dialogic/Editor/Common/sidebar.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Common/toolbar.gd delete mode 100644 godot/addons/dialogic/Editor/Common/toolbar.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Common/unique_identifiers_manager.gd delete mode 100644 godot/addons/dialogic/Editor/Common/unique_identifiers_manager.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Common/update_install_window.gd delete mode 100644 godot/addons/dialogic/Editor/Common/update_install_window.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Common/update_install_window.tscn delete mode 100644 godot/addons/dialogic/Editor/Common/update_manager.gd delete mode 100644 godot/addons/dialogic/Editor/Common/update_manager.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/BranchEnd.gd delete mode 100644 godot/addons/dialogic/Editor/Events/BranchEnd.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/BranchEnd.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/EventBlock/event_block.gd delete mode 100644 godot/addons/dialogic/Editor/Events/EventBlock/event_block.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/EventBlock/event_block.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/EventBlock/event_right_click_menu.gd delete mode 100644 godot/addons/dialogic/Editor/Events/EventBlock/event_right_click_menu.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/array_part.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/array_part.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/array_part.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/dictionary_part.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/dictionary_part.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/dictionary_part.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_array.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_array.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_array.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_audio_preview.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_audio_preview.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_audio_preview.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_bool_button.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_bool_button.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_bool_button.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_bool_check.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_bool_check.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_bool_check.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_color.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_color.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_color.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_condition.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_condition.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_condition.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_dictionary.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_dictionary.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_dictionary.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_file.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_file.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_file.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_flex_value.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_flex_value.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_flex_value.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_image_preview.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_image_preview.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_image_preview.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_number.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_number.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_number.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_options_dynamic.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_options_dynamic.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_options_dynamic.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_options_fixed.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_options_fixed.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_options_fixed.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_text_multiline.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_text_multiline.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_text_multiline.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_text_singleline.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_text_singleline.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_text_singleline.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_vector2.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_vector2.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_vector2.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_vector3.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_vector3.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_vector3.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_vector4.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_vector4.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_vector4.tscn delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_vector_base.gd delete mode 100644 godot/addons/dialogic/Editor/Events/Fields/field_vector_base.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/event_field.gd delete mode 100644 godot/addons/dialogic/Editor/Events/event_field.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Events/styles/InputFieldsStyle.tres delete mode 100644 godot/addons/dialogic/Editor/Events/styles/ResourceMenuHover.tres delete mode 100644 godot/addons/dialogic/Editor/Events/styles/ResourceMenuNormal.tres delete mode 100644 godot/addons/dialogic/Editor/Events/styles/ResourceMenuPanelBackground.tres delete mode 100644 godot/addons/dialogic/Editor/Events/styles/SectionPanel.tres delete mode 100644 godot/addons/dialogic/Editor/Events/styles/SimpleButtonHover.tres delete mode 100644 godot/addons/dialogic/Editor/Events/styles/SimpleButtonNormal.tres delete mode 100644 godot/addons/dialogic/Editor/Events/styles/TextBackground.tres delete mode 100644 godot/addons/dialogic/Editor/Events/styles/selected_styleboxflat.tres delete mode 100644 godot/addons/dialogic/Editor/Events/styles/unselected_stylebox.tres delete mode 100644 godot/addons/dialogic/Editor/HomePage/home_page.gd delete mode 100644 godot/addons/dialogic/Editor/HomePage/home_page.gd.uid delete mode 100644 godot/addons/dialogic/Editor/HomePage/home_page.tscn delete mode 100644 godot/addons/dialogic/Editor/HomePage/icon_bg.png delete mode 100644 godot/addons/dialogic/Editor/HomePage/icon_bg.png.import delete mode 100644 godot/addons/dialogic/Editor/HomePage/tips.txt delete mode 100644 godot/addons/dialogic/Editor/Images/Dropdown/default.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Dropdown/default.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Dropdown/divide.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Dropdown/divide.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Dropdown/join.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Dropdown/join.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Dropdown/leave.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Dropdown/leave.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Dropdown/minus.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Dropdown/minus.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Dropdown/multiply.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Dropdown/multiply.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Dropdown/plus.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Dropdown/plus.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Dropdown/set.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Dropdown/set.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Dropdown/update.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Dropdown/update.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Interactable/decrement_icon.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Interactable/decrement_icon.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Interactable/increment_icon.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Interactable/increment_icon.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Pieces/add-folder.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Pieces/add-folder.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Pieces/close-icon.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Pieces/close-icon.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Pieces/closed-icon.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Pieces/closed-icon.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Pieces/expand-icon.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Pieces/expand-icon.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Pieces/open-icon.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Pieces/open-icon.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Pieces/variable.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Pieces/variable.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Pieces/variable_icon.png delete mode 100644 godot/addons/dialogic/Editor/Images/Pieces/variable_icon.png.import delete mode 100644 godot/addons/dialogic/Editor/Images/Pieces/warning.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Pieces/warning.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Resources/character.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Resources/character.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Resources/icon_character.png delete mode 100644 godot/addons/dialogic/Editor/Images/Resources/icon_character.png.import delete mode 100644 godot/addons/dialogic/Editor/Images/Resources/portrait.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Resources/portrait.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Resources/timeline.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Resources/timeline.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Toolbar/add-character.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Toolbar/add-character.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Toolbar/add-timeline.svg delete mode 100644 godot/addons/dialogic/Editor/Images/Toolbar/add-timeline.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/Unknown.png delete mode 100644 godot/addons/dialogic/Editor/Images/Unknown.png.import delete mode 100644 godot/addons/dialogic/Editor/Images/dialogic-logo.svg delete mode 100644 godot/addons/dialogic/Editor/Images/dialogic-logo.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/plugin-icon.svg delete mode 100644 godot/addons/dialogic/Editor/Images/plugin-icon.svg.import delete mode 100644 godot/addons/dialogic/Editor/Images/preview_character.png delete mode 100644 godot/addons/dialogic/Editor/Images/preview_character.png.import delete mode 100644 godot/addons/dialogic/Editor/Images/preview_character_speaker.png delete mode 100644 godot/addons/dialogic/Editor/Images/preview_character_speaker.png.import delete mode 100644 godot/addons/dialogic/Editor/Inspector/inspector_plugin.gd delete mode 100644 godot/addons/dialogic/Editor/Inspector/inspector_plugin.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Inspector/timeline_inspector_field.gd delete mode 100644 godot/addons/dialogic/Editor/Inspector/timeline_inspector_field.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Settings/CoreSettingsPages/csv_file.gd delete mode 100644 godot/addons/dialogic/Editor/Settings/CoreSettingsPages/csv_file.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_editor.gd delete mode 100644 godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_editor.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_editor.tscn delete mode 100644 godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_general.gd delete mode 100644 godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_general.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_general.tscn delete mode 100644 godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_modules.gd delete mode 100644 godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_modules.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_modules.tscn delete mode 100644 godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_tools.gd delete mode 100644 godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_tools.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_translation.gd delete mode 100644 godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_translation.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_translation.tscn delete mode 100644 godot/addons/dialogic/Editor/Settings/CoreSettingsPages/tool_resave.gd delete mode 100644 godot/addons/dialogic/Editor/Settings/CoreSettingsPages/tool_resave.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Settings/HintLabelStylingScript.gd delete mode 100644 godot/addons/dialogic/Editor/Settings/HintLabelStylingScript.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Settings/settings_editor.gd delete mode 100644 godot/addons/dialogic/Editor/Settings/settings_editor.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Settings/settings_editor.tscn delete mode 100644 godot/addons/dialogic/Editor/Settings/settings_page.gd delete mode 100644 godot/addons/dialogic/Editor/Settings/settings_page.gd.uid delete mode 100644 godot/addons/dialogic/Editor/Theme/MainTheme.tres delete mode 100644 godot/addons/dialogic/Editor/Theme/PickerTheme.tres delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/TextEditor/CodeCompletionHelper.gd delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/TextEditor/CodeCompletionHelper.gd.uid delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/TextEditor/syntax_highlighter.gd delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/TextEditor/syntax_highlighter.gd.uid delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/TextEditor/timeline_editor_text.gd delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/TextEditor/timeline_editor_text.gd.uid delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/TextEditor/timeline_editor_text.tscn delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/AddEventButton.gd delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/AddEventButton.gd.uid delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/AddEventButton.tscn delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/TimelineArea.gd delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/TimelineArea.gd.uid delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/timeline_editor_visual.gd delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/timeline_editor_visual.gd.uid delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/timeline_editor_visual.tscn delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/shortcut_popup.gd delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/shortcut_popup.gd.uid delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/test_timeline_scene.gd delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/test_timeline_scene.gd.uid delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/test_timeline_scene.tscn delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/timeline_editor.gd delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/timeline_editor.gd.uid delete mode 100644 godot/addons/dialogic/Editor/TimelineEditor/timeline_editor.tscn delete mode 100644 godot/addons/dialogic/Editor/dialogic_editor.gd delete mode 100644 godot/addons/dialogic/Editor/dialogic_editor.gd.uid delete mode 100644 godot/addons/dialogic/Editor/editor_main.gd delete mode 100644 godot/addons/dialogic/Editor/editor_main.gd.uid delete mode 100644 godot/addons/dialogic/Editor/editor_main.tscn delete mode 100644 godot/addons/dialogic/Editor/editors_manager.gd delete mode 100644 godot/addons/dialogic/Editor/editors_manager.gd.uid delete mode 100644 godot/addons/dialogic/Example Assets/Fonts/LICENSE.txt delete mode 100644 godot/addons/dialogic/Example Assets/Fonts/Roboto-Bold.ttf delete mode 100644 godot/addons/dialogic/Example Assets/Fonts/Roboto-Bold.ttf.import delete mode 100644 godot/addons/dialogic/Example Assets/Fonts/Roboto-Italic.ttf delete mode 100644 godot/addons/dialogic/Example Assets/Fonts/Roboto-Italic.ttf.import delete mode 100644 godot/addons/dialogic/Example Assets/Fonts/Roboto-Regular.ttf delete mode 100644 godot/addons/dialogic/Example Assets/Fonts/Roboto-Regular.ttf.import delete mode 100644 godot/addons/dialogic/Example Assets/already_read_indicator.gd delete mode 100644 godot/addons/dialogic/Example Assets/already_read_indicator.gd.uid delete mode 100644 godot/addons/dialogic/Example Assets/backgrounds/BubbleEnd.png delete mode 100644 godot/addons/dialogic/Example Assets/backgrounds/BubbleEnd.png.import delete mode 100644 godot/addons/dialogic/Example Assets/backgrounds/new-default-dialog.png.import delete mode 100644 godot/addons/dialogic/Example Assets/backgrounds/rpg_box.webp delete mode 100644 godot/addons/dialogic/Example Assets/backgrounds/rpg_box.webp.import delete mode 100644 godot/addons/dialogic/Example Assets/bbcode_transitions/bbcode_transition_effect.gd delete mode 100644 godot/addons/dialogic/Example Assets/bbcode_transitions/bbcode_transition_effect.gd.uid delete mode 100644 godot/addons/dialogic/Example Assets/bbcode_transitions/fade_in.tres delete mode 100644 godot/addons/dialogic/Example Assets/bbcode_transitions/fade_scale_in.tres delete mode 100644 godot/addons/dialogic/Example Assets/bbcode_transitions/fancy_in.tres delete mode 100644 godot/addons/dialogic/Example Assets/bbcode_transitions/shaky_in.tres delete mode 100644 godot/addons/dialogic/Example Assets/default_event.gd delete mode 100644 godot/addons/dialogic/Example Assets/default_event.gd.uid delete mode 100644 godot/addons/dialogic/Example Assets/next-indicator/next-indicator-dialogic-1.png delete mode 100644 godot/addons/dialogic/Example Assets/next-indicator/next-indicator-dialogic-1.png.import delete mode 100644 godot/addons/dialogic/Example Assets/next-indicator/next-indicator.png delete mode 100644 godot/addons/dialogic/Example Assets/next-indicator/next-indicator.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 blink.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 blink.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 doubt.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 doubt.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 hate.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 hate.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 plot.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 plot.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 sad.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 sad.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 scoff.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 scoff.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 shy.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 shy.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 surprise.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 surprise.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Antonio/pl5.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Antonio/pl5.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/CustomPortrait_AnimatedSprite.gd delete mode 100644 godot/addons/dialogic/Example Assets/portraits/CustomPortrait_AnimatedSprite.gd.uid delete mode 100644 godot/addons/dialogic/Example Assets/portraits/CustomPortrait_AnimatedSprite.tscn delete mode 100644 godot/addons/dialogic/Example Assets/portraits/CustomPortrait_FaceAtlas.gd delete mode 100644 godot/addons/dialogic/Example Assets/portraits/CustomPortrait_FaceAtlas.gd.uid delete mode 100644 godot/addons/dialogic/Example Assets/portraits/CustomPortrait_FaceAtlas.tscn delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Jane/pl3 avoid.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Jane/pl3 avoid.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Jane/pl3 blink.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Jane/pl3 blink.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Jane/pl3 concept.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Jane/pl3 concept.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Jane/pl3 confusion.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Jane/pl3 confusion.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Jane/pl3 doubt.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Jane/pl3 doubt.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Jane/pl3 happy.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Jane/pl3 happy.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Jane/pl3 plot.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Jane/pl3 plot.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Jane/pl3 sad.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Jane/pl3 sad.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Jane/pl3 shy.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Jane/pl3 shy.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Jane/pl3 surprise.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Jane/pl3 surprise.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Portrait1.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Portrait1.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Portrait2.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Portrait2.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Princess/anger.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Princess/anger.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Princess/frown.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Princess/frown.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Princess/joy.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Princess/joy.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Princess/neutral.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Princess/neutral.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Princess/princess_blank.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Princess/princess_blank.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Princess/shock.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Princess/shock.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Princess/smile.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/Princess/smile.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/rpg_portraits/base1.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/rpg_portraits/base1.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/rpg_portraits/base2.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/rpg_portraits/base2.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/rpg_portraits/base3.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/rpg_portraits/base3.png.import delete mode 100644 godot/addons/dialogic/Example Assets/portraits/rpg_portraits/base4.png delete mode 100644 godot/addons/dialogic/Example Assets/portraits/rpg_portraits/base4.png.import delete mode 100644 godot/addons/dialogic/Example Assets/sound-effects/LICENSE.txt delete mode 100644 godot/addons/dialogic/Example Assets/sound-effects/typing1.wav delete mode 100644 godot/addons/dialogic/Example Assets/sound-effects/typing1.wav.import delete mode 100644 godot/addons/dialogic/Example Assets/sound-effects/typing2.wav delete mode 100644 godot/addons/dialogic/Example Assets/sound-effects/typing2.wav.import delete mode 100644 godot/addons/dialogic/Example Assets/sound-effects/typing3.wav delete mode 100644 godot/addons/dialogic/Example Assets/sound-effects/typing3.wav.import delete mode 100644 godot/addons/dialogic/Example Assets/sound-effects/typing4.wav delete mode 100644 godot/addons/dialogic/Example Assets/sound-effects/typing4.wav.import delete mode 100644 godot/addons/dialogic/Example Assets/sound-effects/typing5.wav delete mode 100644 godot/addons/dialogic/Example Assets/sound-effects/typing5.wav.import delete mode 100644 godot/addons/dialogic/Modules/Audio/event_audio.gd delete mode 100644 godot/addons/dialogic/Modules/Audio/event_audio.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Audio/icon_music.png delete mode 100644 godot/addons/dialogic/Modules/Audio/icon_music.png.import delete mode 100644 godot/addons/dialogic/Modules/Audio/icon_sound.png delete mode 100644 godot/addons/dialogic/Modules/Audio/icon_sound.png.import delete mode 100644 godot/addons/dialogic/Modules/Audio/index.gd delete mode 100644 godot/addons/dialogic/Modules/Audio/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Audio/settings_audio.gd delete mode 100644 godot/addons/dialogic/Modules/Audio/settings_audio.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Audio/settings_audio.tscn delete mode 100644 godot/addons/dialogic/Modules/Audio/subsystem_audio.gd delete mode 100644 godot/addons/dialogic/Modules/Audio/subsystem_audio.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Background/DefaultBackgroundScene/default_background.gd delete mode 100644 godot/addons/dialogic/Modules/Background/DefaultBackgroundScene/default_background.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Background/DefaultBackgroundScene/default_background.tscn delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/Defaults/push_down.gd delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/Defaults/push_down.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/Defaults/push_left.gd delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/Defaults/push_left.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/Defaults/push_right.gd delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/Defaults/push_right.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/Defaults/push_up.gd delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/Defaults/push_up.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/Defaults/simple_fade.gd delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/Defaults/simple_fade.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/Defaults/simple_fade.tres delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/Defaults/swipe_diagonal_up_left.gd delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/Defaults/swipe_diagonal_up_left.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/Defaults/swipe_left_to_right.gd delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/Defaults/swipe_left_to_right.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/Defaults/swipe_right_to_left.gd delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/Defaults/swipe_right_to_left.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/class_dialogic_background_transition.gd delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/class_dialogic_background_transition.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/default_transition_shader.gdshader delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/default_transition_shader.gdshader.uid delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/push_transition_shader.gdshader delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/push_transition_shader.gdshader.uid delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/simple_push_transitions.gd delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/simple_push_transitions.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/simple_swipe_gradient.tres delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/simple_swipe_transitions.gd delete mode 100644 godot/addons/dialogic/Modules/Background/Transitions/simple_swipe_transitions.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Background/dialogic_background.gd delete mode 100644 godot/addons/dialogic/Modules/Background/dialogic_background.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Background/event_background.gd delete mode 100644 godot/addons/dialogic/Modules/Background/event_background.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Background/icon.png delete mode 100644 godot/addons/dialogic/Modules/Background/icon.png.import delete mode 100644 godot/addons/dialogic/Modules/Background/index.gd delete mode 100644 godot/addons/dialogic/Modules/Background/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Background/node_background_holder.gd delete mode 100644 godot/addons/dialogic/Modules/Background/node_background_holder.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Background/subsystem_backgrounds.gd delete mode 100644 godot/addons/dialogic/Modules/Background/subsystem_backgrounds.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Call/event_call.gd delete mode 100644 godot/addons/dialogic/Modules/Call/event_call.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Call/icon.png delete mode 100644 godot/addons/dialogic/Modules/Call/icon.png.import delete mode 100644 godot/addons/dialogic/Modules/Call/index.gd delete mode 100644 godot/addons/dialogic/Modules/Call/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/bounce.gd delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/bounce.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/bounce_in_out.gd delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/bounce_in_out.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/fade_down_in_out.gd delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/fade_down_in_out.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/fade_in_out.gd delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/fade_in_out.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/fade_up_in_out.gd delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/fade_up_in_out.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/heartbeat.gd delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/heartbeat.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/instant_in_out.gd delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/instant_in_out.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/shake_x.gd delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/shake_x.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/shake_y.gd delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/shake_y.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/slide_down_in_out.gd delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/slide_down_in_out.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/slide_left_in_out.gd delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/slide_left_in_out.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/slide_right_in_out.gd delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/slide_right_in_out.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/slide_up_in.gd delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/slide_up_in.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/tada.gd delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/tada.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/zoom_center_in_out.gd delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/zoom_center_in_out.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/zoom_in_out.gd delete mode 100644 godot/addons/dialogic/Modules/Character/DefaultAnimations/zoom_in_out.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/DialogicPortraitAnimationsUtil.gd delete mode 100644 godot/addons/dialogic/Modules/Character/DialogicPortraitAnimationsUtil.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/class_dialogic_animation.gd delete mode 100644 godot/addons/dialogic/Modules/Character/class_dialogic_animation.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/custom_portrait_thumbnail.png delete mode 100644 godot/addons/dialogic/Modules/Character/custom_portrait_thumbnail.png.import delete mode 100644 godot/addons/dialogic/Modules/Character/default_portrait.gd delete mode 100644 godot/addons/dialogic/Modules/Character/default_portrait.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/default_portrait.tscn delete mode 100644 godot/addons/dialogic/Modules/Character/default_portrait_thumbnail.png delete mode 100644 godot/addons/dialogic/Modules/Character/default_portrait_thumbnail.png.import delete mode 100644 godot/addons/dialogic/Modules/Character/dialogic_portrait.gd delete mode 100644 godot/addons/dialogic/Modules/Character/dialogic_portrait.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/event_character.gd delete mode 100644 godot/addons/dialogic/Modules/Character/event_character.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/icon.png.import delete mode 100644 godot/addons/dialogic/Modules/Character/icon.svg delete mode 100644 godot/addons/dialogic/Modules/Character/icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/Character/icon_position.png delete mode 100644 godot/addons/dialogic/Modules/Character/icon_position.png.import delete mode 100644 godot/addons/dialogic/Modules/Character/index.gd delete mode 100644 godot/addons/dialogic/Modules/Character/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/node_portrait_container.gd delete mode 100644 godot/addons/dialogic/Modules/Character/node_portrait_container.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/portrait_position.svg delete mode 100644 godot/addons/dialogic/Modules/Character/portrait_position.svg.import delete mode 100644 godot/addons/dialogic/Modules/Character/preview_character.tres delete mode 100644 godot/addons/dialogic/Modules/Character/settings_portraits.gd delete mode 100644 godot/addons/dialogic/Modules/Character/settings_portraits.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/settings_portraits.tscn delete mode 100644 godot/addons/dialogic/Modules/Character/simple_image_portrait_thumbnail.png delete mode 100644 godot/addons/dialogic/Modules/Character/simple_image_portrait_thumbnail.png.import delete mode 100644 godot/addons/dialogic/Modules/Character/subsystem_containers.gd delete mode 100644 godot/addons/dialogic/Modules/Character/subsystem_containers.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/subsystem_portraits.gd delete mode 100644 godot/addons/dialogic/Modules/Character/subsystem_portraits.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Character/update_mirror.svg delete mode 100644 godot/addons/dialogic/Modules/Character/update_mirror.svg.import delete mode 100644 godot/addons/dialogic/Modules/Character/update_portrait.svg delete mode 100644 godot/addons/dialogic/Modules/Character/update_portrait.svg.import delete mode 100644 godot/addons/dialogic/Modules/Character/update_position.svg delete mode 100644 godot/addons/dialogic/Modules/Character/update_position.svg.2023_09_23_08_37_47.0.svg delete mode 100644 godot/addons/dialogic/Modules/Character/update_position.svg.2023_09_23_08_37_47.0.svg.import delete mode 100644 godot/addons/dialogic/Modules/Character/update_position.svg.import delete mode 100644 godot/addons/dialogic/Modules/Character/update_z_index.svg delete mode 100644 godot/addons/dialogic/Modules/Character/update_z_index.svg.import delete mode 100644 godot/addons/dialogic/Modules/Choice/event_choice.gd delete mode 100644 godot/addons/dialogic/Modules/Choice/event_choice.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Choice/icon.svg delete mode 100644 godot/addons/dialogic/Modules/Choice/icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/Choice/index.gd delete mode 100644 godot/addons/dialogic/Modules/Choice/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Choice/node_button_sound.gd delete mode 100644 godot/addons/dialogic/Modules/Choice/node_button_sound.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Choice/node_choice_button.gd delete mode 100644 godot/addons/dialogic/Modules/Choice/node_choice_button.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Choice/settings_choices.gd delete mode 100644 godot/addons/dialogic/Modules/Choice/settings_choices.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Choice/settings_choices.tscn delete mode 100644 godot/addons/dialogic/Modules/Choice/subsystem_choices.gd delete mode 100644 godot/addons/dialogic/Modules/Choice/subsystem_choices.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Choice/ui_choice_end.gd delete mode 100644 godot/addons/dialogic/Modules/Choice/ui_choice_end.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Choice/ui_choice_end.tscn delete mode 100644 godot/addons/dialogic/Modules/Clear/clear_background.svg delete mode 100644 godot/addons/dialogic/Modules/Clear/clear_background.svg.import delete mode 100644 godot/addons/dialogic/Modules/Clear/clear_characters.svg delete mode 100644 godot/addons/dialogic/Modules/Clear/clear_characters.svg.import delete mode 100644 godot/addons/dialogic/Modules/Clear/clear_music.svg delete mode 100644 godot/addons/dialogic/Modules/Clear/clear_music.svg.import delete mode 100644 godot/addons/dialogic/Modules/Clear/clear_positions.svg delete mode 100644 godot/addons/dialogic/Modules/Clear/clear_positions.svg.import delete mode 100644 godot/addons/dialogic/Modules/Clear/clear_style.svg delete mode 100644 godot/addons/dialogic/Modules/Clear/clear_style.svg.import delete mode 100644 godot/addons/dialogic/Modules/Clear/clear_textbox.svg delete mode 100644 godot/addons/dialogic/Modules/Clear/clear_textbox.svg.import delete mode 100644 godot/addons/dialogic/Modules/Clear/event_clear.gd delete mode 100644 godot/addons/dialogic/Modules/Clear/event_clear.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Clear/icon.png delete mode 100644 godot/addons/dialogic/Modules/Clear/icon.png.import delete mode 100644 godot/addons/dialogic/Modules/Clear/index.gd delete mode 100644 godot/addons/dialogic/Modules/Clear/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Comment/event_comment.gd delete mode 100644 godot/addons/dialogic/Modules/Comment/event_comment.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Comment/icon.png delete mode 100644 godot/addons/dialogic/Modules/Comment/icon.png.import delete mode 100644 godot/addons/dialogic/Modules/Comment/index.gd delete mode 100644 godot/addons/dialogic/Modules/Comment/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Condition/event_condition.gd delete mode 100644 godot/addons/dialogic/Modules/Condition/event_condition.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Condition/icon.svg delete mode 100644 godot/addons/dialogic/Modules/Condition/icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/Condition/index.gd delete mode 100644 godot/addons/dialogic/Modules/Condition/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Condition/ui_condition_end.gd delete mode 100644 godot/addons/dialogic/Modules/Condition/ui_condition_end.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Condition/ui_condition_end.tscn delete mode 100644 godot/addons/dialogic/Modules/Core/event_end_branch.gd delete mode 100644 godot/addons/dialogic/Modules/Core/event_end_branch.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Core/icon.png delete mode 100644 godot/addons/dialogic/Modules/Core/icon.png.import delete mode 100644 godot/addons/dialogic/Modules/Core/index.gd delete mode 100644 godot/addons/dialogic/Modules/Core/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Core/subsystem_animation.gd delete mode 100644 godot/addons/dialogic/Modules/Core/subsystem_animation.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Core/subsystem_expression.gd delete mode 100644 godot/addons/dialogic/Modules/Core/subsystem_expression.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Core/subsystem_input.gd delete mode 100644 godot/addons/dialogic/Modules/Core/subsystem_input.gd.uid delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Base_Default/default_layout_base.gd delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Base_Default/default_layout_base.gd.uid delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Base_Default/default_layout_base.tscn delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Base_Default/part_config.cfg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Base_TextBubble/part_config.cfg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Base_TextBubble/text_bubble_base.gd delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Base_TextBubble/text_bubble_base.gd.uid delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Base_TextBubble/text_bubble_base.tscn delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_FullBackground/background_layer_icon.svg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_FullBackground/background_layer_icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_FullBackground/full_background_layer.gd delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_FullBackground/full_background_layer.gd.uid delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_FullBackground/full_background_layer.tscn delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_FullBackground/part_config.cfg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_FullBackground/preview.png delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_FullBackground/preview.png.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Glossary/glossary_popup_layer.gd delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Glossary/glossary_popup_layer.gd.uid delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Glossary/glossary_popup_layer.tscn delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Glossary/part_config.cfg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Glossary/popup_glossary_layer_icon.svg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Glossary/popup_glossary_layer_icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Glossary/preview.png delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Glossary/preview.png.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_History/example_history_item.gd delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_History/example_history_item.gd.uid delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_History/example_history_item.tscn delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_History/history_icon.svg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_History/history_icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_History/history_layer.gd delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_History/history_layer.gd.uid delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_History/history_layer.tscn delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_History/part_config.cfg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_History/preview.png delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_History/preview.png.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Input/full_advance_input_layer.gd delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Input/full_advance_input_layer.gd.uid delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Input/full_advance_input_layer.tscn delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Input/input_layer_icon.svg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Input/input_layer_icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Input/part_config.cfg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Input/preview.png delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Input/preview.png.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_SpeakerPortraitTextbox/default_stylebox.tres delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_SpeakerPortraitTextbox/part_config.cfg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_SpeakerPortraitTextbox/preview.png delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_SpeakerPortraitTextbox/preview.png.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_SpeakerPortraitTextbox/speaker-textbox-icon.svg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_SpeakerPortraitTextbox/speaker-textbox-icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_SpeakerPortraitTextbox/speaker_portrait_textbox_layer.gd delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_SpeakerPortraitTextbox/speaker_portrait_textbox_layer.gd.uid delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_SpeakerPortraitTextbox/textbox_with_speaker_portrait.tscn delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_TextInput/part_config.cfg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_TextInput/preview.png delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_TextInput/preview.png.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_TextInput/text_input_layer.gd delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_TextInput/text_input_layer.gd.uid delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_TextInput/text_input_layer.tscn delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_TextInput/text_input_layer_icon.svg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_TextInput/text_input_layer_icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Textbubble/part_config.cfg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Textbubble/preview.png delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Textbubble/preview.png.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Textbubble/speech_bubble.gdshader delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Textbubble/speech_bubble.gdshader.uid delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Textbubble/text_bubble.gd delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Textbubble/text_bubble.gd.uid delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Textbubble/text_bubble.gdshader delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Textbubble/text_bubble.gdshader.uid delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Textbubble/text_bubble.tscn delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Textbubble/text_bubble_layer.gd delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Textbubble/text_bubble_layer.gd.uid delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Textbubble/text_bubble_layer.tscn delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Textbubble/text_bubble_layer_icon.svg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_Textbubble/text_bubble_layer_icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Choices/choice_panel_focus.tres delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Choices/choice_panel_hover.tres delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Choices/choice_panel_normal.tres delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Choices/choices_layer_icon.svg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Choices/choices_layer_icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Choices/part_config.cfg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Choices/preview.png delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Choices/preview.png.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Choices/vn_choice_layer.gd delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Choices/vn_choice_layer.gd.uid delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Choices/vn_choice_layer.tscn delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Portraits/part_config.cfg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Portraits/portrait_layer_icon.svg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Portraits/portrait_layer_icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Portraits/preview.png delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Portraits/preview.png.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Portraits/vn_portrait_layer.gd delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Portraits/vn_portrait_layer.gd.uid delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Portraits/vn_portrait_layer.tscn delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Textbox/animations.gd delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Textbox/animations.gd.uid delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Textbox/autoadvance_indicator.gd delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Textbox/autoadvance_indicator.gd.uid delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Textbox/next.svg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Textbox/next.svg.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Textbox/part_config.cfg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Textbox/preview.png delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Textbox/preview.png.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Textbox/textbox_layer_icon.svg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Textbox/textbox_layer_icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Textbox/vn_textbox_default_panel.tres delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Textbox/vn_textbox_layer.gd delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Textbox/vn_textbox_layer.gd.uid delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Textbox/vn_textbox_layer.tscn delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Layer_VN_Textbox/vn_textbox_name_label_panel.tres delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Style_SpeakerTextbox/part_config.cfg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Style_SpeakerTextbox/preview.png delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Style_SpeakerTextbox/preview.png.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Style_SpeakerTextbox/speaker_textbox_style.tres delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Style_TextBubbles/part_config.cfg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Style_TextBubbles/preview.png delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Style_TextBubbles/preview.png.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Style_TextBubbles/textbubble_style.tres delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Style_VN_Default/default_vn_style.tres delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Style_VN_Default/part_config.cfg delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Style_VN_Default/preview.png delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/Style_VN_Default/preview.png.import delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/index.gd delete mode 100644 godot/addons/dialogic/Modules/DefaultLayoutParts/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/End/event_end.gd delete mode 100644 godot/addons/dialogic/Modules/End/event_end.gd.uid delete mode 100644 godot/addons/dialogic/Modules/End/icon.png delete mode 100644 godot/addons/dialogic/Modules/End/icon.png.import delete mode 100644 godot/addons/dialogic/Modules/End/index.gd delete mode 100644 godot/addons/dialogic/Modules/End/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Glossary/add-glossary.svg delete mode 100644 godot/addons/dialogic/Modules/Glossary/add-glossary.svg.import delete mode 100644 godot/addons/dialogic/Modules/Glossary/event_glossary.gd delete mode 100644 godot/addons/dialogic/Modules/Glossary/event_glossary.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Glossary/glossary_editor.gd delete mode 100644 godot/addons/dialogic/Modules/Glossary/glossary_editor.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Glossary/glossary_editor.tscn delete mode 100644 godot/addons/dialogic/Modules/Glossary/glossary_resource.gd delete mode 100644 godot/addons/dialogic/Modules/Glossary/glossary_resource.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Glossary/icon.png.import delete mode 100644 godot/addons/dialogic/Modules/Glossary/icon.svg delete mode 100644 godot/addons/dialogic/Modules/Glossary/icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/Glossary/index.gd delete mode 100644 godot/addons/dialogic/Modules/Glossary/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Glossary/subsystem_glossary.gd delete mode 100644 godot/addons/dialogic/Modules/Glossary/subsystem_glossary.gd.uid delete mode 100644 godot/addons/dialogic/Modules/HighlightPortrait/highlight_portrait_thumbnail.png delete mode 100644 godot/addons/dialogic/Modules/HighlightPortrait/highlight_portrait_thumbnail.png.import delete mode 100644 godot/addons/dialogic/Modules/HighlightPortrait/index.gd delete mode 100644 godot/addons/dialogic/Modules/HighlightPortrait/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/HighlightPortrait/simple_highlight_portrait.gd delete mode 100644 godot/addons/dialogic/Modules/HighlightPortrait/simple_highlight_portrait.gd.uid delete mode 100644 godot/addons/dialogic/Modules/HighlightPortrait/simple_highlight_portrait.tscn delete mode 100644 godot/addons/dialogic/Modules/History/definition.svg delete mode 100644 godot/addons/dialogic/Modules/History/definition.svg.import delete mode 100644 godot/addons/dialogic/Modules/History/event_history.gd delete mode 100644 godot/addons/dialogic/Modules/History/event_history.gd.uid delete mode 100644 godot/addons/dialogic/Modules/History/icon.svg delete mode 100644 godot/addons/dialogic/Modules/History/icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/History/index.gd delete mode 100644 godot/addons/dialogic/Modules/History/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/History/settings_history.gd delete mode 100644 godot/addons/dialogic/Modules/History/settings_history.gd.uid delete mode 100644 godot/addons/dialogic/Modules/History/settings_history.tscn delete mode 100644 godot/addons/dialogic/Modules/History/subsystem_history.gd delete mode 100644 godot/addons/dialogic/Modules/History/subsystem_history.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Jump/event_jump.gd delete mode 100644 godot/addons/dialogic/Modules/Jump/event_jump.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Jump/event_label.gd delete mode 100644 godot/addons/dialogic/Modules/Jump/event_label.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Jump/event_return.gd delete mode 100644 godot/addons/dialogic/Modules/Jump/event_return.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Jump/icon.png.import delete mode 100644 godot/addons/dialogic/Modules/Jump/icon_jump.png delete mode 100644 godot/addons/dialogic/Modules/Jump/icon_jump.png.import delete mode 100644 godot/addons/dialogic/Modules/Jump/icon_label.png delete mode 100644 godot/addons/dialogic/Modules/Jump/icon_label.png.import delete mode 100644 godot/addons/dialogic/Modules/Jump/icon_return.svg delete mode 100644 godot/addons/dialogic/Modules/Jump/icon_return.svg.import delete mode 100644 godot/addons/dialogic/Modules/Jump/index.gd delete mode 100644 godot/addons/dialogic/Modules/Jump/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Jump/subsystem_jump.gd delete mode 100644 godot/addons/dialogic/Modules/Jump/subsystem_jump.gd.uid delete mode 100644 godot/addons/dialogic/Modules/LayeredPortrait/custom_layered_portrait.gd delete mode 100644 godot/addons/dialogic/Modules/LayeredPortrait/custom_layered_portrait.gd.uid delete mode 100644 godot/addons/dialogic/Modules/LayeredPortrait/index.gd delete mode 100644 godot/addons/dialogic/Modules/LayeredPortrait/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/LayeredPortrait/layered_portrait.gd delete mode 100644 godot/addons/dialogic/Modules/LayeredPortrait/layered_portrait.gd.uid delete mode 100644 godot/addons/dialogic/Modules/LayeredPortrait/layered_portrait.tscn delete mode 100644 godot/addons/dialogic/Modules/LayeredPortrait/layered_portrait_thumbnail.png delete mode 100644 godot/addons/dialogic/Modules/LayeredPortrait/layered_portrait_thumbnail.png.import delete mode 100644 godot/addons/dialogic/Modules/Save/event_save.gd delete mode 100644 godot/addons/dialogic/Modules/Save/event_save.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Save/icon.svg delete mode 100644 godot/addons/dialogic/Modules/Save/icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/Save/index.gd delete mode 100644 godot/addons/dialogic/Modules/Save/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Save/settings_save.gd delete mode 100644 godot/addons/dialogic/Modules/Save/settings_save.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Save/settings_save.tscn delete mode 100644 godot/addons/dialogic/Modules/Save/subsystem_save.gd delete mode 100644 godot/addons/dialogic/Modules/Save/subsystem_save.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Settings/event_setting.gd delete mode 100644 godot/addons/dialogic/Modules/Settings/event_setting.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Settings/icon.svg delete mode 100644 godot/addons/dialogic/Modules/Settings/icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/Settings/index.gd delete mode 100644 godot/addons/dialogic/Modules/Settings/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Settings/subsystem_settings.gd delete mode 100644 godot/addons/dialogic/Modules/Settings/subsystem_settings.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Signal/event_signal.gd delete mode 100644 godot/addons/dialogic/Modules/Signal/event_signal.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Signal/icon.png delete mode 100644 godot/addons/dialogic/Modules/Signal/icon.png.import delete mode 100644 godot/addons/dialogic/Modules/Signal/index.gd delete mode 100644 godot/addons/dialogic/Modules/Signal/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Style/DialogicStylesUtil.gd delete mode 100644 godot/addons/dialogic/Modules/Style/DialogicStylesUtil.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Style/character_settings_style.gd delete mode 100644 godot/addons/dialogic/Modules/Style/character_settings_style.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Style/character_settings_style.tscn delete mode 100644 godot/addons/dialogic/Modules/Style/event_style.gd delete mode 100644 godot/addons/dialogic/Modules/Style/event_style.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Style/icon.png delete mode 100644 godot/addons/dialogic/Modules/Style/icon.png.import delete mode 100644 godot/addons/dialogic/Modules/Style/index.gd delete mode 100644 godot/addons/dialogic/Modules/Style/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Style/node_style.gd delete mode 100644 godot/addons/dialogic/Modules/Style/node_style.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Style/subsystem_styles.gd delete mode 100644 godot/addons/dialogic/Modules/Style/subsystem_styles.gd.uid delete mode 100644 godot/addons/dialogic/Modules/StyleEditor/Components/style_browser.gd delete mode 100644 godot/addons/dialogic/Modules/StyleEditor/Components/style_browser.gd.uid delete mode 100644 godot/addons/dialogic/Modules/StyleEditor/Components/style_browser.tscn delete mode 100644 godot/addons/dialogic/Modules/StyleEditor/Components/style_browser_window.gd delete mode 100644 godot/addons/dialogic/Modules/StyleEditor/Components/style_browser_window.gd.uid delete mode 100644 godot/addons/dialogic/Modules/StyleEditor/Components/style_layer_tree.gd delete mode 100644 godot/addons/dialogic/Modules/StyleEditor/Components/style_layer_tree.gd.uid delete mode 100644 godot/addons/dialogic/Modules/StyleEditor/index.gd delete mode 100644 godot/addons/dialogic/Modules/StyleEditor/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/StyleEditor/style_editor.gd delete mode 100644 godot/addons/dialogic/Modules/StyleEditor/style_editor.gd.uid delete mode 100644 godot/addons/dialogic/Modules/StyleEditor/style_editor.tscn delete mode 100644 godot/addons/dialogic/Modules/StyleEditor/style_layer_editor.gd delete mode 100644 godot/addons/dialogic/Modules/StyleEditor/style_layer_editor.gd.uid delete mode 100644 godot/addons/dialogic/Modules/StyleEditor/styles_icon.svg delete mode 100644 godot/addons/dialogic/Modules/StyleEditor/styles_icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/Text/DNextIndicator_icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/Text/auto_advance.gd delete mode 100644 godot/addons/dialogic/Modules/Text/auto_advance.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Text/auto_skip.gd delete mode 100644 godot/addons/dialogic/Modules/Text/auto_skip.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Text/character_settings/character_moods_settings.gd delete mode 100644 godot/addons/dialogic/Modules/Text/character_settings/character_moods_settings.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Text/character_settings/character_moods_settings.tscn delete mode 100644 godot/addons/dialogic/Modules/Text/character_settings/character_portrait_mood_settings.gd delete mode 100644 godot/addons/dialogic/Modules/Text/character_settings/character_portrait_mood_settings.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Text/character_settings/character_portrait_mood_settings.tscn delete mode 100644 godot/addons/dialogic/Modules/Text/event_text.gd delete mode 100644 godot/addons/dialogic/Modules/Text/event_text.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Text/icon.svg delete mode 100644 godot/addons/dialogic/Modules/Text/icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/Text/index.gd delete mode 100644 godot/addons/dialogic/Modules/Text/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Text/manual_advance.gd delete mode 100644 godot/addons/dialogic/Modules/Text/manual_advance.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Text/node_dialog_text.gd delete mode 100644 godot/addons/dialogic/Modules/Text/node_dialog_text.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Text/node_dialog_text_icon.svg delete mode 100644 godot/addons/dialogic/Modules/Text/node_dialog_text_icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/Text/node_input.gd delete mode 100644 godot/addons/dialogic/Modules/Text/node_input.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Text/node_name_label.gd delete mode 100644 godot/addons/dialogic/Modules/Text/node_name_label.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Text/node_name_label_icon.svg delete mode 100644 godot/addons/dialogic/Modules/Text/node_name_label_icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/Text/node_next_indicator.gd delete mode 100644 godot/addons/dialogic/Modules/Text/node_next_indicator.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Text/node_next_indicator_icon.svg delete mode 100644 godot/addons/dialogic/Modules/Text/node_next_indicator_icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/Text/node_type_sound.gd delete mode 100644 godot/addons/dialogic/Modules/Text/node_type_sound.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Text/settings_text.gd delete mode 100644 godot/addons/dialogic/Modules/Text/settings_text.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Text/settings_text.tscn delete mode 100644 godot/addons/dialogic/Modules/Text/subsystem_text.gd delete mode 100644 godot/addons/dialogic/Modules/Text/subsystem_text.gd.uid delete mode 100644 godot/addons/dialogic/Modules/TextInput/event_text_input.gd delete mode 100644 godot/addons/dialogic/Modules/TextInput/event_text_input.gd.uid delete mode 100644 godot/addons/dialogic/Modules/TextInput/icon.png delete mode 100644 godot/addons/dialogic/Modules/TextInput/icon.png.import delete mode 100644 godot/addons/dialogic/Modules/TextInput/index.gd delete mode 100644 godot/addons/dialogic/Modules/TextInput/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/TextInput/node_text_input.gd delete mode 100644 godot/addons/dialogic/Modules/TextInput/node_text_input.gd.uid delete mode 100644 godot/addons/dialogic/Modules/TextInput/subsystem_text_input.gd delete mode 100644 godot/addons/dialogic/Modules/TextInput/subsystem_text_input.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Variable/add-variable.svg delete mode 100644 godot/addons/dialogic/Modules/Variable/add-variable.svg.import delete mode 100644 godot/addons/dialogic/Modules/Variable/event_variable.gd delete mode 100644 godot/addons/dialogic/Modules/Variable/event_variable.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Variable/icon.png delete mode 100644 godot/addons/dialogic/Modules/Variable/icon.png.import delete mode 100644 godot/addons/dialogic/Modules/Variable/index.gd delete mode 100644 godot/addons/dialogic/Modules/Variable/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Variable/subsystem_variables.gd delete mode 100644 godot/addons/dialogic/Modules/Variable/subsystem_variables.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Variable/variable.svg delete mode 100644 godot/addons/dialogic/Modules/Variable/variable.svg.import delete mode 100644 godot/addons/dialogic/Modules/Variable/variables_editor/variable_tree.gd delete mode 100644 godot/addons/dialogic/Modules/Variable/variables_editor/variable_tree.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Variable/variables_editor/variables_editor.gd delete mode 100644 godot/addons/dialogic/Modules/Variable/variables_editor/variables_editor.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Variable/variables_editor/variables_editor.tscn delete mode 100644 godot/addons/dialogic/Modules/Voice/event_voice.gd delete mode 100644 godot/addons/dialogic/Modules/Voice/event_voice.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Voice/icon.png delete mode 100644 godot/addons/dialogic/Modules/Voice/icon.png.import delete mode 100644 godot/addons/dialogic/Modules/Voice/index.gd delete mode 100644 godot/addons/dialogic/Modules/Voice/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Voice/subsystem_voice.gd delete mode 100644 godot/addons/dialogic/Modules/Voice/subsystem_voice.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Wait/event_wait.gd delete mode 100644 godot/addons/dialogic/Modules/Wait/event_wait.gd.uid delete mode 100644 godot/addons/dialogic/Modules/Wait/icon.svg delete mode 100644 godot/addons/dialogic/Modules/Wait/icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/Wait/index.gd delete mode 100644 godot/addons/dialogic/Modules/Wait/index.gd.uid delete mode 100644 godot/addons/dialogic/Modules/WaitInput/event_wait_input.gd delete mode 100644 godot/addons/dialogic/Modules/WaitInput/event_wait_input.gd.uid delete mode 100644 godot/addons/dialogic/Modules/WaitInput/icon.svg delete mode 100644 godot/addons/dialogic/Modules/WaitInput/icon.svg.import delete mode 100644 godot/addons/dialogic/Modules/WaitInput/index.gd delete mode 100644 godot/addons/dialogic/Modules/WaitInput/index.gd.uid delete mode 100644 godot/addons/dialogic/Resources/CharacterResourceLoader.gd delete mode 100644 godot/addons/dialogic/Resources/CharacterResourceLoader.gd.uid delete mode 100644 godot/addons/dialogic/Resources/CharacterResourceSaver.gd delete mode 100644 godot/addons/dialogic/Resources/CharacterResourceSaver.gd.uid delete mode 100644 godot/addons/dialogic/Resources/TimelineResourceLoader.gd delete mode 100644 godot/addons/dialogic/Resources/TimelineResourceLoader.gd.uid delete mode 100644 godot/addons/dialogic/Resources/TimelineResourceSaver.gd delete mode 100644 godot/addons/dialogic/Resources/TimelineResourceSaver.gd.uid delete mode 100644 godot/addons/dialogic/Resources/character.gd delete mode 100644 godot/addons/dialogic/Resources/character.gd.uid delete mode 100644 godot/addons/dialogic/Resources/dialogic_identifiable_resource.gd delete mode 100644 godot/addons/dialogic/Resources/dialogic_identifiable_resource.gd.uid delete mode 100644 godot/addons/dialogic/Resources/dialogic_layout_base.gd delete mode 100644 godot/addons/dialogic/Resources/dialogic_layout_base.gd.uid delete mode 100644 godot/addons/dialogic/Resources/dialogic_layout_layer.gd delete mode 100644 godot/addons/dialogic/Resources/dialogic_layout_layer.gd.uid delete mode 100644 godot/addons/dialogic/Resources/dialogic_style.gd delete mode 100644 godot/addons/dialogic/Resources/dialogic_style.gd.uid delete mode 100644 godot/addons/dialogic/Resources/dialogic_style_layer.gd delete mode 100644 godot/addons/dialogic/Resources/dialogic_style_layer.gd.uid delete mode 100644 godot/addons/dialogic/Resources/event.gd delete mode 100644 godot/addons/dialogic/Resources/event.gd.uid delete mode 100644 godot/addons/dialogic/Resources/timeline.gd delete mode 100644 godot/addons/dialogic/Resources/timeline.gd.uid delete mode 100644 godot/addons/dialogic/plugin.cfg delete mode 100644 godot/addons/dialogic/plugin.gd delete mode 100644 godot/addons/dialogic/plugin.gd.uid delete mode 100644 godot/addons/glogging/LICENSE.md delete mode 100644 godot/addons/glogging/glogging.gd delete mode 100644 godot/addons/glogging/glogging.gd.uid delete mode 100644 godot/addons/glogging/plugin.cfg delete mode 100644 godot/addons/glogging/plugin.gd delete mode 100644 godot/addons/glogging/plugin.gd.uid delete mode 100644 godot/addons/godot_resource_groups/csharp/ResourceGroup.cs delete mode 100644 godot/addons/godot_resource_groups/csharp/ResourceGroupBackgroundLoader.cs delete mode 100644 godot/addons/godot_resource_groups/godot_resource_groups.gd delete mode 100644 godot/addons/godot_resource_groups/godot_resource_groups.gd.uid delete mode 100644 godot/addons/godot_resource_groups/godot_resource_groups_export_plugin.gd delete mode 100644 godot/addons/godot_resource_groups/godot_resource_groups_export_plugin.gd.uid delete mode 100644 godot/addons/godot_resource_groups/path_verifier.gd delete mode 100644 godot/addons/godot_resource_groups/path_verifier.gd.uid delete mode 100644 godot/addons/godot_resource_groups/plugin.cfg delete mode 100644 godot/addons/godot_resource_groups/resource_group.gd delete mode 100644 godot/addons/godot_resource_groups/resource_group.gd.uid delete mode 100644 godot/addons/godot_resource_groups/resource_group.svg delete mode 100644 godot/addons/godot_resource_groups/resource_group.svg.import delete mode 100644 godot/addons/godot_resource_groups/resource_group_background_loader.gd delete mode 100644 godot/addons/godot_resource_groups/resource_group_background_loader.gd.uid delete mode 100644 godot/addons/godot_resource_groups/resource_group_scanner.gd delete mode 100644 godot/addons/godot_resource_groups/resource_group_scanner.gd.uid delete mode 100644 godot/addons/godot_resource_groups/resource_scanner.gd delete mode 100644 godot/addons/godot_resource_groups/resource_scanner.gd.uid delete mode 100644 godot/addons/icon_explorer/LICENSE.md delete mode 100644 godot/addons/icon_explorer/icon.svg delete mode 100644 godot/addons/icon_explorer/icon.svg.import delete mode 100644 godot/addons/icon_explorer/internal/ext/bootstrap/collection.gd delete mode 100644 godot/addons/icon_explorer/internal/ext/bootstrap/collection.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ext/bootstrap/details_panel.gd delete mode 100644 godot/addons/icon_explorer/internal/ext/bootstrap/details_panel.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ext/bootstrap/details_panel.tscn delete mode 100644 godot/addons/icon_explorer/internal/ext/bootstrap/icon.gd delete mode 100644 godot/addons/icon_explorer/internal/ext/bootstrap/icon.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ext/country_flag_icons/collection.gd delete mode 100644 godot/addons/icon_explorer/internal/ext/country_flag_icons/collection.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ext/country_flag_icons/details_panel.gd delete mode 100644 godot/addons/icon_explorer/internal/ext/country_flag_icons/details_panel.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ext/country_flag_icons/details_panel.tscn delete mode 100644 godot/addons/icon_explorer/internal/ext/country_flag_icons/icon.gd delete mode 100644 godot/addons/icon_explorer/internal/ext/country_flag_icons/icon.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ext/font_awesome/collection.gd delete mode 100644 godot/addons/icon_explorer/internal/ext/font_awesome/collection.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ext/font_awesome/details_panel.gd delete mode 100644 godot/addons/icon_explorer/internal/ext/font_awesome/details_panel.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ext/font_awesome/details_panel.tscn delete mode 100644 godot/addons/icon_explorer/internal/ext/font_awesome/icon.gd delete mode 100644 godot/addons/icon_explorer/internal/ext/font_awesome/icon.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ext/icon_tabler/collection.gd delete mode 100644 godot/addons/icon_explorer/internal/ext/icon_tabler/collection.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ext/icon_tabler/details_panel.gd delete mode 100644 godot/addons/icon_explorer/internal/ext/icon_tabler/details_panel.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ext/icon_tabler/details_panel.tscn delete mode 100644 godot/addons/icon_explorer/internal/ext/icon_tabler/icon.gd delete mode 100644 godot/addons/icon_explorer/internal/ext/icon_tabler/icon.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ext/material_design/collection.gd delete mode 100644 godot/addons/icon_explorer/internal/ext/material_design/collection.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ext/material_design/details_panel.gd delete mode 100644 godot/addons/icon_explorer/internal/ext/material_design/details_panel.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ext/material_design/details_panel.tscn delete mode 100644 godot/addons/icon_explorer/internal/ext/material_design/icon.gd delete mode 100644 godot/addons/icon_explorer/internal/ext/material_design/icon.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ext/simple_icons/collection.gd delete mode 100644 godot/addons/icon_explorer/internal/ext/simple_icons/collection.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ext/simple_icons/details_panel.gd delete mode 100644 godot/addons/icon_explorer/internal/ext/simple_icons/details_panel.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ext/simple_icons/details_panel.tscn delete mode 100644 godot/addons/icon_explorer/internal/ext/simple_icons/icon.gd delete mode 100644 godot/addons/icon_explorer/internal/ext/simple_icons/icon.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/scripts/collection.gd delete mode 100644 godot/addons/icon_explorer/internal/scripts/collection.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/scripts/database.gd delete mode 100644 godot/addons/icon_explorer/internal/scripts/database.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/scripts/icon.gd delete mode 100644 godot/addons/icon_explorer/internal/scripts/icon.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/scripts/tools/io.gd delete mode 100644 godot/addons/icon_explorer/internal/scripts/tools/io.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/scripts/tools/zip_extractor.gd delete mode 100644 godot/addons/icon_explorer/internal/scripts/tools/zip_extractor.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/scripts/tools/zip_extractor_threaded.gd delete mode 100644 godot/addons/icon_explorer/internal/scripts/tools/zip_extractor_threaded.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ui/detail_panel/color_field.gd delete mode 100644 godot/addons/icon_explorer/internal/ui/detail_panel/color_field.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ui/detail_panel/color_field.tscn delete mode 100644 godot/addons/icon_explorer/internal/ui/detail_panel/detail_panel.gd delete mode 100644 godot/addons/icon_explorer/internal/ui/detail_panel/detail_panel.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ui/detail_panel/detail_panel.tscn delete mode 100644 godot/addons/icon_explorer/internal/ui/detail_panel/field.gd delete mode 100644 godot/addons/icon_explorer/internal/ui/detail_panel/field.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ui/detail_panel/field_title.gd delete mode 100644 godot/addons/icon_explorer/internal/ui/detail_panel/field_title.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ui/detail_panel/field_title.tscn delete mode 100644 godot/addons/icon_explorer/internal/ui/detail_panel/list_field.gd delete mode 100644 godot/addons/icon_explorer/internal/ui/detail_panel/list_field.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ui/detail_panel/list_field.tscn delete mode 100644 godot/addons/icon_explorer/internal/ui/detail_panel/text_field.gd delete mode 100644 godot/addons/icon_explorer/internal/ui/detail_panel/text_field.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ui/detail_panel/text_field.tscn delete mode 100644 godot/addons/icon_explorer/internal/ui/detail_panel/toolbar.gd delete mode 100644 godot/addons/icon_explorer/internal/ui/detail_panel/toolbar.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ui/explorer/explorer.gd delete mode 100644 godot/addons/icon_explorer/internal/ui/explorer/explorer.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ui/explorer/explorer.tscn delete mode 100644 godot/addons/icon_explorer/internal/ui/explorer/filter_options.gd delete mode 100644 godot/addons/icon_explorer/internal/ui/explorer/filter_options.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ui/explorer/option_popup.gd delete mode 100644 godot/addons/icon_explorer/internal/ui/explorer/option_popup.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ui/explorer_dialog.gd delete mode 100644 godot/addons/icon_explorer/internal/ui/explorer_dialog.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ui/explorer_dialog.tscn delete mode 100644 godot/addons/icon_explorer/internal/ui/main_screen.gd delete mode 100644 godot/addons/icon_explorer/internal/ui/main_screen.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ui/main_screen.tscn delete mode 100644 godot/addons/icon_explorer/internal/ui/options/collection_management.gd delete mode 100644 godot/addons/icon_explorer/internal/ui/options/collection_management.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ui/options/options.gd delete mode 100644 godot/addons/icon_explorer/internal/ui/options/options.gd.uid delete mode 100644 godot/addons/icon_explorer/internal/ui/options/options.tscn delete mode 100644 godot/addons/icon_explorer/plugin.cfg delete mode 100644 godot/addons/icon_explorer/plugin.gd delete mode 100644 godot/addons/icon_explorer/plugin.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/LICENSE.txt delete mode 100644 godot/addons/net.yarvis.pixel_pen/README.md delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.android.debug.arm32.so delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.android.debug.arm64.so delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.android.release.arm32.so delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.android.release.arm64.so delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.linux.debug.x86_64.so delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.linux.release.x86_64.so delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.macos.debug.framework/libpixelpen.macos.debug delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.macos.release.framework/libpixelpen.macos.release delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.web.debug.wasm32.wasm delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.web.release.wasm32.wasm delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.windows.debug.x86_32.dll delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.windows.debug.x86_32.exp delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.windows.debug.x86_32.lib delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.windows.debug.x86_64.dll delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.windows.debug.x86_64.exp delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.windows.debug.x86_64.lib delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.windows.release.x86_32.dll delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.windows.release.x86_32.exp delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.windows.release.x86_32.lib delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.windows.release.x86_64.dll delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.windows.release.x86_64.exp delete mode 100644 godot/addons/net.yarvis.pixel_pen/bin/libpixelpen.windows.release.x86_64.lib delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/animation_cell.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/animation_cell.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/editor_shorcut.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/editor_shorcut.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/frame.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/frame.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/indexed_color_image.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/indexed_color_image.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/indexed_palette.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/indexed_palette.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/mask_selection.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/mask_selection.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/pixel_pen_project.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/pixel_pen_project.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/pixelpen.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/pixelpen.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/pixelpen_enum.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/pixelpen_enum.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/pixelpen_state.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/pixelpen_state.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/project_packer.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/project_packer.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/theme_config.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/theme_config.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/undo_redo_manager.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/undo_redo_manager.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/user_config.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/classes/user_config.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/edit_canvas_size.tscn delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/edit_canvas_size/anchor_view.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/edit_canvas_size/anchor_view.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/edit_canvas_size/edit_canvas_size.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/edit_canvas_size/edit_canvas_size.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas.tscn delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/brush_tool.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/brush_tool.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/canvas_paint.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/canvas_paint.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/color_picker_tool.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/color_picker_tool.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/cursor.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/cursor.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/editor_canvas.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/editor_canvas.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/ellipse_tool.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/ellipse_tool.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/fill_tool.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/fill_tool.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/line_tool.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/line_tool.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/magnet_tool.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/magnet_tool.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/move_tool.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/move_tool.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/pan_tool.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/pan_tool.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/pen_tool.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/pen_tool.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/rectangle_tool.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/rectangle_tool.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/select_tool.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/select_tool.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/selection_tool.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/selection_tool.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/stamp_tool.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/stamp_tool.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/tool.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/tool.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/zoom_tool.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_canvas/zoom_tool.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_layer/layer.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_layer/layer.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui.tscn delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/animation_box.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/animation_box.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/button_hover.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/button_hover.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/debug_label.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/debug_label.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/editor_main_ui.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/editor_main_ui.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/grid_pallete.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/grid_pallete.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/layers.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/layers.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/layers_tools.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/layers_tools.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/pickable.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/pickable.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/preview_play_pause.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/preview_play_pause.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/sub_tool.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/sub_tool.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/sub_viewport.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/sub_viewport.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/tool_box.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/tool_box.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/visible_callback.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_main_ui/visible_callback.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_window.tscn delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_window/editor_window.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/editor_window/editor_window.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/export_manager.tscn delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/export_sheet/canvas_export_2d.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/export_sheet/canvas_export_2d.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/export_sheet/export_sheet.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/export_sheet/export_sheet.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/frame_preview.tscn delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/frame_preview/frame_preview.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/frame_preview/frame_preview.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/frame_preview/sample_border.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/frame_preview/sample_border.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/image_option_btn.tscn delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/image_option_btn/border_draw.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/image_option_btn/border_draw.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/image_option_btn/image_option_btn.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/image_option_btn/image_option_btn.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/import_window.tscn delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/import_window/import_window.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/import_window/import_window.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/import_window/import_window_grid.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/import_window/import_window_grid.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/import_window/input_control.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/import_window/input_control.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/layer.tscn delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/layer_properties.tscn delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/layer_properties/layer_properties.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/layer_properties/layer_properties.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/new_project_dialog.tscn delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/new_project_dialog/new_project_dialog.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/new_project_dialog/new_project_dialog.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/panels/color_wheel/color_wheel.tscn delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/panels/color_wheel/color_wheel_script/alpha_slider.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/panels/color_wheel/color_wheel_script/alpha_slider.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/panels/color_wheel/color_wheel_script/color_wheel.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/panels/color_wheel/color_wheel_script/color_wheel.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/panels/color_wheel/color_wheel_script/hue_slider.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/panels/color_wheel/color_wheel_script/hue_slider.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/panels/color_wheel/color_wheel_script/sv_slider.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/panels/color_wheel/color_wheel_script/sv_slider.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/panels/color_wheel/shader/alpha_slider.gdshader delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/panels/color_wheel/shader/alpha_slider.gdshader.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/panels/color_wheel/shader/hue_slider.gdshader delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/panels/color_wheel/shader/hue_slider.gdshader.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/panels/color_wheel/shader/sv_slider.gdshader delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/panels/color_wheel/shader/sv_slider.gdshader.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/preferences.tscn delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/preferences/general_preferences.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/preferences/general_preferences.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/preferences/preferences.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/preferences/preferences.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/preferences/shorcut_listener.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/preferences/shorcut_listener.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/preferences/shorcuts_preferences.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/preferences/shorcuts_preferences.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/startup_window.tscn delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/startup_window/startup_window.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/startup_window/startup_window.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/window_reference.tscn delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/window_reference/window_reference.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/editor/window_reference/window_reference.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/pixelpen.gdextension delete mode 100644 godot/addons/net.yarvis.pixel_pen/pixelpen.gdextension.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/pixelpen_plugin.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/pixelpen_plugin.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/plugin.cfg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/default_theme.tres delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/editor_canvas.gdshader delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/editor_canvas.gdshader.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/editor_canvas_cursor.gdshader delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/editor_canvas_cursor.gdshader.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/editor_shorcut.tres delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/fonts/inter/OFL.txt delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/fonts/inter/README.txt delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/fonts/inter/static/Inter-Bold.ttf delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/fonts/inter/static/Inter-Bold.ttf.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/fonts/inter/static/Inter-Regular.ttf delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/fonts/inter/static/Inter-Regular.ttf.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/fonts/inter/static/Inter-SemiBold.ttf delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/fonts/inter/static/Inter-SemiBold.ttf.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/fonts/inter/static/Inter-Thin.ttf delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/fonts/inter/static/Inter-Thin.ttf.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/grayscale.gdshader delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/grayscale.gdshader.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/Icon.png delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/Icon.png.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/add_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/add_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/arrow-expand-down.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/arrow-expand-down.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/arrow-expand-left.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/arrow-expand-left.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/arrow-expand-right.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/arrow-expand-right.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/arrow-expand-up.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/arrow-expand-up.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/arrow_selector_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/arrow_selector_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/brush_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/brush_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/cancel.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/cancel.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/check-circle-outline.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/check-circle-outline.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/chevron-down.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/chevron-down.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/circle-outline.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/circle-outline.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/color_picker_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/color_picker_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/color_picker_plus.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/color_picker_plus.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/content-copy.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/content-copy.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/content-cut.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/content-cut.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/content-save-alert-outline.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/content-save-alert-outline.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/content-save.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/content-save.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/crop_free_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/crop_free_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/delete_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/delete_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/delete_in_selection.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/delete_in_selection.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/eye_20.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/eye_20.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/fit-to-screen-outline.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/fit-to-screen-outline.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/flip-horizontal.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/flip-horizontal.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/flip-vertical.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/flip-vertical.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/folder-outline.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/folder-outline.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/folder_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/folder_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/grid_3x3_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/grid_3x3_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/image-filter-black-white.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/image-filter-black-white.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/index_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/index_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/information-outline.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/information-outline.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/ink_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/ink_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/ink_eraser_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/ink_eraser_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/layers-search-outline.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/layers-search-outline.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/line_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/line_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/magnet-on.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/magnet-on.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/magnet.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/magnet.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/menu_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/menu_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/move_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/move_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/palette_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/palette_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/pan_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/pan_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/pause.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/pause.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/pen.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/pen.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/play.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/play.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/rect_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/rect_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/redo.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/redo.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/remove_selection_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/remove_selection_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/rotate-left.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/rotate-left.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/rotate-right.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/rotate-right.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/rotate_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/rotate_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/select-color.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/select-color.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/select-inverse.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/select-inverse.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/selection_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/selection_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/skip-backward.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/skip-backward.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/skip-forward.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/skip-forward.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/stamp.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/stamp.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/step-backward.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/step-backward.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/step-forward.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/step-forward.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/undo.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/undo.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/vector-difference-ba.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/vector-difference-ba.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/vector-intersection.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/vector-intersection.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/vector-union.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/vector-union.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/visibility_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/visibility_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/zoom_in_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/zoom_in_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/zoom_out_24.svg delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/icon/zoom_out_24.svg.import delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/indexed_layer.gdshader delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/indexed_layer.gdshader.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/marching_ant.gdshader delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/marching_ant.gdshader.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/marching_ant_filled.gdshader delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/marching_ant_filled.gdshader.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/skinning_tint.gdshader delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/skinning_tint.gdshader.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/tile_transparant_material.tres delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/tint_color.gdshader delete mode 100644 godot/addons/net.yarvis.pixel_pen/resources/tint_color.gdshader.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/LICENSE delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/converter.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/converter.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/exporter.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/exporter.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/gif-lzw/LICENSE delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/gif-lzw/lsbbitpacker.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/gif-lzw/lsbbitpacker.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/gif-lzw/lsbbitunpacker.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/gif-lzw/lsbbitunpacker.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/gif-lzw/lzw.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/gif-lzw/lzw.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/little_endian.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/little_endian.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/lookup_color.gdshader delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/lookup_color.gdshader.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/lookup_similar.gdshader delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/lookup_similar.gdshader.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/quantization/median_cut.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/quantization/median_cut.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/quantization/uniform.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/thirdparty/gdgifexporter/quantization/uniform.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/ui/layout_split/branch.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/ui/layout_split/branch.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/ui/layout_split/data_branch.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/ui/layout_split/data_branch.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/ui/layout_split/layout_split.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/ui/layout_split/layout_split.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/ui/tree_properties/toggle_button.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/ui/tree_properties/toggle_button.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/ui/tree_properties/tree_properties.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/ui/tree_properties/tree_properties.gd.uid delete mode 100644 godot/addons/net.yarvis.pixel_pen/ui/tree_properties/tree_row.gd delete mode 100644 godot/addons/net.yarvis.pixel_pen/ui/tree_properties/tree_row.gd.uid delete mode 100644 godot/addons/panku_console/LICENSE delete mode 100644 godot/addons/panku_console/README.md delete mode 100644 godot/addons/panku_console/common/buffered_rich_text.gd delete mode 100644 godot/addons/panku_console/common/buffered_rich_text.gd.uid delete mode 100644 godot/addons/panku_console/common/config.gd delete mode 100644 godot/addons/panku_console/common/config.gd.uid delete mode 100644 godot/addons/panku_console/common/gdexprenv.gd delete mode 100644 godot/addons/panku_console/common/gdexprenv.gd.uid delete mode 100644 godot/addons/panku_console/common/lynx_window2/border.gd delete mode 100644 godot/addons/panku_console/common/lynx_window2/border.gd.uid delete mode 100644 godot/addons/panku_console/common/lynx_window2/lynx_window_2.gd delete mode 100644 godot/addons/panku_console/common/lynx_window2/lynx_window_2.gd.uid delete mode 100644 godot/addons/panku_console/common/lynx_window2/lynx_window_2.tscn delete mode 100644 godot/addons/panku_console/common/lynx_window2/lynx_window_shader_material.tres delete mode 100644 godot/addons/panku_console/common/lynx_window2/lynx_windows_manager_2.gd delete mode 100644 godot/addons/panku_console/common/lynx_window2/lynx_windows_manager_2.gd.uid delete mode 100644 godot/addons/panku_console/common/module_manager.gd delete mode 100644 godot/addons/panku_console/common/module_manager.gd.uid delete mode 100644 godot/addons/panku_console/common/module_options.gd delete mode 100644 godot/addons/panku_console/common/module_options.gd.uid delete mode 100644 godot/addons/panku_console/common/panku_button.gd delete mode 100644 godot/addons/panku_console/common/panku_button.gd.uid delete mode 100644 godot/addons/panku_console/common/panku_button.tscn delete mode 100644 godot/addons/panku_console/common/panku_module.gd delete mode 100644 godot/addons/panku_console/common/panku_module.gd.uid delete mode 100644 godot/addons/panku_console/common/repl_base_instance.gd delete mode 100644 godot/addons/panku_console/common/repl_base_instance.gd.uid delete mode 100644 godot/addons/panku_console/common/smooth_scroll/smooth_scroll.gd delete mode 100644 godot/addons/panku_console/common/smooth_scroll/smooth_scroll.gd.uid delete mode 100644 godot/addons/panku_console/common/smooth_scroll/smooth_scroll.tscn delete mode 100644 godot/addons/panku_console/common/utils.gd delete mode 100644 godot/addons/panku_console/common/utils.gd.uid delete mode 100644 godot/addons/panku_console/console.gd delete mode 100644 godot/addons/panku_console/console.gd.uid delete mode 100644 godot/addons/panku_console/console.tscn delete mode 100644 godot/addons/panku_console/default_panku_config.cfg delete mode 100644 godot/addons/panku_console/logo.svg delete mode 100644 godot/addons/panku_console/logo.svg.import delete mode 100644 godot/addons/panku_console/modules/about/about.gd delete mode 100644 godot/addons/panku_console/modules/about/about.gd.uid delete mode 100644 godot/addons/panku_console/modules/about/about.tscn delete mode 100644 godot/addons/panku_console/modules/about/env.gd delete mode 100644 godot/addons/panku_console/modules/about/env.gd.uid delete mode 100644 godot/addons/panku_console/modules/about/module.gd delete mode 100644 godot/addons/panku_console/modules/about/module.gd.uid delete mode 100644 godot/addons/panku_console/modules/about/url_button.gd delete mode 100644 godot/addons/panku_console/modules/about/url_button.gd.uid delete mode 100644 godot/addons/panku_console/modules/about/url_button.tscn delete mode 100644 godot/addons/panku_console/modules/check_latest_release/env.gd delete mode 100644 godot/addons/panku_console/modules/check_latest_release/env.gd.uid delete mode 100644 godot/addons/panku_console/modules/check_latest_release/module.gd delete mode 100644 godot/addons/panku_console/modules/check_latest_release/module.gd.uid delete mode 100644 godot/addons/panku_console/modules/check_latest_release/network.gd delete mode 100644 godot/addons/panku_console/modules/check_latest_release/network.gd.uid delete mode 100644 godot/addons/panku_console/modules/check_latest_release/opt.gd delete mode 100644 godot/addons/panku_console/modules/check_latest_release/opt.gd.uid delete mode 100644 godot/addons/panku_console/modules/engine_tools/env.gd delete mode 100644 godot/addons/panku_console/modules/engine_tools/env.gd.uid delete mode 100644 godot/addons/panku_console/modules/engine_tools/module.gd delete mode 100644 godot/addons/panku_console/modules/engine_tools/module.gd.uid delete mode 100644 godot/addons/panku_console/modules/engine_tools/opt.gd delete mode 100644 godot/addons/panku_console/modules/engine_tools/opt.gd.uid delete mode 100644 godot/addons/panku_console/modules/expression_monitor/env.gd delete mode 100644 godot/addons/panku_console/modules/expression_monitor/env.gd.uid delete mode 100644 godot/addons/panku_console/modules/expression_monitor/expression_item.gd delete mode 100644 godot/addons/panku_console/modules/expression_monitor/expression_item.gd.uid delete mode 100644 godot/addons/panku_console/modules/expression_monitor/expression_item.tscn delete mode 100644 godot/addons/panku_console/modules/expression_monitor/expression_monitor2.gd delete mode 100644 godot/addons/panku_console/modules/expression_monitor/expression_monitor2.gd.uid delete mode 100644 godot/addons/panku_console/modules/expression_monitor/expression_monitor2.tscn delete mode 100644 godot/addons/panku_console/modules/expression_monitor/module.gd delete mode 100644 godot/addons/panku_console/modules/expression_monitor/module.gd.uid delete mode 100644 godot/addons/panku_console/modules/expression_monitor/monitor_group_ui.gd delete mode 100644 godot/addons/panku_console/modules/expression_monitor/monitor_group_ui.gd.uid delete mode 100644 godot/addons/panku_console/modules/expression_monitor/monitor_group_ui.tscn delete mode 100644 godot/addons/panku_console/modules/expression_monitor/monitor_groups_ui.gd delete mode 100644 godot/addons/panku_console/modules/expression_monitor/monitor_groups_ui.gd.uid delete mode 100644 godot/addons/panku_console/modules/expression_monitor/monitor_groups_ui.tscn delete mode 100644 godot/addons/panku_console/modules/general_settings/env.gd delete mode 100644 godot/addons/panku_console/modules/general_settings/env.gd.uid delete mode 100644 godot/addons/panku_console/modules/general_settings/module.gd delete mode 100644 godot/addons/panku_console/modules/general_settings/module.gd.uid delete mode 100644 godot/addons/panku_console/modules/general_settings/opt.gd delete mode 100644 godot/addons/panku_console/modules/general_settings/opt.gd.uid delete mode 100644 godot/addons/panku_console/modules/history_manager/env.gd delete mode 100644 godot/addons/panku_console/modules/history_manager/env.gd.uid delete mode 100644 godot/addons/panku_console/modules/history_manager/exp_history.gd delete mode 100644 godot/addons/panku_console/modules/history_manager/exp_history.gd.uid delete mode 100644 godot/addons/panku_console/modules/history_manager/exp_history.tscn delete mode 100644 godot/addons/panku_console/modules/history_manager/exp_history_item.gd delete mode 100644 godot/addons/panku_console/modules/history_manager/exp_history_item.gd.uid delete mode 100644 godot/addons/panku_console/modules/history_manager/exp_history_item.tscn delete mode 100644 godot/addons/panku_console/modules/history_manager/module.gd delete mode 100644 godot/addons/panku_console/modules/history_manager/module.gd.uid delete mode 100644 godot/addons/panku_console/modules/history_manager/opt.gd delete mode 100644 godot/addons/panku_console/modules/history_manager/opt.gd.uid delete mode 100644 godot/addons/panku_console/modules/interactive_shell/console_logs/console_logs.gd delete mode 100644 godot/addons/panku_console/modules/interactive_shell/console_logs/console_logs.gd.uid delete mode 100644 godot/addons/panku_console/modules/interactive_shell/console_logs/console_logs.tscn delete mode 100644 godot/addons/panku_console/modules/interactive_shell/console_ui/help_bar.tscn delete mode 100644 godot/addons/panku_console/modules/interactive_shell/console_ui/panku_console_ui.gd delete mode 100644 godot/addons/panku_console/modules/interactive_shell/console_ui/panku_console_ui.gd.uid delete mode 100644 godot/addons/panku_console/modules/interactive_shell/console_ui/panku_console_ui.tscn delete mode 100644 godot/addons/panku_console/modules/interactive_shell/console_ui/remote_control_node.gd delete mode 100644 godot/addons/panku_console/modules/interactive_shell/console_ui/remote_control_node.gd.uid delete mode 100644 godot/addons/panku_console/modules/interactive_shell/console_ui/repl.gd delete mode 100644 godot/addons/panku_console/modules/interactive_shell/console_ui/repl.gd.uid delete mode 100644 godot/addons/panku_console/modules/interactive_shell/console_ui/repl.tscn delete mode 100644 godot/addons/panku_console/modules/interactive_shell/console_ui/side_buttons_controller.gd delete mode 100644 godot/addons/panku_console/modules/interactive_shell/console_ui/side_buttons_controller.gd.uid delete mode 100644 godot/addons/panku_console/modules/interactive_shell/env.gd delete mode 100644 godot/addons/panku_console/modules/interactive_shell/env.gd.uid delete mode 100644 godot/addons/panku_console/modules/interactive_shell/hints_list/hint.gd delete mode 100644 godot/addons/panku_console/modules/interactive_shell/hints_list/hint.gd.uid delete mode 100644 godot/addons/panku_console/modules/interactive_shell/hints_list/hint.tscn delete mode 100644 godot/addons/panku_console/modules/interactive_shell/hints_list/hints_list.gd delete mode 100644 godot/addons/panku_console/modules/interactive_shell/hints_list/hints_list.gd.uid delete mode 100644 godot/addons/panku_console/modules/interactive_shell/hints_list/hints_list.tscn delete mode 100644 godot/addons/panku_console/modules/interactive_shell/input_field/input_area.gd delete mode 100644 godot/addons/panku_console/modules/interactive_shell/input_field/input_area.gd.uid delete mode 100644 godot/addons/panku_console/modules/interactive_shell/input_field/input_area.tscn delete mode 100644 godot/addons/panku_console/modules/interactive_shell/input_field/input_field.gd delete mode 100644 godot/addons/panku_console/modules/interactive_shell/input_field/input_field.gd.uid delete mode 100644 godot/addons/panku_console/modules/interactive_shell/mini_repl_2.gd delete mode 100644 godot/addons/panku_console/modules/interactive_shell/mini_repl_2.gd.uid delete mode 100644 godot/addons/panku_console/modules/interactive_shell/mini_repl_2.tscn delete mode 100644 godot/addons/panku_console/modules/interactive_shell/module.gd delete mode 100644 godot/addons/panku_console/modules/interactive_shell/module.gd.uid delete mode 100644 godot/addons/panku_console/modules/interactive_shell/opt.gd delete mode 100644 godot/addons/panku_console/modules/interactive_shell/opt.gd.uid delete mode 100644 godot/addons/panku_console/modules/interactive_shell/side_menu_config.json delete mode 100644 godot/addons/panku_console/modules/keyboard_shortcuts/env.gd delete mode 100644 godot/addons/panku_console/modules/keyboard_shortcuts/env.gd.uid delete mode 100644 godot/addons/panku_console/modules/keyboard_shortcuts/exp_key_item.gd delete mode 100644 godot/addons/panku_console/modules/keyboard_shortcuts/exp_key_item.gd.uid delete mode 100644 godot/addons/panku_console/modules/keyboard_shortcuts/exp_key_item.tscn delete mode 100644 godot/addons/panku_console/modules/keyboard_shortcuts/exp_key_mapper_2.gd delete mode 100644 godot/addons/panku_console/modules/keyboard_shortcuts/exp_key_mapper_2.gd.uid delete mode 100644 godot/addons/panku_console/modules/keyboard_shortcuts/exp_key_mapper_2.tscn delete mode 100644 godot/addons/panku_console/modules/keyboard_shortcuts/module.gd delete mode 100644 godot/addons/panku_console/modules/keyboard_shortcuts/module.gd.uid delete mode 100644 godot/addons/panku_console/modules/keyboard_shortcuts/opt.gd delete mode 100644 godot/addons/panku_console/modules/keyboard_shortcuts/opt.gd.uid delete mode 100644 godot/addons/panku_console/modules/keyboard_shortcuts/remap_button.gd delete mode 100644 godot/addons/panku_console/modules/keyboard_shortcuts/remap_button.gd.uid delete mode 100644 godot/addons/panku_console/modules/native_logger/env.gd delete mode 100644 godot/addons/panku_console/modules/native_logger/env.gd.uid delete mode 100644 godot/addons/panku_console/modules/native_logger/godot_log_monitor.gd delete mode 100644 godot/addons/panku_console/modules/native_logger/godot_log_monitor.gd.uid delete mode 100644 godot/addons/panku_console/modules/native_logger/log_overlay.tscn delete mode 100644 godot/addons/panku_console/modules/native_logger/log_view_tag.gd delete mode 100644 godot/addons/panku_console/modules/native_logger/log_view_tag.gd.uid delete mode 100644 godot/addons/panku_console/modules/native_logger/log_view_tag.tscn delete mode 100644 godot/addons/panku_console/modules/native_logger/logger_view.gd delete mode 100644 godot/addons/panku_console/modules/native_logger/logger_view.gd.uid delete mode 100644 godot/addons/panku_console/modules/native_logger/logger_view.tscn delete mode 100644 godot/addons/panku_console/modules/native_logger/module.gd delete mode 100644 godot/addons/panku_console/modules/native_logger/module.gd.uid delete mode 100644 godot/addons/panku_console/modules/native_logger/opt.gd delete mode 100644 godot/addons/panku_console/modules/native_logger/opt.gd.uid delete mode 100644 godot/addons/panku_console/modules/screen_crt_effect/crt_effect_layer.tscn delete mode 100644 godot/addons/panku_console/modules/screen_crt_effect/env.gd delete mode 100644 godot/addons/panku_console/modules/screen_crt_effect/env.gd.uid delete mode 100644 godot/addons/panku_console/modules/screen_crt_effect/module.gd delete mode 100644 godot/addons/panku_console/modules/screen_crt_effect/module.gd.uid delete mode 100644 godot/addons/panku_console/modules/screen_crt_effect/opt.gd delete mode 100644 godot/addons/panku_console/modules/screen_crt_effect/opt.gd.uid delete mode 100644 godot/addons/panku_console/modules/screen_notifier/env.gd delete mode 100644 godot/addons/panku_console/modules/screen_notifier/env.gd.uid delete mode 100644 godot/addons/panku_console/modules/screen_notifier/log_item.gd delete mode 100644 godot/addons/panku_console/modules/screen_notifier/log_item.gd.uid delete mode 100644 godot/addons/panku_console/modules/screen_notifier/log_item.tscn delete mode 100644 godot/addons/panku_console/modules/screen_notifier/module.gd delete mode 100644 godot/addons/panku_console/modules/screen_notifier/module.gd.uid delete mode 100644 godot/addons/panku_console/modules/screen_notifier/resident_logs.gd delete mode 100644 godot/addons/panku_console/modules/screen_notifier/resident_logs.gd.uid delete mode 100644 godot/addons/panku_console/modules/screen_notifier/resident_logs.tscn delete mode 100644 godot/addons/panku_console/modules/snake/env.gd delete mode 100644 godot/addons/panku_console/modules/snake/env.gd.uid delete mode 100644 godot/addons/panku_console/modules/snake/module.gd delete mode 100644 godot/addons/panku_console/modules/snake/module.gd.uid delete mode 100644 godot/addons/panku_console/modules/snake/snake.gd delete mode 100644 godot/addons/panku_console/modules/snake/snake.gd.uid delete mode 100644 godot/addons/panku_console/modules/snake/snake.tscn delete mode 100644 godot/addons/panku_console/modules/snake/snake_gradient.tres delete mode 100644 godot/addons/panku_console/modules/snake/snake_ui.gd delete mode 100644 godot/addons/panku_console/modules/snake/snake_ui.gd.uid delete mode 100644 godot/addons/panku_console/modules/system_report/env.gd delete mode 100644 godot/addons/panku_console/modules/system_report/env.gd.uid delete mode 100644 godot/addons/panku_console/modules/system_report/module.gd delete mode 100644 godot/addons/panku_console/modules/system_report/module.gd.uid delete mode 100644 godot/addons/panku_console/modules/system_report/os_report.gd delete mode 100644 godot/addons/panku_console/modules/system_report/os_report.gd.uid delete mode 100644 godot/addons/panku_console/modules/texture_viewer/module.gd delete mode 100644 godot/addons/panku_console/modules/texture_viewer/module.gd.uid delete mode 100644 godot/addons/panku_console/modules/texture_viewer/texture_viewer.gd delete mode 100644 godot/addons/panku_console/modules/texture_viewer/texture_viewer.gd.uid delete mode 100644 godot/addons/panku_console/modules/texture_viewer/texture_viewer.tscn delete mode 100644 godot/addons/panku_console/modules/variable_tracker/module.gd delete mode 100644 godot/addons/panku_console/modules/variable_tracker/module.gd.uid delete mode 100644 godot/addons/panku_console/modules/variable_tracker/opt.gd delete mode 100644 godot/addons/panku_console/modules/variable_tracker/opt.gd.uid delete mode 100644 godot/addons/panku_console/plugin.cfg delete mode 100644 godot/addons/panku_console/plugin.gd delete mode 100644 godot/addons/panku_console/plugin.gd.uid delete mode 100644 godot/addons/panku_console/res/effect/square_shadow.png delete mode 100644 godot/addons/panku_console/res/effect/square_shadow.png.import delete mode 100644 godot/addons/panku_console/res/green_gradient_1d.tres delete mode 100644 godot/addons/panku_console/res/icons2/add.svg delete mode 100644 godot/addons/panku_console/res/icons2/add.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/arrow-down-svgrepo-com.svg delete mode 100644 godot/addons/panku_console/res/icons2/arrow-down-svgrepo-com.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/arrow-up-md-svgrepo-com.svg delete mode 100644 godot/addons/panku_console/res/icons2/arrow-up-md-svgrepo-com.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/bin-cancel-delete-remove-trash-garbage-svgrepo-com.svg delete mode 100644 godot/addons/panku_console/res/icons2/bin-cancel-delete-remove-trash-garbage-svgrepo-com.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/bookmark-filled-svgrepo-com.svg delete mode 100644 godot/addons/panku_console/res/icons2/bookmark-filled-svgrepo-com.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/bookmark-svgrepo-com.svg delete mode 100644 godot/addons/panku_console/res/icons2/bookmark-svgrepo-com.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/check-svgrepo-com.svg delete mode 100644 godot/addons/panku_console/res/icons2/check-svgrepo-com.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/checkbox_checked.svg delete mode 100644 godot/addons/panku_console/res/icons2/checkbox_checked.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/checkbox_unchecked.svg delete mode 100644 godot/addons/panku_console/res/icons2/checkbox_unchecked.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/chevron_right.svg delete mode 100644 godot/addons/panku_console/res/icons2/chevron_right.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/close.svg delete mode 100644 godot/addons/panku_console/res/icons2/close.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/close_20x.svg delete mode 100644 godot/addons/panku_console/res/icons2/close_20x.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/expand_more.svg delete mode 100644 godot/addons/panku_console/res/icons2/expand_more.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/eye.svg delete mode 100644 godot/addons/panku_console/res/icons2/eye.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/favorite.svg delete mode 100644 godot/addons/panku_console/res/icons2/favorite.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/fold-svgrepo-com.svg delete mode 100644 godot/addons/panku_console/res/icons2/fold-svgrepo-com.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/gear.svg delete mode 100644 godot/addons/panku_console/res/icons2/gear.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/history.svg delete mode 100644 godot/addons/panku_console/res/icons2/history.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/info.svg delete mode 100644 godot/addons/panku_console/res/icons2/info.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/info2.svg delete mode 100644 godot/addons/panku_console/res/icons2/info2.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/keyboard.svg delete mode 100644 godot/addons/panku_console/res/icons2/keyboard.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/menu.svg delete mode 100644 godot/addons/panku_console/res/icons2/menu.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/more_horiz.svg delete mode 100644 godot/addons/panku_console/res/icons2/more_horiz.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/open_with.svg delete mode 100644 godot/addons/panku_console/res/icons2/open_with.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/pause-1010-svgrepo-com.svg delete mode 100644 godot/addons/panku_console/res/icons2/pause-1010-svgrepo-com.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/play-1001-svgrepo-com.svg delete mode 100644 godot/addons/panku_console/res/icons2/play-1001-svgrepo-com.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/pop-out-svgrepo-com.svg delete mode 100644 godot/addons/panku_console/res/icons2/pop-out-svgrepo-com.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/question.svg delete mode 100644 godot/addons/panku_console/res/icons2/question.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/remove.svg delete mode 100644 godot/addons/panku_console/res/icons2/remove.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/rename-svgrepo-com.svg delete mode 100644 godot/addons/panku_console/res/icons2/rename-svgrepo-com.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/reply.svg delete mode 100644 godot/addons/panku_console/res/icons2/reply.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/resize-svgrepo-com.svg delete mode 100644 godot/addons/panku_console/res/icons2/resize-svgrepo-com.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/search.svg delete mode 100644 godot/addons/panku_console/res/icons2/search.svg.import delete mode 100644 godot/addons/panku_console/res/icons2/swap_horiz.svg delete mode 100644 godot/addons/panku_console/res/icons2/swap_horiz.svg.import delete mode 100644 godot/addons/panku_console/res/panku_console_theme.tres delete mode 100644 godot/addons/panku_console/res/shader/mattias_crt.gdshader delete mode 100644 godot/addons/panku_console/res/shader/mattias_crt.gdshader.uid delete mode 100644 godot/addons/panku_console/res/shader/simple_fast_blur.gdshader delete mode 100644 godot/addons/panku_console/res/shader/simple_fast_blur.gdshader.uid delete mode 100644 godot/addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png delete mode 100644 godot/addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png.import delete mode 100644 godot/addons/phantom_camera/assets/PhantomCameraBtnPrimaryHover.png delete mode 100644 godot/addons/phantom_camera/assets/PhantomCameraBtnPrimaryHover.png.import delete mode 100644 godot/addons/phantom_camera/examples/credits.txt delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_framed_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_group_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_path_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_limit_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_noise_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_tweening_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/2D/2d_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/2D/2d_follow_framed_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/2D/2d_follow_group_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/2D/2d_follow_path_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/2D/2d_limit_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/2D/2d_tweening_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_framed_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_glued_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_group_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_path_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_simple_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_third_person_attribtues_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_third_person_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_look_at_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_noise_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_tweening_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D-4.4/sub_scenes/playable_character_3d.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D-4.4/sub_scenes/playable_character_third_person_3d.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D/3d_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D/3d_follow_framed_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D/3d_follow_glued_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D/3d_follow_group_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D/3d_follow_path_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D/3d_follow_simple_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D/3d_follow_third_person_attribtues_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D/3d_follow_third_person_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D/3d_look_at_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D/3d_noise_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D/3d_tweening_example_scene.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn delete mode 100644 godot/addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_third_person_3d.tscn delete mode 100644 godot/addons/phantom_camera/examples/models/3d_cube_dark.tscn delete mode 100644 godot/addons/phantom_camera/examples/resources/tween/fixed_camera_tween.tres delete mode 100644 godot/addons/phantom_camera/examples/resources/tween/inventory_phantom_camera_2d_tween.tres delete mode 100644 godot/addons/phantom_camera/examples/resources/tween/item_focus_phantom_camera_2d_tween.tres delete mode 100644 godot/addons/phantom_camera/examples/resources/tween/player_phantom_camera_2d_tween.tres delete mode 100644 godot/addons/phantom_camera/examples/resources/tween/player_phantom_camera_3d_tween.tres delete mode 100644 godot/addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween.gd delete mode 100644 godot/addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween.gd.uid delete mode 100644 godot/addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween_4.3.gd delete mode 100644 godot/addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween_4.3.gd.uid delete mode 100644 godot/addons/phantom_camera/examples/scripts/2D/2d_trigger_area.gd delete mode 100644 godot/addons/phantom_camera/examples/scripts/2D/2d_trigger_area.gd.uid delete mode 100644 godot/addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd delete mode 100644 godot/addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd.uid delete mode 100644 godot/addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd delete mode 100644 godot/addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd.uid delete mode 100644 godot/addons/phantom_camera/examples/scripts/3D/3d_trigger_area.gd delete mode 100644 godot/addons/phantom_camera/examples/scripts/3D/3d_trigger_area.gd.uid delete mode 100644 godot/addons/phantom_camera/examples/scripts/3D/npc.gd delete mode 100644 godot/addons/phantom_camera/examples/scripts/3D/npc.gd.uid delete mode 100644 godot/addons/phantom_camera/examples/scripts/3D/path_follow.gd delete mode 100644 godot/addons/phantom_camera/examples/scripts/3D/path_follow.gd.uid delete mode 100644 godot/addons/phantom_camera/examples/scripts/3D/player_controller.gd delete mode 100644 godot/addons/phantom_camera/examples/scripts/3D/player_controller.gd.uid delete mode 100644 godot/addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd delete mode 100644 godot/addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd.uid delete mode 100644 godot/addons/phantom_camera/examples/scripts/3D/player_controller_first_person.gd delete mode 100644 godot/addons/phantom_camera/examples/scripts/3D/player_controller_first_person.gd.uid delete mode 100644 godot/addons/phantom_camera/examples/scripts/3D/player_controller_first_person_4.4.gd delete mode 100644 godot/addons/phantom_camera/examples/scripts/3D/player_controller_first_person_4.4.gd.uid delete mode 100644 godot/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd delete mode 100644 godot/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd.uid delete mode 100644 godot/addons/phantom_camera/examples/scripts/3D/player_controller_third_person_4.4.gd delete mode 100644 godot/addons/phantom_camera/examples/scripts/3D/player_controller_third_person_4.4.gd.uid delete mode 100644 godot/addons/phantom_camera/examples/textures/2D/inventory_container.png delete mode 100644 godot/addons/phantom_camera/examples/textures/2D/inventory_container.png.import delete mode 100644 godot/addons/phantom_camera/examples/textures/2D/level_spritesheet.png delete mode 100644 godot/addons/phantom_camera/examples/textures/2D/level_spritesheet.png.import delete mode 100644 godot/addons/phantom_camera/examples/textures/2D/phantom_camera_2d_sprite.png delete mode 100644 godot/addons/phantom_camera/examples/textures/2D/phantom_camera_2d_sprite.png.import delete mode 100644 godot/addons/phantom_camera/examples/textures/2D/player_sprite.svg delete mode 100644 godot/addons/phantom_camera/examples/textures/2D/player_sprite.svg.import delete mode 100644 godot/addons/phantom_camera/examples/textures/2D/sign_prompt.png delete mode 100644 godot/addons/phantom_camera/examples/textures/2D/sign_prompt.png.import delete mode 100644 godot/addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png delete mode 100644 godot/addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png.import delete mode 100644 godot/addons/phantom_camera/examples/textures/3D/target.png delete mode 100644 godot/addons/phantom_camera/examples/ui/ui_inventory.tscn delete mode 100644 godot/addons/phantom_camera/examples/ui/ui_sign.tscn delete mode 100644 godot/addons/phantom_camera/fonts/Nunito-Black.ttf delete mode 100644 godot/addons/phantom_camera/fonts/Nunito-Black.ttf.import delete mode 100644 godot/addons/phantom_camera/fonts/Nunito-Regular.ttf delete mode 100644 godot/addons/phantom_camera/fonts/Nunito-Regular.ttf.import delete mode 100644 godot/addons/phantom_camera/icons/misc/PriorityOverride.svg delete mode 100644 godot/addons/phantom_camera/icons/misc/PriorityOverride.svg.import delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_2d.svg delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_2d.svg.import delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_3d.svg delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_3d.svg.import delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg.import delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_gizmo.svg delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_gizmo.svg.import delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_glow_logo.png delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_glow_logo.png.import delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_host.svg delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_host.svg.import delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_logo.png delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_logo.png.import delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg.import delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg.import delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg.import delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_noise_resource.svg delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_noise_resource.svg.import delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_tween.svg delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_tween.svg.import delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg delete mode 100644 godot/addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg.import delete mode 100644 godot/addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg delete mode 100644 godot/addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg.import delete mode 100644 godot/addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg delete mode 100644 godot/addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg.import delete mode 100644 godot/addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg delete mode 100644 godot/addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg.import delete mode 100644 godot/addons/phantom_camera/icons/viewfinder/Select.svg delete mode 100644 godot/addons/phantom_camera/icons/viewfinder/Select.svg.import delete mode 100644 godot/addons/phantom_camera/icons/warning.svg delete mode 100644 godot/addons/phantom_camera/icons/warning.svg.import delete mode 100644 godot/addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd delete mode 100644 godot/addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd.uid delete mode 100644 godot/addons/phantom_camera/panel/editor.gd.uid delete mode 100644 godot/addons/phantom_camera/panel/editor.tscn delete mode 100644 godot/addons/phantom_camera/panel/updater/download_update_panel.tscn delete mode 100644 godot/addons/phantom_camera/panel/updater/update_button.tscn delete mode 100644 godot/addons/phantom_camera/panel/viewfinder/deadzone_style_box.tres delete mode 100644 godot/addons/phantom_camera/panel/viewfinder/host_list/host_list.tscn delete mode 100644 godot/addons/phantom_camera/panel/viewfinder/host_list/host_list_item.tscn delete mode 100644 godot/addons/phantom_camera/panel/viewfinder/host_list/host_list_item_group.tres delete mode 100644 godot/addons/phantom_camera/panel/viewfinder/viewfinder_panel.tscn delete mode 100644 godot/addons/phantom_camera/plugin.cfg delete mode 100644 godot/addons/phantom_camera/plugin.gd delete mode 100644 godot/addons/phantom_camera/plugin.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/gizmos/phantom_camera_3d_gizmo.gd delete mode 100644 godot/addons/phantom_camera/scripts/gizmos/phantom_camera_3d_gizmo.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/gizmos/phantom_camera_3d_gizmo_plugin.gd delete mode 100644 godot/addons/phantom_camera/scripts/gizmos/phantom_camera_3d_gizmo_plugin.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd delete mode 100644 godot/addons/phantom_camera/scripts/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/managers/PhantomCameraManager.cs delete mode 100644 godot/addons/phantom_camera/scripts/managers/PhantomCameraManager.cs.uid delete mode 100644 godot/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd delete mode 100644 godot/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/panel/editor.gd delete mode 100644 godot/addons/phantom_camera/scripts/panel/editor.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/panel/updater/download_update_panel.gd delete mode 100644 godot/addons/phantom_camera/scripts/panel/updater/download_update_panel.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/panel/updater/update_button.gd delete mode 100644 godot/addons/phantom_camera/scripts/panel/updater/update_button.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/panel/updater/updater_constants.gd delete mode 100644 godot/addons/phantom_camera/scripts/panel/updater/updater_constants.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/panel/viewfinder/host_list.gd delete mode 100644 godot/addons/phantom_camera/scripts/panel/viewfinder/host_list.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/panel/viewfinder/host_list_item.gd delete mode 100644 godot/addons/phantom_camera/scripts/panel/viewfinder/host_list_item.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd delete mode 100644 godot/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera/PhantomCamera.cs delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera/PhantomCamera.cs.uid delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera/PhantomCamera2D.cs delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera/PhantomCamera2D.cs.uid delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera/PhantomCamera3D.cs delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera/PhantomCamera3D.cs.uid delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera/PhantomCameraNoiseEmitter2D.cs delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera/PhantomCameraNoiseEmitter2D.cs.uid delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera/PhantomCameraNoiseEmitter3D.cs delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera/PhantomCameraNoiseEmitter3D.cs.uid delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera_host/PhantomCameraHost.cs delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera_host/PhantomCameraHost.cs.uid delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd delete mode 100644 godot/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/resources/Camera3DResource.cs delete mode 100644 godot/addons/phantom_camera/scripts/resources/Camera3DResource.cs.uid delete mode 100644 godot/addons/phantom_camera/scripts/resources/PhantomCameraNoise2D.cs delete mode 100644 godot/addons/phantom_camera/scripts/resources/PhantomCameraNoise2D.cs.uid delete mode 100644 godot/addons/phantom_camera/scripts/resources/PhantomCameraNoise3D.cs delete mode 100644 godot/addons/phantom_camera/scripts/resources/PhantomCameraNoise3D.cs.uid delete mode 100644 godot/addons/phantom_camera/scripts/resources/PhantomCameraTween.cs delete mode 100644 godot/addons/phantom_camera/scripts/resources/PhantomCameraTween.cs.uid delete mode 100644 godot/addons/phantom_camera/scripts/resources/camera_3d_resource.gd delete mode 100644 godot/addons/phantom_camera/scripts/resources/camera_3d_resource.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd delete mode 100644 godot/addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd delete mode 100644 godot/addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd.uid delete mode 100644 godot/addons/phantom_camera/scripts/resources/tween_resource.gd delete mode 100644 godot/addons/phantom_camera/scripts/resources/tween_resource.gd.uid delete mode 100644 godot/addons/phantom_camera/themes/button_focus.tres delete mode 100644 godot/addons/phantom_camera/themes/button_hover.tres delete mode 100644 godot/addons/phantom_camera/themes/button_normal.tres delete mode 100644 godot/addons/phantom_camera/themes/theme.tres delete mode 100644 godot/addons/resources_spreadsheet_view/LICENSE.md delete mode 100644 godot/addons/resources_spreadsheet_view/editor_color_setter.gd delete mode 100644 godot/addons/resources_spreadsheet_view/editor_color_setter.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/editor_icon_button.gd delete mode 100644 godot/addons/resources_spreadsheet_view/editor_icon_button.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/editor_resource_array_picker.gd delete mode 100644 godot/addons/resources_spreadsheet_view/editor_resource_array_picker.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/editor_view.gd delete mode 100644 godot/addons/resources_spreadsheet_view/editor_view.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/editor_view.tscn delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/formats_edit/edit_base.gd delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/formats_edit/edit_base.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/formats_edit/edit_csv.gd delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/formats_edit/edit_csv.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/formats_edit/edit_tres.gd delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/formats_edit/edit_tres.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/formats_export/export_csv.gd delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/formats_export/export_csv.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/formats_import/import_csv.gd delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/formats_import/import_csv.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/import_export_dialog.gd delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/import_export_dialog.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/import_export_dialog.tscn delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/import_export_enum_format.gd delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/import_export_enum_format.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/import_export_enum_format.tscn delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/property_list_item.gd delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/property_list_item.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/property_list_item.tscn delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/spreadsheet_import.gd delete mode 100644 godot/addons/resources_spreadsheet_view/import_export/spreadsheet_import.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/class_filter.gd delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/class_filter.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/column_header_manager.gd delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/column_header_manager.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/custom_grid_container.gd delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/custom_grid_container.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/expression_textfield.gd delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/expression_textfield.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/frozen_columns.gd delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/frozen_columns.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/input_handler.gd delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/input_handler.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/recent_paths.gd delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/recent_paths.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/selection_actions.gd delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/selection_actions.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/selection_actions.tscn delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/selection_manager.gd delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/selection_manager.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/table_header.gd delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/table_header.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/table_header.tscn delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/table_pages.gd delete mode 100644 godot/addons/resources_spreadsheet_view/main_screen/table_pages.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/plugin.cfg delete mode 100644 godot/addons/resources_spreadsheet_view/plugin.gd delete mode 100644 godot/addons/resources_spreadsheet_view/plugin.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/settings_grid.gd delete mode 100644 godot/addons/resources_spreadsheet_view/settings_grid.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/settings_grid.tscn delete mode 100644 godot/addons/resources_spreadsheet_view/text_editing_utils.gd delete mode 100644 godot/addons/resources_spreadsheet_view/text_editing_utils.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/array.tscn delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/basic.tscn delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/cell_editor.gd delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/cell_editor.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/cell_editor_array.gd delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/cell_editor_array.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/cell_editor_bool.gd delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/cell_editor_bool.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/cell_editor_color.gd delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/cell_editor_color.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/cell_editor_dict.gd delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/cell_editor_dict.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/cell_editor_enum.gd delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/cell_editor_enum.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/cell_editor_enum_array.gd delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/cell_editor_enum_array.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/cell_editor_number.gd delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/cell_editor_number.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/cell_editor_resource.gd delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/cell_editor_resource.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/cell_editor_string.gd delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/cell_editor_string.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/typed_cells/resource.tscn delete mode 100644 godot/addons/resources_spreadsheet_view/typed_editors/dock_array.gd delete mode 100644 godot/addons/resources_spreadsheet_view/typed_editors/dock_array.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/typed_editors/dock_array.tscn delete mode 100644 godot/addons/resources_spreadsheet_view/typed_editors/dock_base.gd delete mode 100644 godot/addons/resources_spreadsheet_view/typed_editors/dock_base.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/typed_editors/dock_color.gd delete mode 100644 godot/addons/resources_spreadsheet_view/typed_editors/dock_color.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/typed_editors/dock_color.tscn delete mode 100644 godot/addons/resources_spreadsheet_view/typed_editors/dock_dict.gd delete mode 100644 godot/addons/resources_spreadsheet_view/typed_editors/dock_dict.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/typed_editors/dock_dict.tscn delete mode 100644 godot/addons/resources_spreadsheet_view/typed_editors/dock_enum_array.gd delete mode 100644 godot/addons/resources_spreadsheet_view/typed_editors/dock_enum_array.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/typed_editors/dock_enum_array.tscn delete mode 100644 godot/addons/resources_spreadsheet_view/typed_editors/dock_number.gd delete mode 100644 godot/addons/resources_spreadsheet_view/typed_editors/dock_number.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/typed_editors/dock_number.tscn delete mode 100644 godot/addons/resources_spreadsheet_view/typed_editors/dock_texture.gd delete mode 100644 godot/addons/resources_spreadsheet_view/typed_editors/dock_texture.gd.uid delete mode 100644 godot/addons/resources_spreadsheet_view/typed_editors/dock_texture.tscn delete mode 100644 godot/addons/snappy/plugin.cfg delete mode 100644 godot/addons/snappy/snappy.gd delete mode 100644 godot/addons/snappy/snappy.gd.uid delete mode 100644 godot/addons/ui_design_tool/assets/icons/folder_open-white-18dp.svg delete mode 100644 godot/addons/ui_design_tool/assets/icons/folder_open-white-18dp.svg.import delete mode 100644 godot/addons/ui_design_tool/assets/icons/format-color-text.png delete mode 100644 godot/addons/ui_design_tool/assets/icons/format-color-text.png.import delete mode 100644 godot/addons/ui_design_tool/assets/icons/format_align_center-white-18dp.svg delete mode 100644 godot/addons/ui_design_tool/assets/icons/format_align_center-white-18dp.svg.import delete mode 100644 godot/addons/ui_design_tool/assets/icons/format_align_left-white-18dp.svg delete mode 100644 godot/addons/ui_design_tool/assets/icons/format_align_left-white-18dp.svg.import delete mode 100644 godot/addons/ui_design_tool/assets/icons/format_align_right-white-18dp.svg delete mode 100644 godot/addons/ui_design_tool/assets/icons/format_align_right-white-18dp.svg.import delete mode 100644 godot/addons/ui_design_tool/assets/icons/format_bold-white-18dp.svg delete mode 100644 godot/addons/ui_design_tool/assets/icons/format_bold-white-18dp.svg.import delete mode 100644 godot/addons/ui_design_tool/assets/icons/format_clear-white-18dp.svg delete mode 100644 godot/addons/ui_design_tool/assets/icons/format_clear-white-18dp.svg.import delete mode 100644 godot/addons/ui_design_tool/assets/icons/format_color_reset-white-18dp.svg delete mode 100644 godot/addons/ui_design_tool/assets/icons/format_color_reset-white-18dp.svg.import delete mode 100644 godot/addons/ui_design_tool/assets/icons/format_italic-white-18dp.svg delete mode 100644 godot/addons/ui_design_tool/assets/icons/format_italic-white-18dp.svg.import delete mode 100644 godot/addons/ui_design_tool/assets/icons/format_underlined-white-18dp.svg delete mode 100644 godot/addons/ui_design_tool/assets/icons/format_underlined-white-18dp.svg.import delete mode 100644 godot/addons/ui_design_tool/assets/icons/marker.png delete mode 100644 godot/addons/ui_design_tool/assets/icons/marker.png.import delete mode 100644 godot/addons/ui_design_tool/assets/icons/more_horiz-white-18dp.svg delete mode 100644 godot/addons/ui_design_tool/assets/icons/more_horiz-white-18dp.svg.import delete mode 100644 godot/addons/ui_design_tool/assets/icons/more_vert-white-18dp.svg delete mode 100644 godot/addons/ui_design_tool/assets/icons/more_vert-white-18dp.svg.import delete mode 100644 godot/addons/ui_design_tool/assets/icons/photo_size_select_small-white-18dp.svg delete mode 100644 godot/addons/ui_design_tool/assets/icons/photo_size_select_small-white-18dp.svg.import delete mode 100644 godot/addons/ui_design_tool/assets/icons/refresh-white-18dp.svg delete mode 100644 godot/addons/ui_design_tool/assets/icons/refresh-white-18dp.svg.import delete mode 100644 godot/addons/ui_design_tool/assets/icons/vertical_align_bottom-white-18dp.svg delete mode 100644 godot/addons/ui_design_tool/assets/icons/vertical_align_bottom-white-18dp.svg.import delete mode 100644 godot/addons/ui_design_tool/assets/icons/vertical_align_center-white-18dp.svg delete mode 100644 godot/addons/ui_design_tool/assets/icons/vertical_align_center-white-18dp.svg.import delete mode 100644 godot/addons/ui_design_tool/assets/icons/vertical_align_top-white-18dp.svg delete mode 100644 godot/addons/ui_design_tool/assets/icons/vertical_align_top-white-18dp.svg.import delete mode 100644 godot/addons/ui_design_tool/plugin.cfg delete mode 100644 godot/addons/ui_design_tool/plugin.gd delete mode 100644 godot/addons/ui_design_tool/plugin.gd.uid delete mode 100644 godot/addons/ui_design_tool/scenes/OverlayTextEdit.gd delete mode 100644 godot/addons/ui_design_tool/scenes/OverlayTextEdit.gd.uid delete mode 100644 godot/addons/ui_design_tool/scenes/OverlayTextEdit.tscn delete mode 100644 godot/addons/ui_design_tool/scenes/Toolbar.gd delete mode 100644 godot/addons/ui_design_tool/scenes/Toolbar.gd.uid delete mode 100644 godot/addons/ui_design_tool/scenes/Toolbar.tscn delete mode 100644 godot/addons/ui_design_tool/scripts/FontManager.gd delete mode 100644 godot/addons/ui_design_tool/scripts/FontManager.gd.uid delete mode 100644 godot/addons/ui_design_tool/scripts/Utils.gd delete mode 100644 godot/addons/ui_design_tool/scripts/Utils.gd.uid delete mode 100644 godot/addons/your_buil/CHANGELOG.md delete mode 100644 godot/addons/your_buil/LICENSE.txt delete mode 100644 godot/addons/your_buil/exporter.gd delete mode 100644 godot/addons/your_buil/exporter.gd.uid delete mode 100644 godot/addons/your_buil/plugin.cfg delete mode 100644 godot/addons/your_buil/plugin.gd delete mode 100644 godot/addons/your_buil/plugin.gd.uid delete mode 100644 godot/addons/your_buil/wrapper.gd delete mode 100644 godot/addons/your_buil/wrapper.gd.uid delete mode 100644 godot/art/House In a Forest Loop.ogg delete mode 100644 godot/art/House In a Forest Loop.ogg.import delete mode 100644 godot/art/enemyFlyingAlt_1.png delete mode 100644 godot/art/enemyFlyingAlt_1.png.import delete mode 100644 godot/art/enemyFlyingAlt_2.png delete mode 100644 godot/art/enemyFlyingAlt_2.png.import delete mode 100644 godot/art/enemySwimming_1.png delete mode 100644 godot/art/enemySwimming_1.png.import delete mode 100644 godot/art/enemySwimming_2.png delete mode 100644 godot/art/enemySwimming_2.png.import delete mode 100644 godot/art/enemyWalking_1.png delete mode 100644 godot/art/enemyWalking_1.png.import delete mode 100644 godot/art/enemyWalking_2.png delete mode 100644 godot/art/enemyWalking_2.png.import delete mode 100644 godot/art/gameover.wav delete mode 100644 godot/art/gameover.wav.import create mode 100644 godot/art/lilhornet.png rename godot/{addons/phantom_camera/examples/textures/3D/target.png.import => art/lilhornet.png.import} (72%) create mode 100644 godot/art/minecraft_atlas.png rename godot/{addons/Gedis/icon.png.import => art/minecraft_atlas.png.import} (73%) delete mode 100644 godot/art/playerGrey_up1.png delete mode 100644 godot/art/playerGrey_up1.png.import delete mode 100644 godot/art/playerGrey_up2.png delete mode 100644 godot/art/playerGrey_up2.png.import delete mode 100644 godot/art/playerGrey_walk1.png delete mode 100644 godot/art/playerGrey_walk1.png.import delete mode 100644 godot/art/playerGrey_walk2.png delete mode 100644 godot/art/playerGrey_walk2.png.import create mode 100644 godot/trymap.tscn create mode 100644 rust/src/Mappy.rs delete mode 100644 rust/src/player.rs diff --git a/godot/Rust.gdextension b/godot/Rust.gdextension index 89ab2a2..c640e38 100644 --- a/godot/Rust.gdextension +++ b/godot/Rust.gdextension @@ -1,7 +1,6 @@ [configuration] entry_symbol = "gdext_rust_init" compatibility_minimum = 4.1 -reloadable = true [libraries] "android.debug" = "res://../rust/target/debug/godottest_rs.so" @@ -66,5 +65,6 @@ reloadable = true "windows.editor.x86_64" = "res://../rust/target/x86_64-pc-windows-msvc/debug/godottest_rs.dll" [icons] -Player = "res://addons/rust/NodeRustFerris.svg" AsyncRuntime = "res://addons/rust/NodeRustFerris.svg" +Player = "res://addons/rust/NodeRustFerris.svg" +Mappy = "res://addons/rust/NodeRustFerris.svg" diff --git a/godot/addons/Asset_Drawer/AssetDrawerShortcut.tres b/godot/addons/Asset_Drawer/AssetDrawerShortcut.tres deleted file mode 100644 index b05aa41..0000000 --- a/godot/addons/Asset_Drawer/AssetDrawerShortcut.tres +++ /dev/null @@ -1,7 +0,0 @@ -[gd_resource type="InputEventKey" format=3 uid="uid://bafyb8y38ahfh"] - -[resource] -device = -1 -ctrl_pressed = true -keycode = 32 -unicode = 32 diff --git a/godot/addons/Asset_Drawer/FileSystem.gd b/godot/addons/Asset_Drawer/FileSystem.gd deleted file mode 100644 index edd080c..0000000 --- a/godot/addons/Asset_Drawer/FileSystem.gd +++ /dev/null @@ -1,110 +0,0 @@ -@tool -extends EditorPlugin - -# Padding from the bottom when popped out -var padding: int = 20 - -# Padding from the bottom when not popped out -var bottompadding: int = 60 - -# The file system -var FileDock: Object - -# Toggle for when the file system is moved to bottom -var filesBottom: bool = false - -var newSize: Vector2 -var initialLoad: bool = false - -var AssetDrawerShortcut: InputEventKey = InputEventKey.new() -var showing: bool = false - -func _enter_tree() -> void: - # Add tool button to move shelf to editor bottom - add_tool_menu_item("Files to Bottom", Callable(self, "FilesToBottom")) - - # Get our file system - FileDock = self.get_editor_interface().get_file_system_dock() - await get_tree().create_timer(0.1).timeout - FilesToBottom() - - # Prevent file tree from being shrunk on load - await get_tree().create_timer(0.1).timeout - var file_split_container := FileDock.get_child(3) as SplitContainer - file_split_container .split_offset = 175 - - # Get shortcut - AssetDrawerShortcut = preload("res://addons/Asset_Drawer/AssetDrawerShortcut.tres") - -#region show hide filesystem -func _input(event: InputEvent) -> void: - if (AssetDrawerShortcut.is_match(event) && - event.is_pressed() && - !event.is_echo()): - if filesBottom == true: - match showing: - false: - make_bottom_panel_item_visible(FileDock) - showing = true - true: - print("hide") - hide_bottom_panel() - showing = false -#endregion - -func _exit_tree() -> void: - remove_tool_menu_item("Files to Bottom") - FilesToBottom() - - -func _process(delta: float) -> void: - - newSize = FileDock.get_window().size - - # Keeps the file system from being unusable in size - if FileDock.get_window().name == "root" && filesBottom == false: - FileDock.get_child(3).get_child(0).size.y = newSize.y - padding - FileDock.get_child(3).get_child(1).size.y = newSize.y - padding - return - - # Adjust the size of the file system based on how far up - # the drawer has been pulled - if FileDock.get_window().name == "root" && filesBottom == true: - newSize = FileDock.get_parent().size - var editor = get_editor_interface() - var editorsettings = editor.get_editor_settings() - var fontsize: int = editorsettings.get_setting("interface/editor/main_font_size") - var editorscale = EditorInterface.get_editor_scale() - - FileDock.get_child(3).get_child(0).size.y = newSize.y - (fontsize * 2) - (bottompadding * EditorInterface.get_editor_scale()) - FileDock.get_child(3).get_child(1).size.y = newSize.y - (fontsize * 2) - (bottompadding * EditorInterface.get_editor_scale()) - return - - # Keeps our systems sized when popped out - if (FileDock.get_window().name != "root" && filesBottom == false): - FileDock.get_window().min_size.y = 50 - FileDock.get_child(3).get_child(0).size.y = newSize.y - padding - FileDock.get_child(3).get_child(1).size.y = newSize.y - padding - - # Centers window on first pop - if initialLoad == false: - initialLoad = true - var screenSize: Vector2 = DisplayServer.screen_get_size() - FileDock.get_window().position = screenSize/2 - - return - -# Moves the files between the bottom panel and the original dock -func FilesToBottom() -> void: - if filesBottom == true: - remove_control_from_bottom_panel(FileDock) - add_control_to_dock(EditorPlugin.DOCK_SLOT_LEFT_BR, FileDock) - filesBottom = false - return - - FileDock = self.get_editor_interface().get_file_system_dock() - remove_control_from_docks(FileDock) - add_control_to_bottom_panel(FileDock, "File System") - filesBottom = true - - diff --git a/godot/addons/Asset_Drawer/FileSystem.gd.uid b/godot/addons/Asset_Drawer/FileSystem.gd.uid deleted file mode 100644 index f0fedbe..0000000 --- a/godot/addons/Asset_Drawer/FileSystem.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b5fge81gtvo4b diff --git a/godot/addons/Asset_Drawer/LICENSE b/godot/addons/Asset_Drawer/LICENSE deleted file mode 100644 index cfbc27e..0000000 --- a/godot/addons/Asset_Drawer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 Michael McGuire - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/godot/addons/Asset_Drawer/plugin.cfg b/godot/addons/Asset_Drawer/plugin.cfg deleted file mode 100644 index 7ed9fe6..0000000 --- a/godot/addons/Asset_Drawer/plugin.cfg +++ /dev/null @@ -1,7 +0,0 @@ -[plugin] - -name="Asset Drawer" -description="Converts the File dock to an Asset Drawer at the bottom of the editor." -author="GlitchedCode" -version="" -script="FileSystem.gd" diff --git a/godot/addons/Gedis/core/gedis_core.gd b/godot/addons/Gedis/core/gedis_core.gd deleted file mode 100644 index 1dbf591..0000000 --- a/godot/addons/Gedis/core/gedis_core.gd +++ /dev/null @@ -1,212 +0,0 @@ -class_name GedisCore - -# Core data buckets -var _store: Dictionary = {} -var _hashes: Dictionary = {} -var _lists: Dictionary = {} -var _sets: Dictionary = {} -var _sorted_sets: Dictionary = {} -var _expiry: Dictionary = {} - -# Pub/Sub registries -var _subscribers: Dictionary[String, Array] = {} -var _psubscribers: Dictionary[String, Array] = {} -var _gedis: Gedis - -func _init(gedis_instance: Gedis) -> void: - _gedis = gedis_instance - -func _now() -> int: - return _gedis._time_source.get_time() - -func _delete_all_types_for_key(key: String) -> void: - _store.erase(key) - _hashes.erase(key) - _lists.erase(key) - _sets.erase(key) - _sorted_sets.erase(key) - _expiry.erase(key) - -func _touch_type(key: String, type_bucket: Dictionary) -> void: - # When a key is used for a new type, remove it from other types. - if not type_bucket.has(key): - _store.erase(key) - _hashes.erase(key) - _lists.erase(key) - _sets.erase(key) - _sorted_sets.erase(key) - -func key_exists(key: String) -> bool: - return _store.has(key) or _hashes.has(key) or _lists.has(key) or _sets.has(key) or _sorted_sets.has(key) - -func _get_all_keys() -> Dictionary[String, bool]: - var all: Dictionary[String, bool] = {} - for k in _store.keys(): - all[str(k)] = true - for k in _hashes.keys(): - all[str(k)] = true - for k in _lists.keys(): - all[str(k)] = true - for k in _sets.keys(): - all[str(k)] = true - for k in _sorted_sets.keys(): - all[str(k)] = true - return all - -func flushall() -> void: - _store.clear() - _hashes.clear() - _lists.clear() - _sets.clear() - _sorted_sets.clear() - _expiry.clear() - _subscribers.clear() - _psubscribers.clear() - - -func dump_all(options: Dictionary = {}) -> Dictionary: - var state := { - "store": _store.duplicate(true), - "hashes": _hashes.duplicate(true), - "lists": _lists.duplicate(true), - "sets": _sets.duplicate(true), - "sorted_sets": _sorted_sets.duplicate(true), - "expiry": _expiry.duplicate(true), - } - - var include: Array = options.get("include", []) - var exclude: Array = options.get("exclude", []) - - if not include.is_empty(): - for bucket_name in state: - var bucket: Dictionary = state[bucket_name] - for key in bucket.keys(): - var keep = false - for prefix in include: - if key.begins_with(prefix): - keep = true - break - if not keep: - bucket.erase(key) - - if not exclude.is_empty(): - for bucket_name in state: - var bucket: Dictionary = state[bucket_name] - for key in bucket.keys(): - for prefix in exclude: - if key.begins_with(prefix): - bucket.erase(key) - break - return state - - -func restore_all(state: Dictionary) -> void: - flushall() - - _store = state.get("store", {}) - _hashes = state.get("hashes", {}) - _lists = state.get("lists", {}) - _sets = state.get("sets", {}) - _sorted_sets = state.get("sorted_sets", {}) - _expiry = state.get("expiry", {}) - - # Discard expired keys - var now: float = _now() - for key in _expiry.keys(): - if _expiry[key] < now: - _delete_all_types_for_key(key) - -func restore_key(key: String, data: Dictionary) -> void: - _delete_all_types_for_key(key) - var value = data["value"] - var type = data["type"] - - if type == "string": - _store[key] = value - elif type == "hash": - _hashes[key] = value - elif type == "list": - _lists[key] = value - elif type == "set": - _sets[key] = value - elif type == "sorted_set": - _sorted_sets[key] = value - - if data.has("expiry"): - _expiry[key] = data["expiry"] - -func rename(key: String, newkey: String) -> int: - if not key_exists(key): - return ERR_DOES_NOT_EXIST - - if key_exists(newkey): - return 0 - - var value - if _store.has(key): - value = _store[key] - _store[newkey] = value - elif _hashes.has(key): - value = _hashes[key] - _hashes[newkey] = value - elif _lists.has(key): - value = _lists[key] - _lists[newkey] = value - elif _sets.has(key): - value = _sets[key] - _sets[newkey] = value - elif _sorted_sets.has(key): - value = _sorted_sets[key] - _sorted_sets[newkey] = value - else: - return ERR_DOES_NOT_EXIST - - if _expiry.has(key): - var expiry_time = _expiry[key] - _expiry[newkey] = expiry_time - - _delete_all_types_for_key(key) - return 1 - -func move(key: String, newkey: String) -> int: - if not key_exists(key): - return ERR_DOES_NOT_EXIST - - if key_exists(newkey): - _delete_all_types_for_key(newkey) - - var value - if _store.has(key): - value = _store[key] - _store[newkey] = value - elif _hashes.has(key): - value = _hashes[key] - _hashes[newkey] = value - elif _lists.has(key): - value = _lists[key] - _lists[newkey] = value - elif _sets.has(key): - value = _sets[key] - _sets[newkey] = value - elif _sorted_sets.has(key): - value = _sorted_sets[key] - _sorted_sets[newkey] = value - else: - return ERR_DOES_NOT_EXIST - - if _expiry.has(key): - var expiry_time = _expiry[key] - _expiry[newkey] = expiry_time - - _delete_all_types_for_key(key) - return 1 - -func ks(key: String) -> String: - return "gedis:keyspace:" + key - -func rks(key: String) -> String: - var prefix = "gedis:keyspace:" - if key.begins_with(prefix): - return key.substr(prefix.length()) - else: - return key diff --git a/godot/addons/Gedis/core/gedis_core.gd.uid b/godot/addons/Gedis/core/gedis_core.gd.uid deleted file mode 100644 index 1692014..0000000 --- a/godot/addons/Gedis/core/gedis_core.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ccfoujiaf8wpi diff --git a/godot/addons/Gedis/core/gedis_debugger.gd b/godot/addons/Gedis/core/gedis_debugger.gd deleted file mode 100644 index 445a300..0000000 --- a/godot/addons/Gedis/core/gedis_debugger.gd +++ /dev/null @@ -1,162 +0,0 @@ -extends RefCounted -class_name GedisDebugger - -var _gedis: Gedis - -func _init(gedis: Gedis): - _gedis = gedis - if _gedis and _gedis._pubsub: - _gedis._pubsub.subscribed.connect(_on_subscribed) - _gedis._pubsub.unsubscribed.connect(_on_unsubscribed) - -func _on_subscribed(channel: String, subscriber: Object): - var debugger = Engine.get_singleton("EngineDebugger") - if debugger and debugger.is_active(): - debugger.send_message("gedis:pubsub_event", ["subscribed", channel, str(subscriber)]) - -func _on_unsubscribed(channel: String, subscriber: Object): - var debugger = Engine.get_singleton("EngineDebugger") - if debugger and debugger.is_active(): - debugger.send_message("gedis:pubsub_event", ["unsubscribed", channel, str(subscriber)]) - -static func _ensure_debugger_is_registered(): - if Engine.is_editor_hint(): - return - - if not Gedis._debugger_registered: - if Engine.has_singleton("EngineDebugger"): - var debugger = Engine.get_singleton("EngineDebugger") - debugger.register_message_capture("gedis", Callable(Gedis, "_on_debugger_message")) - if debugger.is_active(): - debugger.send_message("gedis:ping", []) - Gedis._debugger_registered = true - -static func _on_debugger_message(message: String, data: Array) -> bool: - # EngineDebugger will call this with the suffix (the part after "gedis:") - # so message will be e.g. "request_instances" or "request_instance_data". - if not Engine.has_singleton("EngineDebugger"): - return false - - match message: - "request_instances": - var instances_data = [] - for instance_info in Gedis.get_all_instances(): - instances_data.append({ - "id": instance_info["id"], - "name": instance_info["name"] - }) - var debugger = Engine.get_singleton("EngineDebugger") - if debugger and debugger.is_active(): - debugger.send_message("gedis:instances_data", instances_data) - return true - - "request_instance_data": - if data.size() < 2: - return false - var instance_id = data[0] - var command = data[1] - - # Find the target instance in the static registry. - var target_instance = null - for inst in Gedis._instances: - if is_instance_valid(inst) and inst._instance_id == instance_id: - target_instance = inst - break - - if target_instance == null: - return false - - var debugger = Engine.get_singleton("EngineDebugger") - if not debugger or not debugger.is_active(): - return false - - match command: - "snapshot": - var pattern = data[2] if data.size() > 2 else "*" - var snapshot_data = target_instance.snapshot(pattern) - debugger.send_message("gedis:snapshot_data", [snapshot_data]) - return true - "dump": - if data.size() < 3: - return false - var key = data[2] - var key_value_data = target_instance.dump_key(key) - debugger.send_message("gedis:key_value_data", [key_value_data]) - return true - "set": - if data.size() < 4: - return false - var key = data[2] - var value = data[3] - target_instance.set_value(key, value) - var key_value_data = target_instance.dump_key(key) - debugger.send_message("gedis:key_value_data", [key_value_data]) - return true - "pubsub": - var channels = target_instance._pubsub.list_channels() - var channels_data = {} - for channel in channels: - channels_data[channel] = target_instance._pubsub.list_subscribers(channel) - - var patterns = target_instance._pubsub.list_patterns() - var patterns_data = {} - for pattern in patterns: - patterns_data[pattern] = target_instance._pubsub.list_pattern_subscribers(pattern) - - debugger.send_message("gedis:pubsub_data", [channels_data, patterns_data]) - return true - - return false - -# Debugger-like helpers: type/dump/snapshot -func type(key: String) -> String: - if _gedis._expiry._is_expired(key): - return "none" - if _gedis._core._store.has(key): - return "string" - if _gedis._core._hashes.has(key): - return "hash" - if _gedis._core._lists.has(key): - return "list" - if _gedis._core._sets.has(key): - return "set" - if _gedis._core._sorted_sets.has(key): - return "zset" - return "none" - -func dump(key: String) -> Dictionary: - var t = type(key) - if t == "none": - return {} - var d: Dictionary = {} - d["type"] = t - d["ttl"] = _gedis.ttl(key) - match t: - "string": - d["value"] = _gedis._core._store.get(key, null) - "hash": - d["value"] = _gedis._core._hashes.get(key, {}).duplicate(true) - "list": - d["value"] = _gedis._core._lists.get(key, []).duplicate() - "set": - d["value"] = _gedis._core._sets.get(key, {}).keys() - "zset": - var data = _gedis._core._sorted_sets.get(key, {}) - var value = [] - if data.has("sorted_set"): - # The internal representation is [score, member] but for visualization - # it's more intuitive to show [member, score]. - for entry in data.sorted_set: - value.append([entry[1], entry[0]]) - d["value"] = value - _: - d["value"] = null - return d - -func snapshot(pattern: String = "*") -> Dictionary: - var out: Dictionary = {} - for k in _gedis._strings.keys(pattern): - var key_data = dump(str(k)) - key_data["ttl"] = _gedis._expiry.ttl(str(k)) - out[str(k)] = key_data - return out diff --git a/godot/addons/Gedis/core/gedis_debugger.gd.uid b/godot/addons/Gedis/core/gedis_debugger.gd.uid deleted file mode 100644 index 0237a05..0000000 --- a/godot/addons/Gedis/core/gedis_debugger.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bx77jybsq60mc diff --git a/godot/addons/Gedis/core/gedis_expiry.gd b/godot/addons/Gedis/core/gedis_expiry.gd deleted file mode 100644 index 1aff0a6..0000000 --- a/godot/addons/Gedis/core/gedis_expiry.gd +++ /dev/null @@ -1,98 +0,0 @@ -extends RefCounted -class_name GedisExpiry - -var _gedis: Gedis - -# Provides an ordered view of expirations for efficient purging. -# The list is sorted by timestamp and stores [timestamp, key] pairs. -var _expiry_list: Array - -func _init(p_gedis: Gedis): - _gedis = p_gedis - _expiry_list = [] - -func _now() -> int: - return _gedis._time_source.get_time() - -func _is_expired(key: String) -> bool: - if _gedis._core._expiry.has(key) and _gedis._core._expiry[key] <= _now(): - var timestamp = _gedis._core._expiry[key] - _gedis._core._delete_all_types_for_key(key) - var entry = [timestamp, key] - var index = _expiry_list.bsearch(entry) - if index < _expiry_list.size() and _expiry_list[index] == entry: - _expiry_list.remove_at(index) - return true - return false - -func _purge_expired() -> void: - var now := _now() - var expired_count := 0 - var ex := _gedis._core._expiry - for item in _expiry_list: - var timestamp: int = item[0] - var key: String = item[1] - - if timestamp <= now: - if ex.has(key) and ex[key] == timestamp: - _gedis._core._delete_all_types_for_key(key) - _gedis.publish("gedis:keyspace:" + key, "expire") - expired_count += 1 - else: - break - - if expired_count > 0: - _expiry_list = _expiry_list.slice(expired_count) - -# ---------------- -# Expiry commands -# ---------------- -func expire(key: String, seconds: int) -> bool: - if not _gedis.exists(key): - return false - - # If the key already has an expiry, remove the old entry from the sorted list. - if _gedis._core._expiry.has(key): - var old_timestamp = _gedis._core._expiry[key] - var old_entry = [old_timestamp, key] - var index = _expiry_list.bsearch(old_entry) - if index < _expiry_list.size() and _expiry_list[index] == old_entry: - _expiry_list.remove_at(index) - - var new_timestamp = _now() + (float(seconds) * 1000.0) - _gedis._core._expiry[key] = new_timestamp - - # Add the new expiry to the sorted list. - var new_entry = [new_timestamp, key] - var insertion_index = _expiry_list.bsearch(new_entry) - _expiry_list.insert(insertion_index, new_entry) - - return true - -# TTL returns: -# -2 if the key does not exist -# -1 if the key exists but has no associated expire -# >= 0 number of seconds to expire -func ttl(key: String) -> int: - if not _gedis.exists(key): - return -2 - if not _gedis._core._expiry.has(key): - return -1 - return max(0, int(ceil((_gedis._core._expiry[key] - _now()) / 1000.0))) - -func persist(key: String) -> bool: - if not _gedis.exists(key): - return false - if _gedis._core._expiry.has(key): - var timestamp = _gedis._core._expiry[key] - _gedis._core._expiry.erase(key) - var entry = [timestamp, key] - var index = _expiry_list.bsearch(entry) - if index < _expiry_list.size() and _expiry_list[index] == entry: - _expiry_list.remove_at(index) - return true - return false - -func setex(key: String, seconds: int, value: Variant) -> void: - _gedis.set_value(key, value) - expire(key, seconds) \ No newline at end of file diff --git a/godot/addons/Gedis/core/gedis_expiry.gd.uid b/godot/addons/Gedis/core/gedis_expiry.gd.uid deleted file mode 100644 index 1d13ef5..0000000 --- a/godot/addons/Gedis/core/gedis_expiry.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bscau2tkd4lcx diff --git a/godot/addons/Gedis/core/gedis_hashes.gd b/godot/addons/Gedis/core/gedis_hashes.gd deleted file mode 100644 index 9b09022..0000000 --- a/godot/addons/Gedis/core/gedis_hashes.gd +++ /dev/null @@ -1,132 +0,0 @@ -extends RefCounted -class_name GedisHashes - -var _gedis - -func _init(gedis): - _gedis = gedis - -# ------ -# Hashes -# ------ -func hset(key: String, field: String, value) -> int: - _gedis._core._touch_type(key, _gedis._core._hashes) - var d: Dictionary = _gedis._core._hashes.get(key, {}) - var existed := int(d.has(field)) - d[field] = value - _gedis._core._hashes[key] = d - _gedis.publish("gedis:keyspace:" + key, "set") - return 1 - existed - -func hget(key: String, field: String, default_value: Variant = null): - if _gedis._expiry._is_expired(key): - return default_value - var d: Dictionary = _gedis._core._hashes.get(key, {}) - return d.get(field, default_value) - -# Gets the values of multiple fields in a hash. -# --- -# @param key: The key of the hash. -# @param fields: An array of fields to get the values of. -# @return: An array of values for the given fields. If a field does not exist, the corresponding value in the array will be null. -func hmget(key: String, fields: Array) -> Array: - if _gedis._expiry._is_expired(key): - return fields.map(func(_field): return null) - var d: Dictionary = _gedis._core._hashes.get(key, {}) - var result: Array = [] - for field in fields: - result.append(d.get(field, null)) - return result - -# Sets multiple fields and their values in a hash. -# --- -# @param key: The key of the hash. -# @param field_value_pairs: A dictionary of field-value pairs to set. -func hmset(key: String, field_value_pairs: Dictionary) -> void: - _gedis._core._touch_type(key, _gedis._core._hashes) - var d: Dictionary = _gedis._core._hashes.get(key, {}) - for field in field_value_pairs: - d[field] = field_value_pairs[field] - _gedis._core._hashes[key] = d - _gedis.publish("gedis:keyspace:" + key, "set") - -func hincrby(key: String, field: String, amount: int) -> Variant: - _gedis._core._touch_type(key, _gedis._core._hashes) - var d: Dictionary = _gedis._core._hashes.get(key, {}) - var value = d.get(field, 0) - if not typeof(value) in [TYPE_INT, TYPE_FLOAT]: - push_error("WRONGTYPE Operation against a key holding the wrong kind of value") - return null - value += amount - d[field] = value - _gedis._core._hashes[key] = d - _gedis.publish("gedis:keyspace:" + key, "set") - return value - -func hincrbyfloat(key: String, field: String, amount: float) -> Variant: - _gedis._core._touch_type(key, _gedis._core._hashes) - var d: Dictionary = _gedis._core._hashes.get(key, {}) - var value = d.get(field, 0.0) - if not typeof(value) in [TYPE_INT, TYPE_FLOAT]: - push_error("WRONGTYPE Operation against a key holding the wrong kind of value") - return null - value += amount - d[field] = value - _gedis._core._hashes[key] = d - _gedis.publish("gedis:keyspace:" + key, "set") - return value - -func hdel(key: String, fields) -> int: - # Accept single field (String) or Array of fields - if _gedis._expiry._is_expired(key): - return 0 - if not _gedis._core._hashes.has(key): - return 0 - var d: Dictionary = _gedis._core._hashes[key] - var removed = 0 - if typeof(fields) == TYPE_ARRAY: - for f in fields: - if d.has(str(f)): - d.erase(str(f)) - removed += 1 - else: - var f = str(fields) - if d.has(f): - d.erase(f) - removed = 1 - if d.is_empty(): - _gedis._core._hashes.erase(key) - _gedis.publish("gedis:keyspace:" + key, "del") - else: - _gedis._core._hashes[key] = d - return removed - -func hgetall(key: String) -> Dictionary: - if _gedis._expiry._is_expired(key): - return {} - return _gedis._core._hashes.get(key, {}).duplicate(true) - -func hexists(key: String, field = null) -> bool: - if _gedis._expiry._is_expired(key): - return false - - if field == null: - return _gedis._core._hashes.has(key) - - var d: Dictionary = _gedis._core._hashes.get(key, {}) - return d.has(field) - -func hkeys(key: String) -> Array: - if _gedis._expiry._is_expired(key): - return [] - return _gedis._core._hashes.get(key, {}).keys() - -func hvals(key: String) -> Array: - if _gedis._expiry._is_expired(key): - return [] - return _gedis._core._hashes.get(key, {}).values() - -func hlen(key: String) -> int: - if _gedis._expiry._is_expired(key): - return 0 - return _gedis._core._hashes.get(key, {}).size() \ No newline at end of file diff --git a/godot/addons/Gedis/core/gedis_hashes.gd.uid b/godot/addons/Gedis/core/gedis_hashes.gd.uid deleted file mode 100644 index fcf2caa..0000000 --- a/godot/addons/Gedis/core/gedis_hashes.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dcvde42llr5d4 diff --git a/godot/addons/Gedis/core/gedis_lists.gd b/godot/addons/Gedis/core/gedis_lists.gd deleted file mode 100644 index e336b47..0000000 --- a/godot/addons/Gedis/core/gedis_lists.gd +++ /dev/null @@ -1,293 +0,0 @@ -extends RefCounted -class_name GedisLists - -var _gedis - -func _init(gedis): - _gedis = gedis - -# ----- -# Lists -# ----- -func lpush(key: String, value) -> int: - _gedis._core._touch_type(key, _gedis._core._lists) - var a: Array = _gedis._core._lists.get(key, []) - if typeof(value) == TYPE_ARRAY: - a = value + a - else: - a.insert(0, value) - _gedis._core._lists[key] = a - _gedis.publish("gedis:keyspace:" + key, "set") - return a.size() - -func rpush(key: String, value) -> int: - _gedis._core._touch_type(key, _gedis._core._lists) - var a: Array = _gedis._core._lists.get(key, []) - if typeof(value) == TYPE_ARRAY: - a += value - else: - a.append(value) - _gedis._core._lists[key] = a - _gedis.publish("gedis:keyspace:" + key, "set") - return a.size() - -func lpop(key: String): - if _gedis._expiry._is_expired(key): - return null - if not _gedis._core._lists.has(key): - return null - var a: Array = _gedis._core._lists[key].duplicate() - if a.is_empty(): - return null - var v = a.pop_front() - if a.is_empty(): - _gedis._core._lists.erase(key) - _gedis.publish("gedis:keyspace:" + key, "del") - else: - _gedis._core._lists[key] = a - _gedis.publish("gedis:keyspace:" + key, "set") - return v - -func rpop(key: String): - if _gedis._expiry._is_expired(key): - return null - if not _gedis._core._lists.has(key): - return null - var a: Array = _gedis._core._lists[key].duplicate() - if a.is_empty(): - return null - var v = a.pop_back() - if a.is_empty(): - _gedis._core._lists.erase(key) - _gedis.publish("gedis:keyspace:" + key, "del") - else: - _gedis._core._lists[key] = a - _gedis.publish("gedis:keyspace:" + key, "set") - return v - -func llen(key: String) -> int: - if _gedis._expiry._is_expired(key): - return 0 - var a: Array = _gedis._core._lists.get(key, []) - return a.size() - -func lexists(key: String) -> bool: - if _gedis._expiry._is_expired(key): - return false - return _gedis._core._lists.has(key) - -func lget(key: String) -> Array: - if _gedis._expiry._is_expired(key): - return [] - return _gedis._core._lists.get(key, []).duplicate() - -func lrange(key: String, start: int, stop: int) -> Array: - if _gedis._expiry._is_expired(key): - return [] - var a: Array = _gedis._core._lists.get(key, []) - var n = a.size() - # normalize negative indices - if start < 0: - start = n + start - if stop < 0: - stop = n + stop - # clamp - start = max(0, start) - stop = min(n - 1, stop) - if start > stop or n == 0: - return [] - var out: Array = [] - for i in range(start, stop + 1): - out.append(a[i]) - return out - -func lindex(key: String, index: int): - if _gedis._expiry._is_expired(key): - return null - var a: Array = _gedis._core._lists.get(key, []) - var n = a.size() - if n == 0: - return null - if index < 0: - index = n + index - if index < 0 or index >= n: - return null - return a[index] - -func lset(key: String, index: int, value) -> bool: - if _gedis._expiry._is_expired(key): - return false - if not _gedis._core._lists.has(key): - return false - var a: Array = _gedis._core._lists[key].duplicate() - var n = a.size() - if index < 0: - index = n + index - if index < 0 or index >= n: - return false - a[index] = value - _gedis._core._lists[key] = a - _gedis.publish("gedis:keyspace:" + key, "set") - return true - -func lrem(key: String, count: int, value) -> int: - # Remove elements equal to value. Behavior similar to Redis. - if _gedis._expiry._is_expired(key): - return 0 - if not _gedis._core._lists.has(key): - return 0 - var a: Array = _gedis._core._lists[key].duplicate() - var removed = 0 - if count == 0: - # remove all - var filtered: Array = [] - for v in a: - if v == value: - removed += 1 - else: - filtered.append(v) - a = filtered - elif count > 0: - var out: Array = [] - for v in a: - if v == value and removed < count: - removed += 1 - continue - out.append(v) - a = out - else: - # count < 0, remove from tail - var rev = a.duplicate() - rev.reverse() - var out2: Array = [] - for v in rev: - if v == value and removed < abs(count): - removed += 1 - continue - out2.append(v) - out2.reverse() - a = out2 - if a.is_empty(): - _gedis._core._lists.erase(key) - _gedis.publish("gedis:keyspace:" + key, "del") - else: - _gedis._core._lists[key] = a - _gedis.publish("gedis:keyspace:" + key, "set") - return removed - -func lmove(source: String, destination: String, from: String, to: String): - if _gedis._expiry._is_expired(source): - return null - if not _gedis._core._lists.has(source): - return null - - var source_list: Array = _gedis._core._lists[source] - if source_list.is_empty(): - return null - - var element - if from.to_upper() == "LEFT": - element = source_list.pop_front() - elif from.to_upper() == "RIGHT": - element = source_list.pop_back() - else: - return null - - _gedis._core._touch_type(destination, _gedis._core._lists) - var dest_list: Array = _gedis._core._lists.get(destination, []) - - if to.to_upper() == "LEFT": - dest_list.insert(0, element) - elif to.to_upper() == "RIGHT": - dest_list.append(element) - else: - # Invalid 'to', restore source list and return error - if from.to_upper() == "LEFT": - source_list.insert(0, element) - else: - source_list.append(element) - return null - - if source_list.is_empty(): - _gedis._core._lists.erase(source) - _gedis.publish("gedis:keyspace:" + source, "del") - else: - _gedis._core._lists[source] = source_list - _gedis.publish("gedis:keyspace:" + source, "set") - _gedis._core._lists[destination] = dest_list - _gedis.publish("gedis:keyspace:" + destination, "set") - - return element -# Trims a list to the specified range of indices. -# Removes all elements from the list that are not in the range [start, stop]. -# If start is greater than stop, or start is out of bounds, the list will be emptied. -# --- -# @param key: The key of the list to trim. -# @param start: The starting index of the range. -# @param stop: The ending index of the range. -# @return: Returns true if the list was trimmed, false otherwise. -func ltrim(key: String, start: int, stop: int) -> bool: - if _gedis._expiry._is_expired(key): - return false - if not _gedis._core._lists.has(key): - return false - - var a: Array = _gedis._core._lists[key].duplicate() - var n = a.size() - - if start < 0: - start = n + start - if stop < 0: - stop = n + stop - - start = max(0, start) - stop = min(n - 1, stop) - - if start > stop: - _gedis._core._lists.erase(key) - _gedis.publish("gedis:keyspace:" + key, "del") - return true - - var trimmed_list: Array = [] - for i in range(start, stop + 1): - trimmed_list.append(a[i]) - - _gedis._core._lists[key] = trimmed_list - _gedis.publish("gedis:keyspace:" + key, "set") - return true - -# Inserts a value into a list before or after a pivot value. -# --- -# @param key: The key of the list. -# @param position: "BEFORE" or "AFTER" the pivot. -# @param pivot: The value to insert the new value next to. -# @param value: The value to insert. -# @return: The new size of the list, or -1 if the pivot was not found. Returns 0 if the key does not exist or the position is invalid. -func linsert(key: String, position: String, pivot: Variant, value: Variant) -> int: - if _gedis._expiry._is_expired(key): - return 0 - if not _gedis._core._lists.has(key): - return 0 - - var a: Array = _gedis._core._lists[key].duplicate() - var n = a.size() - var index = -1 - - for i in range(n): - if a[i] == pivot: - index = i - break - - if index == -1: - return -1 - - if position.to_upper() == "BEFORE": - a.insert(index, value) - elif position.to_upper() == "AFTER": - a.insert(index + 1, value) - else: - return 0 - - _gedis._core._lists[key] = a - _gedis.publish("gedis:keyspace:" + key, "set") - return a.size() \ No newline at end of file diff --git a/godot/addons/Gedis/core/gedis_lists.gd.uid b/godot/addons/Gedis/core/gedis_lists.gd.uid deleted file mode 100644 index b30e08a..0000000 --- a/godot/addons/Gedis/core/gedis_lists.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://budmyot3vslr3 diff --git a/godot/addons/Gedis/core/gedis_pubsub.gd b/godot/addons/Gedis/core/gedis_pubsub.gd deleted file mode 100644 index ff43b61..0000000 --- a/godot/addons/Gedis/core/gedis_pubsub.gd +++ /dev/null @@ -1,106 +0,0 @@ -extends RefCounted -class_name GedisPubSub - -var _gedis: Gedis - -signal pubsub_message(channel, message) -signal psub_message(pattern, channel, message) - -signal subscribed(channel, subscriber) -signal unsubscribed(channel, subscriber) - -func _init(gedis: Gedis): - _gedis = gedis - -# -------- -# Pub/Sub -# -------- -func publish(channel: String, message) -> void: - # Backwards-compatible delivery: - # 1) If subscriber objects registered via subscribe/psubscribe expect direct signals, - # call their 'pubsub_message'/'psub_message' on the subscriber object. - # 2) Emit a single Gedis-level signal so external code can connect to this Gedis instance. - # This avoids emitting the same Gedis signal multiple times (which would cause duplicate callbacks). - # Direct subscribers (back-compat) - if _gedis._core._subscribers.has(channel): - for subscriber in _gedis._core._subscribers[channel]: - if is_instance_valid(subscriber): - # deliver directly to subscriber object if it exposes the signal - if subscriber.has_signal("pubsub_message"): - subscriber.pubsub_message.emit(channel, message) - # Emit a single Gedis-level pubsub notification for all listeners connected to this Gedis instance. - if _gedis._core._subscribers.has(channel) and _gedis._core._subscribers[channel].size() > 0: - pubsub_message.emit(channel, message) - # Pattern subscribers (back-compat + Gedis-level) - for pattern in _gedis._core._psubscribers.keys(): - # Use simple glob matching: convert to RegEx - var rx = _gedis._utils._glob_to_regex(pattern) - if rx.search(channel) != null: - for subscriber in _gedis._core._psubscribers[pattern]: - if is_instance_valid(subscriber): - if subscriber.has_signal("psub_message"): - subscriber.psub_message.emit(pattern, channel, message) - # Emit one Gedis-level pattern message for this matching pattern - psub_message.emit(pattern, channel, message) - -func subscribe(channel: String, subscriber: Object) -> void: - var arr: Array = _gedis._core._subscribers.get(channel, []) - # avoid duplicates - for s in arr: - if s == subscriber: - return - arr.append(subscriber) - _gedis._core._subscribers[channel] = arr - subscribed.emit(channel, subscriber) - -func unsubscribe(channel: String, subscriber: Object) -> void: - if not _gedis._core._subscribers.has(channel): - return - var arr: Array = _gedis._core._subscribers[channel] - for i in range(arr.size()): - if arr[i] == subscriber: - arr.remove_at(i) - unsubscribed.emit(channel, subscriber) - break - if arr.is_empty(): - _gedis._core._subscribers.erase(channel) - else: - _gedis._core._subscribers[channel] = arr - -func psubscribe(pattern: String, subscriber: Object) -> void: - var arr: Array = _gedis._core._psubscribers.get(pattern, []) - for s in arr: - if s == subscriber: - return - arr.append(subscriber) - _gedis._core._psubscribers[pattern] = arr - subscribed.emit(pattern, subscriber) - -func punsubscribe(pattern: String, subscriber: Object) -> void: - if not _gedis._core._psubscribers.has(pattern): - return - var arr: Array = _gedis._core._psubscribers[pattern] - for i in range(arr.size()): - if arr[i] == subscriber: - arr.remove_at(i) - unsubscribed.emit(pattern, subscriber) - break - if arr.is_empty(): - _gedis._core._psubscribers.erase(pattern) - else: - _gedis._core._psubscribers[pattern] = arr - -# ----------- -# Introspection -# ----------- -func list_channels() -> Array: - return _gedis._core._subscribers.keys() - -func list_subscribers(channel: String) -> Array: - return _gedis._core._subscribers.get(channel, []) - -func list_patterns() -> Array: - return _gedis._core._psubscribers.keys() - -func list_pattern_subscribers(pattern: String) -> Array: - return _gedis._core._psubscribers.get(pattern, []) diff --git a/godot/addons/Gedis/core/gedis_pubsub.gd.uid b/godot/addons/Gedis/core/gedis_pubsub.gd.uid deleted file mode 100644 index c65f198..0000000 --- a/godot/addons/Gedis/core/gedis_pubsub.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://jwecqfjo870q diff --git a/godot/addons/Gedis/core/gedis_sets.gd b/godot/addons/Gedis/core/gedis_sets.gd deleted file mode 100644 index 060ce6e..0000000 --- a/godot/addons/Gedis/core/gedis_sets.gd +++ /dev/null @@ -1,216 +0,0 @@ -extends RefCounted -class_name GedisSets - -var _gedis: Gedis - -func _init(gedis: Gedis): - _gedis = gedis - -# ---- -# Sets -# ---- -func sadd(key: String, member) -> int: - _gedis._core._touch_type(key, _gedis._core._sets) - var s: Dictionary = _gedis._core._sets.get(key, {}) - var existed := int(s.has(member)) - s[member] = true - _gedis._core._sets[key] = s - _gedis.publish("gedis:keyspace:" + key, "set") - return 1 - existed - -func srem(key: String, member) -> int: - if _gedis._expiry._is_expired(key): - return 0 - if not _gedis._core._sets.has(key): - return 0 - var s: Dictionary = _gedis._core._sets[key] - var existed := int(s.has(member)) - s.erase(member) - if s.is_empty(): - _gedis._core._sets.erase(key) - _gedis.publish("gedis:keyspace:" + key, "del") - else: - _gedis._core._sets[key] = s - return existed - -func smembers(key: String) -> Array: - if _gedis._expiry._is_expired(key): - return [] - var s: Dictionary = _gedis._core._sets.get(key, {}) - return s.keys() - -func sismember(key: String, member) -> bool: - if _gedis._expiry._is_expired(key): - return false - var s: Dictionary = _gedis._core._sets.get(key, {}) - return s.has(member) - -func scard(key: String) -> int: - if _gedis._expiry._is_expired(key): - return 0 - return _gedis._core._sets.get(key, {}).size() - -func sexists(key: String) -> bool: - if _gedis._expiry._is_expired(key): - return false - return _gedis._core._sets.has(key) - -func spop(key: String): - if _gedis._expiry._is_expired(key): - return null - if not _gedis._core._sets.has(key): - return null - var s: Dictionary = _gedis._core._sets[key] - var keys_arr: Array = s.keys() - if keys_arr.is_empty(): - return null - var idx = randi() % keys_arr.size() - var member = keys_arr[idx] - s.erase(member) - if s.is_empty(): - _gedis._core._sets.erase(key) - _gedis.publish("gedis:keyspace:" + key, "del") - else: - _gedis._core._sets[key] = s - return member - -func smove(source: String, destination: String, member) -> bool: - if _gedis._expiry._is_expired(source): - return false - if not sismember(source, member): - return false - # remove from source - srem(source, member) - # add to destination (creates destination set) - sadd(destination, member) - return true - -# Computes the union of multiple sets. -# --- -# @param keys: An array of set keys. -# @return: An array containing the members of the resulting union set. -func sunion(keys: Array) -> Array: - var result_set := {} - for key in keys: - var members = smembers(key) - for member in members: - result_set[member] = true - return result_set.keys() - -# Computes the intersection of multiple sets. -# --- -# @param keys: An array of set keys. -# @return: An array containing the members of the resulting intersection set. -func sinter(keys: Array) -> Array: - if keys.is_empty(): - return [] - - var result_set := {} - var first_set_members = smembers(keys[0]) - for member in first_set_members: - result_set[member] = true - - for i in range(1, keys.size()): - var next_set_members = smembers(keys[i]) - var current_members = result_set.keys() - for member in current_members: - if not next_set_members.has(member): - result_set.erase(member) - - return result_set.keys() - -# Computes the difference between multiple sets. -# The difference is calculated as the members of the first set minus the members of all subsequent sets. -# --- -# @param keys: An array of set keys. The first key is the set to subtract from. -# @return: An array containing the members of the resulting difference set. -func sdiff(keys: Array) -> Array: - if keys.is_empty(): - return [] - - var result_set := {} - var first_set_members = smembers(keys[0]) - for member in first_set_members: - result_set[member] = true - - for i in range(1, keys.size()): - var next_set_members = smembers(keys[i]) - for member in next_set_members: - if result_set.has(member): - result_set.erase(member) - - return result_set.keys() - -# Computes the union of multiple sets and stores the result in a new set. -# --- -# @param destination: The key to store the resulting union set in. -# @param keys: An array of set keys. -# @return: The number of members in the resulting union set. -func sunionstore(destination: String, keys: Array) -> int: - var result_members = sunion(keys) - _gedis._core._sets.erase(destination) - for member in result_members: - sadd(destination, member) - return result_members.size() - -# Computes the intersection of multiple sets and stores the result in a new set. -# --- -# @param destination: The key to store the resulting intersection set in. -# @param keys: An array of set keys. -# @return: The number of members in the resulting intersection set. -func sinterstore(destination: String, keys: Array) -> int: - var result_members = sinter(keys) - _gedis._core._sets.erase(destination) - for member in result_members: - sadd(destination, member) - return result_members.size() - -# Computes the difference between multiple sets and stores the result in a new set. -# --- -# @param destination: The key to store the resulting difference set in. -# @param keys: An array of set keys. The first key is the set to subtract from. -# @return: The number of members in the resulting difference set. -func sdiffstore(destination: String, keys: Array) -> int: - var result_members = sdiff(keys) - _gedis._core._sets.erase(destination) - for member in result_members: - sadd(destination, member) - return result_members.size() - -# Gets one or more random members from a set. -# --- -# @param key: The key of the set. -# @param count: The number of random members to return. If positive, returns unique members. If negative, allows for repetitions. -# @return: A single random member if count is 1, or an array of random members. Returns null or an empty array if the set is empty. -func srandmember(key: String, count: int = 1): - if _gedis._expiry._is_expired(key): - return null if count == 1 else [] - - var s: Dictionary = _gedis._core._sets.get(key, {}) - var members = s.keys() - if members.is_empty(): - return null if count == 1 else [] - - if count == 1: - return members.pick_random() - - var result = [] - if count > 0: - # Positive count: return unique elements - if count >= members.size(): - members.shuffle() - return members - - var used_indices = {} - while result.size() < count: - var idx = randi() % members.size() - if not used_indices.has(idx): - result.append(members[idx]) - used_indices[idx] = true - else: # count < 0 - # Negative count: repetitions are allowed - var abs_count = abs(count) - for _i in range(abs_count): - result.append(members.pick_random()) - - return result \ No newline at end of file diff --git a/godot/addons/Gedis/core/gedis_sets.gd.uid b/godot/addons/Gedis/core/gedis_sets.gd.uid deleted file mode 100644 index 75e8ba3..0000000 --- a/godot/addons/Gedis/core/gedis_sets.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c2v7tr3s0wiv7 diff --git a/godot/addons/Gedis/core/gedis_sorted_sets.gd b/godot/addons/Gedis/core/gedis_sorted_sets.gd deleted file mode 100644 index 00addc1..0000000 --- a/godot/addons/Gedis/core/gedis_sorted_sets.gd +++ /dev/null @@ -1,415 +0,0 @@ -# This class provides a sorted set data structure, where each member is associated with a score. -# Members are stored in an array, sorted by score, allowing for efficient range queries. A dictionary -# is used for quick lookups of member scores. -# -# Features: -# - Add/update members with scores. -# - Remove members. -# - Retrieve members within a score range. -# - Pop members that are "ready" based on a timestamp score. -# -# The implementation aims to be simple and efficient for common use cases in game development, -# such as managing timed events, priority queues, or leaderboards. - -extends RefCounted -class_name GedisSortedSets - -var _gedis: Gedis - -func _init(gedis: Gedis): - _gedis = gedis - -# Adds a new member to the sorted set with the specified score. -# If the member already exists, its score is updated, and its position in the set is adjusted. -# -# @param member: The member to add or update. -# @param score: The score associated with the member. -func add(key: String, member: String, score: int) -> int: - _gedis._core._touch_type(key, _gedis._core._sorted_sets) - var data: Dictionary = _gedis._core._sorted_sets.get(key, { - "sorted_set": [], - "member_scores": {} - }) - - var new_member = not data.member_scores.has(member) - if not new_member: - remove(key, member) - data = _gedis._core._sorted_sets.get(key, { - "sorted_set": [], - "member_scores": {} - }) - - data.member_scores[member] = score - var entry = [score, member] - var inserted: bool = false - for i in range(data.sorted_set.size()): - if score < data.sorted_set[i][0]: - data.sorted_set.insert(i, entry) - inserted = true - break - if not inserted: - data.sorted_set.append(entry) - - _gedis._core._sorted_sets[key] = data - if new_member: - _gedis.publish("gedis:keyspace:" + key, "set") - return 1 if new_member else 0 - - -# Removes a member from the sorted set. -# -# @param member: The member to remove. -func remove(key: String, member: String) -> int: - if _gedis._expiry._is_expired(key): - return 0 - if not _gedis._core._sorted_sets.has(key): - return 0 - - var data: Dictionary = _gedis._core._sorted_sets[key] - if not data.member_scores.has(member): - return 0 - - var score = data.member_scores[member] - data.member_scores.erase(member) - - for i in range(data.sorted_set.size()): - if data.sorted_set[i][0] == score and data.sorted_set[i][1] == member: - data.sorted_set.remove_at(i) - if data.sorted_set.is_empty(): - _gedis._core._sorted_sets.erase(key) - _gedis.publish("gedis:keyspace:" + key, "del") - else: - _gedis._core._sorted_sets[key] = data - return 1 - return 0 - -func zexists(key: String) -> bool: - if _gedis._expiry._is_expired(key): - return false - return _gedis._core._sorted_sets.has(key) - -func zcard(key: String) -> int: - if _gedis._expiry._is_expired(key): - return 0 - if not _gedis._core._sorted_sets.has(key): - return 0 - return _gedis._core._sorted_sets[key].sorted_set.size() - -# Returns a range of members from the sorted set, ordered by score. -# -# @param start: The starting index of the range. -# @param stop: The ending index of the range. -# @param withscores: Whether to return scores along with members. -# @return: An array of members, or an array of [member, score] pairs if withscores is true. -func zrange(key: String, start, stop, withscores: bool = false) -> Array: - return _zrange(key, start, stop, withscores, false) - -# Returns a range of members from the sorted set, ordered by score in reverse. -# -# @param start: The starting index of the range. -# @param stop: The ending index of the range. -# @param withscores: Whether to return scores along with members. -# @return: An array of members, or an array of [member, score] pairs if withscores is true. -func zrevrange(key: String, start, stop, withscores: bool = false) -> Array: - return _zrange(key, start, stop, withscores, true) - -func _zrange(key: String, start, stop, withscores: bool, reverse: bool) -> Array: - if _gedis._expiry._is_expired(key): - return [] - if not _gedis._core._sorted_sets.has(key): - return [] - - var data: Dictionary = _gedis._core._sorted_sets[key] - var sorted_set: Array = data.sorted_set - if reverse: - sorted_set = sorted_set.duplicate() - sorted_set.reverse() - - var set_len: int = sorted_set.size() - - var start_index = start - if start_index < 0: - start_index = set_len + start_index - - var stop_index = stop - if stop_index < 0: - stop_index = set_len + stop_index - - if start_index < 0: - start_index = 0 - - if stop_index >= set_len: - stop_index = set_len - 1 - - if start_index > stop_index or start_index >= set_len: - return [] - - var result: Array = [] - for i in range(start_index, stop_index + 1): - var entry = sorted_set[i] - var score = entry[0] - var member = entry[1] - if withscores: - result.append([member, score]) - else: - result.append(member) - return result - -# Returns a range of members from the sorted set, ordered by score. -# -# @param min_score: The minimum score of the range. -# @param max_score: The maximum score of the range. -# @param withscores: Whether to return scores along with members. -# @return: An array of members, or an array of [member, score] pairs if withscores is true. -# Returns a range of members from the sorted set, ordered by score. -func zrangebyscore(key: String, min_score, max_score, withscores: bool = false) -> Array: - if _gedis._expiry._is_expired(key): - return [] - if not _gedis._core._sorted_sets.has(key): - return [] - - var data: Dictionary = _gedis._core._sorted_sets[key] - var result: Array = [] - for entry in data.sorted_set: - var score = entry[0] - var member = entry[1] - if score >= min_score and score <= max_score: - if withscores: - result.append([member, score]) - else: - result.append(member) - return result - -# Returns a range of members from the sorted set, ordered by score in reverse. -# -# @param min_score: The minimum score of the range. -# @param max_score: The maximum score of the range. -# @param withscores: Whether to return scores along with members. -# @return: An array of members, or an array of [member, score] pairs if withscores is true. -# Returns a range of members from the sorted set, ordered by score in reverse. -func zrevrangebyscore(key: String, min_score, max_score, withscores: bool = false) -> Array: - var result = zrangebyscore(key, min_score, max_score, withscores) - result.reverse() - return result - -# Removes and returns members with scores up to the given 'now' value. -# This is useful for processing items that are due, like in a task scheduler. -# -# @param now: The current time or score to check against. -# @return: An array of members that were popped. -func pop_ready(key: String, now: int) -> Array: - if _gedis._expiry._is_expired(key): - return [] - if not _gedis._core._sorted_sets.has(key): - return [] - - var data: Dictionary = _gedis._core._sorted_sets[key] - var ready_members: Array = [] - var i: int = 0 - while i < data.sorted_set.size(): - var entry = data.sorted_set[i] - if entry[0] <= now: - ready_members.append(entry[1]) - data.member_scores.erase(entry[1]) - data.sorted_set.remove_at(i) - else: - break - - if data.sorted_set.is_empty(): - _gedis._core._sorted_sets.erase(key) - _gedis.publish("gedis:keyspace:" + key, "del") - else: - _gedis._core._sorted_sets[key] = data - return ready_members - - -# Returns the score of a member in the sorted set. -# --- -# @param key: The key of the sorted set. -# @param member: The member to get the score of. -# @return: The score of the member, or null if the member does not exist. -func zscore(key: String, member: String) -> Variant: - if _gedis._expiry._is_expired(key): - return null - if not _gedis._core._sorted_sets.has(key): - return null - - var data: Dictionary = _gedis._core._sorted_sets[key] - if not data.member_scores.has(member): - return null - - return data.member_scores[member] - - -# Returns the rank of a member in the sorted set, with scores ordered from low to high. -# The rank is 0-based. -# --- -# @param key: The key of the sorted set. -# @param member: The member to get the rank of. -# @return: The rank of the member, or null if the member does not exist. -func zrank(key: String, member: String) -> Variant: - if _gedis._expiry._is_expired(key): - return null - if not _gedis._core._sorted_sets.has(key): - return null - - var data: Dictionary = _gedis._core._sorted_sets[key] - if not data.member_scores.has(member): - return null - - for i in range(data.sorted_set.size()): - if data.sorted_set[i][1] == member: - return i - return null - - -# Returns the rank of a member in the sorted set, with scores ordered from high to low. -# The rank is 0-based. -# --- -# @param key: The key of the sorted set. -# @param member: The member to get the rank of. -# @return: The rank of the member, or null if the member does not exist. -func zrevrank(key: String, member: String) -> Variant: - if _gedis._expiry._is_expired(key): - return null - if not _gedis._core._sorted_sets.has(key): - return null - - var data: Dictionary = _gedis._core._sorted_sets[key] - if not data.member_scores.has(member): - return null - - for i in range(data.sorted_set.size() - 1, -1, -1): - if data.sorted_set[i][1] == member: - return data.sorted_set.size() - 1 - i - return null - - -# Returns the number of members in a sorted set with scores within the given range. -# --- -# @param key: The key of the sorted set. -# @param min_score: The minimum score of the range. -# @param max_score: The maximum score of the range. -# @return: The number of members in the specified score range. -func zcount(key: String, min_score, max_score) -> int: - if _gedis._expiry._is_expired(key): - return 0 - if not _gedis._core._sorted_sets.has(key): - return 0 - - var data: Dictionary = _gedis._core._sorted_sets[key] - var count: int = 0 - for entry in data.sorted_set: - var score = entry[0] - if score >= min_score and score <= max_score: - count += 1 - return count - - -# Increments the score of a member in a sorted set. -# If the member does not exist, it is added with the increment as its score. -# --- -# @param key: The key of the sorted set. -# @param increment: The amount to increment the score by. -# @param member: The member whose score to increment. -# @return: The new score of the member. -func zincrby(key: String, increment, member: String) -> Variant: - _gedis._core._touch_type(key, _gedis._core._sorted_sets) - var current_score = zscore(key, member) - if current_score == null: - current_score = 0 - var new_score = current_score + increment - add(key, member, new_score) - return new_score - -# Computes the union of multiple sorted sets and stores the result in a new sorted set. -# --- -# @param destination: The key to store the resulting sorted set in. -# @param keys: An array of sorted set keys. -# @param aggregate: The aggregation strategy for scores of the same member ("SUM", "MIN", "MAX"). -# @return: The number of members in the resulting sorted set. -func zunionstore(destination: String, keys: Array, aggregate: String = "SUM") -> int: - var temp_scores: Dictionary = {} - for key in keys: - if not _gedis._core._sorted_sets.has(key): - continue - var data: Dictionary = _gedis._core._sorted_sets[key] - for member in data.member_scores: - var score = data.member_scores[member] - if not temp_scores.has(member): - temp_scores[member] = score - else: - match aggregate.to_upper(): - "SUM": - temp_scores[member] += score - "MIN": - temp_scores[member] = min(temp_scores[member], score) - "MAX": - temp_scores[member] = max(temp_scores[member], score) - - if _gedis._core._sorted_sets.has(destination): - _gedis.del([destination]) - - for member in temp_scores: - add(destination, member, temp_scores[member]) - - if not _gedis._core._sorted_sets.has(destination): - return 0 - return _gedis._core._sorted_sets[destination].sorted_set.size() - - -# Computes the intersection of multiple sorted sets and stores the result in a new sorted set. -# --- -# @param destination: The key to store the resulting sorted set in. -# @param keys: An array of sorted set keys. -# @param aggregate: The aggregation strategy for scores of the same member ("SUM", "MIN", "MAX"). -# @return: The number of members in the resulting sorted set. -func zinterstore(destination: String, keys: Array, aggregate: String = "SUM") -> int: - if keys.is_empty(): - return 0 - - var member_sets: Array = [] - for key in keys: - if not _gedis._core._sorted_sets.has(key): - return 0 - var data: Dictionary = _gedis._core._sorted_sets[key] - member_sets.append(data.member_scores.keys()) - - var intersection = member_sets[0] - for i in range(1, member_sets.size()): - var next_set = member_sets[i] - var current_intersection: Array = [] - for member in intersection: - if member in next_set: - current_intersection.append(member) - intersection = current_intersection - - var temp_scores: Dictionary = {} - for member in intersection: - var score_sum = 0 - var score_min = INF - var score_max = - INF - for key in keys: - var data: Dictionary = _gedis._core._sorted_sets[key] - var score = data.member_scores[member] - score_sum += score - score_min = min(score_min, score) - score_max = max(score_max, score) - - match aggregate.to_upper(): - "SUM": - temp_scores[member] = score_sum - "MIN": - temp_scores[member] = score_min - "MAX": - temp_scores[member] = score_max - - if _gedis._core._sorted_sets.has(destination): - _gedis.del([destination]) - - for member in temp_scores: - add(destination, member, temp_scores[member]) - - if not _gedis._core._sorted_sets.has(destination): - return 0 - return _gedis._core._sorted_sets[destination].sorted_set.size() diff --git a/godot/addons/Gedis/core/gedis_sorted_sets.gd.uid b/godot/addons/Gedis/core/gedis_sorted_sets.gd.uid deleted file mode 100644 index 39ad72d..0000000 --- a/godot/addons/Gedis/core/gedis_sorted_sets.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://nld5hwedd25b diff --git a/godot/addons/Gedis/core/gedis_strings.gd b/godot/addons/Gedis/core/gedis_strings.gd deleted file mode 100644 index 414336c..0000000 --- a/godot/addons/Gedis/core/gedis_strings.gd +++ /dev/null @@ -1,139 +0,0 @@ -extends RefCounted -class_name GedisStrings - -var _gedis: Gedis - -func _init(gedis: Gedis): - _gedis = gedis - -# ----------------- -# String/number API -# ----------------- -func set_value(key: StringName, value: Variant) -> void: - _gedis._core._touch_type(str(key), _gedis._core._store) - _gedis._core._store[str(key)] = value - _gedis.publish("gedis:keyspace:" + str(key), "set") - -func get_value(key: StringName, default_value: Variant = null) -> Variant: - if _gedis._expiry._is_expired(str(key)): - return default_value - return _gedis._core._store.get(str(key), default_value) - -# del: accept String or Array of keys -func del(keys) -> int: - if typeof(keys) == TYPE_ARRAY: - var count = 0 - for k in keys: - if _gedis._expiry._is_expired(str(k)): - continue - if exists(str(k)): - _gedis.publish("gedis:keyspace:" + str(k), "del") - _gedis._core._delete_all_types_for_key(str(k)) - count += 1 - return count - else: - var k = str(keys) - var existed := int(exists(k)) - if existed > 0: - _gedis.publish("gedis:keyspace:" + k, "del") - _gedis._core._delete_all_types_for_key(k) - return existed - -# exists: if Array -> return number of existing keys, else boolean for single key -func exists(keys) -> Variant: - if typeof(keys) == TYPE_ARRAY: - var cnt = 0 - for k in keys: - if not _gedis._expiry._is_expired(str(k)) and _gedis._core.key_exists(str(k)): - cnt += 1 - return cnt - else: - var k = str(keys) - if _gedis._expiry._is_expired(k): - return false - return _gedis._core.key_exists(k) - -# key_exists: explicit single-key boolean (keeps parity with C++ API) -func key_exists(key: String) -> bool: - return bool(exists(key)) - -func incrby(key: String, amount: int = 1) -> int: - var k := str(key) - var current: int = 0 - if _gedis._expiry._is_expired(k): - current = 0 - else: - var raw = get_value(k, 0) - match typeof(raw): - TYPE_NIL: - current = 0 - TYPE_INT: - current = int(raw) - TYPE_FLOAT: - current = int(raw) - TYPE_STRING: - var s := str(raw).strip_edges() - if s.find(".") != -1: - current = int(float(s)) - else: - # int(s) will raise on invalid strings; rely on Godot to convert or raise as needed. - current = int(s) - _: - current = int(raw) - var v: int = current + int(amount) - # Store as an integer to keep types consistent - _gedis._core._touch_type(k, _gedis._core._store) - _gedis._core._store[k] = v - _gedis.publish("gedis:keyspace:" + k, "set") - return v - -func decrby(key: String, amount: int = 1) -> int: - return incrby(key, -int(amount)) - -func keys(pattern: String = "*") -> Array: - var all: Dictionary = _gedis._core._get_all_keys() - var rx := _gedis._utils._glob_to_regex(pattern) - var out: Array = [] - for k in all.keys(): - if not _gedis._expiry._is_expired(str(k)) and rx.search(str(k)) != null: - out.append(str(k)) - return out - -func mset(dict: Dictionary) -> void: - for k in dict.keys(): - set_value(str(k), dict[k]) - -func mget(keys: Array) -> Array: - var out: Array = [] - for k in keys: - out.append(get_value(str(k), null)) - return out - -func append(key: String, value: String) -> int: - var k := str(key) - var current_value := get_value(k, "") - if typeof(current_value) != TYPE_STRING: - current_value = str(current_value) - var new_value: String = current_value + value - set_value(k, new_value) - return new_value.length() - -func getset(key: String, value: Variant) -> Variant: - var k := str(key) - var old_value = get_value(k) - set_value(k, value) - return old_value - -func strlen(key: String) -> int: - var k := str(key) - var value = get_value(k) - if typeof(value) == TYPE_STRING: - return value.length() - return 0 - -func setnx(key: String, value: Variant) -> int: - var k := str(key) - if not _gedis._expiry._is_expired(k) and key_exists(k): - return 0 - set_value(k, value) - return 1 \ No newline at end of file diff --git a/godot/addons/Gedis/core/gedis_strings.gd.uid b/godot/addons/Gedis/core/gedis_strings.gd.uid deleted file mode 100644 index f938a71..0000000 --- a/godot/addons/Gedis/core/gedis_strings.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dv4qlsimic35p diff --git a/godot/addons/Gedis/core/gedis_utils.gd b/godot/addons/Gedis/core/gedis_utils.gd deleted file mode 100644 index 9effbf3..0000000 --- a/godot/addons/Gedis/core/gedis_utils.gd +++ /dev/null @@ -1,43 +0,0 @@ -class_name GedisUtils -var _regex_cache := {} - -# ---------------- -# Utility functions -# ---------------- -func _glob_to_regex(glob: String) -> RegEx: - if _regex_cache.has(glob): - return _regex_cache[glob] - - var escaped := "" - for ch in glob: - match ch: - ".": - escaped += "\\." - "*": - escaped += ".*" - "?": - escaped += "." - "+": - escaped += "\\+" - "(": - escaped += "\\(" - ")": - escaped += "\\)" - "[": - escaped += "\\[" - "]": - escaped += "\\]" - "^": - escaped += "\\^" - "$": - escaped += "\\$" - "|": - escaped += "\\|" - "\\": - escaped += "\\\\" - _: - escaped += ch - var r := RegEx.new() - r.compile("^%s$" % escaped) - _regex_cache[glob] = r - return r \ No newline at end of file diff --git a/godot/addons/Gedis/core/gedis_utils.gd.uid b/godot/addons/Gedis/core/gedis_utils.gd.uid deleted file mode 100644 index c9b1af4..0000000 --- a/godot/addons/Gedis/core/gedis_utils.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b3eglfuyrjdgp diff --git a/godot/addons/Gedis/core/persistence/gedis_json_snapshot_backend.gd b/godot/addons/Gedis/core/persistence/gedis_json_snapshot_backend.gd deleted file mode 100644 index a9c9aac..0000000 --- a/godot/addons/Gedis/core/persistence/gedis_json_snapshot_backend.gd +++ /dev/null @@ -1,107 +0,0 @@ -class_name GedisJSONSnapshotBackend extends GedisPersistenceBackend - -func save(data: Dictionary, options: Dictionary) -> int: - var path: String = options.get("path", "") - if path.is_empty(): - push_error("JSON snapshot backend requires a 'path' in options.") - return FAILED - - var file = FileAccess.open(path, FileAccess.WRITE) - if not file: - push_error("Failed to open file for writing: %s" % path) - return FAILED - - # Serialize variants to strings - var serializable_data = {} - for bucket_name in data: - var bucket = data[bucket_name] - var serializable_bucket = {} - for key in bucket: - var value = bucket[key] - if typeof(value) in [TYPE_OBJECT, TYPE_RID, TYPE_CALLABLE, TYPE_SIGNAL]: - serializable_bucket[key] = var_to_str(value) - else: - serializable_bucket[key] = value - serializable_data[bucket_name] = serializable_bucket - - var json_string = JSON.stringify(serializable_data, "\t") - file.store_string(json_string) - file.close() - - return OK - - -func load(options: Dictionary) -> Dictionary: - var path: String = options.get("path", "") - if path.is_empty(): - push_error("JSON snapshot backend requires a 'path' in options.") - return {} - - if not FileAccess.file_exists(path): - return {} # Return empty dict if file doesn't exist, not an error - - var file = FileAccess.open(path, FileAccess.READ) - if not file: - push_error("Failed to open file for reading: %s" % path) - return {} - - var json_string: String = file.get_as_text() - file.close() - - var json = JSON.new() - var error = json.parse(json_string) - if error != OK: - push_error("Failed to parse JSON from file: %s" % path) - return {} - - var loaded_data: Dictionary = json.get_data() - - # Deserialize variants from strings - for bucket_name in loaded_data: - var bucket = loaded_data[bucket_name] - if typeof(bucket) == TYPE_DICTIONARY: - for key in bucket: - var value = bucket[key] - if typeof(value) == TYPE_STRING and value.begins_with("@"): - bucket[key] = str_to_var(value) - elif typeof(bucket) == TYPE_STRING and bucket.begins_with("@"): - loaded_data[bucket_name] = str_to_var(bucket) - - return loaded_data - -func serialize(data: Dictionary) -> String: - var serializable_data = {} - for bucket_name in data: - var bucket = data[bucket_name] - var serializable_bucket = {} - for key in bucket: - var value = bucket[key] - if typeof(value) in [TYPE_OBJECT, TYPE_RID, TYPE_CALLABLE, TYPE_SIGNAL]: - serializable_bucket[key] = var_to_str(value) - else: - serializable_bucket[key] = value - serializable_data[bucket_name] = serializable_bucket - - return JSON.stringify(serializable_data, "\t") - -func deserialize(data: String) -> Dictionary: - var json = JSON.new() - var error = json.parse(data) - if error != OK: - push_error("Failed to parse JSON from string") - return {} - - var loaded_data: Dictionary = json.get_data() - - # Deserialize variants from strings - for bucket_name in loaded_data: - var bucket = loaded_data[bucket_name] - if typeof(bucket) == TYPE_DICTIONARY: - for key in bucket: - var value = bucket[key] - if typeof(value) == TYPE_STRING and value.begins_with("@"): - bucket[key] = str_to_var(value) - elif typeof(bucket) == TYPE_STRING and bucket.begins_with("@"): - loaded_data[bucket_name] = str_to_var(bucket) - - return loaded_data \ No newline at end of file diff --git a/godot/addons/Gedis/core/persistence/gedis_json_snapshot_backend.gd.uid b/godot/addons/Gedis/core/persistence/gedis_json_snapshot_backend.gd.uid deleted file mode 100644 index 7f4cb45..0000000 --- a/godot/addons/Gedis/core/persistence/gedis_json_snapshot_backend.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dw5ib42q321e4 diff --git a/godot/addons/Gedis/core/persistence/gedis_persistence_backend.gd b/godot/addons/Gedis/core/persistence/gedis_persistence_backend.gd deleted file mode 100644 index d2aa0ce..0000000 --- a/godot/addons/Gedis/core/persistence/gedis_persistence_backend.gd +++ /dev/null @@ -1,29 +0,0 @@ -class_name GedisPersistenceBackend - -# Base class for persistence backends. -# All backends should inherit from this class and implement the `save` and `load` methods. - -func save(data: Dictionary, options: Dictionary) -> int: - # This method should be implemented by the child class. - # It should save the data to the persistence layer and return OK or FAILED. - push_error("save() not implemented in the persistence backend.") - return FAILED - - -func load(options: Dictionary) -> Dictionary: - # This method should be implemented by the child class. - # It should load the data from the persistence layer and return it as a Dictionary. - push_error("load() not implemented in the persistence backend.") - return {} - -func serialize(data: Dictionary) -> String: - # This method should be implemented by the child class. - # It should serialize the data to a string. - push_error("serialize() not implemented in the persistence backend.") - return "" - -func deserialize(data: String) -> Dictionary: - # This method should be implemented by the child class. - # It should deserialize the data from a string. - push_error("deserialize() not implemented in the persistence backend.") - return {} \ No newline at end of file diff --git a/godot/addons/Gedis/core/persistence/gedis_persistence_backend.gd.uid b/godot/addons/Gedis/core/persistence/gedis_persistence_backend.gd.uid deleted file mode 100644 index cb894d2..0000000 --- a/godot/addons/Gedis/core/persistence/gedis_persistence_backend.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cqoc0ht0swvnp diff --git a/godot/addons/Gedis/core/time_sources/gedis_process_delta_time_source.gd b/godot/addons/Gedis/core/time_sources/gedis_process_delta_time_source.gd deleted file mode 100644 index 133708d..0000000 --- a/godot/addons/Gedis/core/time_sources/gedis_process_delta_time_source.gd +++ /dev/null @@ -1,15 +0,0 @@ -class_name GedisProcessDeltaTimeSource -extends GedisTimeSource - -var current_time: int = 0 - -func _init() -> void: - current_time = Time.get_unix_time_from_system() * 1000 - -func tick(delta: float) -> void: - current_time += int(delta * 1000) - instance.purge_expired() - -# Returns the current time as a Unix timestamp with milliseconds. -func get_time() -> int: - return current_time diff --git a/godot/addons/Gedis/core/time_sources/gedis_process_delta_time_source.gd.uid b/godot/addons/Gedis/core/time_sources/gedis_process_delta_time_source.gd.uid deleted file mode 100644 index e690456..0000000 --- a/godot/addons/Gedis/core/time_sources/gedis_process_delta_time_source.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cepu7wbyednk diff --git a/godot/addons/Gedis/core/time_sources/gedis_tick_time_source.gd b/godot/addons/Gedis/core/time_sources/gedis_tick_time_source.gd deleted file mode 100644 index 606ff35..0000000 --- a/godot/addons/Gedis/core/time_sources/gedis_tick_time_source.gd +++ /dev/null @@ -1,6 +0,0 @@ -class_name GedisTickTimeSource -extends GedisTimeSource - -# Returns the current time as a Unix timestamp with milliseconds. -func get_time() -> int: - return Time.get_ticks_msec() diff --git a/godot/addons/Gedis/core/time_sources/gedis_tick_time_source.gd.uid b/godot/addons/Gedis/core/time_sources/gedis_tick_time_source.gd.uid deleted file mode 100644 index cac8b78..0000000 --- a/godot/addons/Gedis/core/time_sources/gedis_tick_time_source.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dyaygbjbae3jp diff --git a/godot/addons/Gedis/core/time_sources/gedis_time_source.gd b/godot/addons/Gedis/core/time_sources/gedis_time_source.gd deleted file mode 100644 index 11b1241..0000000 --- a/godot/addons/Gedis/core/time_sources/gedis_time_source.gd +++ /dev/null @@ -1,12 +0,0 @@ -class_name GedisTimeSource -extends RefCounted - -var instance: Gedis - -# Returns the current time as a Unix timestamp in milliseconds. -func get_time() -> int: - return 0 - -# Increments the time [Optional] -func tick(_delta) -> void: - instance.purge_expired() diff --git a/godot/addons/Gedis/core/time_sources/gedis_time_source.gd.uid b/godot/addons/Gedis/core/time_sources/gedis_time_source.gd.uid deleted file mode 100644 index 1ce09bc..0000000 --- a/godot/addons/Gedis/core/time_sources/gedis_time_source.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b36i3x1dhi4b6 diff --git a/godot/addons/Gedis/core/time_sources/gedis_unix_time_source.gd b/godot/addons/Gedis/core/time_sources/gedis_unix_time_source.gd deleted file mode 100644 index 25c66f6..0000000 --- a/godot/addons/Gedis/core/time_sources/gedis_unix_time_source.gd +++ /dev/null @@ -1,6 +0,0 @@ -class_name GedisUnixTimeSource -extends GedisTimeSource - -# Returns the current time as a Unix timestamp with milliseconds. -func get_time() -> int: - return Time.get_unix_time_from_system() * 1000 diff --git a/godot/addons/Gedis/core/time_sources/gedis_unix_time_source.gd.uid b/godot/addons/Gedis/core/time_sources/gedis_unix_time_source.gd.uid deleted file mode 100644 index d31ac38..0000000 --- a/godot/addons/Gedis/core/time_sources/gedis_unix_time_source.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bsxup2elcrrr7 diff --git a/godot/addons/Gedis/debugger/gedis_debugger_panel.gd b/godot/addons/Gedis/debugger/gedis_debugger_panel.gd deleted file mode 100644 index 0a0a189..0000000 --- a/godot/addons/Gedis/debugger/gedis_debugger_panel.gd +++ /dev/null @@ -1,22 +0,0 @@ -@tool -extends VBoxContainer - -@export var pub_sub_tree: Tree -@export var fetch_pubsub_button: Button -@export var instance_selector: OptionButton - -var plugin - -func _ready() -> void: - _populate_pubsub_tree() - fetch_pubsub_button.pressed.connect(_on_fetch_pubsub_pressed) - -func _on_fetch_pubsub_pressed(): - if plugin: - var selected_id = instance_selector.get_item_id(instance_selector.selected) - plugin.send_message_to_game("request_instance_data", [selected_id, "pubsub"]) - -func _populate_pubsub_tree(): - if not pub_sub_tree: - return - pub_sub_tree.clear() diff --git a/godot/addons/Gedis/debugger/gedis_debugger_panel.gd.uid b/godot/addons/Gedis/debugger/gedis_debugger_panel.gd.uid deleted file mode 100644 index 75c2f1c..0000000 --- a/godot/addons/Gedis/debugger/gedis_debugger_panel.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dbrrt18c60tyc diff --git a/godot/addons/Gedis/debugger/gedis_debugger_panel.tscn b/godot/addons/Gedis/debugger/gedis_debugger_panel.tscn deleted file mode 100644 index 79d1f2e..0000000 --- a/godot/addons/Gedis/debugger/gedis_debugger_panel.tscn +++ /dev/null @@ -1,102 +0,0 @@ -[gd_scene load_steps=3 format=3 uid="uid://c6w7w7w7w7w7"] - -[ext_resource type="Script" uid="uid://dbrrt18c60tyc" path="res://addons/Gedis/debugger/gedis_debugger_panel.gd" id="1_z8w8w"] - -[sub_resource type="Theme" id="Theme_1"] -Label/colors/font_color = Color(1, 0.647059, 0, 1) - -[node name="Dashboard" type="VBoxContainer" node_paths=PackedStringArray("pub_sub_tree", "fetch_pubsub_button", "instance_selector")] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_right = -1152.0 -offset_bottom = -648.0 -script = ExtResource("1_z8w8w") -pub_sub_tree = NodePath("TabContainer/PubSub/HSplitContainer/PubSubTree") -fetch_pubsub_button = NodePath("TopPanel/FetchPubSubButton") -instance_selector = NodePath("TopPanel/instance_selector") - -[node name="status_label" type="Label" parent="."] -layout_mode = 2 -theme = SubResource("Theme_1") -text = "Waiting for game connection..." - -[node name="TopPanel" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="instance_selector" type="OptionButton" parent="TopPanel"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="RefreshButton" type="Button" parent="TopPanel"] -layout_mode = 2 -text = "Refresh Instances" - -[node name="FetchKeysButton" type="Button" parent="TopPanel"] -layout_mode = 2 -text = "Fetch Keys" - -[node name="FetchPubSubButton" type="Button" parent="TopPanel"] -layout_mode = 2 -text = "Fetch Pub/Sub" - -[node name="SearchPanel" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="search_box" type="LineEdit" parent="SearchPanel"] -layout_mode = 2 -size_flags_horizontal = 3 -placeholder_text = "Filter keys..." - -[node name="filter_button" type="Button" parent="SearchPanel"] -layout_mode = 2 -text = "Filter" - -[node name="TabContainer" type="TabContainer" parent="."] -layout_mode = 2 -size_flags_vertical = 3 -current_tab = 0 - -[node name="Keys" type="VBoxContainer" parent="TabContainer"] -layout_mode = 2 -metadata/_tab_index = 0 - -[node name="HSplitContainer" type="HSplitContainer" parent="TabContainer/Keys"] -layout_mode = 2 -size_flags_vertical = 3 - -[node name="key_list" type="Tree" parent="TabContainer/Keys/HSplitContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -columns = 3 -column_titles_visible = true - -[node name="key_value_view" type="TextEdit" parent="TabContainer/Keys/HSplitContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -editable = false - -[node name="PubSub" type="VBoxContainer" parent="TabContainer"] -visible = false -layout_mode = 2 -metadata/_tab_index = 1 - -[node name="HSplitContainer" type="HSplitContainer" parent="TabContainer/PubSub"] -layout_mode = 2 -size_flags_vertical = 3 - -[node name="PubSubTree" type="Tree" parent="TabContainer/PubSub/HSplitContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -hide_root = true - -[node name="PubSubEventsTree" type="Tree" parent="TabContainer/PubSub/HSplitContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -columns = 2 -column_titles_visible = true -hide_root = true diff --git a/godot/addons/Gedis/gedis.gd b/godot/addons/Gedis/gedis.gd deleted file mode 100644 index e0dd7b0..0000000 --- a/godot/addons/Gedis/gedis.gd +++ /dev/null @@ -1,567 +0,0 @@ -class_name Gedis extends Node - -# Component instances -var _core: GedisCore -var _expiry: GedisExpiry -var _time_source: GedisTimeSource -var _strings: GedisStrings -var _hashes: GedisHashes -var _lists: GedisLists -var _sets: GedisSets -var _sorted_sets: GedisSortedSets -var _pubsub: GedisPubSub -var _debugger_component: GedisDebugger -var _utils: GedisUtils -var _persistence_backends: Dictionary = {} -var _default_persistence_backend: String = "" - -# Instance registry -static var _instances: Array = [] -static var _next_instance_id: int = 0 -var _instance_id: int = -1 -var _instance_name: String = "" -static var _debugger_registered = false - -func _init() -> void: - # assign id and register - _instance_id = _next_instance_id - _next_instance_id += 1 - _instance_name = "Gedis_%d" % _instance_id - _instances.append(self) - - # Instantiate components - _core = GedisCore.new(self) - _utils = GedisUtils.new() - _expiry = GedisExpiry.new(self) - _strings = GedisStrings.new(self) - _hashes = GedisHashes.new(self) - _lists = GedisLists.new(self) - _sets = GedisSets.new(self) - _sorted_sets = GedisSortedSets.new(self) - _pubsub = GedisPubSub.new(self) - _debugger_component = GedisDebugger.new(self) - - _time_source = GedisUnixTimeSource.new() - _time_source.instance = self - - _pubsub.pubsub_message.connect(_on_pubsub_message) - _pubsub.psub_message.connect(_on_psub_message) - - GedisDebugger._ensure_debugger_is_registered() - -func _on_pubsub_message(channel: String, message: Variant) -> void: - pubsub_message.emit(channel, message) - -func _on_psub_message(pattern: String, channel: String, message: Variant) -> void: - psub_message.emit(pattern, channel, message) - -func _exit_tree() -> void: - # unregister instance - for i in range(_instances.size()): - if _instances[i] == self: - _instances.remove_at(i) - break - -func _process(delta: float) -> void: - _time_source.tick(delta) - -# --- Time Source --- -func set_time_source(p_time_source: GedisTimeSource) -> void: - p_time_source.instance = self - _time_source = p_time_source - -func get_time_source() -> GedisTimeSource: - return _time_source - -# --- Public API --- - -signal pubsub_message(channel, message) -signal psub_message(pattern, channel, message) - -## Sets a value for a key -func set_value(key: StringName, value: Variant) -> void: - _strings.set_value(key, value) - -## Sets a key to a value with an expiration time in seconds. -func setex(key: StringName, seconds: int, value: Variant) -> void: - set_value(key, value) - expire(key, seconds) - -## Gets the string value of a key. -func get_value(key: StringName, default_value: Variant = null) -> Variant: - return _strings.get_value(key, default_value) - -## Deletes one or more keys. -func del(keys) -> int: - return _strings.del(keys) - -## Checks if one or more keys exist. -func exists(keys) -> Variant: - return _strings.exists(keys) - -## Checks if a key exists. -func key_exists(key: String) -> bool: - return _strings.key_exists(key) - -## Increments the integer value of a key by a given amount. -func incrby(key: String, amount: int = 1) -> int: - return _strings.incrby(key, amount) - -## Decrements the integer value of a key by a given amount. -func decrby(key: String, amount: int = 1) -> int: - return _strings.decrby(key, amount) - -## Gets all keys matching a pattern. -func keys(pattern: String = "*") -> Array: - return _strings.keys(pattern) - -## Sets multiple keys to multiple values. -func mset(dict: Dictionary) -> void: - _strings.mset(dict) - -## Gets the values of all specified keys. -func mget(keys: Array) -> Array: - return _strings.mget(keys) - -## Appends a value to a key. -func append(key: String, value: String) -> int: - return _strings.append(key, value) - -## Atomically sets a key to a value and returns the old value. -func getset(key: String, value: Variant) -> Variant: - return _strings.getset(key, value) - -## Gets the length of the string value of a key. -func strlen(key: String) -> int: - return _strings.strlen(key) - -## Sets a key to a value, only if the key does not exist. -func setnx(key: String, value: Variant) -> int: - return _strings.setnx(key, value) - -## Renames a key to newkey, only if newkey does not exist. -func rename(key: String, newkey: String) -> int: - return _core.rename(key, newkey) - -## Moves a key to another key. -func move(key: String, newkey: String) -> int: - return _core.move(key, newkey) - -## Returns a random key from the database. -func randomkey() -> String: - var all_keys = _core._get_all_keys().keys() - if all_keys.is_empty(): - return "" - return all_keys.pick_random() - -## Returns the number of keys in the database. -func dbsize() -> int: - return _core._get_all_keys().size() - -## Adds the keyspace prefix to a key -func ks(key: String) -> String: - return _core.ks(key) - -## Removes the keyspace prefix from a key if present, otherwise returns the key unchanged -func rks(key: String) -> String: - return _core.rks(key) - -# Hashes -## Sets the string value of a hash field. -func hset(key: String, field: String, value) -> int: - return _hashes.hset(key, field, value) - -## Gets the value of a hash field. -func hget(key: String, field: String, default_value: Variant = null): - return _hashes.hget(key, field, default_value) - -## Gets the values of all the given hash fields. -func hmget(key: String, fields: Array) -> Array: - return _hashes.hmget(key, fields) - -## Sets multiple hash fields to multiple values. -func hmset(key: String, field_value_pairs: Dictionary) -> void: - _hashes.hmset(key, field_value_pairs) - -## Increments the integer value of a hash field by the given amount. -func hincrby(key: String, field: String, amount: int) -> Variant: - return _hashes.hincrby(key, field, amount) - -## Increments the float value of a hash field by the given amount. -func hincrbyfloat(key: String, field: String, amount: float) -> Variant: - return _hashes.hincrbyfloat(key, field, amount) - -## Deletes one or more hash fields. -func hdel(key: String, fields) -> int: - return _hashes.hdel(key, fields) - -## Gets all the fields and values in a hash. -func hgetall(key: String) -> Dictionary: - return _hashes.hgetall(key) - -## Checks if a hash field exists. -func hexists(key: String, field = null) -> bool: - return _hashes.hexists(key, field) - -## Gets all the fields in a hash. -func hkeys(key: String) -> Array: - return _hashes.hkeys(key) - -## Gets all the values in a hash. -func hvals(key: String) -> Array: - return _hashes.hvals(key) - -## Gets the number of fields in a hash. -func hlen(key: String) -> int: - return _hashes.hlen(key) - -# Lists -## Prepends one or multiple values to a list. -func lpush(key: String, value) -> int: - return _lists.lpush(key, value) - -## Appends one or multiple values to a list. -func rpush(key: String, value) -> int: - return _lists.rpush(key, value) - -## Removes and gets the first element in a list. -func lpop(key: String): - return _lists.lpop(key) - -## Removes and gets the last element in a list. -func rpop(key: String): - return _lists.rpop(key) - -## Gets the length of a list. -func llen(key: String) -> int: - return _lists.llen(key) - -## Checks if a list exists. -func lexists(key: String) -> bool: - return _lists.lexists(key) - -## Gets all elements from a list. -func lget(key: String) -> Array: - return _lists.lget(key) - -## Gets a range of elements from a list. -func lrange(key: String, start: int, stop: int) -> Array: - return _lists.lrange(key, start, stop) - -## Gets an element from a list by index. -func lindex(key: String, index: int): - return _lists.lindex(key, index) - -## Sets the value of an element in a list by index. -func lset(key: String, index: int, value) -> bool: - return _lists.lset(key, index, value) - -## Removes elements from a list. -func lrem(key: String, count: int, value) -> int: - return _lists.lrem(key, count, value) - -## Trims a list to the specified range of indices. -func ltrim(key: String, start: int, stop: int) -> bool: - return _lists.ltrim(key, start, stop) - -## Inserts a value into a list before or after a pivot value. -func linsert(key: String, position: String, pivot, value) -> int: - return _lists.linsert(key, position, pivot, value) - -## Atomically returns and removes the first/last element of the list stored at source and pushes the element at the first/last element of the list stored at destination. -func lmove(source: String, destination: String, from: String, to: String): - return _lists.lmove(source, destination, from, to) - -# Sets -## Adds one or more members to a set. -func sadd(key: String, member) -> int: - return _sets.sadd(key, member) - -## Removes one or more members from a set. -func srem(key: String, member) -> int: - return _sets.srem(key, member) - -## Gets all the members in a set. -func smembers(key: String) -> Array: - return _sets.smembers(key) - -## Checks if a member is in a set. -func sismember(key: String, member) -> bool: - return _sets.sismember(key, member) - -## Gets the number of members in a set. -func scard(key: String) -> int: - return _sets.scard(key) - -## Checks if a set exists. -func sexists(key: String) -> bool: - return _sets.sexists(key) - -## Removes and returns a random member from a set. -func spop(key: String): - return _sets.spop(key) - -## Moves a member from one set to another. -func smove(source: String, destination: String, member) -> bool: - return _sets.smove(source, destination, member) - -## Returns the union of the sets stored at the given keys. -func sunion(keys: Array) -> Array: - return _sets.sunion(keys) - -## Returns the intersection of the sets stored at the given keys. -func sinter(keys: Array) -> Array: - return _sets.sinter(keys) - -## Returns the difference of the sets stored at the given keys. -func sdiff(keys: Array) -> Array: - return _sets.sdiff(keys) - -## Stores the union of the sets at keys in the destination key. -func sunionstore(destination: String, keys: Array) -> int: - return _sets.sunionstore(destination, keys) - -## Stores the intersection of the sets at keys in the destination key. -func sinterstore(destination: String, keys: Array) -> int: - return _sets.sinterstore(destination, keys) - -## Stores the difference of the sets at keys in the destination key. -func sdiffstore(destination: String, keys: Array) -> int: - return _sets.sdiffstore(destination, keys) - -## Returns one or more random members from the set at key. -func srandmember(key: String, count: int = 1) -> Variant: - return _sets.srandmember(key, count) - -# Sorted Sets -## Adds a member with a score to a sorted set. -func zadd(key: String, member: String, score: int): - return _sorted_sets.add(key, member, score) - -## Checks if a sorted set exists. -func zexists(key: String) -> bool: - return _sorted_sets.zexists(key) - -## Gets the number of members in a sorted set. -func zcard(key: String) -> int: - return _sorted_sets.zcard(key) - -## Removes a member from a sorted set. -func zrem(key: String, member: String): - return _sorted_sets.remove(key, member) - -## Gets members from a sorted set within a score range. -func zrange(key: String, start, stop, withscores: bool = false): - return _sorted_sets.zrange(key, start, stop, withscores) - -## Gets members from a sorted set within a score range, in reverse order. -func zrevrange(key: String, start, stop, withscores: bool = false): - return _sorted_sets.zrevrange(key, start, stop, withscores) - -## Removes and returns members with scores up to a certain value. -func zpopready(key: String, now: int): - return _sorted_sets.pop_ready(key, now) - -## Returns the score of member in the sorted set at key. -func zscore(key: String, member: String) -> Variant: - return _sorted_sets.zscore(key, member) - -## Returns the rank of member in the sorted set at key. -func zrank(key: String, member: String) -> Variant: - return _sorted_sets.zrank(key, member) - -## Returns the rank of member in the sorted set at key, with scores ordered from high to low. -func zrevrank(key: String, member: String) -> Variant: - return _sorted_sets.zrevrank(key, member) - -## Returns the number of elements in the sorted set at key with a score between min and max. -func zcount(key: String, min_score, max_score) -> int: - return _sorted_sets.zcount(key, min_score, max_score) - -## Increments the score of member in the sorted set at key by increment. -func zincrby(key: String, increment, member: String) -> Variant: - return _sorted_sets.zincrby(key, increment, member) - -## Returns a range of members in a sorted set, by score. -func zrangebyscore(key: String, min_score, max_score, withscores: bool = false) -> Array: - return _sorted_sets.zrangebyscore(key, min_score, max_score, withscores) - -## Returns a range of members in a sorted set, by score, in reverse order. -func zrevrangebyscore(key: String, min_score, max_score, withscores: bool = false) -> Array: - return _sorted_sets.zrevrangebyscore(key, min_score, max_score, withscores) - -## Computes the union of sorted sets and stores the result in a new key. -func zunionstore(destination: String, keys: Array, aggregate: String = "SUM") -> int: - return _sorted_sets.zunionstore(destination, keys, aggregate) - -## Computes the intersection of sorted sets and stores the result in a new key. -func zinterstore(destination: String, keys: Array, aggregate: String = "SUM") -> int: - return _sorted_sets.zinterstore(destination, keys, aggregate) - -# Pub/Sub -## Posts a message to a channel. -func publish(channel: String, message) -> void: - _pubsub.publish.call_deferred(channel, message) - -## Subscribes to a channel. -func subscribe(channel: String, subscriber: Object) -> void: - _pubsub.subscribe(channel, subscriber) - -## Unsubscribes from a channel. -func unsubscribe(channel: String, subscriber: Object) -> void: - _pubsub.unsubscribe(channel, subscriber) - -## Subscribes to channels matching a pattern. -func psubscribe(pattern: String, subscriber: Object) -> void: - _pubsub.psubscribe(pattern, subscriber) - -## Unsubscribes from channels matching a pattern. -func punsubscribe(pattern: String, subscriber: Object) -> void: - _pubsub.punsubscribe(pattern, subscriber) - -## Returns a list of all active channels. -func list_channels() -> Array: - return _pubsub.list_channels() - -## Returns a list of subscribers for a given channel. -func list_subscribers(channel: String) -> Array: - return _pubsub.list_subscribers(channel) - -## Returns a list of all active patterns. -func list_patterns() -> Array: - return _pubsub.list_patterns() - -## Returns a list of subscribers for a given pattern. -func list_pattern_subscribers(pattern: String) -> Array: - return _pubsub.list_pattern_subscribers(pattern) - -# Expiry -## Sets a key's time to live in seconds. -func expire(key: String, seconds: int) -> bool: - return _expiry.expire(key, seconds) - -## Gets the remaining time to live of a key. -func ttl(key: String) -> int: - return _expiry.ttl(key) - -## Removes the expiration from a key. -func persist(key: String) -> bool: - return _expiry.persist(key) - -## Purges all expired keys -func purge_expired() -> void: - _expiry._purge_expired() - -# Admin -## Deletes all keys from the database. -func flushall() -> void: - _core.flushall() - -# Persistence -## Registers a new persistence backend. -func register_persistence_backend(name: String, backend: GedisPersistenceBackend) -> void: - _persistence_backends[name] = backend - -## Sets the default persistence backend. -func set_default_persistence_backend(name: String) -> bool: - if _persistence_backends.has(name): - _default_persistence_backend = name - return true - return false - -## Saves the current state to a file using the default persistence backend. -func save(path: String, options: Dictionary = {}) -> int: - if _default_persistence_backend.is_empty(): - register_persistence_backend("json", GedisJSONSnapshotBackend.new()) - set_default_persistence_backend("json") - - var backend: GedisPersistenceBackend = _persistence_backends[_default_persistence_backend] - var dump_options = options.duplicate() - if dump_options.has("path"): - dump_options.erase("path") - - var data = _core.dump_all(dump_options) - - var save_options = {"path": path} - return backend.save(data, save_options) - -## Loads the state from a file using the default persistence backend. -func load(path: String, options: Dictionary = {}) -> int: - if _default_persistence_backend.is_empty(): - register_persistence_backend("json", GedisJSONSnapshotBackend.new()) - set_default_persistence_backend("json") - - var backend: GedisPersistenceBackend = _persistence_backends[_default_persistence_backend] - var load_options = {"path": path} - var data = backend.load(load_options) - - if data.is_empty(): - return FAILED - - _core.restore_all(data) - return OK - -## Dumps the entire dataset to a variable. -func dump_all(options: Dictionary = {}) -> Dictionary: - return _core.dump_all(options) - -## Restores the entire dataset from a variable. -func restore_all(data: Dictionary) -> void: - _core.restore_all(data) - -## Restores a key from a serialized value. -func restore(key: String, data: String, backend: String = "") -> int: - var persistence_backend: GedisPersistenceBackend - if backend.is_empty(): - if _default_persistence_backend.is_empty(): - register_persistence_backend("json", GedisJSONSnapshotBackend.new()) - set_default_persistence_backend("json") - persistence_backend = _persistence_backends[_default_persistence_backend] - elif _persistence_backends.has(backend): - persistence_backend = _persistence_backends[backend] - else: - return FAILED - - var deserialized_data = persistence_backend.deserialize(data) - if deserialized_data.is_empty(): - return FAILED - - _core.restore_key(key, deserialized_data) - return OK - -# Debugger -## Returns the type of the value stored at a key. -func type(key: String) -> String: - return _debugger_component.type(key) - -## Returns a dictionary representation of the value stored at a key. -func dump_key(key: String) -> Dictionary: - return _debugger_component.dump(key) - -## Returns a snapshot of the database for keys matching a pattern. -func snapshot(pattern: String = "*") -> Dictionary: - return _debugger_component.snapshot(pattern) - -# Instance helpers -## Sets the name for this Gedis instance. -func set_instance_name(name: String) -> void: - _instance_name = name - -## Gets the name for this Gedis instance. -func get_instance_name() -> String: - return _instance_name - -## Gets all active Gedis instances. -static func get_all_instances() -> Array: - var result: Array = [] - for inst in _instances: - if is_instance_valid(inst): - var info: Dictionary = {} - info["id"] = inst._instance_id - info["name"] = inst.name if inst.name else inst._instance_name - info["object"] = inst - result.append(info) - return result - -static func _on_debugger_message(message: String, data: Array) -> bool: - return GedisDebugger._on_debugger_message(message, data) diff --git a/godot/addons/Gedis/gedis.gd.uid b/godot/addons/Gedis/gedis.gd.uid deleted file mode 100644 index 3f2e080..0000000 --- a/godot/addons/Gedis/gedis.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://7l48sw6l2lq3 diff --git a/godot/addons/Gedis/icon.png b/godot/addons/Gedis/icon.png deleted file mode 100644 index e579569c477329c11484d83e9b2869e246158b94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99432 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
p2;N#a~fwUo;hWO;2a-lNrU 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 dashboard_control - var full_snapshot_data = {} # session_id -> full_snapshot_data - var pending_requests = {} # session_id -> { "command": String, "instance_id": int, "context": any } - var _pubsub_events = {} # session_id -> [] - - func _has_capture(capture): - return capture == "gedis" - - func _capture(message, data, session_id): - if not _pubsub_events.has(session_id): - _pubsub_events[session_id] = [] - # message is the full message string received by the editor (e.g. "gedis:instances_data") - # data is the Array payload sent from the game. Engines and editors may wrap values - # differently (sometimes the payload is passed as a single element array), so normalize. - var parts = message.split(":") - var kind = parts[1] if parts.size() > 1 else "" - - match kind: - "ping": - _request_instances_update(session_id) - return true - "instances_data": - # instances may be either sent as the array itself or wrapped as [instances] - var instances = data - if data.size() == 1 and typeof(data[0]) == TYPE_ARRAY: - instances = data[0] - _update_instances(instances, session_id) - return true - "snapshot_data": - # snapshot is expected to be a Dictionary; it may be wrapped in an Array - var snapshot = data[0] if data.size() > 0 else {} - _update_snapshot_data(snapshot, session_id) - return true - "key_value_data": - # key/value payload may be wrapped similarly - var kv = data[0] if data.size() > 0 else {} - _update_key_value_data(kv, session_id) - return true - "pubsub_data": - var channels_data = data[0] if data.size() > 0 else {} - var patterns_data = data[1] if data.size() > 1 else {} - _update_pubsub_tree(session_id, channels_data, patterns_data) - return true - "pubsub_event": - if not session_id in _pubsub_events: - _pubsub_events[session_id] = [] - _pubsub_events[session_id].append({"message": data[0], "data": [data[1], data[2]]}) - _populate_pubsub_events(session_id) - _fetch_pubsub_for_selected_instance(session_id) # Refresh tree on event - return true - return false - - func _setup_session(session_id): - var dashboard = GedisDebuggerPanel.instantiate() - dashboard.name = "Gedis" - dashboard.plugin = self - - var session = get_session(session_id) - session.started.connect(func(): _on_session_started(session_id)) - session.stopped.connect(func(): _on_session_stopped(session_id)) - session.add_session_tab(dashboard) - - dashboard_tabs[session_id] = dashboard - _pubsub_events[session_id] = [] - - func _on_session_started(session_id): - full_snapshot_data[session_id] = {} - _clear_views(session_id) - _populate_pubsub_events(session_id) - _update_pubsub_tree(session_id, {}, {}) - - var dashboard = dashboard_tabs[session_id] - - var instance_selector = dashboard.find_child("instance_selector", true, false) - if instance_selector: - instance_selector.item_selected.connect(func(index): _on_instance_selected(index, session_id)) - - var refresh_button = dashboard.find_child("RefreshButton", true, false) - if refresh_button: - refresh_button.pressed.connect(func(): _request_instances_update(session_id)) - - var fetch_keys_button = dashboard.find_child("FetchKeysButton", true, false) - if fetch_keys_button: - fetch_keys_button.pressed.connect(func(): _fetch_keys_for_selected_instance(session_id)) - - var filter_button = dashboard.find_child("filter_button", true, false) - if filter_button: - filter_button.pressed.connect(func(): _on_filter_pressed(session_id)) - - var key_list = dashboard.find_child("key_list", true, false) - if key_list: - key_list.item_selected.connect(func(): _on_key_selected(session_id)) - - _request_instances_update(session_id) - - func _on_session_stopped(session_id): - if session_id in dashboard_tabs: - var dashboard = dashboard_tabs[session_id] - var status_label = dashboard.find_child("status_label", true, false) - if status_label: - status_label.text = "Game disconnected" - status_label.add_theme_color_override("font_color", Color.RED) - - func _request_instances_update(session_id): - var session = get_session(session_id) - if session and session.is_active(): - session.send_message("gedis:request_instances", []) - - func _update_instances(instances_data, session_id): - if not session_id in dashboard_tabs: - return - - var dashboard = dashboard_tabs[session_id] - var status_label = dashboard.find_child("status_label", true, false) - var instance_selector = dashboard.find_child("instance_selector", true, false) - - if not instance_selector: - print("Warning: instance_selector not found in dashboard") - return - - instance_selector.clear() - - if instances_data.size() > 0: - status_label.text = "Connected - Found %d Gedis instance(s)" % instances_data.size() - status_label.add_theme_color_override("font_color", Color.GREEN) - - for instance_info in instances_data: - var name = instance_info.get("name", "Gedis_%d" % instance_info.get("id", -1)) - var id = int(instance_info["id"]) if instance_info.has("id") else -1 - instance_selector.add_item(name, id) - - if instance_selector.get_item_count() > 0: - instance_selector.select(0) - # The select() method does not trigger the item_selected signal, so we must call the handler manually. - _fetch_keys_for_selected_instance(session_id) - _fetch_pubsub_for_selected_instance(session_id) - else: - status_label.text = "No Gedis instances found in running game" - status_label.add_theme_color_override("font_color", Color.ORANGE) - _clear_views(session_id) - - func _on_instance_selected(_index, session_id): - _fetch_keys_for_selected_instance(session_id) - _fetch_pubsub_for_selected_instance(session_id) - - func _fetch_keys_for_selected_instance(session_id): - if not session_id in dashboard_tabs: - return - - var dashboard = dashboard_tabs[session_id] - var instance_selector = dashboard.find_child("instance_selector", true, false) - if not instance_selector or instance_selector.get_selected() < 0: - return - - var instance_id = instance_selector.get_item_id(instance_selector.get_selected()) - var session = get_session(session_id) - pending_requests[session_id] = {"command": "snapshot", "instance_id": instance_id} - if session and session.is_active(): - session.send_message("gedis:request_instance_data", [instance_id, "snapshot", "*"]) - - func _fetch_pubsub_for_selected_instance(session_id): - if not session_id in dashboard_tabs: - return - - var dashboard = dashboard_tabs[session_id] - var instance_selector = dashboard.find_child("instance_selector", true, false) - if not instance_selector or instance_selector.get_selected() < 0: - return - - var instance_id = instance_selector.get_item_id(instance_selector.get_selected()) - var session = get_session(session_id) - pending_requests[session_id] = {"command": "pubsub", "instance_id": instance_id} - if session and session.is_active(): - session.send_message("gedis:request_instance_data", [instance_id, "pubsub"]) - - func _on_filter_pressed(session_id): - if not session_id in dashboard_tabs: - return - - var dashboard = dashboard_tabs[session_id] - var search_box = dashboard.find_child("search_box", true, false) - var filter_text = search_box.text if search_box else "" - - _populate_key_list(session_id, filter_text) - - - func _update_snapshot_data(snapshot_data, session_id): - if not session_id in dashboard_tabs: - return - - full_snapshot_data[session_id] = snapshot_data - _populate_key_list(session_id) - - func _populate_key_list(session_id, filter_text = ""): - var dashboard = dashboard_tabs[session_id] - var key_list = dashboard.find_child("key_list", true, false) - - if not key_list: - return - - key_list.clear() - var root = key_list.create_item() - - var data_to_display = full_snapshot_data.get(session_id, {}) - - var regex = RegEx.new() - if not filter_text.is_empty(): - var pattern = filter_text.replace("*", ".*").replace("?", ".") - regex.compile(pattern) - - for redis_key in data_to_display.keys(): - if filter_text.is_empty() or regex.search(redis_key): - var key_info = data_to_display[redis_key] - var item = key_list.create_item(root) - item.set_text(0, redis_key) - item.set_text(1, key_info.get("type", "UNKNOWN")) - var ttl_value = key_info.get("ttl", -1) - if ttl_value == -1: - item.set_text(2, "∞") - elif ttl_value == -2: - item.set_text(2, "EXPIRED") - else: - item.set_text(2, str(ttl_value) + "s") - - func _update_key_value_data(key_value_data, session_id): - if not session_id in dashboard_tabs: - return - - var dashboard = dashboard_tabs[session_id] - var key_value_view = dashboard.find_child("key_value_view", true, false) - - if not key_value_view: - return - - if key_value_data is Dictionary and "value" in key_value_data: - key_value_view.text = var_to_str(key_value_data.value) - else: - key_value_view.text = var_to_str(key_value_data) - - func _on_key_selected(session_id): - if not session_id in dashboard_tabs: - return - - var dashboard = dashboard_tabs[session_id] - var key_list = dashboard.find_child("key_list", true, false) - var key_value_view = dashboard.find_child("key_value_view", true, false) - var instance_selector = dashboard.find_child("instance_selector", true, false) - - if not key_list or not key_value_view or not instance_selector: - return - - var selected_item = key_list.get_selected() - if not selected_item: - key_value_view.text = "" - return - - var selected_key = selected_item.get_text(0) - if instance_selector.get_selected() >= 0: - var instance_id = instance_selector.get_item_id(instance_selector.get_selected()) - var session = get_session(session_id) - pending_requests[session_id] = {"command": "dump", "instance_id": instance_id, "key": selected_key} - if session and session.is_active(): - session.send_message("gedis:request_instance_data", [instance_id, "dump", selected_key]) - - key_value_view.editable = false - - - func _on_edit_pressed(session_id): - if not session_id in dashboard_tabs: - return - - var dashboard = dashboard_tabs[session_id] - var key_value_view = dashboard.find_child("key_value_view", true, false) - var edit_button = dashboard.find_child("edit_button", true, false) - var save_button = dashboard.find_child("save_button", true, false) - - if not key_value_view or not edit_button or not save_button: - return - - key_value_view.editable = true - save_button.disabled = false - edit_button.disabled = true - - func _on_save_pressed(session_id): - if not session_id in dashboard_tabs: - return - - var dashboard = dashboard_tabs[session_id] - var key_list = dashboard.find_child("key_list", true, false) - var key_value_view = dashboard.find_child("key_value_view", true, false) - var instance_selector = dashboard.find_child("instance_selector", true, false) - var edit_button = dashboard.find_child("edit_button", true, false) - var save_button = dashboard.find_child("save_button", true, false) - - if not key_list or not key_value_view or not instance_selector or not edit_button or not save_button: - return - - var selected_item = key_list.get_selected() - if not selected_item or instance_selector.get_selected() < 0: - return - - var instance_id = instance_selector.get_item_id(instance_selector.get_selected()) - var key = selected_item.get_text(0) - var new_value_text = key_value_view.text - - var json = JSON.new() - var error = json.parse(new_value_text) - var new_value - if error == OK: - new_value = json.get_data() - else: - # Fallback for non-JSON strings - new_value = new_value_text - - var session = get_session(session_id) - if session and session.is_active(): - pending_requests[session_id] = {"command": "set", "instance_id": instance_id, "key": key} - session.send_message("gedis:request_instance_data", [instance_id, "set", key, new_value]) - - key_value_view.editable = false - save_button.disabled = true - edit_button.disabled = false - - func _clear_views(session_id): - if not session_id in dashboard_tabs: - return - - var dashboard = dashboard_tabs[session_id] - var key_list = dashboard.find_child("key_list", true, false) - var key_value_view = dashboard.find_child("key_value_view", true, false) - var edit_button = dashboard.find_child("edit_button", true, false) - var save_button = dashboard.find_child("save_button", true, false) - - if key_list: - key_list.clear() - if key_value_view: - key_value_view.text = "" - if edit_button: - edit_button.disabled = true - if save_button: - save_button.disabled = true - - func _populate_pubsub_events(session_id): - var dashboard = dashboard_tabs[session_id] - var events_tree = dashboard.find_child("PubSubEventsTree", true, false) - if not events_tree: - return - events_tree.clear() - var root = events_tree.create_item() - for event in _pubsub_events.get(session_id, []): - var event_item = events_tree.create_item(root) - event_item.set_text(0, event.message) - event_item.set_text(1, JSON.stringify(event.data)) - - func _update_pubsub_tree(session_id, channels_data, patterns_data): - var dashboard = dashboard_tabs[session_id] - var pub_sub_tree = dashboard.find_child("PubSubTree", true, false) - if not pub_sub_tree: - return - - pub_sub_tree.clear() - var root = pub_sub_tree.create_item() - - var channels_item = pub_sub_tree.create_item(root) - channels_item.set_text(0, "Channels") - for channel_name in channels_data: - var subscribers = channels_data[channel_name] - var channel_item = pub_sub_tree.create_item(channels_item) - channel_item.set_text(0, channel_name) - for sub in subscribers: - var sub_item = pub_sub_tree.create_item(channel_item) - sub_item.set_text(0, str(sub)) - - var patterns_item = pub_sub_tree.create_item(root) - patterns_item.set_text(0, "Patterns") - for pattern_name in patterns_data: - var subscribers = patterns_data[pattern_name] - var pattern_item = pub_sub_tree.create_item(patterns_item) - pattern_item.set_text(0, pattern_name) - for sub in subscribers: - var sub_item = pub_sub_tree.create_item(pattern_item) - sub_item.set_text(0, str(sub)) - - func send_message_to_game(message: String, data: Array): - var session_id = get_current_session_id() - if session_id != -1: - var session = get_session(session_id) - if session and session.is_active(): - session.send_message("gedis:" + message, data) - - func get_current_session_id(): - for session_id in dashboard_tabs: - var session = get_session(session_id) - if session and session.is_active(): - return session_id - return -1 - -var debugger_plugin - -func _enter_tree(): - debugger_plugin = GedisDebuggerPlugin.new() - add_debugger_plugin(debugger_plugin) - -func _exit_tree(): - remove_debugger_plugin(debugger_plugin) - debugger_plugin = null diff --git a/godot/addons/Gedis/plugin.gd.uid b/godot/addons/Gedis/plugin.gd.uid deleted file mode 100644 index 1d8c476..0000000 --- a/godot/addons/Gedis/plugin.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bad4nw3ewpjx6 diff --git a/godot/addons/GedisQueue/GedisQueue.gd b/godot/addons/GedisQueue/GedisQueue.gd deleted file mode 100644 index 4a20392..0000000 --- a/godot/addons/GedisQueue/GedisQueue.gd +++ /dev/null @@ -1,274 +0,0 @@ -extends Node -class_name GedisQueue - -## Manages job queues and workers. -## -## This class provides a high-level interface for creating and managing job queues -## that are processed by workers. It uses Gedis (a Godot Redis-like in-memory -## data structure server) for storing job information and queue state. - -## Emitted when a job is completed successfully. -signal completed(job: GedisJob, return_value) -## Emitted when a job fails. -signal failed(job: GedisJob, error_message: String) -## Emitted when a job's progress is updated. -signal progress(job: GedisJob, value: float) - -const QUEUE_PREFIX = "gedis_queue:" - -var max_completed_jobs := 0 -var max_failed_jobs := 0 - -const STATUS_WAITING = "waiting" -const STATUS_ACTIVE = "active" -const STATUS_COMPLETED = "completed" -const STATUS_FAILED = "failed" - -var _gedis: Gedis -var _workers: Array[GedisWorker] = [] - -## Sets up the GedisQueue with a Gedis instance. -## -## If no Gedis instance is provided, a new one will be created automatically -## when needed. -## -## @param gedis_instance The Gedis instance to use. -func setup(gedis_instance: Gedis = null): - if gedis_instance: - _gedis = gedis_instance - else: - _gedis = Gedis.new() - _gedis.name = "Gedis" - add_child(_gedis) - -## Adds a new job to a queue. -## -## @param queue_name The name of the queue to add the job to. -## @param job_data A dictionary containing the data for the job. -## @param opts A dictionary of options for the job. -## "add_to_front": (bool) If true, adds the job to the front of the queue. -## @return The newly created GedisJob. -func add(queue_name: String, job_data: Dictionary, opts: Dictionary = {}) -> GedisJob: - _ensure_gedis_instance() - - var job_id = _generate_job_id() - var job_key = _get_job_key(queue_name, job_id) - var job = GedisJob.new(self, queue_name, job_id, job_data) - - var job_hash = { - "id": job_id, - "data": job_data, - "status": STATUS_WAITING, - "progress": 0.0 - } - - for key in job_hash: - _gedis.hset(job_key, key, job_hash[key]) - - if opts.get("add_to_front", false): - _gedis.lpush(_get_queue_key(queue_name, STATUS_WAITING), job_id) - else: - _gedis.rpush(_get_queue_key(queue_name, STATUS_WAITING), job_id) - - _gedis.publish(_get_event_channel(queue_name, "added"), {"job_id": job_id, "data": job_data}) - - return job - -## Retrieves a job from a queue by its ID. -## -## @param queue_name The name of the queue. -## @param job_id The ID of the job to retrieve. -## @return The GedisJob if found, otherwise null. -func get_job(queue_name: String, job_id: String) -> GedisJob: - var job_key = _get_job_key(queue_name, job_id) - var job_hash = _gedis.hgetall(job_key) - - if job_hash.is_empty(): - return null - - var job_data = job_hash.get("data", {}) - var job_status = job_hash.get("status", GedisQueue.STATUS_WAITING) - var job = GedisJob.new(self, queue_name, job_id, job_data, job_status) - return job - -## Retrieves a list of jobs from a queue. -## -## @param queue_name The name of the queue. -## @param types An array of job statuses to retrieve (e.g., ["waiting", "active"]). -## @param start The starting index. -## @param end The ending index. -## @param asc Whether to sort in ascending order (currently unused). -## @return An array of GedisJob objects. -func get_jobs(queue_name: String, types: Array, start: int = 0, end: int = -1, asc: bool = false) -> Array[GedisJob]: - var jobs: Array[GedisJob] = [] - for type in types: - var queue_key = _get_queue_key(queue_name, type) - var job_ids = _gedis.lrange(queue_key, start, end) - for job_id in job_ids: - var job = get_job(queue_name, job_id) - if job: - jobs.append(job) - return jobs - -## Pauses a queue. -## -## When a queue is paused, workers will not process any new jobs from it. -## -## @param queue_name The name of the queue to pause. -func pause(queue_name: String) -> void: - _ensure_gedis_instance() - - var state_key = _get_state_key(queue_name) - _gedis.hset(state_key, "paused", "1") - -## Resumes a paused queue. -## -## @param queue_name The name of the queue to resume. -func resume(queue_name: String) -> void: - _ensure_gedis_instance() - - var state_key = _get_state_key(queue_name) - _gedis.hdel(state_key, "paused") - -## Checks if a queue is paused. -## -## @param queue_name The name of the queue. -## @return True if the queue is paused, otherwise false. -func is_paused(queue_name: String) -> bool: - _ensure_gedis_instance() - - var state_key = _get_state_key(queue_name) - return _gedis.hexists(state_key, "paused") - -## Updates the progress of a job. -## -## @param queue_name The name of the queue. -## @param job_id The ID of the job. -## @param value The new progress value (0.0 to 1.0). -func update_job_progress(queue_name: String, job_id: String, value: float): - _ensure_gedis_instance() - - var job_key = _get_job_key(queue_name, job_id) - _gedis.hset(job_key, "progress", value) - _gedis.publish(_get_event_channel(queue_name, "progress"), {"job_id": job_id, "progress": value}) - progress.emit(get_job(queue_name, job_id), value) - -## Removes a job from a queue. -## -## @param queue_name The name of the queue. -## @param job_id The ID of the job to remove. -func remove_job(queue_name: String, job_id: String): - _ensure_gedis_instance() - - var job_key = _get_job_key(queue_name, job_id) - _gedis.del(job_key) - - # Remove the job ID from all possible status lists - for status in [STATUS_WAITING, STATUS_ACTIVE, STATUS_COMPLETED, STATUS_FAILED]: - var queue_key = _get_queue_key(queue_name, status) - _gedis.lrem(queue_key, 0, job_id) - -func _get_queue_key(queue_name: String, status: String = STATUS_WAITING) -> String: - return "%s%s:%s" % [QUEUE_PREFIX, queue_name, status] - -func _get_job_key(queue_name: String, job_id: String) -> String: - return QUEUE_PREFIX + queue_name + ":job:" + job_id - -func _get_state_key(queue_name: String) -> String: - return QUEUE_PREFIX + queue_name + ":state" - -func _get_event_channel(queue_name: String, event: String) -> String: - return "%s%s:events:%s" % [QUEUE_PREFIX, queue_name, event] - -func _generate_job_id() -> String: - var t = Time.get_unix_time_from_system() - var r = randi() % 1000 - return "%s-%s" % [t, r] - -func _ensure_gedis_instance(): - if not _gedis: - var gedis_instance = Gedis.new() - gedis_instance.name = "Gedis" - add_child(gedis_instance) - setup(gedis_instance) - -## Starts a worker to process jobs from a queue. -## -## @param queue_name The name of the queue to process. -## @param processor A callable that will be executed for each job. -## @return The newly created GedisWorker. -func process(queue_name: String, processor: Callable, p_batch_size: int = 1) -> GedisWorker: - var worker = GedisWorker.new(self, queue_name, processor, p_batch_size) - add_child(worker) - _workers.append(worker) - worker.start() - return worker - -## Closes all workers for a specific queue. -## -## @param queue_name The name of the queue. -func close(queue_name: String) -> void: - var workers_to_remove: Array[GedisWorker] = [] - for worker in _workers: - if worker._queue_name == queue_name: - workers_to_remove.append(worker) - - for worker in workers_to_remove: - worker.close() - _workers.erase(worker) - worker.queue_free() - -func _enter_tree() -> void: - if !_gedis: - var gedis_instance = Gedis.new() - gedis_instance.name = "Gedis" - add_child(gedis_instance) - _gedis = gedis_instance - -func _exit_tree(): - for worker in _workers: - if is_instance_valid(worker): - worker.close() - -## Marks a job as completed. -## -## @param job The job to mark as completed. -## @param return_value The return value of the job. -func _job_completed(job: GedisJob, return_value): - _ensure_gedis_instance() - var job_key = _get_job_key(job.queue_name, job.id) - _gedis.lrem(_get_queue_key(job.queue_name, STATUS_ACTIVE), 1, job.id) - - completed.emit(job, return_value) - _gedis.publish(_get_event_channel(job.queue_name, "completed"), {"job_id": job.id, "return_value": return_value}) - - if max_completed_jobs == 0: - _gedis.del(job_key) - else: - _gedis.hset(job_key, "status", STATUS_COMPLETED) - _gedis.hset(job_key, "returnvalue", return_value) - _gedis.lpush(_get_queue_key(job.queue_name, STATUS_COMPLETED), job.id) - if max_completed_jobs > 0: - _gedis.ltrim(_get_queue_key(job.queue_name, STATUS_COMPLETED), 0, max_completed_jobs - 1) - - -## Marks a job as failed. -## -## @param job The job to mark as failed. -## @param error_message The error message. -func _job_failed(job: GedisJob, error_message: String): - _ensure_gedis_instance() - var job_key = _get_job_key(job.queue_name, job.id) - _gedis.lrem(_get_queue_key(job.queue_name, STATUS_ACTIVE), 1, job.id) - - failed.emit(job, error_message) - _gedis.publish(_get_event_channel(job.queue_name, "failed"), {"job_id": job.id, "error_message": error_message}) - - if max_failed_jobs == 0: - _gedis.del(job_key) - else: - _gedis.hset(job_key, "status", STATUS_FAILED) - _gedis.hset(job_key, "failed_reason", error_message) - _gedis.lpush(_get_queue_key(job.queue_name, STATUS_FAILED), job.id) - if max_failed_jobs > 0: - _gedis.ltrim(_get_queue_key(job.queue_name, STATUS_FAILED), 0, max_failed_jobs - 1) diff --git a/godot/addons/GedisQueue/GedisQueue.gd.uid b/godot/addons/GedisQueue/GedisQueue.gd.uid deleted file mode 100644 index ed26305..0000000 --- a/godot/addons/GedisQueue/GedisQueue.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cbcpxfgtw831t diff --git a/godot/addons/GedisQueue/GedisQueueJob.gd b/godot/addons/GedisQueue/GedisQueueJob.gd deleted file mode 100644 index 32c6bd1..0000000 --- a/godot/addons/GedisQueue/GedisQueueJob.gd +++ /dev/null @@ -1,51 +0,0 @@ -extends RefCounted - -class_name GedisJob - -## Represents a job in a GedisQueue. -## -## This class holds information about a job, such as its ID, data, and status. -## It also provides methods for interacting with the job, such as updating its -## progress and removing it from the queue. - -var id: String -var data: Dictionary -var queue_name: String -var status: String - -var _gedis_queue - -func _init(p_gedis_queue, p_queue_name: String, p_id: String, p_data: Dictionary, p_status: String = GedisQueue.STATUS_WAITING): - _gedis_queue = p_gedis_queue - queue_name = p_queue_name - id = p_id - data = p_data - status = p_status - -## Updates the progress of the job. -## -## @param value The new progress value (0.0 to 1.0). -func progress(value: float) -> void: - _gedis_queue.update_job_progress(queue_name, id, value) - -## Removes the job from the queue. -func remove() -> void: - _gedis_queue.remove_job(queue_name, id) - -## Marks the job as completed. -## -## This should be called by a worker's processor function when the job has -## been successfully processed. -## -## @param return_value An optional value to store as the result of the job. -func complete(return_value: Variant = null) -> void: - _gedis_queue._job_completed(self, return_value) - -## Marks the job as failed. -## -## This should be called by a worker's processor function when the job has -## failed to be processed. -## -## @param error_message The error message to store for the failed job. -func fail(error_message: String) -> void: - _gedis_queue._job_failed(self, error_message) \ No newline at end of file diff --git a/godot/addons/GedisQueue/GedisQueueJob.gd.uid b/godot/addons/GedisQueue/GedisQueueJob.gd.uid deleted file mode 100644 index a8c51f8..0000000 --- a/godot/addons/GedisQueue/GedisQueueJob.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://3qjcot47lxgw diff --git a/godot/addons/GedisQueue/GedisQueueWorker.gd b/godot/addons/GedisQueue/GedisQueueWorker.gd deleted file mode 100644 index e67b76e..0000000 --- a/godot/addons/GedisQueue/GedisQueueWorker.gd +++ /dev/null @@ -1,106 +0,0 @@ -extends Node - -class_name GedisWorker - -## Processes jobs from a GedisQueue. -## -## A worker is responsible for fetching jobs from a specific queue and executing -## a processor function for each job. -## -## The processor function receives the job and is responsible for calling -## `job.complete()` or `job.fail()` to finish the job. The worker itself does -## not handle the return value of the processor. - -signal completed(job: GedisJob, return_value) -signal failed(job: GedisJob, error_message: String) -signal progress(job: GedisJob, value: float) -signal _batch_completed - -var _gedis_queue: GedisQueue -var _queue_name: String -var _processor: Callable -var _is_running = false -var _gedis: Gedis -var _jobs_in_progress = {} - -var batch_size = 1 - -func _init(p_gedis_queue: GedisQueue, p_queue_name: String, p_processor: Callable, p_batch_size: int = 1): - _gedis_queue = p_gedis_queue - _gedis = _gedis_queue._gedis - _queue_name = p_queue_name - _processor = p_processor - batch_size = p_batch_size - - _gedis_queue.completed.connect(_on_job_completed) - _gedis_queue.failed.connect(_on_job_failed) - _gedis_queue.progress.connect(func(job: GedisJob, value: float): progress.emit(job, value)) - -## Starts the worker. -func start(): - _is_running = true - _process_jobs() - -## Stops the worker. -func close(): - _is_running = false - -func _on_job_completed(job: GedisJob, return_value): - if _jobs_in_progress.has(job.id): - _jobs_in_progress.erase(job.id) - if _jobs_in_progress.is_empty(): - _batch_completed.emit() - completed.emit(job, return_value) - -func _on_job_failed(job: GedisJob, error_message: String): - if _jobs_in_progress.has(job.id): - _jobs_in_progress.erase(job.id) - if _jobs_in_progress.is_empty(): - _batch_completed.emit() - failed.emit(job, error_message) - -func _process_jobs(): - await get_tree().process_frame - while _is_running: - if _gedis_queue.is_paused(_queue_name): - await get_tree().create_timer(1.0).timeout - continue - - var job_ids = [] - for i in range(batch_size): - var job_id = _gedis.lpop(_gedis_queue._get_queue_key(_queue_name, GedisQueue.STATUS_WAITING)) - if not job_id: - break - job_ids.append(job_id) - - if job_ids.is_empty(): - if Engine.is_editor_hint(): - await get_tree().process_frame - else: - if get_tree(): - await get_tree().process_frame - continue - - for job_id in job_ids: - _gedis.lpush(_gedis_queue._get_queue_key(_queue_name, GedisQueue.STATUS_ACTIVE), job_id) - var job = _gedis_queue.get_job(_queue_name, job_id) - if not job: - push_warning("GedisQueueWorker: Job with id %s not found." % job_id) - continue - - _jobs_in_progress[job_id] = job - var job_key = _gedis_queue._get_job_key(_queue_name, job_id) - _gedis.hset(job_key, "status", GedisQueue.STATUS_ACTIVE) - _gedis_queue._gedis.publish(_gedis_queue._get_event_channel(_queue_name, "active"), {"job_id": job.id}) - _process_job(job) - - if not _jobs_in_progress.is_empty(): - await _batch_completed - -func _process_job(job: GedisJob): - var result = await _processor.call(job) - if result is Object and result.has_method("is_valid"): - result = await result - - if job.status == GedisQueue.STATUS_ACTIVE: - job.complete(result) diff --git a/godot/addons/GedisQueue/GedisQueueWorker.gd.uid b/godot/addons/GedisQueue/GedisQueueWorker.gd.uid deleted file mode 100644 index 8095ee3..0000000 --- a/godot/addons/GedisQueue/GedisQueueWorker.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ccq10gtvm32oo diff --git a/godot/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd b/godot/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd deleted file mode 100644 index 3e1795c..0000000 --- a/godot/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd +++ /dev/null @@ -1,67 +0,0 @@ -@tool -extends VBoxContainer - -# UI references will be set from the scene -@export var queues_tree: Tree -@export var jobs_tree: Tree -@export var job_details_text: TextEdit -@export var refresh_button: Button - -var plugin - -func _ready() -> void: - if refresh_button: - refresh_button.pressed.connect(_on_refresh_pressed) - - # Set column titles for the queues tree - queues_tree.set_column_titles_visible(true) - queues_tree.set_column_title(0, "Queue") - queues_tree.set_column_title(1, "Jobs") - - # Set column titles for the jobs tree - jobs_tree.set_column_titles_visible(true) - jobs_tree.set_column_title(0, "ID") - jobs_tree.set_column_title(1, "Queue") - jobs_tree.set_column_title(2, "Status") - -func set_plugin(p) -> void: - plugin = p - -func _on_refresh_pressed() -> void: - if plugin: - # This assumes the main dashboard has an instance selector - var selected_id = get_parent().get_parent().instance_selector.get_item_id(get_parent().get_parent().instance_selector.selected) - var session_id = plugin.get_current_session_id() - if session_id != -1: - plugin._fetch_keys_for_selected_instance(session_id) - -func update_queues(data: Dictionary) -> void: - queues_tree.clear() - var root = queues_tree.create_item() - queues_tree.hide_root = true - - for queue_name in data: - var queue_item = queues_tree.create_item(root) - queue_item.set_text(0, queue_name) - queue_item.set_text(1, str(data[queue_name].size())) - -func update_jobs(jobs: Array) -> void: - jobs_tree.clear() - var root = jobs_tree.create_item() - jobs_tree.hide_root = true - - for job in jobs: - var job_item = jobs_tree.create_item(root) - job_item.set_text(0, job.id) - job_item.set_text(1, job.queue_name) - job_item.set_text(2, job.status) - job_item.set_meta("data", job.data) - -func _on_jobs_tree_item_selected() -> void: - var selected_item = jobs_tree.get_selected() - if selected_item: - job_details_text.text = selected_item.get_meta("data") - -func _on_queues_tree_item_selected() -> void: - # TODO: should filter out jobs not the selected queue - pass diff --git a/godot/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd.uid b/godot/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd.uid deleted file mode 100644 index cb05b85..0000000 --- a/godot/addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c5fv5yw1cok24 diff --git a/godot/addons/GedisQueue/debugger/gedis_queue_debugger_panel.tscn b/godot/addons/GedisQueue/debugger/gedis_queue_debugger_panel.tscn deleted file mode 100644 index 7c2b9c7..0000000 --- a/godot/addons/GedisQueue/debugger/gedis_queue_debugger_panel.tscn +++ /dev/null @@ -1,48 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://b5h5h5h5h5h5"] - -[ext_resource type="Script" uid="uid://c5fv5yw1cok24" path="res://addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd" id="1_abcde"] - -[node name="GedisQueueDebuggerPanel" type="VBoxContainer" node_paths=PackedStringArray("queues_tree", "jobs_tree", "job_details_text", "refresh_button")] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -script = ExtResource("1_abcde") -queues_tree = NodePath("HSplitContainer/QueuesTree") -jobs_tree = NodePath("HSplitContainer/JobsVBox/JobsTree") -job_details_text = NodePath("HSplitContainer/JobsVBox/JobDetailsText") -refresh_button = NodePath("RefreshButton") - -[node name="RefreshButton" type="Button" parent="."] -layout_mode = 2 -text = "Refresh Queues" - -[node name="HSplitContainer" type="HSplitContainer" parent="."] -layout_mode = 2 -size_flags_vertical = 3 - -[node name="QueuesTree" type="Tree" parent="HSplitContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_stretch_ratio = 0.3 -columns = 2 -column_titles_visible = true -select_mode = 1 - -[node name="JobsVBox" type="VBoxContainer" parent="HSplitContainer"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="JobsTree" type="Tree" parent="HSplitContainer/JobsVBox"] -layout_mode = 2 -size_flags_vertical = 3 -columns = 3 -column_titles_visible = true -select_mode = 1 - -[node name="JobDetailsText" type="TextEdit" parent="HSplitContainer/JobsVBox"] -layout_mode = 2 -size_flags_vertical = 3 -editable = false - -[connection signal="item_selected" from="HSplitContainer/QueuesTree" to="." method="_on_queues_tree_item_selected"] -[connection signal="item_selected" from="HSplitContainer/JobsVBox/JobsTree" to="." method="_on_jobs_tree_item_selected"] diff --git a/godot/addons/GedisQueue/icon.png b/godot/addons/GedisQueue/icon.png deleted file mode 100644 index 3829df9801107692001ff20e3b6cdf715649c0ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105347 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 KedLvkZ^GX^T5&4? diff --git a/godot/addons/GedisQueue/icon.png.import b/godot/addons/GedisQueue/icon.png.import deleted file mode 100644 index 74e27cc..0000000 --- a/godot/addons/GedisQueue/icon.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://48jxifffcg1y" -path="res://.godot/imported/icon.png-bff46c8d6bc629df6e2505dfe04b11b4.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/GedisQueue/icon.png" -dest_files=["res://.godot/imported/icon.png-bff46c8d6bc629df6e2505dfe04b11b4.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/godot/addons/GedisQueue/plugin.cfg b/godot/addons/GedisQueue/plugin.cfg deleted file mode 100644 index 8968b1b..0000000 --- a/godot/addons/GedisQueue/plugin.cfg +++ /dev/null @@ -1,7 +0,0 @@ -[plugin] - -name="GedisQueue" -description="A BullMQ-like queue system for Godot, backed by Gedis." -author="NodotProject" -version="0.1.9" -script="plugin.gd" \ No newline at end of file diff --git a/godot/addons/GedisQueue/plugin.gd b/godot/addons/GedisQueue/plugin.gd deleted file mode 100644 index 8f3c3e6..0000000 --- a/godot/addons/GedisQueue/plugin.gd +++ /dev/null @@ -1,87 +0,0 @@ -@tool -extends EditorPlugin - -const GedisQueueDebuggerPanel = preload("res://addons/GedisQueue/debugger/gedis_queue_debugger_panel.tscn") - -var queue_debugger_plugin -var queue_panel -var dashboard - -func _enter_tree(): - queue_debugger_plugin = GedisQueueDebuggerPlugin.new() - add_debugger_plugin(queue_debugger_plugin) - - var timer = Timer.new() - timer.wait_time = 1 - timer.timeout.connect(_on_timer_timeout) - add_child(timer) - timer.start() - -func _on_timer_timeout(): - var editor_node = EditorInterface.get_base_control() - dashboard = editor_node.find_child("Gedis", true, false) - - if dashboard: - var debugger = dashboard.plugin - if debugger: - var tab_container = dashboard.find_child("TabContainer", true, false) - if tab_container: - queue_panel = dashboard.find_child("Queue", true, false) - if !queue_panel: - queue_panel = GedisQueueDebuggerPanel.instantiate() - queue_panel.name = "Queue" - tab_container.add_child(queue_panel) - queue_panel.set_plugin(debugger) - - var session_id = debugger.get_current_session_id() - if session_id != -1: - queue_debugger_plugin.set_queue_panel(session_id, queue_panel) - - -func _exit_tree(): - if queue_debugger_plugin: - remove_debugger_plugin(queue_debugger_plugin) - queue_debugger_plugin = null - if queue_panel: - queue_panel.queue_free() - -class GedisQueueDebuggerPlugin extends EditorDebuggerPlugin: - var queue_panels = {} - - func set_queue_panel(session_id, panel): - queue_panels[session_id] = panel - - func _has_capture(capture): - return capture == "gedis" - - func _capture(message, data, session_id): - var parts = message.split(":") - var kind = parts[1] if parts.size() > 1 else "" - - if session_id in queue_panels: - var queue_panel = queue_panels[session_id] - match kind: - "snapshot_data": - if queue_panel: - var snapshot = data[0] - var queues = {} - var jobs = [] - - for key in snapshot: - var value = snapshot[key] - if "job" in key: - var job_data = value["value"] - var key_parts = key.split(":") - if key_parts.size() > 2: - job_data["queue_name"] = key_parts[1] - jobs.append(job_data) - else: - var queue_name = key.replace("gedis_queue:", "").replace(":waiting", "").replace(":active", "") - if not queue_name in queues: - queues[queue_name] = [] - queues[queue_name].append_array(value["value"]) - - queue_panel.update_queues(queues) - queue_panel.update_jobs(jobs) - return true - return false diff --git a/godot/addons/GedisQueue/plugin.gd.uid b/godot/addons/GedisQueue/plugin.gd.uid deleted file mode 100644 index 376e978..0000000 --- a/godot/addons/GedisQueue/plugin.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://vbxscf2mqmmy diff --git a/godot/addons/PaletteTools/Images/Blank.png b/godot/addons/PaletteTools/Images/Blank.png deleted file mode 100644 index 7966a87f112de042305f877dd5d11998ac5e6376..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|bUj@hLo9le z|NI96`~UxpHy9WiO<5ree{2QmdKI;Vst04UBa2LJ#7 diff --git a/godot/addons/PaletteTools/Images/Plus.png.import b/godot/addons/PaletteTools/Images/Plus.png.import deleted file mode 100644 index 15ad244..0000000 --- a/godot/addons/PaletteTools/Images/Plus.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bv0rua34hrcsa" -path="res://.godot/imported/Plus.png-e4e5eebf42f899e6f55e4d0ffe60c50a.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/PaletteTools/Images/Plus.png" -dest_files=["res://.godot/imported/Plus.png-e4e5eebf42f899e6f55e4d0ffe60c50a.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/godot/addons/PaletteTools/Images/checked.png b/godot/addons/PaletteTools/Images/checked.png deleted file mode 100755 index 1b76d169b7109953262cefd35380440b3e85b398..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4754 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 diff --git a/godot/addons/PaletteTools/Images/checked_4k.png.import b/godot/addons/PaletteTools/Images/checked_4k.png.import deleted file mode 100644 index c6134a5..0000000 --- a/godot/addons/PaletteTools/Images/checked_4k.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://blxftvivd7x5x" -path="res://.godot/imported/checked_4k.png-342c0f16a75c36f211dc8d6291dcbfde.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/PaletteTools/Images/checked_4k.png" -dest_files=["res://.godot/imported/checked_4k.png-342c0f16a75c36f211dc8d6291dcbfde.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/godot/addons/PaletteTools/Images/spyglass.png b/godot/addons/PaletteTools/Images/spyglass.png deleted file mode 100644 index cd33f77906cc37f743c1be8a7fe4e5b99f87b345..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|QaoK8Lo9mF zPCCeUK!L-#@X){i)$GUSdbCaI{J6kY^0l@vOG4nw^D1Yy?oHNgD`Xa_iLiRFX5tvj zkho6n1?$EsCA{%`DN-)W>!WqdZ^#$i(9dAD_1B+tD9bJE<^ef@OLh_raXUU4#S5|j R?*iJ#;OXk;vd$@?2>@^aIh6na diff --git a/godot/addons/PaletteTools/Images/spyglass.png.import b/godot/addons/PaletteTools/Images/spyglass.png.import deleted file mode 100644 index 58b186c..0000000 --- a/godot/addons/PaletteTools/Images/spyglass.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://duuedcimehb1f" -path="res://.godot/imported/spyglass.png-c8a5839ba62e6621291233abb45e1ee9.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/PaletteTools/Images/spyglass.png" -dest_files=["res://.godot/imported/spyglass.png-c8a5839ba62e6621291233abb45e1ee9.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/godot/addons/PaletteTools/Images/unchecked.png b/godot/addons/PaletteTools/Images/unchecked.png deleted file mode 100755 index c8262c12dce6a185fc8239a1c630a7e08c7bedf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4376 zcmeHKdsGzX6(6VyB6?y3HCF9pF^M+L&SRH-Oj*prqO4|d1ymqtot^n+8Q9rfb_dvn zqo5L>i5jh^YNdjYNSh`?mBc6(j9Sf!BED*xYUTKdV#HvyNfcB2%`VT=oYTWO&428i zdELkFe)o6pchAmhYs!q_5#u5d1Q~8lHl@P*Wcdsq0D%Ro(iN}GJ&^gy(EMB5njiZc z?wo6!W4^$Dd~-a4WgXmE+frS@HaAU(t2@}#`ux}!V{}8-#A|2$^^x`IQY+7$eevFV z)<-jI#?_7yR%ew)?xNl*U$E*}<&*sh$`7yZsM*21`M7F&Zr;5e9V^-<41G58%e0+? zYLdT2&ac~$9)9J8uaKV?-`_O)+L@XSr6t=c@%vSoQSI(6zd?|Yav?F%YEDe-N(QE| zeepYn=bpFL(MpY$LM`slf{?=cph2+%i@q;ffTRv^= z+^{kB1rxFd8{5N@U;uUc)jX!&e>Of0_`l55L}O`A19r z?C}6(z7+q;L~U!?@%7pBqa&zjlvu-k~jq|fX*Q}eV zr{;#loD9uvMh`D(*M4t!<2~Kh_KlyIE5AFDA3uF*v$8o?*YsWOjRPrVEh_h(qNjB) z6A#VByLO#eS9VlvxqfKZl#<3nr@FQD6xQ7E<(c=7tiKS3 z&e}io8WOg$F=O?gFE74-^|Ilk(vmM8c7$X*JilLja#09uI-dZWE5q_S&ALP-!?|og z=@Z?s>kuSvn$OL!c|byKz%DoqimwkhC{TejDCWmn2#Y%rd9*|a?lFkiX2ID(>PvKRHQ6YDP0~rPU`h~oS<-u!k`7_^*bfThdI45GDHx= z1iY+Aa7%*AiOQIa%~c>76bh(EyVfVVEtYP0r?-;@$OrCY+&HNua8bm2dw8X!LI~2i zpda<{ro%morvk65z{7&1Lg18QdP8t*x4*l<;|Qd~u{dx55t@2oRI*RV8D@*M+e4jSMC90Xl1d`CKp>EFVAc;DCGDw=VAqp z4m|P%L#W_^Q972y)OucnF{GNucvhv41!^vqkEMD+nVnvVak4;$g5XL4;%InIqtS61 zjG}B5rshc!v#EF<)A9^y11dGe>tlOC%=QSdD;Y=cRmo5sgraN&!)akpXf&J}Q?n|7 z=>f0D)TB)hG&V{DcufF`W9jKGkI2As3L;|%xZ7zDC}hHEqt$FsP)edlVs$VQ4;>7O z*9B*RuSbzCh#*a3WHw1HL8;Vgl2XNLV^x}9pa9-H;PJvvlrc#{sS0Z3vd}OYNGv1w zDFg_>!d&P?4`3vhC*9?87!)!DDtmUTEpR(=jKr822|!R7mL@5hB-2S9O;I#KVuY3^ zdfB@;f%pF}YkBjaalw)&3tkxC9}oq1R2s++z6D<$LSQSQXkb&&3>!?r%M=1Guug~- zRIxdX(+=SD=xo<6x$q;cU}GpP1+)wX86>*8i6Sr^(AhW=mXpxx`l5SXyi~+^fYA6W3T+)^uJ>8_gr|^GO{>Sql`4-ZP9*jsCyrpB?JInu$ zP3%Yu3winOltz=`W+gJXdQyI2&AyzhjaNd$kq?mjmd$@nuKU}P@3C)2W;_jbUr<*V j!Gng4TwC~9^z8-s-BB1KB`zEU^Fho>DW(q+7A^Y^7b!t7 diff --git a/godot/addons/PaletteTools/Images/unchecked.png.import b/godot/addons/PaletteTools/Images/unchecked.png.import deleted file mode 100644 index a64f708..0000000 --- a/godot/addons/PaletteTools/Images/unchecked.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://585mb8p87t5x" -path="res://.godot/imported/unchecked.png-5249d27fb8a908d32590159e278c99c8.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/PaletteTools/Images/unchecked.png" -dest_files=["res://.godot/imported/unchecked.png-5249d27fb8a908d32590159e278c99c8.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/godot/addons/PaletteTools/Images/unchecked_4k.png b/godot/addons/PaletteTools/Images/unchecked_4k.png deleted file mode 100644 index 0b49623a216261c1ca298907165ae20274118b64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4532 zcmeHKdsGu=77sMaOI)mgo~pa!fDg7zGLr{Mri5pB1Pp|ig0jWQ%mhaAA{iiHRf3Ao zf(y0PYTdG+*4wXj7r#)wn=WPEY$z&+YKk^4*iccQk(KMwLr_tzKa`wp zt=m}5|8&QjD--zj2?r}wb+z6}Dbs&Jy`@e5-r~8*Kj7Hzl|w&tBp-Hct_aTAIndXN zdu4RyY}nc6I=HR$qf;q`0gGo>&yze|9-Q&kKjz$2Ue&%*Thkl*xZ%}5wIKHwEWWKM z;EU(XD|>qHoVTm@C-}MT`+eqp@P~cG!e@_J=rxyn0(ecrKfm=xD7vI(jr5 z5XAmFK|_uB`oi(Pt0$@+5ac#7FA) zTyET6yJAzH7gWCKN-&vJeXYNtaqYwU(>opoKl>;=KLW{|;lB04@hhmY+q=6@^F>#4 z@_d@kS`@bAm$JUH3su=GLf7BVwq|whO%dLb?ZTsgLfe{l30x!{7ds`1jPd z43~gQu4~$%Gwb_h-ziu9QNFjox>fz|;KhQlSVy~{eU1F;;L-a{No8GP%faHI6N}MD z>e9NpiSq#9IXiKg?I_);sKR+^MfmgbWR3JwqR z47K9`z(}(MWH%a2Hr%d+owzu7=EOo6a;mWTN;p%ag`&+?8j=Vk0u+g{Gesge%o7T= zQhGd96*~d}MoKu3Wi7Z+SX^8zC>9IM)?6W`P$-0`NGK8^Km)Orm{`J&m}~(Y#4v`6 zwvkrG!ZKzP#90p-%Q)!#I&`Q!VMYM?xmIptHBu#MG9#HZ3L<|uqrlb$vCw}J7&RA zkjoe?PAfq6Bu$plkCQdYH*Urm&O}Fm`55jb?a|ns%0Nq_!Bu9mkaJJ1Qo`K&IAtao z3U@wAL-d$l79vGt5{y73m?#91D-=3Jst{8Wy;OpVq{IX$waLa3CX(i$0JwkwIC?Q9 z(}^fCA|^--k;tVeq992EK~X|MU{V6pQ@RNd$yNqbC1IH86$eEDs1SuhPRIdN2rUyK z5*@8a6toCKq?lArh(hG3P8Q;XqDVZ}Y&8-fos5ylrG*w#u5*GT9FNqhm9R*Fj!U!# zg4F{9CA^F=723xq(itP2#u6Nxm<$z(B@zrp6=D=q$i|hH(^ea(L=F=}1>#{BxU}FP z7(gt+)hPgQT7X#aXe&*yW^20HY*50SOAu!{Hmw2Mi6U4+MX)pg1%n+FOVPI)|I1M8PKMZ-HPjV>4-4G#^Bb1OlRb5r01IUItG zD55E+p8#ukip(QSxish=Bjq|OXMUm-NF7&Bav8{)9F&3tWKuzbx)RCslw6?~=|eF2 zWOSQZ&lVF_Ix-jV2)F{}>EsGp>P%G7WbNWSn#%$p48cUm7-150gfQVqz(THPj7A(P z{1GRiPK60g2G|YDK=T5yl!&d>N6$;HpO0)U=c+UUOtUCv;2iXp^e>`pJDOWhqo_ZnWitgsz#5U^7n%I{ckjv|z96z?Gkq>}*yauc| zhaMXGT>oLO)lpl2Y3H;swk4vi`Gq+5uRrl|1n%NjNAThPhl5?K8eAHyZ&rU;9g05= zVsa|aW~4vVRvy{nzWb#&>TX=w{Pv@0jnA@cHTCKo{|=dW)!nqF&UK|;j#DR5*R+Ky z$Rp5E7Qw&PIs&=NfBK7CBfxLv9)Le{b{_S*e=OuG_V0ZUcDNh1E!@S2eKKE|74JGL z-m3=q;Ny7T5$NM^S3&uZhiY}zpV`LF&O5T|qK=`+@Oj?h11CHB6EE%aZb>cthECb6 z+M6Vse}L><;t(H;^$Gxnd=BH;w=qu^6*Tu9hRxr7)pX&tFU&W(%hw(`(39fV(OZ3Y c8^;Ot7ulhRsE!I9qT`0@m?YH)QLD@U3p0~*_W%F@ diff --git a/godot/addons/PaletteTools/Images/unchecked_4k.png.import b/godot/addons/PaletteTools/Images/unchecked_4k.png.import deleted file mode 100644 index cd908a0..0000000 --- a/godot/addons/PaletteTools/Images/unchecked_4k.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bpiotwvx0p7kp" -path="res://.godot/imported/unchecked_4k.png-4470f9e94d7b68e36513e292443cc559.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/PaletteTools/Images/unchecked_4k.png" -dest_files=["res://.godot/imported/unchecked_4k.png-4470f9e94d7b68e36513e292443cc559.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/godot/addons/PaletteTools/LICENSE.md b/godot/addons/PaletteTools/LICENSE.md deleted file mode 100644 index d8d9374..0000000 --- a/godot/addons/PaletteTools/LICENSE.md +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2023 RancidMilk - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/godot/addons/PaletteTools/README.md b/godot/addons/PaletteTools/README.md deleted file mode 100644 index 9d1a56e..0000000 --- a/godot/addons/PaletteTools/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# Godot 4 Palette Tools - -This is a small addon that allows for easy color palette integration in Godot 4. Quickly Create/Download palettes. Load/Save for use any time. Comes with the ability to quickly switch the editor's color-picker swatches as well as a custom color picker that can switch between palettes on demand. Download option currently supports Lospec palettes. - -## Setup - -### Install Methods - -#### Recommended: - -Open the *AssetLib* tab in the editor and search for Palette Tools. - -#### Manual Method: - -From either the [project repo](https://github.com/RancidMilkGames/GodotPaletteTools) or [asset library website](https://godotengine.org/asset-library/asset) copy the "PaletteTools" folder to your project's "addons" folder. If this is your first time using a Godot plugin/addon, and you don't have an addons folder, make a folder named "addons" in the root of your project. - -### Activate - -Godot will automatically activate the addon if you used the previously mentioned recommended method. If done manually, go to `Project Settings->Plugins` to activate it. - - - - - - - - - - - - - -
- :warning: Notice -
-
    -
  • Plugin will not be immediately noticeable. It will appear in the right-side dock with Inspector/Node/History. You may need to either expand the dock or use the arrows to access it.
  • -
-
- -## USE - -* **Custom Palette Picker**: Replaces the default color picker with an extended one that can switch between palettes. For special use cases and not thoroughly tested so by default it's set to off. -* **Saved Palettes**: List of previously saved palettes. To load or delete a palette, select it in the list and then press the corresponding button. -* **Get from Lospec**: Either enter a Lospec palette URL or browse through popular palettes. The plugin will automatically keep track of the palette name, and it's author for referencing or crediting. -* **Palette Preview**: Preview/editor for palettes. Click the plus sign to add a color to the palette. Existing colors can be edited by clicking on them, or removed with the red close button in the top right corner of the button. The save palette button will store the palette. -* **Replace Editor Swatches**: If you have an eligible palette, an option will appear that allows you to save it to the editor's swatches, which can be accessed from both the default color picker and the extended one. - -## Tips - -* You can copy the "res://addons/PaletteTools/color_presets.cfg" file to move saved palettes/settings between projects - -## Future - -I consider this plugin mostly done, but still use it regularly, so if Godot has any breaking changes that affect it, those will probably be addressed. It also might get the occasional new feature. Some current thoughts are: - -- [ ] Theme integration of some sort -- [ ] The ability to mass convert one color in the project to another - -## Notes - -* Tested on Godot 4.2. If you'd like to run it on an earlier version of Godot 4, [this is a link](https://github.com/RancidMilkGames/GodotPaletteTools/tree/47c09b8d6e43a0acc0380a1344a4b2282f95d49b) to the last commit before the 4.2 changes. -* Custom Color picker won't work when editing resources. I'm not sure if this is possible to implement in Godot's current state. diff --git a/godot/addons/PaletteTools/Resources/section_label_settings.tres b/godot/addons/PaletteTools/Resources/section_label_settings.tres deleted file mode 100644 index 53e96af..0000000 --- a/godot/addons/PaletteTools/Resources/section_label_settings.tres +++ /dev/null @@ -1,9 +0,0 @@ -[gd_resource type="LabelSettings" format=3 uid="uid://d21bg0y0svxi3"] - -[resource] -font_size = 24 -outline_size = 4 -outline_color = Color(0, 0, 0, 1) -shadow_size = 6 -shadow_color = Color(0.714494, 0.571648, 0.404247, 1) -shadow_offset = Vector2(0, 0) diff --git a/godot/addons/PaletteTools/Resources/section_label_settings_contrast.tres b/godot/addons/PaletteTools/Resources/section_label_settings_contrast.tres deleted file mode 100644 index 012fa67..0000000 --- a/godot/addons/PaletteTools/Resources/section_label_settings_contrast.tres +++ /dev/null @@ -1,8 +0,0 @@ -[gd_resource type="LabelSettings" format=3 uid="uid://k60qt3dd7ov2"] - -[resource] -font_size = 50 -font_color = Color(0.545098, 0.333333, 0.501961, 1) -outline_color = Color(0.772549, 0.8, 0.721569, 1) -shadow_color = Color(0.760784, 0.552941, 0.458824, 1) -shadow_offset = Vector2(0, 0) diff --git a/godot/addons/PaletteTools/Scenes/browse_palette_preview.tscn b/godot/addons/PaletteTools/Scenes/browse_palette_preview.tscn deleted file mode 100644 index 1100e00..0000000 --- a/godot/addons/PaletteTools/Scenes/browse_palette_preview.tscn +++ /dev/null @@ -1,83 +0,0 @@ -[gd_scene load_steps=5 format=3 uid="uid://xj8jb4l74mf"] - -[ext_resource type="Script" path="res://addons/PaletteTools/Scripts/browse_palette_preview.gd" id="1_j460a"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_g4ruc"] -content_margin_left = 25.0 -content_margin_top = 25.0 -content_margin_right = 25.0 -content_margin_bottom = 25.0 -bg_color = Color(0.435294, 0.403922, 0.462745, 1) -border_width_left = 10 -border_width_top = 10 -border_width_right = 10 -border_width_bottom = 10 -border_color = Color(0, 0, 0, 1) -border_blend = true -corner_radius_top_left = 25 -corner_radius_top_right = 25 -corner_radius_bottom_right = 25 -corner_radius_bottom_left = 25 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_qogr7"] -content_margin_left = 7.0 -content_margin_top = 4.0 -content_margin_right = 7.0 -content_margin_bottom = 4.0 -bg_color = Color(0.713726, 0.572549, 0.403922, 1) -border_width_left = 5 -border_width_top = 5 -border_width_right = 5 -border_width_bottom = 5 -border_color = Color(0.00820202, 0.00820203, 0.00820202, 1) -border_blend = true -corner_radius_top_left = 3 -corner_radius_top_right = 3 -corner_radius_bottom_right = 3 -corner_radius_bottom_left = 3 - -[sub_resource type="LabelSettings" id="LabelSettings_nkmub"] -font_size = 24 -font_color = Color(0, 0, 0, 1) -outline_size = 4 -outline_color = Color(0.552941, 0.384314, 0.407843, 1) - -[node name="PanelContainer" type="PanelContainer" node_paths=PackedStringArray("info_label", "color_container")] -offset_top = 54.0 -offset_right = 1152.0 -offset_bottom = 54.0 -theme_override_styles/panel = SubResource("StyleBoxFlat_g4ruc") -script = ExtResource("1_j460a") -info_label = NodePath("BrowsePalettePreview/HBoxContainer/Label") -color_container = NodePath("BrowsePalettePreview/MarginContainer/HFlowContainer") - -[node name="BrowsePalettePreview" type="VBoxContainer" parent="."] -layout_mode = 2 -size_flags_horizontal = 3 -theme_override_constants/separation = 10 - -[node name="HBoxContainer" type="HBoxContainer" parent="BrowsePalettePreview"] -layout_mode = 2 - -[node name="PaletteSelect" type="Button" parent="BrowsePalettePreview/HBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 0 -mouse_default_cursor_shape = 2 -theme_override_colors/font_color = Color(0, 0, 0, 1) -theme_override_styles/normal = SubResource("StyleBoxFlat_qogr7") -text = "Import" - -[node name="Label" type="Label" parent="BrowsePalettePreview/HBoxContainer"] -layout_mode = 2 -text = "Palette name by user" -label_settings = SubResource("LabelSettings_nkmub") - -[node name="MarginContainer" type="MarginContainer" parent="BrowsePalettePreview"] -layout_mode = 2 - -[node name="HFlowContainer" type="HFlowContainer" parent="BrowsePalettePreview/MarginContainer"] -layout_mode = 2 -theme_override_constants/h_separation = 0 -theme_override_constants/v_separation = 0 - -[connection signal="pressed" from="BrowsePalettePreview/HBoxContainer/PaletteSelect" to="." method="_on_palette_select_pressed"] diff --git a/godot/addons/PaletteTools/Scenes/color_sample.tscn b/godot/addons/PaletteTools/Scenes/color_sample.tscn deleted file mode 100644 index 2f94e24..0000000 --- a/godot/addons/PaletteTools/Scenes/color_sample.tscn +++ /dev/null @@ -1,70 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://157npdwcov77"] - -[ext_resource type="Script" path="res://addons/PaletteTools/Scripts/color_sample.gd" id="1_8rxjv"] -[ext_resource type="Texture2D" path="res://addons/PaletteTools/Images/Blank.png" id="1_jr35n"] - -[sub_resource type="LabelSettings" id="LabelSettings_s1xg4"] -font_size = 20 -font_color = Color(0.113725, 0.113725, 0.113725, 1) - -[node name="ColorSample" type="MarginContainer" node_paths=PackedStringArray("color_picker_button", "remove_button", "remove_button_text")] -custom_minimum_size = Vector2(50, 50) -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -12.5 -offset_top = -12.5 -offset_right = 12.5 -offset_bottom = 12.5 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_constants/margin_left = 5 -theme_override_constants/margin_top = 5 -theme_override_constants/margin_right = 5 -theme_override_constants/margin_bottom = 5 -script = ExtResource("1_8rxjv") -color_picker_button = NodePath("Color") -remove_button = NodePath("Color/Remove") -remove_button_text = NodePath("Color/Remove/Label") - -[node name="Color" type="ColorPickerButton" parent="."] -custom_minimum_size = Vector2(50, 50) -layout_mode = 2 -mouse_default_cursor_shape = 2 - -[node name="Remove" type="TextureButton" parent="Color"] -self_modulate = Color(0.980392, 0.513726, 0.47451, 1) -custom_minimum_size = Vector2(10, 10) -layout_mode = 1 -anchors_preset = 1 -anchor_left = 1.0 -anchor_right = 1.0 -offset_left = -14.0 -offset_top = 4.0 -offset_right = -4.0 -offset_bottom = 14.0 -grow_horizontal = 0 -mouse_default_cursor_shape = 2 -texture_normal = ExtResource("1_jr35n") -ignore_texture_size = true -stretch_mode = 4 - -[node name="Label" type="Label" parent="Color/Remove"] -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -20.0 -offset_top = -13.0 -offset_right = 20.0 -offset_bottom = 13.0 -grow_horizontal = 2 -grow_vertical = 2 -text = "X" -label_settings = SubResource("LabelSettings_s1xg4") -horizontal_alignment = 1 -vertical_alignment = 1 diff --git a/godot/addons/PaletteTools/Scenes/custom_palette.tscn b/godot/addons/PaletteTools/Scenes/custom_palette.tscn deleted file mode 100644 index 564a43d..0000000 --- a/godot/addons/PaletteTools/Scenes/custom_palette.tscn +++ /dev/null @@ -1,20 +0,0 @@ -[gd_scene format=3 uid="uid://c41c3pd6clxuu"] - -[node name="CustomPalette" type="ColorRect"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -color = Color(1, 1, 1, 0.996078) - -[node name="Button" type="Button" parent="."] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -flat = true diff --git a/godot/addons/PaletteTools/Scenes/custom_picker.tscn b/godot/addons/PaletteTools/Scenes/custom_picker.tscn deleted file mode 100644 index 7e84871..0000000 --- a/godot/addons/PaletteTools/Scenes/custom_picker.tscn +++ /dev/null @@ -1,140 +0,0 @@ -[gd_scene load_steps=10 format=3 uid="uid://te84lilqmwp0"] - -[ext_resource type="Script" path="res://addons/PaletteTools/Scripts/custom_picker.gd" id="1_oxy04"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_igykn"] -content_margin_left = 4.0 -content_margin_top = 4.0 -content_margin_right = 4.0 -content_margin_bottom = 4.0 -bg_color = Color(0.745098, 0.584314, 0.360784, 1) -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 -corner_detail = 6 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_etl6w"] -content_margin_left = 4.0 -content_margin_top = 4.0 -content_margin_right = 4.0 -content_margin_bottom = 4.0 -bg_color = Color(0.603922, 0.309804, 0.313726, 1) -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 -corner_detail = 6 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jt85f"] -content_margin_left = 4.0 -content_margin_top = 4.0 -content_margin_right = 4.0 -content_margin_bottom = 4.0 -bg_color = Color(0.772549, 0.8, 0.721569, 1) -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 -corner_detail = 6 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1lt0k"] -content_margin_left = 4.0 -content_margin_top = 0.0 -content_margin_right = 4.0 -content_margin_bottom = 0.0 -bg_color = Color(0.407843, 0.67451, 0.662745, 1) -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 -corner_detail = 6 - -[sub_resource type="Theme" id="Theme_8u2vs"] -VScrollBar/styles/grabber = SubResource("StyleBoxFlat_igykn") -VScrollBar/styles/grabber_highlight = SubResource("StyleBoxFlat_etl6w") -VScrollBar/styles/grabber_pressed = SubResource("StyleBoxFlat_jt85f") -VScrollBar/styles/scroll = SubResource("StyleBoxFlat_1lt0k") - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_jcc3n"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_t77tn"] -bg_color = Color(0.839216, 0.839216, 0.839216, 1) -corner_radius_top_left = 5 -corner_radius_top_right = 5 -corner_radius_bottom_right = 5 -corner_radius_bottom_left = 5 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ykbik"] -bg_color = Color(0.839216, 0.839216, 0.839216, 1) -corner_radius_top_left = 5 -corner_radius_top_right = 5 -corner_radius_bottom_right = 5 -corner_radius_bottom_left = 5 - -[node name="CustomPicker" type="PopupPanel" node_paths=PackedStringArray("color_picker", "saved_palettes", "apply_palette_button")] -disable_3d = true -title = "Palette Tools Color-Picker" -size = Vector2i(1280, 2700) -visible = true -min_size = Vector2i(640, 1350) -theme = SubResource("Theme_8u2vs") -script = ExtResource("1_oxy04") -color_picker = NodePath("ScrollContainer/VBoxContainer/ColorPicker") -saved_palettes = NodePath("ScrollContainer/VBoxContainer/SavedPalettes") -apply_palette_button = NodePath("ScrollContainer/VBoxContainer/HBoxContainer/Button") - -[node name="ScrollContainer" type="ScrollContainer" parent="."] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = 4.0 -offset_top = 4.0 -offset_right = -4.0 -offset_bottom = -4.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_vertical = 3 - -[node name="VBoxContainer" type="VBoxContainer" parent="ScrollContainer"] -custom_minimum_size = Vector2(300, 600) -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -alignment = 1 - -[node name="ColorPicker" type="ColorPicker" parent="ScrollContainer/VBoxContainer"] -layout_mode = 2 -deferred_mode = true -picker_shape = 3 - -[node name="HBoxContainer" type="HBoxContainer" parent="ScrollContainer/VBoxContainer"] -layout_mode = 2 - -[node name="Label" type="Label" parent="ScrollContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -text = "Saved Palettes: -" - -[node name="Spacer" type="Control" parent="ScrollContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="Button" type="Button" parent="ScrollContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -tooltip_text = "Applies palette to Swatches. Alternatively you can double click a palette or press enter with a palette highlighted" -text = "Apply to Swatches" - -[node name="SavedPalettes" type="ItemList" parent="ScrollContainer/VBoxContainer"] -custom_minimum_size = Vector2(300, 0) -layout_mode = 2 -size_flags_horizontal = 4 -tooltip_text = "Double click on palette or select one and hit enter to apply it." -theme_override_colors/font_selected_color = Color(0.0862745, 0.0862745, 0.0862745, 1) -theme_override_styles/focus = SubResource("StyleBoxEmpty_jcc3n") -theme_override_styles/selected = SubResource("StyleBoxFlat_t77tn") -theme_override_styles/selected_focus = SubResource("StyleBoxFlat_ykbik") -auto_height = true -item_count = 1 -same_column_width = true -item_0/text = "No Palettes" diff --git a/godot/addons/PaletteTools/Scenes/palette_tools.tscn b/godot/addons/PaletteTools/Scenes/palette_tools.tscn deleted file mode 100644 index bca9890..0000000 --- a/godot/addons/PaletteTools/Scenes/palette_tools.tscn +++ /dev/null @@ -1,647 +0,0 @@ -[gd_scene load_steps=42 format=3 uid="uid://3m5qn5hayqy3"] - -[ext_resource type="Script" path="res://addons/PaletteTools/Scripts/palette_tool.gd" id="1_coeap"] -[ext_resource type="Script" path="res://addons/PaletteTools/Scripts/get_from_url.gd" id="2_4p84m"] -[ext_resource type="PackedScene" uid="uid://x40sgfxkrskd" path="res://addons/PaletteTools/Scenes/plus_box.tscn" id="2_85d0j"] -[ext_resource type="PackedScene" uid="uid://157npdwcov77" path="res://addons/PaletteTools/Scenes/color_sample.tscn" id="2_fn217"] -[ext_resource type="Shader" path="res://addons/PaletteTools/Shaders/rainbow_shader.gdshader" id="3_gaxkd"] -[ext_resource type="Texture2D" path="res://addons/PaletteTools/Images/Plus.png" id="3_m16i6"] -[ext_resource type="Texture2D" path="res://addons/PaletteTools/Images/spyglass.png" id="4_7wo4d"] -[ext_resource type="LabelSettings" uid="uid://k60qt3dd7ov2" path="res://addons/PaletteTools/Resources/section_label_settings_contrast.tres" id="4_qjnhp"] -[ext_resource type="Texture2D" path="res://addons/PaletteTools/Images/checked_4k.png" id="6_iloov"] -[ext_resource type="Script" path="res://addons/PaletteTools/Scripts/browse_popup.gd" id="7_ob3x8"] -[ext_resource type="Texture2D" path="res://addons/PaletteTools/Images/unchecked_4k.png" id="7_rs6oc"] -[ext_resource type="Script" path="res://addons/PaletteTools/Scripts/loading_palettes_screen.gd" id="9_xvc3k"] -[ext_resource type="Script" path="res://addons/PaletteTools/Scripts/alert_popup_panel.gd" id="11_hklnm"] -[ext_resource type="PackedScene" uid="uid://xj8jb4l74mf" path="res://addons/PaletteTools/Scenes/browse_palette_preview.tscn" id="13_a5syi"] - -[sub_resource type="Theme" id="Theme_igl82"] -MarginContainer/constants/margin_bottom = 3 -MarginContainer/constants/margin_left = 3 -MarginContainer/constants/margin_right = 3 -MarginContainer/constants/margin_top = 3 -TextEdit/font_sizes/font_size = 16 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_7qvmi"] -bg_color = Color(0.713726, 0.572549, 0.403922, 1) - -[sub_resource type="Theme" id="Theme_8bgoc"] -PanelContainer/styles/panel = SubResource("StyleBoxFlat_7qvmi") - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_g1sn2"] -shader = ExtResource("3_gaxkd") -shader_parameter/strength = 0.25 -shader_parameter/speed = 0.25 -shader_parameter/angle = 0.0 - -[sub_resource type="LabelSettings" id="LabelSettings_yeikm"] -font_size = 80 - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_u67lc"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_1qaos"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_kl4yb"] -bg_color = Color(0.839216, 0.839216, 0.839216, 1) -corner_radius_top_left = 5 -corner_radius_top_right = 5 -corner_radius_bottom_right = 5 -corner_radius_bottom_left = 5 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_2u8j5"] -bg_color = Color(0.839216, 0.839216, 0.839216, 1) -corner_radius_top_left = 5 -corner_radius_top_right = 5 -corner_radius_bottom_right = 5 -corner_radius_bottom_left = 5 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_g30ga"] -bg_color = Color(0.929412, 0.882353, 0.619608, 0.823529) -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -corner_radius_top_left = 5 -corner_radius_top_right = 5 -corner_radius_bottom_right = 5 -corner_radius_bottom_left = 5 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_c6ft6"] -bg_color = Color(0.92549, 0.85098, 0.596078, 1) -corner_radius_top_left = 5 -corner_radius_top_right = 5 -corner_radius_bottom_right = 5 -corner_radius_bottom_left = 5 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_b113t"] -bg_color = Color(0.415686, 0.415686, 0.415686, 1) -corner_radius_top_left = 5 -corner_radius_top_right = 5 -corner_radius_bottom_right = 5 -corner_radius_bottom_left = 5 - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_kk1ek"] - -[sub_resource type="Theme" id="Theme_t5g4x"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_4b8x1"] -content_margin_left = 4.0 -content_margin_top = 4.0 -content_margin_right = 4.0 -content_margin_bottom = 4.0 -bg_color = Color(0.890196, 0.890196, 0.890196, 0.6) -corner_radius_top_left = 3 -corner_radius_top_right = 3 -corner_radius_bottom_right = 3 -corner_radius_bottom_left = 3 -corner_detail = 5 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_inmej"] -content_margin_left = 4.0 -content_margin_top = 4.0 -content_margin_right = 4.0 -content_margin_bottom = 4.0 -bg_color = Color(0.1, 0.1, 0.1, 0.6) -corner_radius_top_left = 3 -corner_radius_top_right = 3 -corner_radius_bottom_right = 3 -corner_radius_bottom_left = 3 -corner_detail = 5 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_u8dak"] -content_margin_left = 4.0 -content_margin_top = 4.0 -content_margin_right = 4.0 -content_margin_bottom = 4.0 -bg_color = Color(0.0235294, 0.0235294, 0.0235294, 0.6) -corner_radius_top_left = 3 -corner_radius_top_right = 3 -corner_radius_bottom_right = 3 -corner_radius_bottom_left = 3 -corner_detail = 5 - -[sub_resource type="LabelSettings" id="LabelSettings_rgr51"] -font_size = 40 - -[sub_resource type="LabelSettings" id="LabelSettings_jnb0d"] -font_size = 40 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_6d60a"] -content_margin_left = 5.0 -content_margin_right = 5.0 -bg_color = Color(0.890196, 0.337255, 0.341176, 1) -corner_radius_top_left = 5 -corner_radius_top_right = 5 -corner_radius_bottom_right = 5 -corner_radius_bottom_left = 5 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_y2upq"] -bg_color = Color(0.768627, 0.764706, 0.509804, 1) -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -border_color = Color(0.121569, 0.121569, 0.121569, 1) -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_7ta0s"] -bg_color = Color(0.25098, 0.25098, 0.25098, 1) -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -border_color = Color(0.933333, 0.772549, 0.509804, 1) -corner_radius_top_left = 5 -corner_radius_top_right = 5 -corner_radius_bottom_right = 5 -corner_radius_bottom_left = 5 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ceb4a"] -bg_color = Color(0.333333, 0.333333, 0.333333, 1) -corner_radius_top_left = 5 -corner_radius_top_right = 5 -corner_radius_bottom_right = 5 -corner_radius_bottom_left = 5 - -[sub_resource type="LabelSettings" id="LabelSettings_ww1rl"] -font_size = 40 -font_color = Color(0.0823529, 0.0823529, 0.0823529, 1) - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_tdaa4"] -bg_color = Color(0.172549, 0.172549, 0.172549, 1) -corner_radius_top_left = 5 -corner_radius_top_right = 5 -corner_radius_bottom_right = 5 -corner_radius_bottom_left = 5 - -[sub_resource type="LabelSettings" id="LabelSettings_0flab"] -font_size = 32 - -[sub_resource type="LabelSettings" id="LabelSettings_26hsa"] -font_size = 100 -font_color = Color(0.00820202, 0.00820203, 0.00820202, 1) - -[node name="Palette Tools" type="ScrollContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 3 - -[node name="Colors" type="PanelContainer" parent="." node_paths=PackedStringArray("http", "url", "color_preview", "editor_swatch_save", "restart_editor", "alert", "p_name_text", "p_author_text", "saved_palettes", "clear_preview_button", "col_pick_popup", "browse_popup_panel", "custom_picker_check_box")] -layout_mode = 2 -size_flags_horizontal = 3 -theme = SubResource("Theme_igl82") -script = ExtResource("1_coeap") -http = NodePath("HTTPRequest") -url = NodePath("Palette/Search/LineEdit") -color_preview = NodePath("Palette/ColorPreview") -editor_swatch_save = NodePath("Palette/Container/VBoxContainer/SaveToEditor") -restart_editor = NodePath("Palette/Container/VBoxContainer/RestartEditor") -alert = NodePath("AlertPopup") -p_name_text = NodePath("Palette/Info/PaletteName/LineEdit") -p_author_text = NodePath("Palette/Info/Author/LineEdit") -saved_palettes = NodePath("Palette/SavedPalettes") -clear_preview_button = NodePath("Palette/HBoxContainer/Clear") -col_pick_popup = NodePath("ColorPickerPopup") -browse_popup_panel = NodePath("BrowsePopup") -add_color_scene = ExtResource("2_85d0j") -color_sample = ExtResource("2_fn217") -custom_picker_check_box = NodePath("Palette/CustomPicker/CustomPickerCheckBox") - -[node name="HTTPRequest" type="HTTPRequest" parent="Colors" node_paths=PackedStringArray("colors")] -download_file = "res://addons/PaletteTools/temp_palette.txt" -script = ExtResource("2_4p84m") -colors = NodePath("..") - -[node name="Palette" type="VBoxContainer" parent="Colors"] -layout_mode = 2 -theme = SubResource("Theme_8bgoc") -theme_override_constants/separation = 5 -alignment = 1 - -[node name="Title" type="Label" parent="Colors/Palette"] -material = SubResource("ShaderMaterial_g1sn2") -layout_mode = 2 -size_flags_horizontal = 4 -text = "Palette Tools" -label_settings = SubResource("LabelSettings_yeikm") -horizontal_alignment = 1 - -[node name="CustomPicker" type="HBoxContainer" parent="Colors/Palette"] -layout_mode = 2 -alignment = 1 - -[node name="CustomPickerCheckBox" type="CheckBox" parent="Colors/Palette/CustomPicker"] -layout_mode = 2 -tooltip_text = "Toggle an extended color picker that can switch palettes" -theme_override_font_sizes/font_size = 30 -theme_override_icons/checked = ExtResource("6_iloov") -theme_override_icons/unchecked = ExtResource("7_rs6oc") -icon_alignment = 1 -expand_icon = true - -[node name="RichTextLabel" type="RichTextLabel" parent="Colors/Palette/CustomPicker"] -layout_mode = 2 -size_flags_vertical = 4 -theme_override_font_sizes/normal_font_size = 40 -theme_override_styles/normal = SubResource("StyleBoxEmpty_u67lc") -bbcode_enabled = true -text = "Custom Palette Picker [color=9a4f50](beta)[/color]" -fit_content = true -scroll_active = false -autowrap_mode = 0 - -[node name="PaletteListTitle" type="Label" parent="Colors/Palette"] -layout_mode = 2 -text = "--- Saved Palettes: ---" -label_settings = ExtResource("4_qjnhp") -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="SavedPalettes" type="ItemList" parent="Colors/Palette"] -layout_mode = 2 -theme_override_colors/font_selected_color = Color(0.0862745, 0.0862745, 0.0862745, 1) -theme_override_font_sizes/font_size = 30 -theme_override_styles/focus = SubResource("StyleBoxEmpty_1qaos") -theme_override_styles/selected = SubResource("StyleBoxFlat_kl4yb") -theme_override_styles/selected_focus = SubResource("StyleBoxFlat_2u8j5") -auto_height = true -item_count = 1 -same_column_width = true -item_0/text = "No Palettes" - -[node name="IO" type="HBoxContainer" parent="Colors/Palette"] -layout_mode = 2 - -[node name="New" type="TextureButton" parent="Colors/Palette/IO"] -visible = false -self_modulate = Color(0.720467, 0.720468, 0.720467, 1) -texture_filter = 1 -custom_minimum_size = Vector2(80, 0) -layout_mode = 2 -tooltip_text = "Make a new palette. Erases current preview" -mouse_default_cursor_shape = 2 -texture_normal = ExtResource("3_m16i6") -texture_pressed = ExtResource("3_m16i6") -texture_hover = ExtResource("3_m16i6") -ignore_texture_size = true -stretch_mode = 5 - -[node name="Load" type="Button" parent="Colors/Palette/IO"] -layout_mode = 2 -size_flags_horizontal = 3 -tooltip_text = "Load selected Saved Palette" -mouse_default_cursor_shape = 2 -theme_override_font_sizes/font_size = 30 -text = "Load" - -[node name="Delete" type="Button" parent="Colors/Palette/IO"] -layout_mode = 2 -size_flags_horizontal = 3 -tooltip_text = "Delete selected Saved Palette" -mouse_default_cursor_shape = 2 -theme_override_font_sizes/font_size = 30 -text = "Delete" - -[node name="SearchTitle" type="Label" parent="Colors/Palette"] -layout_mode = 2 -text = "--- Get from Lospec: ---" -label_settings = ExtResource("4_qjnhp") -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="Search" type="HBoxContainer" parent="Colors/Palette"] -layout_mode = 2 - -[node name="LineEdit" type="LineEdit" parent="Colors/Palette/Search"] -layout_mode = 2 -size_flags_horizontal = 3 -theme_override_font_sizes/font_size = 30 -placeholder_text = "Lospec Palette URL" -expand_to_text_length = true -caret_blink = true -caret_blink_interval = 0.5 - -[node name="Search" type="Button" parent="Colors/Palette/Search"] -texture_filter = 1 -custom_minimum_size = Vector2(80, 4) -layout_mode = 2 -mouse_default_cursor_shape = 2 -theme_override_font_sizes/font_size = 40 -theme_override_styles/normal = SubResource("StyleBoxFlat_g30ga") -theme_override_styles/hover = SubResource("StyleBoxFlat_c6ft6") -theme_override_styles/pressed = SubResource("StyleBoxFlat_b113t") -theme_override_styles/focus = SubResource("StyleBoxEmpty_kk1ek") -icon = ExtResource("4_7wo4d") -icon_alignment = 1 -expand_icon = true - -[node name="BrowsePalettesButton" type="Button" parent="Colors/Palette"] -layout_mode = 2 -tooltip_text = "Browse the most popular Lospec palettes" -mouse_default_cursor_shape = 2 -theme = SubResource("Theme_t5g4x") -theme_override_colors/font_color = Color(0, 0, 0, 1) -theme_override_colors/font_pressed_color = Color(0.91664, 0.91664, 0.91664, 1) -theme_override_colors/font_hover_color = Color(0.813258, 0.813258, 0.813258, 1) -theme_override_font_sizes/font_size = 30 -theme_override_styles/normal = SubResource("StyleBoxFlat_4b8x1") -theme_override_styles/hover = SubResource("StyleBoxFlat_inmej") -theme_override_styles/pressed = SubResource("StyleBoxFlat_u8dak") -text = "Browse Palettes" - -[node name="PreviewTitle" type="Label" parent="Colors/Palette"] -layout_mode = 2 -text = "--- Palette Preview: ---" -label_settings = ExtResource("4_qjnhp") -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="Info" type="VBoxContainer" parent="Colors/Palette"] -layout_mode = 2 -alignment = 1 - -[node name="PaletteName" type="HBoxContainer" parent="Colors/Palette/Info"] -layout_mode = 2 - -[node name="Label" type="Label" parent="Colors/Palette/Info/PaletteName"] -layout_mode = 2 -text = "Palette Name:" -label_settings = SubResource("LabelSettings_rgr51") - -[node name="LineEdit" type="LineEdit" parent="Colors/Palette/Info/PaletteName"] -layout_mode = 2 -size_flags_horizontal = 3 -theme_override_font_sizes/font_size = 30 -placeholder_text = "Name" -caret_blink = true -caret_blink_interval = 0.5 - -[node name="Author" type="HBoxContainer" parent="Colors/Palette/Info"] -layout_mode = 2 - -[node name="Label" type="Label" parent="Colors/Palette/Info/Author"] -layout_mode = 2 -text = "Author:" -label_settings = SubResource("LabelSettings_jnb0d") - -[node name="LineEdit" type="LineEdit" parent="Colors/Palette/Info/Author"] -layout_mode = 2 -size_flags_horizontal = 3 -theme_override_font_sizes/font_size = 30 -placeholder_text = "Name" -caret_blink = true -caret_blink_interval = 0.5 - -[node name="ColorPreview" type="HFlowContainer" parent="Colors/Palette"] -layout_mode = 2 -size_flags_vertical = 3 -alignment = 1 - -[node name="HBoxContainer" type="HBoxContainer" parent="Colors/Palette"] -layout_mode = 2 -theme_override_constants/separation = 10 -alignment = 1 - -[node name="Save" type="Button" parent="Colors/Palette/HBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -tooltip_text = "Save the current preview to Saved Palettes" -mouse_default_cursor_shape = 2 -theme_override_font_sizes/font_size = 30 -text = "Save Palette" - -[node name="Clear" type="Button" parent="Colors/Palette/HBoxContainer"] -visible = false -layout_mode = 2 -tooltip_text = "Save the current preview to Saved Palettes" -mouse_default_cursor_shape = 2 -theme_override_colors/font_color = Color(0.125911, 0.125911, 0.125911, 1) -theme_override_font_sizes/font_size = 30 -theme_override_styles/normal = SubResource("StyleBoxFlat_6d60a") -text = "Clear Preview" - -[node name="Container" type="MarginContainer" parent="Colors/Palette"] -layout_mode = 2 - -[node name="ColorRect" type="Panel" parent="Colors/Palette/Container"] -layout_mode = 2 -theme_override_styles/panel = SubResource("StyleBoxFlat_y2upq") - -[node name="VBoxContainer" type="VBoxContainer" parent="Colors/Palette/Container"] -layout_mode = 2 - -[node name="SaveToEditor" type="VBoxContainer" parent="Colors/Palette/Container/VBoxContainer"] -visible = false -layout_mode = 2 -size_flags_horizontal = 4 -alignment = 1 - -[node name="Spacer" type="Control" parent="Colors/Palette/Container/VBoxContainer/SaveToEditor"] -layout_mode = 2 - -[node name="SaveToEditorButton" type="Button" parent="Colors/Palette/Container/VBoxContainer/SaveToEditor"] -layout_mode = 2 -size_flags_horizontal = 4 -tooltip_text = "Replaces the current editor swatches with current palette" -mouse_default_cursor_shape = 2 -theme_override_colors/font_color = Color(0.933333, 0.772549, 0.509804, 1) -theme_override_font_sizes/font_size = 30 -theme_override_styles/normal = SubResource("StyleBoxFlat_7ta0s") -theme_override_styles/hover = SubResource("StyleBoxFlat_ceb4a") -text = "*Save to Editor's Swatches" - -[node name="Label" type="Label" parent="Colors/Palette/Container/VBoxContainer/SaveToEditor"] -layout_mode = 2 -text = "*Note: Editor must be restarted -for changes to take effect" -label_settings = SubResource("LabelSettings_ww1rl") -horizontal_alignment = 1 - -[node name="RestartEditor" type="VBoxContainer" parent="Colors/Palette/Container/VBoxContainer"] -visible = false -layout_mode = 2 -size_flags_horizontal = 4 -alignment = 1 - -[node name="RestartEditorButton" type="Button" parent="Colors/Palette/Container/VBoxContainer/RestartEditor"] -layout_mode = 2 -size_flags_horizontal = 4 -tooltip_text = "Replaces the current editor swatches with current palette" -theme_override_colors/font_color = Color(1, 0.435294, 0.364706, 1) -theme_override_font_sizes/font_size = 30 -theme_override_styles/hover = SubResource("StyleBoxFlat_tdaa4") -text = "*Restart To finalize changes?" - -[node name="Spacer" type="Control" parent="Colors/Palette/Container/VBoxContainer/RestartEditor"] -layout_mode = 2 - -[node name="AlertPopup" type="PopupPanel" parent="Colors" node_paths=PackedStringArray("alert_text_label")] -disable_3d = true -title = "Alert" -initial_position = 1 -size = Vector2i(500, 300) -script = ExtResource("11_hklnm") -alert_text_label = NodePath("Control/Label") - -[node name="Control" type="Control" parent="Colors/AlertPopup"] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = 4.0 -offset_top = 4.0 -offset_right = -4.0 -offset_bottom = -4.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="Label" type="Label" parent="Colors/AlertPopup/Control"] -custom_minimum_size = Vector2(400, 200) -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -0.5 -offset_top = -13.0 -offset_right = 0.5 -offset_bottom = 13.0 -grow_horizontal = 2 -grow_vertical = 2 -text = "Alert" -label_settings = SubResource("LabelSettings_0flab") -horizontal_alignment = 1 -vertical_alignment = 1 -autowrap_mode = 2 - -[node name="CloseButton" type="Button" parent="Colors/AlertPopup/Control"] -layout_mode = 1 -anchors_preset = 7 -anchor_left = 0.5 -anchor_top = 1.0 -anchor_right = 0.5 -anchor_bottom = 1.0 -offset_left = -25.0 -offset_top = -42.0 -offset_right = 25.0 -offset_bottom = -11.0 -grow_horizontal = 2 -grow_vertical = 0 -size_flags_horizontal = 6 -size_flags_vertical = 6 -mouse_default_cursor_shape = 2 -text = "Close" - -[node name="ColorPickerPopup" type="PopupPanel" parent="Colors"] -disable_3d = true -sdf_oversize = 0 -initial_position = 1 -size = Vector2i(306, 514) -unresizable = false - -[node name="ColorPicker" type="ColorPicker" parent="Colors/ColorPickerPopup"] -offset_left = 4.0 -offset_top = 4.0 -offset_right = 302.0 -offset_bottom = 510.0 -picker_shape = 3 -can_add_swatches = false -presets_visible = false - -[node name="BrowsePopup" type="Window" parent="Colors" node_paths=PackedStringArray("colors", "browse_http", "preview_container", "alert_popup", "loading_screen")] -disable_3d = true -title = "Browse Lospec Palettes" -initial_position = 2 -size = Vector2i(1000, 600) -visible = false -wrap_controls = true -script = ExtResource("7_ob3x8") -colors = NodePath("..") -browse_http = NodePath("HTTPRequest") -browse_preview_scene = ExtResource("13_a5syi") -preview_container = NodePath("MarginContainer/VBoxContainer/ScrollContainer/VBoxContainer") -alert_popup = NodePath("../AlertPopup") -loading_screen = NodePath("MarginContainer/Loading") - -[node name="MarginContainer" type="MarginContainer" parent="Colors/BrowsePopup"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_constants/margin_left = 25 -theme_override_constants/margin_top = 25 -theme_override_constants/margin_right = 25 -theme_override_constants/margin_bottom = 25 - -[node name="VBoxContainer" type="VBoxContainer" parent="Colors/BrowsePopup/MarginContainer"] -layout_mode = 2 - -[node name="ScrollContainer" type="ScrollContainer" parent="Colors/BrowsePopup/MarginContainer/VBoxContainer"] -layout_mode = 2 -size_flags_vertical = 3 - -[node name="VBoxContainer" type="VBoxContainer" parent="Colors/BrowsePopup/MarginContainer/VBoxContainer/ScrollContainer"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="LoadMore" type="Button" parent="Colors/BrowsePopup/MarginContainer/VBoxContainer"] -layout_mode = 2 -text = "Load More" - -[node name="Loading" type="ColorRect" parent="Colors/BrowsePopup/MarginContainer" node_paths=PackedStringArray("loading_text")] -layout_mode = 2 -color = Color(0.878431, 0.878431, 0.878431, 1) -script = ExtResource("9_xvc3k") -loading_text = NodePath("Label") - -[node name="Label" type="Label" parent="Colors/BrowsePopup/MarginContainer/Loading"] -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -191.0 -offset_top = -68.5 -offset_right = 191.0 -offset_bottom = 68.5 -grow_horizontal = 2 -grow_vertical = 2 -text = "Loading" -label_settings = SubResource("LabelSettings_26hsa") -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="HTTPRequest" type="HTTPRequest" parent="Colors/BrowsePopup"] - -[connection signal="request_completed" from="Colors/HTTPRequest" to="Colors/HTTPRequest" method="_on_request_completed"] -[connection signal="toggled" from="Colors/Palette/CustomPicker/CustomPickerCheckBox" to="Colors" method="_on_custom_picker_check_box_toggled"] -[connection signal="item_activated" from="Colors/Palette/SavedPalettes" to="Colors" method="_on_saved_palettes_item_activated"] -[connection signal="pressed" from="Colors/Palette/IO/New" to="Colors" method="_on_new_palette_pressed"] -[connection signal="pressed" from="Colors/Palette/IO/Load" to="Colors" method="_on_load_palette_pressed"] -[connection signal="pressed" from="Colors/Palette/IO/Delete" to="Colors" method="_on_delete_palette_pressed"] -[connection signal="text_submitted" from="Colors/Palette/Search/LineEdit" to="Colors" method="_on_line_edit_text_submitted"] -[connection signal="pressed" from="Colors/Palette/Search/Search" to="Colors" method="_on_search_pressed"] -[connection signal="pressed" from="Colors/Palette/BrowsePalettesButton" to="Colors" method="_on_browse_palettes_button_pressed"] -[connection signal="pressed" from="Colors/Palette/HBoxContainer/Save" to="Colors" method="_on_save_palette_pressed"] -[connection signal="pressed" from="Colors/Palette/HBoxContainer/Clear" to="Colors" method="_on_clear_pressed"] -[connection signal="pressed" from="Colors/Palette/Container/VBoxContainer/SaveToEditor/SaveToEditorButton" to="Colors" method="_on_save_to_editor_button_pressed"] -[connection signal="pressed" from="Colors/Palette/Container/VBoxContainer/RestartEditor/RestartEditorButton" to="Colors" method="_on_restart_editor_pressed"] -[connection signal="close_requested" from="Colors/AlertPopup" to="Colors/AlertPopup" method="_on_close_requested"] -[connection signal="pressed" from="Colors/AlertPopup/Control/CloseButton" to="Colors/AlertPopup" method="_on_close_button_pressed"] -[connection signal="color_changed" from="Colors/ColorPickerPopup/ColorPicker" to="Colors" method="_on_color_picker_color_changed"] -[connection signal="close_requested" from="Colors/BrowsePopup" to="Colors/BrowsePopup" method="_on_close_requested"] -[connection signal="focus_exited" from="Colors/BrowsePopup" to="Colors/BrowsePopup" method="_on_focus_exited"] -[connection signal="size_changed" from="Colors/BrowsePopup" to="Colors/BrowsePopup" method="_on_size_changed"] -[connection signal="visibility_changed" from="Colors/BrowsePopup" to="Colors/BrowsePopup" method="_on_visibility_changed"] -[connection signal="pressed" from="Colors/BrowsePopup/MarginContainer/VBoxContainer/LoadMore" to="Colors/BrowsePopup" method="_on_load_more_pressed"] -[connection signal="visibility_changed" from="Colors/BrowsePopup/MarginContainer/Loading" to="Colors/BrowsePopup/MarginContainer/Loading" method="_on_visibility_changed"] -[connection signal="request_completed" from="Colors/BrowsePopup/HTTPRequest" to="Colors/BrowsePopup" method="_on_http_request_completed"] diff --git a/godot/addons/PaletteTools/Scenes/plus_box.tscn b/godot/addons/PaletteTools/Scenes/plus_box.tscn deleted file mode 100644 index 016d841..0000000 --- a/godot/addons/PaletteTools/Scenes/plus_box.tscn +++ /dev/null @@ -1,31 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://x40sgfxkrskd"] - -[ext_resource type="Texture2D" path="res://addons/PaletteTools/Images/Plus.png" id="1_o5f0x"] - -[node name="ColorSample" type="MarginContainer"] -custom_minimum_size = Vector2(50, 50) -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -12.5 -offset_top = -12.5 -offset_right = 12.5 -offset_bottom = 12.5 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_constants/margin_left = 5 -theme_override_constants/margin_top = 5 -theme_override_constants/margin_right = 5 -theme_override_constants/margin_bottom = 5 - -[node name="Color" type="TextureButton" parent="."] -texture_filter = 1 -custom_minimum_size = Vector2(40, 40) -layout_mode = 2 -tooltip_text = "Add color to palette" -mouse_default_cursor_shape = 2 -texture_normal = ExtResource("1_o5f0x") -ignore_texture_size = true -stretch_mode = 5 diff --git a/godot/addons/PaletteTools/Scripts/alert_popup_panel.gd b/godot/addons/PaletteTools/Scripts/alert_popup_panel.gd deleted file mode 100644 index 28884f7..0000000 --- a/godot/addons/PaletteTools/Scripts/alert_popup_panel.gd +++ /dev/null @@ -1,17 +0,0 @@ -@tool -extends PopupPanel - -@export var alert_text_label: Label - - -func alert(message: String) -> void: - alert_text_label.text = message - show() - - -func _on_close_button_pressed() -> void: - hide() - - -func _on_close_requested() -> void: - hide() diff --git a/godot/addons/PaletteTools/Scripts/alert_popup_panel.gd.uid b/godot/addons/PaletteTools/Scripts/alert_popup_panel.gd.uid deleted file mode 100644 index cead3bf..0000000 --- a/godot/addons/PaletteTools/Scripts/alert_popup_panel.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cd6rspiirpfy5 diff --git a/godot/addons/PaletteTools/Scripts/browse_palette_preview.gd b/godot/addons/PaletteTools/Scripts/browse_palette_preview.gd deleted file mode 100644 index fe7a9bd..0000000 --- a/godot/addons/PaletteTools/Scripts/browse_palette_preview.gd +++ /dev/null @@ -1,14 +0,0 @@ -@tool -extends Control - -const Palette := preload("res://addons/PaletteTools/Scripts/palette_tool.gd") - -@export var info_label: Label -@export var color_container: Control - -var colors: Palette -var palette_obj: Dictionary - - -func _on_palette_select_pressed() -> void: - colors.import_palette_from_browse(palette_obj) diff --git a/godot/addons/PaletteTools/Scripts/browse_palette_preview.gd.uid b/godot/addons/PaletteTools/Scripts/browse_palette_preview.gd.uid deleted file mode 100644 index 1f70437..0000000 --- a/godot/addons/PaletteTools/Scripts/browse_palette_preview.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://pagg2ueykteh diff --git a/godot/addons/PaletteTools/Scripts/browse_popup.gd b/godot/addons/PaletteTools/Scripts/browse_popup.gd deleted file mode 100644 index 9465453..0000000 --- a/godot/addons/PaletteTools/Scripts/browse_popup.gd +++ /dev/null @@ -1,94 +0,0 @@ -@tool -extends Window - -const Palette := preload("res://addons/PaletteTools/Scripts/palette_tool.gd") -const Alert := preload("res://addons/PaletteTools/Scripts/alert_popup_panel.gd") -const BrowsePreview := preload("res://addons/PaletteTools/Scripts/browse_palette_preview.gd") - -@export var colors: Palette -@export var browse_http: HTTPRequest -@export var browse_preview_scene: PackedScene -@export var preview_container: Control -@export var alert_popup: Alert -@export var loading_screen: Control - -var current_page: int = 0 -var close_delay: int = 4 - - -func get_palette_list() -> void: - browse_http.request( - "https://lospec.com/palette-list/load?colorNumberFilterType=any&colorNumber=8&page=" - + str(current_page) - + "&tag=&sortingType=downloads" - ) - current_page += 1 - - -func display_preview(palette_obj: Dictionary) -> void: - var prev: BrowsePreview = browse_preview_scene.instantiate() - prev.colors = colors - prev.palette_obj = palette_obj - prev.info_label.text = palette_obj.name + " by: " + palette_obj.author - preview_container.add_child(prev) - for col in palette_obj.colors: - var new_color := ColorRect.new() - new_color.custom_minimum_size = Vector2(75, 75) - new_color.color = Color.from_string(col, Color.WHITE) - prev.color_container.add_child(new_color) - - -func _on_close_button_pressed() -> void: - visible = false - - -func _on_http_request_completed(result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray) -> void: - var html_text := body.get_string_from_utf8() - var json := JSON.new() - var err := json.parse(html_text) - if err != OK: - alert_popup.alert("Error getting palettes") - return - - loading_screen.visible = false - for pal in json.data.palettes: - var user := "Lospec" - var slug := "" - if pal.has("user"): - user = pal.user.name - if pal.has("slug"): - slug = pal.slug - var palette_obj := { - "name": pal.title, - "author": user, - "colors": pal.colors, - "slug": slug - } - - display_preview(palette_obj) - - -func _on_load_more_pressed() -> void: - get_palette_list() - - -func _on_visibility_changed() -> void: - if visible and current_page == 0: - get_palette_list() - - -func _on_close_requested() -> void: - hide() - - -func _on_focus_exited() -> void: - while close_delay > 0: - close_delay -= 1 - await get_tree().create_timer(1).timeout - if not has_focus(): - hide() - close_delay = 3 - - -func _on_size_changed() -> void: - close_delay = 3 diff --git a/godot/addons/PaletteTools/Scripts/browse_popup.gd.uid b/godot/addons/PaletteTools/Scripts/browse_popup.gd.uid deleted file mode 100644 index 7ca0ca7..0000000 --- a/godot/addons/PaletteTools/Scripts/browse_popup.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cas0s5bfj0txi diff --git a/godot/addons/PaletteTools/Scripts/color_sample.gd b/godot/addons/PaletteTools/Scripts/color_sample.gd deleted file mode 100644 index 294b3e6..0000000 --- a/godot/addons/PaletteTools/Scripts/color_sample.gd +++ /dev/null @@ -1,6 +0,0 @@ -@tool -extends MarginContainer - -@export var color_picker_button: ColorPickerButton -@export var remove_button: TextureButton -@export var remove_button_text: Label diff --git a/godot/addons/PaletteTools/Scripts/color_sample.gd.uid b/godot/addons/PaletteTools/Scripts/color_sample.gd.uid deleted file mode 100644 index bac769f..0000000 --- a/godot/addons/PaletteTools/Scripts/color_sample.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://8epr28t2njss diff --git a/godot/addons/PaletteTools/Scripts/custom_picker.gd b/godot/addons/PaletteTools/Scripts/custom_picker.gd deleted file mode 100644 index 9abc924..0000000 --- a/godot/addons/PaletteTools/Scripts/custom_picker.gd +++ /dev/null @@ -1,15 +0,0 @@ -@tool -extends PopupPanel - -@export var color_picker: ColorPicker -@export var saved_palettes: ItemList -@export var apply_palette_button: Button - - -func _init() -> void: - hide() - min_size = Vector2i(320, 675) - size = Vector2i(320, 675) - if DisplayServer.screen_get_size().x > 2000: - min_size *= 2 - size *= 2 diff --git a/godot/addons/PaletteTools/Scripts/custom_picker.gd.uid b/godot/addons/PaletteTools/Scripts/custom_picker.gd.uid deleted file mode 100644 index 87e99d8..0000000 --- a/godot/addons/PaletteTools/Scripts/custom_picker.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b3jncwvxjir6f diff --git a/godot/addons/PaletteTools/Scripts/custom_property.gd b/godot/addons/PaletteTools/Scripts/custom_property.gd deleted file mode 100644 index 9a6b3c6..0000000 --- a/godot/addons/PaletteTools/Scripts/custom_property.gd +++ /dev/null @@ -1,67 +0,0 @@ -extends EditorProperty - -signal mouse_released - -const CustomPalette := preload("res://addons/PaletteTools/Scripts/custom_picker.gd") - -var property_control: Control -var updating := false -var custom_palette: CustomPalette - - -func _init(cust_palette: CustomPalette, obj: Object, named = null) -> void: - property_control = load("res://addons/PaletteTools/Scenes/custom_palette.tscn").instantiate() - custom_palette = cust_palette - if named and obj[named]: - property_control.color = obj[named] - else: - property_control.color = Color.BLACK - add_child(property_control) - add_focusable(property_control) - property_control.get_child(0).pressed.connect(_on_button_pressed) - resource_selected.connect(resource_prop) - - -func resource_prop(path: String, prop: Resource) -> void: - if prop.get(path): - var p := prop.get(path) - if p is Vector4: - property_control.color = Color(p.x, p.y, p.z, p.w) - else: - property_control.color = p - else: - property_control.color = Color.WHITE - - -func _on_button_pressed() -> void: - if not custom_palette: - push_warning( - 'Error in Palette Tools addon: If the "Palette Tools" addon was just activated, ' - + "please select a different node before trying to edit color properties of this one. " - + "This error happens becuase the inspector was loaded before the addon. If you didn't " - + "just activate the addon or start the Godot editor, you can try turning the addon " - + "on and off. If the problem persists, you may need to disable the addon. If this happens, " - + "please report any relevant info so a fix can be made. Thanks!" - ) - return - custom_palette.popup(Rect2(get_global_mouse_position() - Vector2(size.x, (size.y * 20)), size)) - custom_palette.color_picker.color = get_edited_object()[get_edited_property()] - custom_palette.popup_hide.connect(cust_palette_closed, CONNECT_ONE_SHOT) - custom_palette.color_picker.color_changed.connect(cust_palette_changed) - - -func cust_palette_changed(new_color: Color) -> void: - property_control.color = new_color - - -func cust_palette_closed() -> void: - custom_palette.color_picker.color_changed.disconnect(cust_palette_changed) - property_control.color = custom_palette.color_picker.color - emit_changed(get_edited_property(), property_control.color) - - -func _update_property() -> void: - if get_edited_object() and get_edited_object()[get_edited_property()]: - property_control.color = get_edited_object()[get_edited_property()] - else: - property_control.color = Color.BLACK diff --git a/godot/addons/PaletteTools/Scripts/custom_property.gd.uid b/godot/addons/PaletteTools/Scripts/custom_property.gd.uid deleted file mode 100644 index c10c223..0000000 --- a/godot/addons/PaletteTools/Scripts/custom_property.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bnpe28125rr05 diff --git a/godot/addons/PaletteTools/Scripts/get_from_url.gd b/godot/addons/PaletteTools/Scripts/get_from_url.gd deleted file mode 100644 index ae740e0..0000000 --- a/godot/addons/PaletteTools/Scripts/get_from_url.gd +++ /dev/null @@ -1,29 +0,0 @@ -@tool -extends HTTPRequest - -const Palette := preload("res://addons/PaletteTools/Scripts/palette_tool.gd") - -@export var colors: Palette - -var searching := false - - -func get_palette(url: String) -> void: - if searching: - return - searching = true - if url.ends_with("/"): - url = url.left(-1) - var error := request(url + ".json") - if error != OK: - push_error("An error occurred in the HTTP request.") - - -func _on_request_completed(result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray) -> void: - searching = false - var json := FileAccess.get_file_as_string(download_file) - var json_obj := JSON.parse_string(json) - - colors.preview_colors(json_obj.colors) - colors.p_name_text.text = json_obj.name - colors.p_author_text.text = json_obj.author diff --git a/godot/addons/PaletteTools/Scripts/get_from_url.gd.uid b/godot/addons/PaletteTools/Scripts/get_from_url.gd.uid deleted file mode 100644 index b8b7dcb..0000000 --- a/godot/addons/PaletteTools/Scripts/get_from_url.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bm2n1k624d6y1 diff --git a/godot/addons/PaletteTools/Scripts/loading_palettes_screen.gd b/godot/addons/PaletteTools/Scripts/loading_palettes_screen.gd deleted file mode 100644 index b869fc8..0000000 --- a/godot/addons/PaletteTools/Scripts/loading_palettes_screen.gd +++ /dev/null @@ -1,17 +0,0 @@ -@tool -extends ColorRect - -@export var loading_text: Label - - -func _ready() -> void: - visible = true - - -func _on_visibility_changed() -> void: - while visible: - await get_tree().create_timer(.7).timeout - if loading_text.text.ends_with("..."): - loading_text.text.replace("...", "") - else: - loading_text.text += "." diff --git a/godot/addons/PaletteTools/Scripts/loading_palettes_screen.gd.uid b/godot/addons/PaletteTools/Scripts/loading_palettes_screen.gd.uid deleted file mode 100644 index 033a856..0000000 --- a/godot/addons/PaletteTools/Scripts/loading_palettes_screen.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://on3p67y6kr2h diff --git a/godot/addons/PaletteTools/Scripts/palette_inspector_script.gd b/godot/addons/PaletteTools/Scripts/palette_inspector_script.gd deleted file mode 100644 index a64053f..0000000 --- a/godot/addons/PaletteTools/Scripts/palette_inspector_script.gd +++ /dev/null @@ -1,73 +0,0 @@ -extends EditorInspectorPlugin - -const custom_palette_property := preload("res://addons/PaletteTools/Scripts/custom_property.gd") -const CustomColorPicker := preload("res://addons/PaletteTools/Scripts/custom_picker.gd") -const PalettePlugin := preload("res://addons/PaletteTools/palette_tools.gd") -#const custom_palette_picker: PackedScene #= pre - -var my_picker: CustomColorPicker -var my_plugin: PalettePlugin -var saved_palettes: ItemList -var editor_inspector: EditorInspector - - -func _init(plugin: PalettePlugin) -> void: - #custom_palette_picker = load("res://addons/PaletteTools/Scenes/custom_picker.tscn") - my_plugin = plugin - my_picker = load("res://addons/PaletteTools/Scenes/custom_picker.tscn").instantiate() as CustomColorPicker - my_plugin.dock.add_child(my_picker) - - my_plugin.colors.palette_list_updated.connect(load_palettes) - saved_palettes = my_picker.saved_palettes - saved_palettes.item_activated.connect(set_palette) - my_picker.apply_palette_button.pressed.connect(set_palette.bind(-1)) - - editor_inspector = my_plugin.get_editor_interface().get_inspector() - - -func initial_palette(): - var col_picker := my_picker.color_picker as ColorPicker - var editor_settings := my_plugin.get_editor_interface().get_editor_settings() - var preset_settings := editor_settings.get_project_metadata("color_picker", "presets", []) - if preset_settings: - for color: String in preset_settings: - col_picker.add_preset(Color(color)) - - -func _can_handle(object: Object) -> bool: - if object is Resource: - var prop := custom_palette_property.new(my_picker, object) - for property: Dictionary in object.get_property_list(): - if "color" in property.name: - prop.resource_selected.emit(property.name, object) - return false - return true - - -func _parse_property(object: Object, type: Variant.Type, name: String, hint_type: PropertyHint, hint_string: String, usage_flags: PropertyHint, wide: bool) -> bool: - if type == TYPE_COLOR: - var prop := custom_palette_property.new(my_picker, object, name) - add_property_editor(name, prop) - return true - else: - return false - - -func load_palettes() -> void: - if my_plugin.colors.my_palettes.size() > 0: - saved_palettes.clear() - for p in my_plugin.colors.my_palettes: - saved_palettes.add_item(p.name) - else: - saved_palettes.clear() - saved_palettes.add_item("No Palettes") - - -func set_palette(palette_num: int) -> void: - if palette_num == -1 and saved_palettes.get_selected_items().size() > 0: - palette_num = saved_palettes.get_selected_items()[0] - var col_picker: ColorPicker = my_picker.color_picker - for color: Color in col_picker.get_presets(): - col_picker.erase_preset(color) - for color: Color in my_plugin.colors.my_palettes[palette_num].colors: - col_picker.add_preset(color) diff --git a/godot/addons/PaletteTools/Scripts/palette_inspector_script.gd.uid b/godot/addons/PaletteTools/Scripts/palette_inspector_script.gd.uid deleted file mode 100644 index d63a652..0000000 --- a/godot/addons/PaletteTools/Scripts/palette_inspector_script.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dhc2n37pvfjsx diff --git a/godot/addons/PaletteTools/Scripts/palette_tool.gd b/godot/addons/PaletteTools/Scripts/palette_tool.gd deleted file mode 100644 index e130dcd..0000000 --- a/godot/addons/PaletteTools/Scripts/palette_tool.gd +++ /dev/null @@ -1,310 +0,0 @@ -@tool -extends Control - -const Alert := preload("res://addons/PaletteTools/Scripts/alert_popup_panel.gd") -const URLHTTP := preload("res://addons/PaletteTools/Scripts/get_from_url.gd") -const BrowsePalettes := preload("res://addons/PaletteTools/Scripts/browse_popup.gd") -const PalettePlugin := preload("res://addons/PaletteTools/palette_tools.gd") -const ColorSample := preload("res://addons/PaletteTools/Scripts/color_sample.gd") - -signal palette_list_updated - -@export var http: URLHTTP -@export var url: LineEdit -@export var color_preview: HFlowContainer -@export var editor_swatch_save: Control -@export var restart_editor: Control -@export var alert: Alert -@export var p_name_text: LineEdit -@export var p_author_text: LineEdit -@export var saved_palettes: ItemList -@export var clear_preview_button: Button -@export var col_pick_popup: PopupPanel -@export var browse_popup_panel: BrowsePalettes -@export var add_color_scene: PackedScene -@export var color_sample: PackedScene -@export var custom_picker_check_box: CheckBox -var my_plugin: PalettePlugin -var my_palettes: Array[Dictionary] = [] -var config := ConfigFile.new() -var config_path := "res://addons/PaletteTools/color_presets.cfg" -var editing_color_on: ColorPickerButton -var four_k_plus: bool = false - - -func _ready() -> void: - if DisplayServer.screen_get_size().x > 2000: - four_k_plus = true - load_palettes() - _on_new_palette_pressed() - iterate_for_control_sizing(self) - - -## We want to size the plugin to look good in both 1080p and 4k -func iterate_for_control_sizing(node: Node) -> void: - ##TODO: See if there's anything to do about this if/else abomination - if node is Window: - return - - if node is Label and node.label_settings: - if "Title" in node.name: - if node.name == "Title": - if four_k_plus: - node.label_settings.font_size = 80 - else: - node.label_settings.font_size = 40 - else: - if four_k_plus: - node.label_settings.font_size = 50 - else: - node.label_settings.font_size = 25 - else: - if four_k_plus: - node.label_settings.font_size = 40 - else: - node.label_settings.font_size = 22 - - if node is CheckBox: - if four_k_plus: - node.add_theme_icon_override("checked", load("res://addons/PaletteTools/Images/checked_4k.png")) - node.add_theme_icon_override("unchecked", load("res://addons/PaletteTools/Images/unchecked_4k.png")) - else: - node.add_theme_icon_override("checked", load("res://addons/PaletteTools/Images/checked.png")) - node.add_theme_icon_override("unchecked", load("res://addons/PaletteTools/Images/unchecked.png")) - - if node is RichTextLabel: - if four_k_plus: - node.add_theme_font_size_override("normal_font_size", 40) - else: - node.add_theme_font_size_override("normal_font_size", 20) - - if node is Button or node is TextureButton or node is LineEdit or node is ItemList: - if (node is Button and node.icon) or node is TextureButton: - if four_k_plus: - node.custom_minimum_size = Vector2i(80, node.get_minimum_size().y) - else: - node.custom_minimum_size = Vector2i(40, node.get_minimum_size().y) - node.update_minimum_size() - else: - if four_k_plus: - node.add_theme_font_size_override("font_size", 30) - else: - node.add_theme_font_size_override("font_size", 16) - for c in node.get_children(): - iterate_for_control_sizing(c) - - -func size_color_sample(cs: ColorSample) -> void: - if four_k_plus: - cs.custom_minimum_size = Vector2i(95, 95) - cs.remove_button.custom_minimum_size = Vector2i(30, 30) - cs.remove_button_text.label_settings.font_size = 20 - else: - cs.custom_minimum_size = Vector2i(40, 40) - cs.remove_button.custom_minimum_size = Vector2i(10, 10) - cs.remove_button_text.label_settings.font_size = 10 - cs.update_minimum_size() - cs.remove_button.update_minimum_size() - - -func preview_colors(p_colors: PackedStringArray) -> void: - for c in color_preview.get_children(): - c.queue_free() - - for pc: String in p_colors: - var cs: ColorSample = color_sample.instantiate() - var col_pick_btn := cs.color_picker_button as ColorPickerButton - col_pick_btn.color = Color.from_string(pc, Color.RED) - col_pick_btn.get_picker().presets_visible = false - col_pick_btn.get_picker().picker_shape = ColorPicker.SHAPE_OKHSL_CIRCLE - - if four_k_plus: - cs.remove_button.size = Vector2i(20, 20) - else: - cs.remove_button.size = Vector2i(10, 10) - - cs.remove_button.pressed.connect(remove_color.bind(cs)) - color_preview.add_child(cs) - size_color_sample(cs) - - var add_box := add_color_scene.instantiate() - if four_k_plus: - add_box.custom_minimum_size = Vector2i(95, 95) - else: - add_box.custom_minimum_size = Vector2i(40, 40) - color_preview.add_child(add_box) - add_box.update_minimum_size() - add_box.get_child(0).pressed.connect(add_color_to_palette) - - await get_tree().create_timer(.01).timeout - - if color_preview.get_child_count() > 2: - editor_swatch_save.visible = true - clear_preview_button.visible = true - else: - editor_swatch_save.visible = false - clear_preview_button.visible = false - - -func _on_line_edit_text_submitted(new_text: String) -> void: - if new_text.length() > 0: - http.get_palette(new_text) - else: - alert.alert("Please enter a URL") - - -func load_palettes() -> void: - my_palettes.clear() - config.load(config_path) - var json := JSON.new() - if config.has_section("color_picker"): - for sec in config.get_section_keys("color_picker"): - my_palettes.append(json.parse_string(config.get_value("color_picker", sec))) - - if my_palettes.size() > 0: - saved_palettes.clear() - for p in my_palettes: - saved_palettes.add_item(p.name) - else: - saved_palettes.clear() - saved_palettes.add_item("No Palettes") - - -func save_new_palette() -> void: - if color_preview.get_child_count() < 2: - alert.alert("Please add at least one color to save a palette") - return - if p_name_text.text.length() <= 0: - alert.alert("Please add a name to save a palette") - return - - var temp_pca: Array[String] = [] - for c in color_preview.get_children(): - if c == color_preview.get_child(-1): - continue - var color = (c as ColorSample).color_picker_button.color - temp_pca.append(color.to_html()) - - var json := JSON.new() - var new_pal := json.stringify({ - "name": p_name_text.text, - "author": p_author_text.text, - "colors": temp_pca - }) - config.set_value("color_picker", p_name_text.text, new_pal) - config.save(config_path) - - load_palettes() - palette_list_updated.emit() - - -func _on_save_to_editor_button_pressed() -> void: - restart_editor.visible = true - var settings = my_plugin.get_editor_interface().get_editor_settings() - var temp_pca: Array[String] = [] - for c in color_preview.get_children(): - if c == color_preview.get_child(-1): - continue - var color := c.get_node("Color").color as Color - temp_pca.append(color.to_html()) - - settings.set_project_metadata("color_picker", "presets", temp_pca) - - -func _on_restart_editor_pressed() -> void: - my_plugin.get_editor_interface().restart_editor() - - -func _on_search_pressed() -> void: - if url.text.length() > 0: - http.get_palette(url.text) - else: - alert.alert("Please enter a URL") - - -func _on_save_palette_pressed() -> void: - save_new_palette() - - -func _on_load_palette_pressed() -> void: - if saved_palettes.get_selected_items().size() <= 0: - await get_tree().process_frame - alert.alert("Please select a palette") - return - - if not config.has_section("color_picker"): - alert.alert("No palettes saved") - return - var load_color := JSON.parse_string(config.get_value("color_picker", saved_palettes.get_item_text(saved_palettes.get_selected_items()[0]))) - p_name_text.text = load_color.name - p_author_text.text = load_color.author - preview_colors(load_color.colors) - - -func add_color_to_palette() -> void: - var cs: ColorSample = color_sample.instantiate() as ColorSample - editor_swatch_save.visible = true - clear_preview_button.visible = true - color_preview.add_child(cs) - color_preview.move_child(cs, -2) - size_color_sample(cs) - editing_color_on = cs.color_picker_button as ColorPickerButton - editing_color_on.get_picker().presets_visible = false - editing_color_on.get_picker().picker_shape = ColorPicker.SHAPE_OKHSL_CIRCLE - cs.remove_button.pressed.connect(remove_color.bind(cs)) - cs.color_picker_button.get_popup().popup( - Rect2( - get_global_mouse_position() - Vector2(size.x, size.y * 20), - cs.color_picker_button.get_popup().size - ) - ) - - -func remove_color(obj: Node) -> void: - obj.queue_free() - if color_preview.get_child_count() < 3: - editor_swatch_save.visible = false - clear_preview_button.visible = false - - -func _on_delete_palette_pressed() -> void: - if config.has_section("color_picker"): - config.erase_section_key("color_picker", saved_palettes.get_item_text(saved_palettes.get_selected_items()[0])) - config.save(config_path) - load_palettes() - palette_list_updated.emit() - - -func _on_new_palette_pressed() -> void: - p_name_text.text = "" - p_author_text.text = "" - saved_palettes.deselect_all() - preview_colors([]) - - -func _on_color_picker_color_changed(color: Color) -> void: - editing_color_on.color = color - - -func _on_saved_palettes_item_activated(_index: int) -> void: - _on_load_palette_pressed() - - -func _on_clear_pressed() -> void: - p_name_text.text = "" - p_author_text.text = "" - preview_colors([]) - - -func import_palette_from_browse(palette_obj: Dictionary) -> void: - p_name_text.text = palette_obj.name - p_author_text.text = palette_obj.author - preview_colors(palette_obj.colors) - - -func _on_browse_palettes_button_pressed() -> void: - browse_popup_panel.visible = true - - -func _on_custom_picker_check_box_toggled(toggled_on: bool) -> void: - my_plugin.toggle_custom_picker(toggled_on) diff --git a/godot/addons/PaletteTools/Scripts/palette_tool.gd.uid b/godot/addons/PaletteTools/Scripts/palette_tool.gd.uid deleted file mode 100644 index ca094dd..0000000 --- a/godot/addons/PaletteTools/Scripts/palette_tool.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://blkegljtk4m4l diff --git a/godot/addons/PaletteTools/Shaders/rainbow_shader.gdshader b/godot/addons/PaletteTools/Shaders/rainbow_shader.gdshader deleted file mode 100644 index 8114347..0000000 --- a/godot/addons/PaletteTools/Shaders/rainbow_shader.gdshader +++ /dev/null @@ -1,34 +0,0 @@ -//Shader is CC0 from https://godotshaders.com/shader/moving-rainbow-gradient/ -// by Exuin - -// HSV to RBG from https://www.rapidtables.com/convert/color/hsv-to-rgb.html -// Rotation matrix from https://en.wikipedia.org/wiki/Rotation_matrix - -shader_type canvas_item; - - -uniform float strength: hint_range(0., 1.) = 0.5; -uniform float speed: hint_range(0., 10.) = 0.5; -uniform float angle: hint_range(0., 360.) = 0.; - -void fragment() { - float hue = UV.x * cos(radians(angle)) - UV.y * sin(radians(angle)); - hue = fract(hue + fract(TIME * speed)); - float x = 1. - abs(mod(hue / (1./ 6.), 2.) - 1.); - vec3 rainbow; - if(hue < 1./6.){ - rainbow = vec3(1., x, 0.); - } else if (hue < 1./3.) { - rainbow = vec3(x, 1., 0); - } else if (hue < 0.5) { - rainbow = vec3(0, 1., x); - } else if (hue < 2./3.) { - rainbow = vec3(0., x, 1.); - } else if (hue < 5./6.) { - rainbow = vec3(x, 0., 1.); - } else { - rainbow = vec3(1., 0., x); - } - vec4 color = texture(TEXTURE, UV); - COLOR = mix(color, vec4(rainbow, color.a), strength); -} \ No newline at end of file diff --git a/godot/addons/PaletteTools/Shaders/rainbow_shader.gdshader.uid b/godot/addons/PaletteTools/Shaders/rainbow_shader.gdshader.uid deleted file mode 100644 index 0251bef..0000000 --- a/godot/addons/PaletteTools/Shaders/rainbow_shader.gdshader.uid +++ /dev/null @@ -1 +0,0 @@ -uid://d28kki7c38q1s diff --git a/godot/addons/PaletteTools/icon.png b/godot/addons/PaletteTools/icon.png deleted file mode 100644 index be5fdf32d139ab50f44ea4f810b37b21421838db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74171 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

u|vtf(66y#7})Gc=%h2|Ipx_=9UpV8T;5> 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 t5UJm2VbMAh4z?Ta}UhE$w$TwFgF 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 void: - ## load configurations if they exist - var err := config.load(config_path) - - ## If configurations don't exist, it's probably the first plugin load. - ## If installed from the asset library, the plugin is automatically activated. - ## We want to wait for textures to be imported before loading the plugin for this reason. - ## Not doing so will procude log errors and require a project restart - ## before the plugin will work. - if err != OK: - ## Bool to break out of a loop from sub loop - var found_import := false - ## Search for first sign that the import has happened - ## Max attempt of 10 seconds(0.1 * 100) - for try in max_first_load_tries: - for file in DirAccess.get_files_at("res://addons/PaletteTools/Images/"): - if ".import" in file: - found_import = true - break - if found_import: - break - await get_tree().create_timer(.1).timeout - if not found_import: - ## Test - ## Plugin will fail to load if this point is somehow reached. - ## Show error, stop load, and disable to prevent error spam before also failing. - push_error( - "Palette Tools failed to locate both configuration settings and imported textures. " - + "Turning the plugin on again or a project restart may fix this if you have not modified the plugin. " - + "Stopping plugin load and deactivating to prevent a less graceful failure. " - + "If you are modifying the plugin and running into this error, " - + "please edit res://addons/PaletteTools/palette_tools.gd to your needs." - ) - abort_load() - return - - dock = load("res://addons/PaletteTools/Scenes/palette_tools.tscn").instantiate() as Control - colors = dock.get_node("Colors") as Palette - inspector_palette_plugin = load("res://addons/PaletteTools/Scripts/palette_inspector_script.gd").new(self) - - colors.my_plugin = self - add_control_to_dock(DOCK_SLOT_RIGHT_UL, dock) - - var json := JSON.new() - if config.has_section("settings"): - var toggled: bool = config.get_value("settings", "custom_palette_on") - if toggled: - toggle_custom_picker(toggled) - colors.custom_picker_check_box.button_pressed = toggled - else: - config.set_value("settings", "custom_palette_on", false) - - inspector_palette_plugin.load_palettes() - inspector_palette_plugin.initial_palette() - - -func toggle_custom_picker(state: bool): - config.set_value("settings", "custom_palette_on", state) - config.save(config_path) - if state: - add_inspector_plugin(inspector_palette_plugin) - else: - remove_inspector_plugin(inspector_palette_plugin) - - -func _exit_tree() -> void: - if dock: - remove_control_from_docks(dock) - dock.free() - - if is_instance_valid(inspector_palette_plugin) and config.get_value("settings", "custom_palette_on"): - remove_inspector_plugin(inspector_palette_plugin) - - -func _get_plugin_icon() -> Texture2D: - return load("res://addons/PaletteTools/icon.png") - - -func _get_plugin_name() -> String: - return "Palette Tools" - - -func abort_load(): - await get_tree().create_timer(.1).timeout - get_editor_interface().set_plugin_enabled("PaletteTools", false) diff --git a/godot/addons/PaletteTools/palette_tools.gd.uid b/godot/addons/PaletteTools/palette_tools.gd.uid deleted file mode 100644 index 80835d4..0000000 --- a/godot/addons/PaletteTools/palette_tools.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c0f14vlthbxx8 diff --git a/godot/addons/PaletteTools/plugin.cfg b/godot/addons/PaletteTools/plugin.cfg deleted file mode 100644 index 332faeb..0000000 --- a/godot/addons/PaletteTools/plugin.cfg +++ /dev/null @@ -1,7 +0,0 @@ -[plugin] - -name="Palette Tools" -description="Color palatte plugin" -author="RancidMilk" -version="1.6.2" -script="palette_tools.gd" diff --git a/godot/addons/PaletteTools/temp_palette.txt b/godot/addons/PaletteTools/temp_palette.txt deleted file mode 100644 index e69de29..0000000 diff --git a/godot/addons/beehave/LICENSE b/godot/addons/beehave/LICENSE deleted file mode 100644 index caabbff..0000000 --- a/godot/addons/beehave/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 bitbrain - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/godot/addons/beehave/blackboard.gd b/godot/addons/beehave/blackboard.gd deleted file mode 100644 index c152152..0000000 --- a/godot/addons/beehave/blackboard.gd +++ /dev/null @@ -1,55 +0,0 @@ -@icon("icons/blackboard.svg") -class_name Blackboard extends Node - -const DEFAULT = "default" - -## The blackboard is an object that can be used to store and access data between -## multiple nodes of the behavior tree. -@export var blackboard: Dictionary = {}: - set(b): - blackboard = b.duplicate() - _data[DEFAULT] = blackboard - -var _data: Dictionary = {} - - -func _ready(): - blackboard = blackboard.duplicate() - _data[DEFAULT] = blackboard - - -func keys() -> Array[String]: - var keys: Array[String] - keys.assign(_data.keys().duplicate()) - return keys - - -func set_value(key: Variant, value: Variant, blackboard_name: String = DEFAULT) -> void: - if not _data.has(blackboard_name): - _data[blackboard_name] = {} - - _data[blackboard_name][key] = value - - -func get_value( - key: Variant, default_value: Variant = null, blackboard_name: String = DEFAULT -) -> Variant: - if has_value(key, blackboard_name): - return _data[blackboard_name].get(key, default_value) - return default_value - - -func has_value(key: Variant, blackboard_name: String = DEFAULT) -> bool: - return ( - _data.has(blackboard_name) - and _data[blackboard_name].has(key) - and _data[blackboard_name][key] != null - ) - - -func erase_value(key: Variant, blackboard_name: String = DEFAULT) -> void: - if _data.has(blackboard_name): - _data[blackboard_name][key] = null - -func get_debug_data() -> Dictionary: - return _data diff --git a/godot/addons/beehave/blackboard.gd.uid b/godot/addons/beehave/blackboard.gd.uid deleted file mode 100644 index 8d335c7..0000000 --- a/godot/addons/beehave/blackboard.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dme5f24l0edsf diff --git a/godot/addons/beehave/debug/debugger.gd b/godot/addons/beehave/debug/debugger.gd deleted file mode 100644 index adb6732..0000000 --- a/godot/addons/beehave/debug/debugger.gd +++ /dev/null @@ -1,99 +0,0 @@ -@tool -extends EditorDebuggerPlugin - -const DebuggerTab := preload("debugger_tab.gd") -const BeehaveUtils := preload("res://addons/beehave/utils/utils.gd") - -var debugger_tab := DebuggerTab.new() -var floating_window: Window -var session: EditorDebuggerSession - - -func _has_capture(prefix: String) -> bool: - return prefix == "beehave" - - -func _capture(message: String, data: Array, session_id: int) -> bool: - # in case the behavior tree has invalid setup this might be null - if debugger_tab == null: - return false - - if message == "beehave:register_tree": - debugger_tab.register_tree(data[0]) - return true - if message == "beehave:unregister_tree": - debugger_tab.unregister_tree(data[0]) - return true - if message == "beehave:process_interrupt": - debugger_tab.graph.process_interrupt(data[0], data[1]) - return true - if message == "beehave:process_tick": - debugger_tab.graph.process_tick(data[0], data[1], data[2]) - return true - if message == "beehave:process_begin": - debugger_tab.graph.process_begin(data[0], data[1]) - return true - if message == "beehave:process_end": - debugger_tab.graph.process_end(data[0], data[1]) - return true - return false - - -func _setup_session(session_id: int) -> void: - session = get_session(session_id) - session.started.connect(debugger_tab.start) - session.stopped.connect(debugger_tab.stop) - - debugger_tab.name = "🐝 Beehave" - debugger_tab.make_floating.connect(_on_make_floating) - debugger_tab.session = session - session.add_session_tab(debugger_tab) - - -func _on_make_floating() -> void: - var plugin := BeehaveUtils.get_plugin() - if not plugin: - return - if floating_window: - _on_window_close_requested() - return - - var border_size := Vector2(4, 4) * BeehaveUtils.get_editor_scale() - var editor_interface: EditorInterface = plugin.get_editor_interface() - var editor_main_screen = editor_interface.get_editor_main_screen() - debugger_tab.get_parent().remove_child(debugger_tab) - - floating_window = Window.new() - - var panel := Panel.new() - panel.add_theme_stylebox_override( - "panel", - editor_interface.get_base_control().get_theme_stylebox("PanelForeground", "EditorStyles") - ) - panel.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) - floating_window.add_child(panel) - - var margin := MarginContainer.new() - margin.add_child(debugger_tab) - margin.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) - margin.add_theme_constant_override("margin_right", border_size.x) - margin.add_theme_constant_override("margin_left", border_size.x) - margin.add_theme_constant_override("margin_top", border_size.y) - margin.add_theme_constant_override("margin_bottom", border_size.y) - panel.add_child(margin) - - floating_window.title = "🐝 Beehave" - floating_window.wrap_controls = true - floating_window.min_size = Vector2i(600, 350) - floating_window.size = debugger_tab.size - floating_window.position = editor_main_screen.global_position - floating_window.transient = true - floating_window.close_requested.connect(_on_window_close_requested) - editor_interface.get_base_control().add_child(floating_window) - - -func _on_window_close_requested() -> void: - debugger_tab.get_parent().remove_child(debugger_tab) - session.add_session_tab(debugger_tab) - floating_window.queue_free() - floating_window = null diff --git a/godot/addons/beehave/debug/debugger.gd.uid b/godot/addons/beehave/debug/debugger.gd.uid deleted file mode 100644 index 72a094c..0000000 --- a/godot/addons/beehave/debug/debugger.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dhh8iwql2tur2 diff --git a/godot/addons/beehave/debug/debugger_messages.gd b/godot/addons/beehave/debug/debugger_messages.gd deleted file mode 100644 index 3eddb09..0000000 --- a/godot/addons/beehave/debug/debugger_messages.gd +++ /dev/null @@ -1,33 +0,0 @@ -class_name BeehaveDebuggerMessages - - -static func can_send_message() -> bool: - return not Engine.is_editor_hint() and OS.has_feature("editor") - - -static func register_tree(beehave_tree: Dictionary) -> void: - if can_send_message(): - EngineDebugger.send_message("beehave:register_tree", [beehave_tree]) - - -static func unregister_tree(instance_id: int) -> void: - if can_send_message(): - EngineDebugger.send_message("beehave:unregister_tree", [instance_id]) - - -static func process_tick(instance_id: int, status: int, blackboard: Dictionary = {}) -> void: - if can_send_message(): - EngineDebugger.send_message("beehave:process_tick", [instance_id, status, blackboard]) - -static func process_interrupt(instance_id: int, blackboard: Dictionary = {}) -> void: - if can_send_message(): - EngineDebugger.send_message("beehave:process_interrupt", [instance_id, blackboard]) - -static func process_begin(instance_id: int, blackboard: Dictionary = {}) -> void: - if can_send_message(): - EngineDebugger.send_message("beehave:process_begin", [instance_id, blackboard]) - - -static func process_end(instance_id: int, blackboard: Dictionary = {}) -> void: - if can_send_message(): - EngineDebugger.send_message("beehave:process_end", [instance_id, blackboard]) diff --git a/godot/addons/beehave/debug/debugger_messages.gd.uid b/godot/addons/beehave/debug/debugger_messages.gd.uid deleted file mode 100644 index 2148e0e..0000000 --- a/godot/addons/beehave/debug/debugger_messages.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ubuuvrubeh85 diff --git a/godot/addons/beehave/debug/debugger_tab.gd b/godot/addons/beehave/debug/debugger_tab.gd deleted file mode 100644 index 58c6cc7..0000000 --- a/godot/addons/beehave/debug/debugger_tab.gd +++ /dev/null @@ -1,215 +0,0 @@ -@tool -class_name BeehaveDebuggerTab -extends PanelContainer - -const Utils = preload("res://addons/beehave/utils/utils.gd") -const TREE_ICON = preload("../icons/tree.svg") -const OldGraph = preload("old_graph_edit.gd") -const NewGraph = preload("new_graph_edit.gd") -const Blackboard = preload("new_node_blackboard.gd") - -signal make_floating - -var session: EditorDebuggerSession -var first_run = true -var active_trees = {} -var active_tree_id = -1 - -# UI nodes -var container: HSplitContainer -var item_list: ItemList -var graph_container: HSplitContainer -var graph -var blackboard_vbox: VBoxContainer -var message: Label - -func _ready() -> void: - _build_ui() - _init_graph() - stop() - - visibility_changed.connect(_on_visibility_changed) - if visible and is_visible_in_tree(): - get_tree().create_timer(0.5).timeout.connect(_on_visibility_changed) - - -func _build_ui() -> void: - # Main split fills entire panel - container = HSplitContainer.new() - container.set_anchors_preset(Control.PRESET_FULL_RECT) - add_child(container) - - # Left: behavior‐tree list - item_list = ItemList.new() - item_list.custom_minimum_size = Vector2(300, 0) - item_list.item_selected.connect(_on_item_selected) - container.add_child(item_list) - - # Right: graph + (optional) blackboard - graph_container = HSplitContainer.new() - graph_container.size_flags_horizontal = Control.SIZE_EXPAND_FILL - container.add_child(graph_container) - - # Blackboard pane: narrow, hidden until needed - blackboard_vbox = VBoxContainer.new() - blackboard_vbox.custom_minimum_size = Vector2(500, 0) - blackboard_vbox.size_flags_horizontal = Control.SIZE_EXPAND_FILL - blackboard_vbox.size_flags_vertical = Control.SIZE_EXPAND_FILL - blackboard_vbox.hide() - graph_container.add_child(blackboard_vbox) - - # "Run Project for debugging" overlay - message = Label.new() - message.text = "Run Project for debugging" - message.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER - message.vertical_alignment = VERTICAL_ALIGNMENT_CENTER - message.set_anchors_preset(Control.PRESET_CENTER) - add_child(message) - - -func _init_graph() -> void: - var frames = Utils.get_frames() - if Engine.get_version_info().minor >= 2: - graph = NewGraph.new(frames) - else: - graph = OldGraph.new(frames) - - # Graph on the left, blackboard (index 1) on the right - graph.node_selected.connect(_on_graph_node_selected) - graph.node_deselected.connect(_on_graph_node_deselected) - graph.size_flags_horizontal = Control.SIZE_EXPAND_FILL - graph_container.add_child(graph) - graph_container.move_child(graph, 0) - - # "Make Floating" button - var float_btn = Button.new() - float_btn.name = "MakeFloatingButton" - float_btn.flat = true - float_btn.focus_mode = Control.FOCUS_NONE - float_btn.icon = get_theme_icon("ExternalLink", "EditorIcons") - float_btn.pressed.connect(func(): - emit_signal("make_floating") - ) - graph.get_menu_container().add_child(float_btn) - - # "Toggle Panel" button - var toggle_btn = Button.new() - toggle_btn.name = "TogglePanelButton" - toggle_btn.flat = true - toggle_btn.focus_mode = Control.FOCUS_NONE - toggle_btn.icon = get_theme_icon("Back", "EditorIcons") - toggle_btn.pressed.connect(func(): - item_list.visible = not item_list.visible - var icon_name = "Back" if item_list.visible else "Forward" - toggle_btn.icon = get_theme_icon(icon_name, "EditorIcons") - ) - graph.get_menu_container().add_child(toggle_btn) - graph.get_menu_container().move_child(toggle_btn, 0) - - -func start() -> void: - container.visible = true - message.visible = false - - if first_run: - first_run = false - for delay in [0.0, 0.1, 0.5]: - get_tree().create_timer(delay).timeout.connect(_notify_state) - else: - _notify_state() - - # Auto-detach if enabled in project settings - check every time - if ProjectSettings.get_setting("beehave/debugger/start_detached", false): - emit_signal("make_floating") - - -func _notify_state() -> void: - if not session or not visible or not is_visible_in_tree(): - return - session.send_message("beehave:visibility_changed", [true]) - if active_tree_id != -1: - session.send_message("beehave:activate_tree", [active_tree_id]) - - -func stop() -> void: - container.visible = false - message.visible = true - active_trees.clear() - item_list.clear() - graph.beehave_tree = {} - blackboard_vbox.hide() - - -func register_tree(data: Dictionary) -> void: - var id_str = str(data.id) - if not active_trees.has(id_str): - var idx = item_list.add_item(data.name, TREE_ICON) - item_list.set_item_tooltip(idx, data.path) - item_list.set_item_metadata(idx, data.id) - active_trees[id_str] = data - - if data.id.to_int() == active_tree_id: - _notify_state() - - if item_list.get_selected_items().is_empty(): - _select_item_by_id(id_str) - - -func unregister_tree(instance_id: int) -> void: - var id_str = str(instance_id) - for i in range(item_list.get_item_count()): - if item_list.get_item_metadata(i) == id_str: - item_list.remove_item(i) - break - active_trees.erase(id_str) - if graph.beehave_tree.get("id", "") == id_str: - graph.beehave_tree = {} - blackboard_vbox.hide() - - -func _select_item_by_id(id_str: String) -> void: - for i in range(item_list.get_item_count()): - if item_list.get_item_metadata(i) == id_str: - item_list.select(i) - break - get_tree().create_timer(0.2).timeout.connect(func(): - if item_list.is_inside_tree() and not item_list.get_selected_items().is_empty(): - _on_item_selected(item_list.get_selected_items()[0]) - ) - - -func _on_item_selected(idx: int) -> void: - if idx < 0 or idx >= item_list.get_item_count(): - return - - # Immediately hide & clear the blackboard when switching trees - blackboard_vbox.hide() - for child in blackboard_vbox.get_children(): - child.free() - - var id = item_list.get_item_metadata(idx) - var tree_data = active_trees.get(str(id), {}) - if tree_data.is_empty(): - return - - graph.beehave_tree = tree_data - active_tree_id = id.to_int() - _notify_state() - get_tree().create_timer(0.1).timeout.connect(_notify_state) - - -func _on_graph_node_selected(node: GraphNode) -> void: - blackboard_vbox.show() - blackboard_vbox.add_child(Blackboard.new(Utils.get_frames(), node)) - - -func _on_graph_node_deselected(node: GraphNode) -> void: - for child in blackboard_vbox.get_children(): - if child.name == node.name: - child.free() - if blackboard_vbox.get_child_count() == 0: - blackboard_vbox.hide() - - -func _on_visibility_changed() -> void: - _notify_state() diff --git a/godot/addons/beehave/debug/debugger_tab.gd.uid b/godot/addons/beehave/debug/debugger_tab.gd.uid deleted file mode 100644 index dd4b537..0000000 --- a/godot/addons/beehave/debug/debugger_tab.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b7hbn0y1kfarn diff --git a/godot/addons/beehave/debug/global_debugger.gd b/godot/addons/beehave/debug/global_debugger.gd deleted file mode 100644 index 8d344e3..0000000 --- a/godot/addons/beehave/debug/global_debugger.gd +++ /dev/null @@ -1,70 +0,0 @@ -extends Node - -var _registered_trees: Dictionary -var _active_tree -var _pending_activation_id: int = -1 # Store the ID if activation arrives before registration -var _editor_visible: bool = false # Track editor visibility - - -func _enter_tree() -> void: - EngineDebugger.register_message_capture("beehave", _on_debug_message) - - -func _on_debug_message(message: String, data: Array) -> bool: - match message: - "activate_tree": - var requested_id: int = data[0] - _set_active_tree(requested_id) - return true - "visibility_changed": - _editor_visible = data[0] - if _active_tree and is_instance_valid(_active_tree): - # Only update _can_send_message based on editor visibility - _active_tree._can_send_message = _editor_visible - elif _pending_activation_id != -1: - # If we have a pending activation and visibility changes, try to activate it again - _set_active_tree(_pending_activation_id) - return true - return false - - -func _set_active_tree(tree_id: int) -> void: - var tree = _registered_trees.get(tree_id, null) - - if tree and is_instance_valid(tree): - # Tree found, proceed with activation - if _active_tree and is_instance_valid(_active_tree): - _active_tree._can_send_message = false # Deactivate old one - _active_tree = tree - # Activate the new tree ONLY if the editor debugger tab is actually visible - _active_tree._can_send_message = _editor_visible - - # If this was the pending ID, clear it - if _pending_activation_id == tree_id: - _pending_activation_id = -1 - else: - # Tree not found (yet), mark it as pending activation - _pending_activation_id = tree_id - - if _active_tree and is_instance_valid(_active_tree): - _active_tree._can_send_message = false - _active_tree = null # No tree is active now - - -func register_tree(tree) -> void: - var tree_id = tree.get_instance_id() - _registered_trees[tree_id] = tree - - # Check if this tree was waiting for activation - if tree_id == _pending_activation_id: - # Found the pending tree, activate it now - _set_active_tree(tree_id) # This will set _active_tree and handle _can_send_message - - -func unregister_tree(tree) -> void: - var tree_id = tree.get_instance_id() - _registered_trees.erase(tree_id) - if _active_tree == tree: - _active_tree = null - if _pending_activation_id == tree_id: - _pending_activation_id = -1 diff --git a/godot/addons/beehave/debug/global_debugger.gd.uid b/godot/addons/beehave/debug/global_debugger.gd.uid deleted file mode 100644 index 06fe496..0000000 --- a/godot/addons/beehave/debug/global_debugger.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bl3ma400hpvsh diff --git a/godot/addons/beehave/debug/icons/horizontal_layout.svg b/godot/addons/beehave/debug/icons/horizontal_layout.svg deleted file mode 100644 index 235dc62..0000000 --- a/godot/addons/beehave/debug/icons/horizontal_layout.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/godot/addons/beehave/debug/icons/horizontal_layout.svg.import b/godot/addons/beehave/debug/icons/horizontal_layout.svg.import deleted file mode 100644 index 030a49f..0000000 --- a/godot/addons/beehave/debug/icons/horizontal_layout.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bah77esichnyx" -path="res://.godot/imported/horizontal_layout.svg-d2a7af351e44f9bf61d0c938b6f47fac.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/debug/icons/horizontal_layout.svg" -dest_files=["res://.godot/imported/horizontal_layout.svg-d2a7af351e44f9bf61d0c938b6f47fac.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/debug/icons/port_bottom.svg b/godot/addons/beehave/debug/icons/port_bottom.svg deleted file mode 100644 index 3ce70e7..0000000 --- a/godot/addons/beehave/debug/icons/port_bottom.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/godot/addons/beehave/debug/icons/port_bottom.svg.import b/godot/addons/beehave/debug/icons/port_bottom.svg.import deleted file mode 100644 index 73e6829..0000000 --- a/godot/addons/beehave/debug/icons/port_bottom.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://da3b236rjbqns" -path="res://.godot/imported/port_bottom.svg-e5c5c61b642a79ab9c2b66ff56603d34.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/debug/icons/port_bottom.svg" -dest_files=["res://.godot/imported/port_bottom.svg-e5c5c61b642a79ab9c2b66ff56603d34.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/debug/icons/port_left.svg b/godot/addons/beehave/debug/icons/port_left.svg deleted file mode 100644 index c1f6717..0000000 --- a/godot/addons/beehave/debug/icons/port_left.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/godot/addons/beehave/debug/icons/port_left.svg.import b/godot/addons/beehave/debug/icons/port_left.svg.import deleted file mode 100644 index 2a0c5d3..0000000 --- a/godot/addons/beehave/debug/icons/port_left.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bnufc8p6spdtn" -path="res://.godot/imported/port_left.svg-69cd927c4db555f1edbb8d1f553ea2fd.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/debug/icons/port_left.svg" -dest_files=["res://.godot/imported/port_left.svg-69cd927c4db555f1edbb8d1f553ea2fd.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/debug/icons/port_right.svg b/godot/addons/beehave/debug/icons/port_right.svg deleted file mode 100644 index 2560af5..0000000 --- a/godot/addons/beehave/debug/icons/port_right.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/godot/addons/beehave/debug/icons/port_right.svg.import b/godot/addons/beehave/debug/icons/port_right.svg.import deleted file mode 100644 index ed576a4..0000000 --- a/godot/addons/beehave/debug/icons/port_right.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bbmd6vk23ympm" -path="res://.godot/imported/port_right.svg-f760bd8be2dd613d0d3848c998c92a2a.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/debug/icons/port_right.svg" -dest_files=["res://.godot/imported/port_right.svg-f760bd8be2dd613d0d3848c998c92a2a.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/debug/icons/port_top.svg b/godot/addons/beehave/debug/icons/port_top.svg deleted file mode 100644 index d3b99e1..0000000 --- a/godot/addons/beehave/debug/icons/port_top.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/godot/addons/beehave/debug/icons/port_top.svg.import b/godot/addons/beehave/debug/icons/port_top.svg.import deleted file mode 100644 index c8b5b76..0000000 --- a/godot/addons/beehave/debug/icons/port_top.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bw8wmxdfom8eh" -path="res://.godot/imported/port_top.svg-d1b336cdc6a0dd570305782a1e56f61d.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/debug/icons/port_top.svg" -dest_files=["res://.godot/imported/port_top.svg-d1b336cdc6a0dd570305782a1e56f61d.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/debug/icons/vertical_layout.svg b/godot/addons/beehave/debug/icons/vertical_layout.svg deleted file mode 100644 index d59ffb0..0000000 --- a/godot/addons/beehave/debug/icons/vertical_layout.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/godot/addons/beehave/debug/icons/vertical_layout.svg.import b/godot/addons/beehave/debug/icons/vertical_layout.svg.import deleted file mode 100644 index 96f7769..0000000 --- a/godot/addons/beehave/debug/icons/vertical_layout.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bpyxu6i1dx5qh" -path="res://.godot/imported/vertical_layout.svg-1a08fee4b09812a05bcf3defb8afcc4c.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/debug/icons/vertical_layout.svg" -dest_files=["res://.godot/imported/vertical_layout.svg-1a08fee4b09812a05bcf3defb8afcc4c.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/debug/new_frames.gd b/godot/addons/beehave/debug/new_frames.gd deleted file mode 100644 index 4b739fd..0000000 --- a/godot/addons/beehave/debug/new_frames.gd +++ /dev/null @@ -1,69 +0,0 @@ -@tool -extends RefCounted - - -const BeehaveUtils := preload("res://addons/beehave/utils/utils.gd") - - -const SUCCESS_COLOR := Color("#07783a") -const NORMAL_COLOR := Color("#15181e") -const FAILURE_COLOR := Color("#82010b") -const RUNNING_COLOR := Color("#c29c06") - -var panel_normal: StyleBoxFlat -var panel_success: StyleBoxFlat -var panel_failure: StyleBoxFlat -var panel_running: StyleBoxFlat - -var titlebar_normal: StyleBoxFlat -var titlebar_success: StyleBoxFlat -var titlebar_failure: StyleBoxFlat -var titlebar_running: StyleBoxFlat - - -func _init() -> void: - var plugin := BeehaveUtils.get_plugin() - if not plugin: - return - - - titlebar_normal = ( - plugin - .get_editor_interface() - .get_base_control() - .get_theme_stylebox(&"titlebar", &"GraphNode")\ - .duplicate() - ) - titlebar_success = titlebar_normal.duplicate() - titlebar_failure = titlebar_normal.duplicate() - titlebar_running = titlebar_normal.duplicate() - - titlebar_success.bg_color = SUCCESS_COLOR - titlebar_failure.bg_color = FAILURE_COLOR - titlebar_running.bg_color = RUNNING_COLOR - - titlebar_success.border_color = SUCCESS_COLOR - titlebar_failure.border_color = FAILURE_COLOR - titlebar_running.border_color = RUNNING_COLOR - - - panel_normal = ( - plugin - .get_editor_interface() - .get_base_control() - .get_theme_stylebox(&"panel", &"GraphNode") - .duplicate() - ) - panel_success = ( - plugin - .get_editor_interface() - .get_base_control() - .get_theme_stylebox(&"panel_selected", &"GraphNode") - .duplicate() - ) - panel_failure = panel_success.duplicate() - panel_running = panel_success.duplicate() - - panel_success.border_color = SUCCESS_COLOR - panel_failure.border_color = FAILURE_COLOR - panel_running.border_color = RUNNING_COLOR diff --git a/godot/addons/beehave/debug/new_frames.gd.uid b/godot/addons/beehave/debug/new_frames.gd.uid deleted file mode 100644 index aadbeb0..0000000 --- a/godot/addons/beehave/debug/new_frames.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://tn5lef5pc6ol diff --git a/godot/addons/beehave/debug/new_graph_edit.gd b/godot/addons/beehave/debug/new_graph_edit.gd deleted file mode 100644 index a033789..0000000 --- a/godot/addons/beehave/debug/new_graph_edit.gd +++ /dev/null @@ -1,319 +0,0 @@ -@tool -extends GraphEdit - -const BeehaveGraphNode := preload("new_graph_node.gd") - -const HORIZONTAL_LAYOUT_ICON := preload("icons/horizontal_layout.svg") -const VERTICAL_LAYOUT_ICON := preload("icons/vertical_layout.svg") - -const PROGRESS_SHIFT: int = 50 -const INACTIVE_COLOR: Color = Color("#000000") -const ACTIVE_COLOR: Color = Color("#c29c06") -const SUCCESS_COLOR: Color = Color("#07783a") -const FAILURE_COLOR: Color = Color("#82010b") - - -var updating_graph: bool = false -var arraging_nodes: bool = false -var beehave_tree: Dictionary: - set(value): - if beehave_tree == value: - return - beehave_tree = value - active_nodes.clear() - _update_graph() - -var horizontal_layout: bool = false: - set(value): - if updating_graph or arraging_nodes: - return - if horizontal_layout == value: - return - horizontal_layout = value - _update_layout_button() - _update_graph() - - -var frames:RefCounted -var active_nodes: Array[String] -var progress: int = 0 -var layout_button: Button - - -func _init(frames:RefCounted) -> void: - self.frames = frames - - -func _ready() -> void: - custom_minimum_size = Vector2(100, 300) - show_arrange_button = false - minimap_enabled = false - layout_button = Button.new() - layout_button.flat = true - layout_button.focus_mode = Control.FOCUS_NONE - layout_button.pressed.connect(func(): horizontal_layout = not horizontal_layout) - get_menu_container().add_child(layout_button) - _update_layout_button() - - -func _get_connection_line(from_position: Vector2, to_position: Vector2) -> PackedVector2Array: - # FIXME: hack to hide default lines because empty array crashes Godot :( - const vec1 = Vector2(-9999999, -9999999) - const vec2 = Vector2(-9999999, -9999999) - return [vec1, vec2] - - -func _update_graph() -> void: - if updating_graph: - return - - updating_graph = true - - clear_connections() - - for child in _get_child_nodes(): - remove_child(child) - child.queue_free() - - if not beehave_tree.is_empty(): - _add_nodes(beehave_tree) - _connect_nodes(beehave_tree) - _arrange_nodes.call_deferred(beehave_tree) - - updating_graph = false - - -func _add_nodes(node: Dictionary) -> void: - if node.is_empty(): - return - var gnode := BeehaveGraphNode.new(frames, horizontal_layout) - add_child(gnode) - gnode.title_text = node.name - gnode.name = node.id - gnode.icon = _get_icon(node.type.back()) - - if node.type.has(&"BeehaveTree"): - gnode.set_slots(false, true) - elif node.type.has(&"Leaf"): - gnode.set_slots(true, false) - elif node.type.has(&"Composite") or node.type.has(&"Decorator"): - gnode.set_slots(true, true) - - for child in node.get("children", []): - _add_nodes(child) - - -func _connect_nodes(node: Dictionary) -> void: - for child in node.get("children", []): - connect_node(node.id, 0, child.id, 0) - _connect_nodes(child) - - -func _arrange_nodes(node: Dictionary) -> void: - if arraging_nodes: - return - - arraging_nodes = true - - var tree_node := _create_tree_nodes(node) - tree_node.update_positions(horizontal_layout) - _place_nodes(tree_node) - - arraging_nodes = false - - -func _create_tree_nodes(node: Dictionary, root: TreeNode = null) -> TreeNode: - var tree_node := TreeNode.new(get_node(node.id), root) - for child in node.get("children", []): - var child_node := _create_tree_nodes(child, tree_node) - tree_node.children.push_back(child_node) - return tree_node - - -func _place_nodes(node: TreeNode) -> void: - node.item.position_offset = Vector2(node.x, node.y) - for child in node.children: - _place_nodes(child) - - -func _get_icon(type: StringName) -> Texture2D: - var classes := ProjectSettings.get_global_class_list() - for c in classes: - if c["class"] == type: - var icon_path := c.get("icon", String()) - if not icon_path.is_empty(): - return load(icon_path) - return null - - -func get_menu_container() -> Control: - return call("get_menu_hbox") - - -func get_status(status: int) -> String: - if status == 0: - return "SUCCESS" - elif status == 1: - return "FAILURE" - return "RUNNING" - - -func process_begin(instance_id: int, blackboard = null) -> void: - if not _is_same_tree(instance_id): - return - - for child in _get_child_nodes(): - child.set_meta("status", -1) - - - -func process_interrupt(instance_id: int, blackboard = null) -> void: - var node := get_node_or_null(str(instance_id)) - if node: - node.blackboard = blackboard - # TODO: highlight interrupt somehow (e.g. red border pops up?) - - -func process_tick(instance_id: int, status: int, blackboard = null) -> void: - var node := get_node_or_null(str(instance_id)) - if node: - node.text = "Status: %s" % get_status(status) - node.set_status(status) - node.set_meta("status", status) - node.blackboard = blackboard - if status == BeehaveNode.RUNNING: - if not active_nodes.has(node.name): - active_nodes.push_back(node.name) - - -func process_end(instance_id: int, blackboard = null) -> void: - if not _is_same_tree(instance_id): - return - - for child in _get_child_nodes(): - var status := child.get_meta("status", -1) - match status: - BeehaveNode.SUCCESS: - active_nodes.erase(child.name) - child.set_color(SUCCESS_COLOR) - BeehaveNode.FAILURE: - active_nodes.erase(child.name) - child.set_color(FAILURE_COLOR) - child.set_input_color(FAILURE_COLOR) - child.set_output_color(FAILURE_COLOR) - BeehaveNode.RUNNING: - child.set_color(ACTIVE_COLOR) - _: - child.text = " " - child.set_status(status) - child.set_color(INACTIVE_COLOR) - - -func _is_same_tree(instance_id: int) -> bool: - return str(instance_id) == beehave_tree.get("id", "") - - -func _get_child_nodes() -> Array[Node]: - return get_children().filter(func(child): return child is BeehaveGraphNode) - - -func _get_elbow_connection_line(from_position: Vector2, to_position: Vector2) -> PackedVector2Array: - var points: PackedVector2Array - - points.push_back(from_position) - - var mid_position := ((to_position + from_position) / 2).round() - if horizontal_layout: - points.push_back(Vector2(mid_position.x, from_position.y)) - points.push_back(Vector2(mid_position.x, to_position.y)) - else: - points.push_back(Vector2(from_position.x, mid_position.y)) - points.push_back(Vector2(to_position.x, mid_position.y)) - - points.push_back(to_position) - - return points - - -func _process(delta: float) -> void: - if not active_nodes.is_empty(): - progress += 10 if delta >= 0.05 else 1 - if progress >= 1000: - progress = 0 - queue_redraw() - - -func _draw() -> void: - var circle_size: float = max(4, 8 * zoom) - var progress_shift: float = PROGRESS_SHIFT * zoom - - var connections := get_connection_list() - for c in connections: - var from_node: StringName - var to_node: StringName - - from_node = c.from_node - to_node = c.to_node - - var from := get_node(String(from_node)) - var to := get_node(String(to_node)) - - var from_position: Vector2 = from.position + from.get_custom_output_port_position(horizontal_layout) * zoom - var to_position: Vector2 = to.position + to.get_custom_input_port_position(horizontal_layout) * zoom - - var line := _get_elbow_connection_line(from_position, to_position) - - # Get colors based on node states - var from_color: Color - var to_color: Color - - match from.get_meta("status", -1): - BeehaveNode.SUCCESS: from_color = SUCCESS_COLOR - BeehaveNode.FAILURE: from_color = FAILURE_COLOR - BeehaveNode.RUNNING: from_color = ACTIVE_COLOR - _: from_color = INACTIVE_COLOR - - match to.get_meta("status", -1): - BeehaveNode.SUCCESS: to_color = SUCCESS_COLOR - BeehaveNode.FAILURE: to_color = FAILURE_COLOR - BeehaveNode.RUNNING: to_color = ACTIVE_COLOR - _: to_color = INACTIVE_COLOR - - # Draw the line with gradient colors - var line_color := from_color.lerp(to_color, 0.5) - line_color.a = 0.6 - draw_polyline(line, line_color, 7.0 * zoom, true) - - # Draw a second line with a different alpha for smoother transition - var transition_color := from_color.lerp(to_color, 0.3) - transition_color.a = 0.3 - draw_polyline(line, transition_color, 9.0, true) - - # Only draw dots for active nodes - if not active_nodes.is_empty() and from_node in active_nodes and to_node in active_nodes: - if from.get_meta("status", -1) < 0 or to.get_meta("status", -1) < 0: - continue - - var curve = Curve2D.new() - for l in line: - curve.add_point(l) - - var max_steps := int(curve.get_baked_length()) - var current_shift := progress % max_steps - var p := curve.sample_baked(current_shift) - draw_circle(p, circle_size, ACTIVE_COLOR) - - var shift := current_shift - progress_shift - while shift >= 0: - draw_circle(curve.sample_baked(shift), circle_size, ACTIVE_COLOR) - shift -= progress_shift - - shift = current_shift + progress_shift - while shift <= curve.get_baked_length(): - draw_circle(curve.sample_baked(shift), circle_size, ACTIVE_COLOR) - shift += progress_shift - - -func _update_layout_button() -> void: - layout_button.icon = VERTICAL_LAYOUT_ICON if horizontal_layout else HORIZONTAL_LAYOUT_ICON - layout_button.tooltip_text = "Switch to Vertical layout" if horizontal_layout else "Switch to Horizontal layout" diff --git a/godot/addons/beehave/debug/new_graph_edit.gd.uid b/godot/addons/beehave/debug/new_graph_edit.gd.uid deleted file mode 100644 index f422b81..0000000 --- a/godot/addons/beehave/debug/new_graph_edit.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://nqi2umf7xr2h diff --git a/godot/addons/beehave/debug/new_graph_node.gd b/godot/addons/beehave/debug/new_graph_node.gd deleted file mode 100644 index 985054c..0000000 --- a/godot/addons/beehave/debug/new_graph_node.gd +++ /dev/null @@ -1,192 +0,0 @@ -@tool -extends GraphNode - -signal blackboard_updated - -const BeehaveUtils := preload("res://addons/beehave/utils/utils.gd") - -const PORT_TOP_ICON := preload("icons/port_top.svg") -const PORT_BOTTOM_ICON := preload("icons/port_bottom.svg") -const PORT_LEFT_ICON := preload("icons/port_left.svg") -const PORT_RIGHT_ICON := preload("icons/port_right.svg") - - -@export var title_text: String: - set(value): - title_text = value - if title_label: - title_label.text = value - -@export var text: String: - set(value): - text = value - if label: - label.text = " " if text.is_empty() else text - -@export var icon: Texture2D: - set(value): - icon = value - if icon_rect: - icon_rect.texture = value - -@export var blackboard: Dictionary: - set(value): - blackboard = value - blackboard_updated.emit() - -var layout_size: float: - get: - return size.y if horizontal else size.x - - -var icon_rect: TextureRect -var title_label: Label -var label: Label -var titlebar_hbox: HBoxContainer - -var frames: RefCounted -var horizontal: bool = false -var panels_tween: Tween - - -func _init(frames:RefCounted, horizontal: bool = false) -> void: - self.frames = frames - self.horizontal = horizontal - - -func _ready() -> void: - custom_minimum_size = Vector2(50, 50) * BeehaveUtils.get_editor_scale() - draggable = false - - add_theme_color_override("close_color", Color.TRANSPARENT) - add_theme_icon_override("close", ImageTexture.new()) - - # For top port - var top_port: Control = Control.new() - add_child(top_port) - - icon_rect = TextureRect.new() - icon_rect.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED - - titlebar_hbox = get_titlebar_hbox() - titlebar_hbox.get_child(0).queue_free() - titlebar_hbox.alignment = BoxContainer.ALIGNMENT_BEGIN - titlebar_hbox.add_child(icon_rect) - - title_label = Label.new() - title_label.add_theme_color_override("font_color", Color.WHITE) - var title_font: Font = get_theme_font("title_font").duplicate() - if title_font is FontVariation: - title_font.variation_embolden = 1 - elif title_font is FontFile: - title_font.font_weight = 700 - title_label.add_theme_font_override("font", title_font) - title_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER - title_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL - title_label.text = title_text - titlebar_hbox.add_child(title_label) - - label = Label.new() - label.text = " " if text.is_empty() else text - add_child(label) - - # For bottom port - add_child(Control.new()) - - minimum_size_changed.connect(_on_size_changed) - _on_size_changed.call_deferred() - - -func _draw_port(slot_index: int, port_position: Vector2i, left: bool, color: Color) -> void: - if horizontal: - if is_slot_enabled_left(1): - draw_texture(PORT_LEFT_ICON, Vector2(0, size.y / 2) + Vector2(-10, -11), color) - if is_slot_enabled_right(1): - draw_texture(PORT_RIGHT_ICON, Vector2(size.x, size.y / 2) + Vector2(-9, -11), color) - else: - if slot_index == 0 and is_slot_enabled_left(0): - draw_texture(PORT_TOP_ICON, Vector2(size.x / 2, 0) + Vector2(-10, -15), color) - elif slot_index == 1: - draw_texture(PORT_BOTTOM_ICON, Vector2(size.x / 2, size.y) + Vector2(-10, -9), color) - - -func get_custom_input_port_position(horizontal: bool) -> Vector2: - if horizontal: - return Vector2(0, size.y / 2) - else: - return Vector2(size.x/2, 0) - - -func get_custom_output_port_position(horizontal: bool) -> Vector2: - if horizontal: - return Vector2(size.x, size.y / 2) - else: - return Vector2(size.x / 2, size.y) - - -func set_status(status: int) -> void: - match status: - BeehaveNode.SUCCESS: _set_stylebox_overrides(frames.panel_success, frames.titlebar_success) - BeehaveNode.FAILURE: _set_stylebox_overrides(frames.panel_failure, frames.titlebar_failure) - BeehaveNode.RUNNING: _set_stylebox_overrides(frames.panel_running, frames.titlebar_running) - _: _set_stylebox_overrides(frames.panel_normal, frames.titlebar_normal) - - -func set_slots(left_enabled: bool, right_enabled: bool) -> void: - if horizontal: - set_slot(1, left_enabled, -1, Color.WHITE, right_enabled, -1, Color.WHITE, PORT_LEFT_ICON, PORT_RIGHT_ICON) - else: - set_slot(0, left_enabled, -1, Color.WHITE, false, -1, Color.TRANSPARENT, PORT_TOP_ICON, null) - set_slot(2, false, -1, Color.TRANSPARENT, right_enabled, -1, Color.WHITE, null, PORT_BOTTOM_ICON) - - -func set_color(color: Color) -> void: - set_input_color(color) - set_output_color(color) - - -func set_input_color(color: Color) -> void: - set_slot_color_left(1 if horizontal else 0, color) - - -func set_output_color(color: Color) -> void: - set_slot_color_right(1 if horizontal else 2, color) - - -func _set_stylebox_overrides(panel_stylebox: StyleBox, titlebar_stylebox: StyleBox) -> void: - # First update and any status change gets immediate panel update - if not has_theme_stylebox_override("panel") or panel_stylebox != frames.panel_normal: - if panels_tween: - panels_tween.kill() - panels_tween = null - - add_theme_stylebox_override("panel", panel_stylebox) - add_theme_stylebox_override("titlebar", titlebar_stylebox) - return - - # Don't need to do anything if we're already tweening back to normal - if panels_tween: - return - - # Don't need to do anything if our colors are already the same as a normal - var cur_panel_stylebox: StyleBox = get_theme_stylebox("panel") - var cur_titlebar_stylebox: StyleBox = get_theme_stylebox("titlebar") - if cur_panel_stylebox.bg_color == frames.panel_normal.bg_color: - return - - # Apply a duplicate of our current panels that we can tween - add_theme_stylebox_override("panel", cur_panel_stylebox.duplicate()) - add_theme_stylebox_override("titlebar", cur_titlebar_stylebox.duplicate()) - cur_panel_stylebox = get_theme_stylebox("panel") - cur_titlebar_stylebox = get_theme_stylebox("titlebar") - - # Going back to normal is a fade - panels_tween = create_tween() - panels_tween.parallel().tween_property(cur_panel_stylebox, "bg_color", panel_stylebox.bg_color, 1.0) - panels_tween.parallel().tween_property(cur_panel_stylebox, "border_color", panel_stylebox.border_color, 1.0) - panels_tween.parallel().tween_property(cur_titlebar_stylebox, "bg_color", panel_stylebox.bg_color, 1.0) - panels_tween.parallel().tween_property(cur_titlebar_stylebox, "border_color", panel_stylebox.border_color, 1.0) - - -func _on_size_changed(): - add_theme_constant_override("port_offset", 12 * BeehaveUtils.get_editor_scale() if horizontal else round(size.x)) diff --git a/godot/addons/beehave/debug/new_graph_node.gd.uid b/godot/addons/beehave/debug/new_graph_node.gd.uid deleted file mode 100644 index fb5a769..0000000 --- a/godot/addons/beehave/debug/new_graph_node.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bpjiuilpk7qkl diff --git a/godot/addons/beehave/debug/new_node_blackboard.gd b/godot/addons/beehave/debug/new_node_blackboard.gd deleted file mode 100644 index 2b8160d..0000000 --- a/godot/addons/beehave/debug/new_node_blackboard.gd +++ /dev/null @@ -1,81 +0,0 @@ -extends VBoxContainer - -var frames: RefCounted -var graph_node: GraphNode - -var item_tree: Tree - -func _init(frames: RefCounted, node: GraphNode) -> void: - self.frames = frames - graph_node = node - - graph_node.blackboard_updated.connect(_update_list) - -func _ready() -> void: - name = graph_node.name - - set_anchors_preset(Control.PRESET_FULL_RECT) - size_flags_horizontal = Control.SIZE_EXPAND_FILL - size_flags_vertical = Control.SIZE_EXPAND_FILL - - var title_panel: Panel = Panel.new() - title_panel.set_anchors_preset(Control.PRESET_FULL_RECT) - title_panel.custom_minimum_size = Vector2(200, 50) - add_child(title_panel) - var title_hbox: HBoxContainer = HBoxContainer.new() - title_hbox.alignment = BoxContainer.ALIGNMENT_CENTER - title_hbox.size_flags_horizontal = Control.SIZE_EXPAND_FILL - title_hbox.set_anchors_preset(Control.PRESET_FULL_RECT) - title_panel.add_child(title_hbox) - - var icon_rect: TextureRect = TextureRect.new() - icon_rect.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED - icon_rect.texture = graph_node.icon - icon_rect.set_size(Vector2(20, 20)) - title_hbox.add_child(icon_rect) - - var title: Label = Label.new() - title.text = graph_node.title_text - title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER - title.set_anchors_preset(Control.PRESET_FULL_RECT) - title_hbox.add_child(title) - - item_tree = Tree.new() - item_tree.custom_minimum_size = Vector2(200, 400) - item_tree.size_flags_horizontal = Control.SIZE_EXPAND_FILL - item_tree.size_flags_vertical = Control.SIZE_EXPAND_FILL - item_tree.hide_root = true - item_tree.allow_search = false - item_tree.columns = 2 - add_child(item_tree) - - _update_list() - -func _update_list() -> void: - item_tree.clear() - - var root: TreeItem = item_tree.create_item() - - if graph_node.blackboard.size() == 0: - var no_bb_message: TreeItem = item_tree.create_item(root) - no_bb_message.set_text(0, "No blackboard data") - return - - for bb_name in graph_node.blackboard: - var bb_name_branch: TreeItem = item_tree.create_item(root) - bb_name_branch.set_text(0, bb_name) - - #print(graph_node.blackboard.get(bb_name)) - for key in graph_node.blackboard.get(bb_name): - var bb_kv_leaf: TreeItem = item_tree.create_item(bb_name_branch) - bb_kv_leaf.set_text(0, str(key)) - bb_kv_leaf.set_text(1, str(graph_node.blackboard.get(bb_name).get(key))) - -func _get_icon(type: StringName) -> Texture2D: - var classes := ProjectSettings.get_global_class_list() - for c in classes: - if c["class"] == type: - var icon_path := c.get("icon", String()) - if not icon_path.is_empty(): - return load(icon_path) - return null diff --git a/godot/addons/beehave/debug/new_node_blackboard.gd.uid b/godot/addons/beehave/debug/new_node_blackboard.gd.uid deleted file mode 100644 index 9956b98..0000000 --- a/godot/addons/beehave/debug/new_node_blackboard.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ne6tky0wxkxy diff --git a/godot/addons/beehave/debug/old_frames.gd b/godot/addons/beehave/debug/old_frames.gd deleted file mode 100644 index a9f6aa8..0000000 --- a/godot/addons/beehave/debug/old_frames.gd +++ /dev/null @@ -1,47 +0,0 @@ -@tool -extends RefCounted - -const BeehaveUtils := preload("res://addons/beehave/utils/utils.gd") - -const SUCCESS_COLOR := Color("#009944c8") -const NORMAL_COLOR := Color("#15181e") -const FAILURE_COLOR := Color("#cf000f80") -const RUNNING_COLOR := Color("#ffcc00c8") - -var empty: StyleBoxEmpty -var normal: StyleBoxFlat -var success: StyleBoxFlat -var failure: StyleBoxFlat -var running: StyleBoxFlat - - -func _init() -> void: - var plugin := BeehaveUtils.get_plugin() - if not plugin: - return - - var editor_scale := BeehaveUtils.get_editor_scale() - - empty = StyleBoxEmpty.new() - - normal = ( - plugin - . get_editor_interface() - . get_base_control() - . get_theme_stylebox(&"frame", &"GraphNode") - . duplicate() - ) - - success = ( - plugin - . get_editor_interface() - . get_base_control() - . get_theme_stylebox(&"selected_frame", &"GraphNode") - . duplicate() - ) - failure = success.duplicate() - running = success.duplicate() - - success.border_color = SUCCESS_COLOR - failure.border_color = FAILURE_COLOR - running.border_color = RUNNING_COLOR diff --git a/godot/addons/beehave/debug/old_frames.gd.uid b/godot/addons/beehave/debug/old_frames.gd.uid deleted file mode 100644 index d5b5bc6..0000000 --- a/godot/addons/beehave/debug/old_frames.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bhapw50f625uy diff --git a/godot/addons/beehave/debug/old_graph_edit.gd b/godot/addons/beehave/debug/old_graph_edit.gd deleted file mode 100644 index 69c11a3..0000000 --- a/godot/addons/beehave/debug/old_graph_edit.gd +++ /dev/null @@ -1,286 +0,0 @@ -@tool -extends GraphEdit - -const BeehaveGraphNode := preload("old_graph_node.gd") - -const HORIZONTAL_LAYOUT_ICON := preload("icons/horizontal_layout.svg") -const VERTICAL_LAYOUT_ICON := preload("icons/vertical_layout.svg") - -const PROGRESS_SHIFT: int = 50 -const INACTIVE_COLOR: Color = Color("#898989aa") -const ACTIVE_COLOR: Color = Color("#ffcc00c8") -const SUCCESS_COLOR: Color = Color("#009944c8") - -var updating_graph: bool = false -var arraging_nodes: bool = false -var beehave_tree: Dictionary: - set(value): - if beehave_tree == value: - return - beehave_tree = value - active_nodes.clear() - _update_graph() - -var horizontal_layout: bool = false: - set(value): - if updating_graph or arraging_nodes: - return - if horizontal_layout == value: - return - horizontal_layout = value - _update_layout_button() - _update_graph() - -var frames: RefCounted -var active_nodes: Array[String] -var progress: int = 0 -var layout_button: Button - - -func _init(frames: RefCounted) -> void: - self.frames = frames - - -func _ready() -> void: - custom_minimum_size = Vector2(100, 300) - set("arrange_nodes_button_hidden", true) - minimap_enabled = false - layout_button = Button.new() - layout_button.flat = true - layout_button.focus_mode = Control.FOCUS_NONE - layout_button.pressed.connect(func(): horizontal_layout = not horizontal_layout) - get_menu_container().add_child(layout_button) - _update_layout_button() - - -func _update_graph() -> void: - if updating_graph: - return - - updating_graph = true - - clear_connections() - - for child in _get_child_nodes(): - remove_child(child) - child.queue_free() - - if not beehave_tree.is_empty(): - _add_nodes(beehave_tree) - _connect_nodes(beehave_tree) - _arrange_nodes.call_deferred(beehave_tree) - - updating_graph = false - - -func _add_nodes(node: Dictionary) -> void: - if node.is_empty(): - return - var gnode := BeehaveGraphNode.new(frames, horizontal_layout) - add_child(gnode) - gnode.title_text = node.name - gnode.name = node.id - gnode.icon = _get_icon(node.type.back()) - - if node.type.has(&"BeehaveTree"): - gnode.set_slots(false, true) - elif node.type.has(&"Leaf"): - gnode.set_slots(true, false) - elif node.type.has(&"Composite") or node.type.has(&"Decorator"): - gnode.set_slots(true, true) - - for child in node.get("children", []): - _add_nodes(child) - - -func _connect_nodes(node: Dictionary) -> void: - for child in node.get("children", []): - connect_node(node.id, 0, child.id, 0) - _connect_nodes(child) - - -func _arrange_nodes(node: Dictionary) -> void: - if arraging_nodes: - return - - arraging_nodes = true - - var tree_node := _create_tree_nodes(node) - tree_node.update_positions(horizontal_layout) - _place_nodes(tree_node) - - arraging_nodes = false - - -func _create_tree_nodes(node: Dictionary, root: TreeNode = null) -> TreeNode: - var tree_node := TreeNode.new(get_node(node.id), root) - for child in node.get("children", []): - var child_node := _create_tree_nodes(child, tree_node) - tree_node.children.push_back(child_node) - return tree_node - - -func _place_nodes(node: TreeNode) -> void: - node.item.position_offset = Vector2(node.x, node.y) - for child in node.children: - _place_nodes(child) - - -func _get_icon(type: StringName) -> Texture2D: - var classes := ProjectSettings.get_global_class_list() - for c in classes: - if c["class"] == type: - var icon_path := c.get("icon", String()) - if not icon_path.is_empty(): - return load(icon_path) - return null - - -func get_menu_container() -> Control: - return call("get_zoom_hbox") - - -func get_status(status: int) -> String: - if status == 0: - return "SUCCESS" - elif status == 1: - return "FAILURE" - return "RUNNING" - - -func process_begin(instance_id: int) -> void: - if not _is_same_tree(instance_id): - return - - for child in _get_child_nodes(): - child.set_meta("status", -1) - - -func process_tick(instance_id: int, status: int) -> void: - var node := get_node_or_null(str(instance_id)) - if node: - node.text = "Status: %s" % get_status(status) - node.set_status(status) - node.set_meta("status", status) - if status == BeehaveNode.SUCCESS or status == BeehaveNode.RUNNING: - if not active_nodes.has(node.name): - active_nodes.push_back(node.name) - - -func process_end(instance_id: int) -> void: - if not _is_same_tree(instance_id): - return - - for child in _get_child_nodes(): - var status := child.get_meta("status", -1) - match status: - BeehaveNode.SUCCESS: - active_nodes.erase(child.name) - child.set_color(SUCCESS_COLOR) - BeehaveNode.FAILURE: - active_nodes.erase(child.name) - child.set_color(INACTIVE_COLOR) - BeehaveNode.RUNNING: - child.set_color(ACTIVE_COLOR) - _: - child.text = " " - child.set_status(status) - child.set_color(INACTIVE_COLOR) - - -func _is_same_tree(instance_id: int) -> bool: - return str(instance_id) == beehave_tree.get("id", "") - - -func _get_child_nodes() -> Array[Node]: - return get_children().filter(func(child): return child is BeehaveGraphNode) - - -func _get_connection_line(from_position: Vector2, to_position: Vector2) -> PackedVector2Array: - var points: PackedVector2Array - - from_position = from_position.round() - to_position = to_position.round() - - points.push_back(from_position) - - var mid_position := ((to_position + from_position) / 2).round() - if horizontal_layout: - points.push_back(Vector2(mid_position.x, from_position.y)) - points.push_back(Vector2(mid_position.x, to_position.y)) - else: - points.push_back(Vector2(from_position.x, mid_position.y)) - points.push_back(Vector2(to_position.x, mid_position.y)) - - points.push_back(to_position) - - return points - - -func _process(delta: float) -> void: - if not active_nodes.is_empty(): - progress += 10 if delta >= 0.05 else 1 - if progress >= 1000: - progress = 0 - queue_redraw() - - -func _draw() -> void: - if active_nodes.is_empty(): - return - - var circle_size: float = max(3, 6 * zoom) - var progress_shift: float = PROGRESS_SHIFT * zoom - - var connections := get_connection_list() - for c in connections: - var from_node: StringName - var to_node: StringName - - from_node = c.from - to_node = c.to - - if not from_node in active_nodes or not c.to_node in active_nodes: - continue - - var from := get_node(String(from_node)) - var to := get_node(String(to_node)) - - if from.get_meta("status", -1) < 0 or to.get_meta("status", -1) < 0: - return - - var output_port_position: Vector2 - var input_port_position: Vector2 - - output_port_position = ( - from.position + from.call("get_connection_output_position", c.from_port) - ) - input_port_position = to.position + to.call("get_connection_input_position", c.to_port) - - var line := _get_connection_line(output_port_position, input_port_position) - - var curve = Curve2D.new() - for l in line: - curve.add_point(l) - - var max_steps := int(curve.get_baked_length()) - var current_shift := progress % max_steps - var p := curve.sample_baked(current_shift) - draw_circle(p, circle_size, ACTIVE_COLOR) - - var shift := current_shift - progress_shift - while shift >= 0: - draw_circle(curve.sample_baked(shift), circle_size, ACTIVE_COLOR) - shift -= progress_shift - - shift = current_shift + progress_shift - while shift <= curve.get_baked_length(): - draw_circle(curve.sample_baked(shift), circle_size, ACTIVE_COLOR) - shift += progress_shift - - -func _update_layout_button() -> void: - layout_button.icon = VERTICAL_LAYOUT_ICON if horizontal_layout else HORIZONTAL_LAYOUT_ICON - layout_button.tooltip_text = ( - "Switch to Vertical layout" if horizontal_layout else "Switch to Horizontal layout" - ) diff --git a/godot/addons/beehave/debug/old_graph_edit.gd.uid b/godot/addons/beehave/debug/old_graph_edit.gd.uid deleted file mode 100644 index 4498be7..0000000 --- a/godot/addons/beehave/debug/old_graph_edit.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://qhj602h7xnwu diff --git a/godot/addons/beehave/debug/old_graph_node.gd b/godot/addons/beehave/debug/old_graph_node.gd deleted file mode 100644 index 28503b1..0000000 --- a/godot/addons/beehave/debug/old_graph_node.gd +++ /dev/null @@ -1,166 +0,0 @@ -@tool -extends GraphNode - -const BeehaveUtils := preload("res://addons/beehave/utils/utils.gd") - -const DEFAULT_COLOR := Color("#dad4cb") - -const PORT_TOP_ICON := preload("icons/port_top.svg") -const PORT_BOTTOM_ICON := preload("icons/port_bottom.svg") -const PORT_LEFT_ICON := preload("icons/port_left.svg") -const PORT_RIGHT_ICON := preload("icons/port_right.svg") - -@export var title_text: String: - set(value): - title_text = value - if title_label: - title_label.text = value - -@export var text: String: - set(value): - text = value - if label: - label.text = " " if text.is_empty() else text - -@export var icon: Texture2D: - set(value): - icon = value - if icon_rect: - icon_rect.texture = value - -var layout_size: float: - get: - return size.y if horizontal else size.x - -var panel: PanelContainer -var icon_rect: TextureRect -var title_label: Label -var container: VBoxContainer -var label: Label - -var frames: RefCounted -var horizontal: bool = false - - -func _init(frames: RefCounted, horizontal: bool = false) -> void: - self.frames = frames - self.horizontal = horizontal - - -func _ready() -> void: - custom_minimum_size = Vector2(50, 50) * BeehaveUtils.get_editor_scale() - draggable = false - - add_theme_stylebox_override("frame", frames.empty if frames != null else null) - add_theme_stylebox_override("selected_frame", frames.empty if frames != null else null) - add_theme_color_override("close_color", Color.TRANSPARENT) - add_theme_icon_override("close", ImageTexture.new()) - - # For top port - add_child(Control.new()) - - panel = PanelContainer.new() - panel.mouse_filter = Control.MOUSE_FILTER_PASS - panel.add_theme_stylebox_override("panel", frames.normal if frames != null else null) - add_child(panel) - - var vbox_container := VBoxContainer.new() - panel.add_child(vbox_container) - - var title_size := 24 * BeehaveUtils.get_editor_scale() - var margin_container := MarginContainer.new() - margin_container.add_theme_constant_override( - "margin_top", -title_size - 2 * BeehaveUtils.get_editor_scale() - ) - margin_container.mouse_filter = Control.MOUSE_FILTER_PASS - vbox_container.add_child(margin_container) - - var title_container := HBoxContainer.new() - title_container.add_child(Control.new()) - title_container.mouse_filter = Control.MOUSE_FILTER_PASS - title_container.size_flags_horizontal = Control.SIZE_EXPAND_FILL - margin_container.add_child(title_container) - - icon_rect = TextureRect.new() - icon_rect.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED - title_container.add_child(icon_rect) - - title_label = Label.new() - title_label.add_theme_color_override("font_color", DEFAULT_COLOR) - title_label.add_theme_font_override("font", get_theme_font("title_font")) - title_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER - title_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL - title_label.text = title_text - title_container.add_child(title_label) - - title_container.add_child(Control.new()) - - container = VBoxContainer.new() - container.size_flags_vertical = Control.SIZE_EXPAND_FILL - container.size_flags_horizontal = Control.SIZE_EXPAND_FILL - panel.add_child(container) - - label = Label.new() - label.text = " " if text.is_empty() else text - container.add_child(label) - - # For bottom port - add_child(Control.new()) - - minimum_size_changed.connect(_on_size_changed) - _on_size_changed.call_deferred() - - -func set_status(status: int) -> void: - panel.add_theme_stylebox_override("panel", _get_stylebox(status)) - - -func _get_stylebox(status: int) -> StyleBox: - match status: - BeehaveNode.SUCCESS: - return frames.success - BeehaveNode.FAILURE: - return frames.failure - BeehaveNode.RUNNING: - return frames.running - _: - return frames.normal - - -func set_slots(left_enabled: bool, right_enabled: bool) -> void: - if horizontal: - set_slot( - 1, - left_enabled, - 0, - Color.WHITE, - right_enabled, - 0, - Color.WHITE, - PORT_LEFT_ICON, - PORT_RIGHT_ICON - ) - else: - set_slot(0, left_enabled, 0, Color.WHITE, false, -2, Color.TRANSPARENT, PORT_TOP_ICON, null) - set_slot( - 2, false, -1, Color.TRANSPARENT, right_enabled, 0, Color.WHITE, null, PORT_BOTTOM_ICON - ) - - -func set_color(color: Color) -> void: - set_input_color(color) - set_output_color(color) - - -func set_input_color(color: Color) -> void: - set_slot_color_left(1 if horizontal else 0, color) - - -func set_output_color(color: Color) -> void: - set_slot_color_right(1 if horizontal else 2, color) - - -func _on_size_changed(): - add_theme_constant_override( - "port_offset", 12 * BeehaveUtils.get_editor_scale() if horizontal else round(size.x / 2.0) - ) diff --git a/godot/addons/beehave/debug/old_graph_node.gd.uid b/godot/addons/beehave/debug/old_graph_node.gd.uid deleted file mode 100644 index f347591..0000000 --- a/godot/addons/beehave/debug/old_graph_node.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bkng0fnhet2hx diff --git a/godot/addons/beehave/debug/tree_node.gd b/godot/addons/beehave/debug/tree_node.gd deleted file mode 100644 index 1377970..0000000 --- a/godot/addons/beehave/debug/tree_node.gd +++ /dev/null @@ -1,275 +0,0 @@ -class_name TreeNode -extends RefCounted - -# Based on https://rachel53461.wordpress.com/2014/04/20/algorithm-for-drawing-trees/ - -const SIBLING_DISTANCE: float = 20.0 -const LEVEL_DISTANCE: float = 40.0 - -const BeehaveUtils := preload("res://addons/beehave/utils/utils.gd") - -var x: float -var y: float -var mod: float -var parent: TreeNode -var children: Array[TreeNode] - -var item: GraphNode - - -func _init(p_item: GraphNode = null, p_parent: TreeNode = null) -> void: - parent = p_parent - item = p_item - - -func is_leaf() -> bool: - return children.is_empty() - - -func is_most_left() -> bool: - if not parent: - return true - return parent.children.front() == self - - -func is_most_right() -> bool: - if not parent: - return true - return parent.children.back() == self - - -func get_previous_sibling() -> TreeNode: - if not parent or is_most_left(): - return null - return parent.children[parent.children.find(self) - 1] - - -func get_next_sibling() -> TreeNode: - if not parent or is_most_right(): - return null - return parent.children[parent.children.find(self) + 1] - - -func get_most_left_sibling() -> TreeNode: - if not parent: - return null - - if is_most_left(): - return self - - return parent.children.front() - - -func get_most_left_child() -> TreeNode: - if children.is_empty(): - return null - return children.front() - - -func get_most_right_child() -> TreeNode: - if children.is_empty(): - return null - return children.back() - - -func update_positions(horizontally: bool = false) -> void: - _initialize_nodes(self, 0) - _calculate_initial_x(self) - - _check_all_children_on_screen(self) - _calculate_final_positions(self, 0) - - if horizontally: - _swap_x_y(self) - _calculate_x(self, 0) - else: - _calculate_y(self, 0) - - -func _initialize_nodes(node: TreeNode, depth: int) -> void: - node.x = -1 - node.y = depth - node.mod = 0 - - for child in node.children: - _initialize_nodes(child, depth + 1) - - -func _calculate_initial_x(node: TreeNode) -> void: - for child in node.children: - _calculate_initial_x(child) - if node.is_leaf(): - if not node.is_most_left(): - node.x = ( - node.get_previous_sibling().x - + node.get_previous_sibling().item.layout_size - + SIBLING_DISTANCE - ) - else: - node.x = 0 - else: - var mid: float - if node.children.size() == 1: - var offset: float = (node.children.front().item.layout_size - node.item.layout_size) / 2 - mid = node.children.front().x + offset - else: - var left_child := node.get_most_left_child() - var right_child := node.get_most_right_child() - mid = ( - ( - left_child.x - + right_child.x - + right_child.item.layout_size - - node.item.layout_size - ) - / 2 - ) - - if node.is_most_left(): - node.x = mid - else: - node.x = ( - node.get_previous_sibling().x - + node.get_previous_sibling().item.layout_size - + SIBLING_DISTANCE - ) - node.mod = node.x - mid - - if not node.is_leaf() and not node.is_most_left(): - _check_for_conflicts(node) - - -func _calculate_final_positions(node: TreeNode, mod_sum: float) -> void: - node.x += mod_sum - mod_sum += node.mod - - for child in node.children: - _calculate_final_positions(child, mod_sum) - - -func _check_all_children_on_screen(node: TreeNode) -> void: - var node_contour: Dictionary = {} - _get_left_contour(node, 0, node_contour) - - var shift_amount: float = 0 - for y in node_contour.keys(): - if node_contour[y] + shift_amount < 0: - shift_amount = (node_contour[y] * -1) - - if shift_amount > 0: - node.x += shift_amount - node.mod += shift_amount - - -func _check_for_conflicts(node: TreeNode) -> void: - var min_distance := SIBLING_DISTANCE - var shift_value: float = 0 - var shift_sibling: TreeNode = null - - var node_contour: Dictionary = {} # { int, float } - _get_left_contour(node, 0, node_contour) - - var sibling := node.get_most_left_sibling() - while sibling != null and sibling != node: - var sibling_contour: Dictionary = {} - _get_right_contour(sibling, 0, sibling_contour) - - for level in range( - node.y + 1, min(sibling_contour.keys().max(), node_contour.keys().max()) + 1 - ): - var distance: float = node_contour[level] - sibling_contour[level] - if distance + shift_value < min_distance: - shift_value = min_distance - distance - shift_sibling = sibling - - sibling = sibling.get_next_sibling() - - if shift_value > 0: - node.x += shift_value - node.mod += shift_value - _center_nodes_between(shift_sibling, node) - - -func _center_nodes_between(left_node: TreeNode, right_node: TreeNode) -> void: - var left_index := left_node.parent.children.find(left_node) - var right_index := left_node.parent.children.find(right_node) - - var num_nodes_between: int = (right_index - left_index) - 1 - if num_nodes_between > 0: - # The extra distance that needs to be split into num_nodes_between + 1 - # in order to find the new node spacing so that nodes are equally spaced - var distance_to_allocate: float = right_node.x - left_node.x - left_node.item.layout_size - # Subtract sizes on nodes in between - for i in range(left_index + 1, right_index): - distance_to_allocate -= left_node.parent.children[i].item.layout_size - # Divide space equally - var distance_between_nodes: float = distance_to_allocate / (num_nodes_between + 1) - - var prev_node := left_node - var middle_node := left_node.get_next_sibling() - while middle_node != right_node: - var desire_x: float = prev_node.x + prev_node.item.layout_size + distance_between_nodes - var offset := desire_x - middle_node.x - middle_node.x += offset - middle_node.mod += offset - prev_node = middle_node - middle_node = middle_node.get_next_sibling() - - -func _get_left_contour(node: TreeNode, mod_sum: float, values: Dictionary) -> void: - var node_left: float = node.x + mod_sum - var depth := int(node.y) - if not values.has(depth): - values[depth] = node_left - else: - values[depth] = min(values[depth], node_left) - - mod_sum += node.mod - for child in node.children: - _get_left_contour(child, mod_sum, values) - - -func _get_right_contour(node: TreeNode, mod_sum: float, values: Dictionary) -> void: - var node_right: float = node.x + mod_sum + node.item.layout_size - var depth := int(node.y) - if not values.has(depth): - values[depth] = node_right - else: - values[depth] = max(values[depth], node_right) - - mod_sum += node.mod - for child in node.children: - _get_right_contour(child, mod_sum, values) - - -func _swap_x_y(node: TreeNode) -> void: - for child in node.children: - _swap_x_y(child) - - var temp := node.x - node.x = node.y - node.y = temp - - -func _calculate_x(node: TreeNode, offset: int) -> void: - node.x = offset - var sibling := node.get_most_left_sibling() - var max_size: int = node.item.size.x - while sibling != null: - max_size = max(sibling.item.size.x, max_size) - sibling = sibling.get_next_sibling() - - for child in node.children: - _calculate_x(child, max_size + offset + LEVEL_DISTANCE * BeehaveUtils.get_editor_scale()) - - -func _calculate_y(node: TreeNode, offset: int) -> void: - node.y = offset - var sibling := node.get_most_left_sibling() - var max_size: int = node.item.size.y - while sibling != null: - max_size = max(sibling.item.size.y, max_size) - sibling = sibling.get_next_sibling() - - for child in node.children: - _calculate_y(child, max_size + offset + LEVEL_DISTANCE * BeehaveUtils.get_editor_scale()) diff --git a/godot/addons/beehave/debug/tree_node.gd.uid b/godot/addons/beehave/debug/tree_node.gd.uid deleted file mode 100644 index 9b1f539..0000000 --- a/godot/addons/beehave/debug/tree_node.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://20qccrlr5enw diff --git a/godot/addons/beehave/icons/action.svg b/godot/addons/beehave/icons/action.svg deleted file mode 100644 index 3916c89..0000000 --- a/godot/addons/beehave/icons/action.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - diff --git a/godot/addons/beehave/icons/action.svg.import b/godot/addons/beehave/icons/action.svg.import deleted file mode 100644 index 7d95d2d..0000000 --- a/godot/addons/beehave/icons/action.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://btrq8e0kyxthg" -path="res://.godot/imported/action.svg-e8a91246d0ba9ba3cf84290d65648f06.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/action.svg" -dest_files=["res://.godot/imported/action.svg-e8a91246d0ba9ba3cf84290d65648f06.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/icons/blackboard.svg b/godot/addons/beehave/icons/blackboard.svg deleted file mode 100644 index e4948a5..0000000 --- a/godot/addons/beehave/icons/blackboard.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - diff --git a/godot/addons/beehave/icons/blackboard.svg.import b/godot/addons/beehave/icons/blackboard.svg.import deleted file mode 100644 index 40f3ed6..0000000 --- a/godot/addons/beehave/icons/blackboard.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dw7rom0hiff6c" -path="res://.godot/imported/blackboard.svg-18d4dfd4f6de558de250b67251ff1e69.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/blackboard.svg" -dest_files=["res://.godot/imported/blackboard.svg-18d4dfd4f6de558de250b67251ff1e69.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/icons/category_bt.svg b/godot/addons/beehave/icons/category_bt.svg deleted file mode 100644 index 8be61ae..0000000 --- a/godot/addons/beehave/icons/category_bt.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - diff --git a/godot/addons/beehave/icons/category_bt.svg.import b/godot/addons/beehave/icons/category_bt.svg.import deleted file mode 100644 index 0c59c01..0000000 --- a/godot/addons/beehave/icons/category_bt.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://qpdd6ue7x82h" -path="res://.godot/imported/category_bt.svg-8537bebd1c5f62dca3d7ee7f17efeed4.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/category_bt.svg" -dest_files=["res://.godot/imported/category_bt.svg-8537bebd1c5f62dca3d7ee7f17efeed4.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/icons/category_composite.svg b/godot/addons/beehave/icons/category_composite.svg deleted file mode 100644 index aa8b866..0000000 --- a/godot/addons/beehave/icons/category_composite.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - diff --git a/godot/addons/beehave/icons/category_composite.svg.import b/godot/addons/beehave/icons/category_composite.svg.import deleted file mode 100644 index 44cad8d..0000000 --- a/godot/addons/beehave/icons/category_composite.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://863s568sneja" -path="res://.godot/imported/category_composite.svg-43f66e63a7ccfa5ac8ec6da0583b3246.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/category_composite.svg" -dest_files=["res://.godot/imported/category_composite.svg-43f66e63a7ccfa5ac8ec6da0583b3246.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/icons/category_decorator.svg b/godot/addons/beehave/icons/category_decorator.svg deleted file mode 100644 index 165e3d6..0000000 --- a/godot/addons/beehave/icons/category_decorator.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - diff --git a/godot/addons/beehave/icons/category_decorator.svg.import b/godot/addons/beehave/icons/category_decorator.svg.import deleted file mode 100644 index b37cace..0000000 --- a/godot/addons/beehave/icons/category_decorator.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c2ie8m4ddawlb" -path="res://.godot/imported/category_decorator.svg-79d598d6456f32724156248e09d6eaf3.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/category_decorator.svg" -dest_files=["res://.godot/imported/category_decorator.svg-79d598d6456f32724156248e09d6eaf3.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/icons/category_leaf.svg b/godot/addons/beehave/icons/category_leaf.svg deleted file mode 100644 index 1482fe6..0000000 --- a/godot/addons/beehave/icons/category_leaf.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - diff --git a/godot/addons/beehave/icons/category_leaf.svg.import b/godot/addons/beehave/icons/category_leaf.svg.import deleted file mode 100644 index 67ca661..0000000 --- a/godot/addons/beehave/icons/category_leaf.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://eq0sp4g3s75r" -path="res://.godot/imported/category_leaf.svg-c740ecab6cfae632574ca5e39e46fd2e.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/category_leaf.svg" -dest_files=["res://.godot/imported/category_leaf.svg-c740ecab6cfae632574ca5e39e46fd2e.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/icons/condition.svg b/godot/addons/beehave/icons/condition.svg deleted file mode 100644 index 37b2c7a..0000000 --- a/godot/addons/beehave/icons/condition.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - diff --git a/godot/addons/beehave/icons/condition.svg.import b/godot/addons/beehave/icons/condition.svg.import deleted file mode 100644 index 6b14919..0000000 --- a/godot/addons/beehave/icons/condition.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://ck4toqx0nggiu" -path="res://.godot/imported/condition.svg-57892684b10a64086f68c09c388b17e5.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/condition.svg" -dest_files=["res://.godot/imported/condition.svg-57892684b10a64086f68c09c388b17e5.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/icons/cooldown.svg b/godot/addons/beehave/icons/cooldown.svg deleted file mode 100644 index fbdfd6a..0000000 --- a/godot/addons/beehave/icons/cooldown.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - diff --git a/godot/addons/beehave/icons/cooldown.svg.import b/godot/addons/beehave/icons/cooldown.svg.import deleted file mode 100644 index 46e74a8..0000000 --- a/godot/addons/beehave/icons/cooldown.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c4ybmig18t464" -path="res://.godot/imported/cooldown.svg-2fb8975b5974e35bedad825abb9faf66.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/cooldown.svg" -dest_files=["res://.godot/imported/cooldown.svg-2fb8975b5974e35bedad825abb9faf66.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/godot/addons/beehave/icons/delayer.svg b/godot/addons/beehave/icons/delayer.svg deleted file mode 100644 index 21cb617..0000000 --- a/godot/addons/beehave/icons/delayer.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - diff --git a/godot/addons/beehave/icons/delayer.svg.import b/godot/addons/beehave/icons/delayer.svg.import deleted file mode 100644 index 880dcc5..0000000 --- a/godot/addons/beehave/icons/delayer.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c6jvl1gccuj4c" -path="res://.godot/imported/delayer.svg-6f92c97f61b1eb8679428f438e6b08c7.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/delayer.svg" -dest_files=["res://.godot/imported/delayer.svg-6f92c97f61b1eb8679428f438e6b08c7.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/godot/addons/beehave/icons/failer.svg b/godot/addons/beehave/icons/failer.svg deleted file mode 100644 index 968f7e1..0000000 --- a/godot/addons/beehave/icons/failer.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - diff --git a/godot/addons/beehave/icons/failer.svg.import b/godot/addons/beehave/icons/failer.svg.import deleted file mode 100644 index 24862ae..0000000 --- a/godot/addons/beehave/icons/failer.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://2fj7htaqvcud" -path="res://.godot/imported/failer.svg-9a62b840e1eacc0437e7a67b14a302e4.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/failer.svg" -dest_files=["res://.godot/imported/failer.svg-9a62b840e1eacc0437e7a67b14a302e4.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/icons/inverter.svg b/godot/addons/beehave/icons/inverter.svg deleted file mode 100644 index d4e791e..0000000 --- a/godot/addons/beehave/icons/inverter.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - diff --git a/godot/addons/beehave/icons/inverter.svg.import b/godot/addons/beehave/icons/inverter.svg.import deleted file mode 100644 index 4b57722..0000000 --- a/godot/addons/beehave/icons/inverter.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cffmoc3og8hux" -path="res://.godot/imported/inverter.svg-1f1b976d95de42c4ad99a92fa9a6c5d0.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/inverter.svg" -dest_files=["res://.godot/imported/inverter.svg-1f1b976d95de42c4ad99a92fa9a6c5d0.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/icons/limiter.svg b/godot/addons/beehave/icons/limiter.svg deleted file mode 100644 index 7b3fa1d..0000000 --- a/godot/addons/beehave/icons/limiter.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - diff --git a/godot/addons/beehave/icons/limiter.svg.import b/godot/addons/beehave/icons/limiter.svg.import deleted file mode 100644 index 614f44f..0000000 --- a/godot/addons/beehave/icons/limiter.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c7akxvsg0f2by" -path="res://.godot/imported/limiter.svg-b4c7646605c46f53c5e403fe21d8f584.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/limiter.svg" -dest_files=["res://.godot/imported/limiter.svg-b4c7646605c46f53c5e403fe21d8f584.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/icons/repeater.svg b/godot/addons/beehave/icons/repeater.svg deleted file mode 100644 index 47c46e9..0000000 --- a/godot/addons/beehave/icons/repeater.svg +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - diff --git a/godot/addons/beehave/icons/repeater.svg.import b/godot/addons/beehave/icons/repeater.svg.import deleted file mode 100644 index a58b6eb..0000000 --- a/godot/addons/beehave/icons/repeater.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://j551tmw6t4fp" -path="res://.godot/imported/repeater.svg-be2d3a7f1a46d7ba1d1939553725f598.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/repeater.svg" -dest_files=["res://.godot/imported/repeater.svg-be2d3a7f1a46d7ba1d1939553725f598.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/godot/addons/beehave/icons/selector.svg b/godot/addons/beehave/icons/selector.svg deleted file mode 100644 index 0ae3b7a..0000000 --- a/godot/addons/beehave/icons/selector.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - diff --git a/godot/addons/beehave/icons/selector.svg.import b/godot/addons/beehave/icons/selector.svg.import deleted file mode 100644 index 1fd2196..0000000 --- a/godot/addons/beehave/icons/selector.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://b2c5d20doh4sp" -path="res://.godot/imported/selector.svg-78bccfc448bd1676b5a29bfde4b08e5b.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/selector.svg" -dest_files=["res://.godot/imported/selector.svg-78bccfc448bd1676b5a29bfde4b08e5b.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/icons/selector_random.svg b/godot/addons/beehave/icons/selector_random.svg deleted file mode 100644 index 6f631e9..0000000 --- a/godot/addons/beehave/icons/selector_random.svg +++ /dev/null @@ -1,35 +0,0 @@ - - diff --git a/godot/addons/beehave/icons/selector_random.svg.import b/godot/addons/beehave/icons/selector_random.svg.import deleted file mode 100644 index b4d24e0..0000000 --- a/godot/addons/beehave/icons/selector_random.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bmnkcmk7bkdjd" -path="res://.godot/imported/selector_random.svg-d52fea1352c24483ecd9dc8609cf00f3.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/selector_random.svg" -dest_files=["res://.godot/imported/selector_random.svg-d52fea1352c24483ecd9dc8609cf00f3.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/icons/selector_reactive.svg b/godot/addons/beehave/icons/selector_reactive.svg deleted file mode 100644 index 6db005f..0000000 --- a/godot/addons/beehave/icons/selector_reactive.svg +++ /dev/null @@ -1,45 +0,0 @@ - - diff --git a/godot/addons/beehave/icons/selector_reactive.svg.import b/godot/addons/beehave/icons/selector_reactive.svg.import deleted file mode 100644 index 9e2a781..0000000 --- a/godot/addons/beehave/icons/selector_reactive.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://crkbov0h8sb8l" -path="res://.godot/imported/selector_reactive.svg-dd3b8fb8cd2ffe331605aaad1e021cc0.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/selector_reactive.svg" -dest_files=["res://.godot/imported/selector_reactive.svg-dd3b8fb8cd2ffe331605aaad1e021cc0.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/icons/sequence.svg b/godot/addons/beehave/icons/sequence.svg deleted file mode 100644 index 3ebedd9..0000000 --- a/godot/addons/beehave/icons/sequence.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - diff --git a/godot/addons/beehave/icons/sequence.svg.import b/godot/addons/beehave/icons/sequence.svg.import deleted file mode 100644 index c1ab6f8..0000000 --- a/godot/addons/beehave/icons/sequence.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c5gw354thiofm" -path="res://.godot/imported/sequence.svg-76e5600611900cc81e9ec286977b8c6a.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/sequence.svg" -dest_files=["res://.godot/imported/sequence.svg-76e5600611900cc81e9ec286977b8c6a.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/icons/sequence_random.svg b/godot/addons/beehave/icons/sequence_random.svg deleted file mode 100644 index 34e4a12..0000000 --- a/godot/addons/beehave/icons/sequence_random.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - diff --git a/godot/addons/beehave/icons/sequence_random.svg.import b/godot/addons/beehave/icons/sequence_random.svg.import deleted file mode 100644 index bde7dcc..0000000 --- a/godot/addons/beehave/icons/sequence_random.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bat8ptdw5qt1d" -path="res://.godot/imported/sequence_random.svg-58cee9098c622ef87db941279206422a.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/sequence_random.svg" -dest_files=["res://.godot/imported/sequence_random.svg-58cee9098c622ef87db941279206422a.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/icons/sequence_reactive.svg b/godot/addons/beehave/icons/sequence_reactive.svg deleted file mode 100644 index 33d219b..0000000 --- a/godot/addons/beehave/icons/sequence_reactive.svg +++ /dev/null @@ -1,60 +0,0 @@ - - diff --git a/godot/addons/beehave/icons/sequence_reactive.svg.import b/godot/addons/beehave/icons/sequence_reactive.svg.import deleted file mode 100644 index 887d75d..0000000 --- a/godot/addons/beehave/icons/sequence_reactive.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://rmiu1slwfkh7" -path="res://.godot/imported/sequence_reactive.svg-7d384ca290f7934adb9e17d9e7116b6c.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/sequence_reactive.svg" -dest_files=["res://.godot/imported/sequence_reactive.svg-7d384ca290f7934adb9e17d9e7116b6c.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/icons/simple_parallel.svg b/godot/addons/beehave/icons/simple_parallel.svg deleted file mode 100644 index e9c8b00..0000000 --- a/godot/addons/beehave/icons/simple_parallel.svg +++ /dev/null @@ -1,13 +0,0 @@ - - simple_parallel - - Layer 1 - - - - - - - - - \ No newline at end of file diff --git a/godot/addons/beehave/icons/simple_parallel.svg.import b/godot/addons/beehave/icons/simple_parallel.svg.import deleted file mode 100644 index c6b21be..0000000 --- a/godot/addons/beehave/icons/simple_parallel.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dy60wsynpm7in" -path="res://.godot/imported/simple_parallel.svg-3d4107eaf2e46557f6d3be3249f91430.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/simple_parallel.svg" -dest_files=["res://.godot/imported/simple_parallel.svg-3d4107eaf2e46557f6d3be3249f91430.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/godot/addons/beehave/icons/succeeder.svg b/godot/addons/beehave/icons/succeeder.svg deleted file mode 100644 index 10f5912..0000000 --- a/godot/addons/beehave/icons/succeeder.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - diff --git a/godot/addons/beehave/icons/succeeder.svg.import b/godot/addons/beehave/icons/succeeder.svg.import deleted file mode 100644 index 6ab4093..0000000 --- a/godot/addons/beehave/icons/succeeder.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dl6wo332kglbe" -path="res://.godot/imported/succeeder.svg-e5cf6f6e04b9b862b82fd2cb479272aa.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/succeeder.svg" -dest_files=["res://.godot/imported/succeeder.svg-e5cf6f6e04b9b862b82fd2cb479272aa.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/icons/tree.svg b/godot/addons/beehave/icons/tree.svg deleted file mode 100644 index 6c85ea1..0000000 --- a/godot/addons/beehave/icons/tree.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - diff --git a/godot/addons/beehave/icons/tree.svg.import b/godot/addons/beehave/icons/tree.svg.import deleted file mode 100644 index df4a470..0000000 --- a/godot/addons/beehave/icons/tree.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://deryyg2hbmaaw" -path="res://.godot/imported/tree.svg-c0b20ed88b2fe300c0296f7236049076.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/tree.svg" -dest_files=["res://.godot/imported/tree.svg-c0b20ed88b2fe300c0296f7236049076.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/beehave/icons/until_fail.svg b/godot/addons/beehave/icons/until_fail.svg deleted file mode 100644 index c64a0a0..0000000 --- a/godot/addons/beehave/icons/until_fail.svg +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - diff --git a/godot/addons/beehave/icons/until_fail.svg.import b/godot/addons/beehave/icons/until_fail.svg.import deleted file mode 100644 index 9972295..0000000 --- a/godot/addons/beehave/icons/until_fail.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dk3sg4lyppgj2" -path="res://.godot/imported/until_fail.svg-8015014c40e91d9c2668ec34d4118b8e.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/beehave/icons/until_fail.svg" -dest_files=["res://.godot/imported/until_fail.svg-8015014c40e91d9c2668ec34d4118b8e.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/godot/addons/beehave/metrics/beehave_global_metrics.gd b/godot/addons/beehave/metrics/beehave_global_metrics.gd deleted file mode 100644 index ef29db2..0000000 --- a/godot/addons/beehave/metrics/beehave_global_metrics.gd +++ /dev/null @@ -1,54 +0,0 @@ -extends Node - -var _tree_count: int = 0 -var _active_tree_count: int = 0 -var _registered_trees: Array = [] - - -func _enter_tree() -> void: - Performance.add_custom_monitor("beehave/total_trees", _get_total_trees) - Performance.add_custom_monitor("beehave/total_enabled_trees", _get_total_enabled_trees) - - -func register_tree(tree) -> void: - if _registered_trees.has(tree): - return - - _registered_trees.append(tree) - _tree_count += 1 - - if tree.enabled: - _active_tree_count += 1 - - tree.tree_enabled.connect(_on_tree_enabled) - tree.tree_disabled.connect(_on_tree_disabled) - - -func unregister_tree(tree) -> void: - if not _registered_trees.has(tree): - return - - _registered_trees.erase(tree) - _tree_count -= 1 - - if tree.enabled: - _active_tree_count -= 1 - - tree.tree_enabled.disconnect(_on_tree_enabled) - tree.tree_disabled.disconnect(_on_tree_disabled) - - -func _get_total_trees() -> int: - return _tree_count - - -func _get_total_enabled_trees() -> int: - return _active_tree_count - - -func _on_tree_enabled() -> void: - _active_tree_count += 1 - - -func _on_tree_disabled() -> void: - _active_tree_count -= 1 diff --git a/godot/addons/beehave/metrics/beehave_global_metrics.gd.uid b/godot/addons/beehave/metrics/beehave_global_metrics.gd.uid deleted file mode 100644 index 3273d56..0000000 --- a/godot/addons/beehave/metrics/beehave_global_metrics.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c3ktl6ontsdt7 diff --git a/godot/addons/beehave/nodes/beehave_node.gd b/godot/addons/beehave/nodes/beehave_node.gd deleted file mode 100644 index 2817cb3..0000000 --- a/godot/addons/beehave/nodes/beehave_node.gd +++ /dev/null @@ -1,54 +0,0 @@ -@tool -class_name BeehaveNode extends Node - -## A node in the behavior tree. Every node must return `SUCCESS`, `FAILURE` or -## `RUNNING` when ticked. - -enum { SUCCESS, FAILURE, RUNNING } - - -func _get_configuration_warnings() -> PackedStringArray: - var warnings: PackedStringArray = [] - - if get_children().any(func(x): return not (x is BeehaveNode)): - warnings.append("All children of this node should inherit from BeehaveNode class.") - - return warnings - - -## Executes this node and returns a status code. -## This method must be overwritten. -func tick(actor: Node, blackboard: Blackboard) -> int: - return SUCCESS - - -## Called when this node needs to be interrupted before it can return FAILURE or SUCCESS. -func interrupt(actor: Node, blackboard: Blackboard) -> void: - BeehaveDebuggerMessages.process_interrupt(self.get_instance_id(), blackboard.get_debug_data()) - - -## Called before the first time it ticks by the parent. -func before_run(actor: Node, blackboard: Blackboard) -> void: - pass - - -## Called after the last time it ticks and returns -## [code]SUCCESS[/code] or [code]FAILURE[/code]. -func after_run(actor: Node, blackboard: Blackboard) -> void: - pass - - -func get_class_name() -> Array[StringName]: - return [&"BeehaveNode"] - - -func can_send_message(blackboard: Blackboard) -> bool: - return blackboard.get_value("can_send_message", false) - - -func _safe_tick(actor: Node, blackboard: Blackboard) -> int: - var response = tick(actor, blackboard) - if not response is int: - push_error("All tick methods must return an int, got %s" % response) - return FAILURE - return response diff --git a/godot/addons/beehave/nodes/beehave_node.gd.uid b/godot/addons/beehave/nodes/beehave_node.gd.uid deleted file mode 100644 index 4b5360e..0000000 --- a/godot/addons/beehave/nodes/beehave_node.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c37shq5uf4gk diff --git a/godot/addons/beehave/nodes/beehave_tree.gd b/godot/addons/beehave/nodes/beehave_tree.gd deleted file mode 100644 index 3c4fb87..0000000 --- a/godot/addons/beehave/nodes/beehave_tree.gd +++ /dev/null @@ -1,323 +0,0 @@ -@tool -@icon("../icons/tree.svg") -class_name BeehaveTree extends Node - -## Controls the flow of execution of the entire behavior tree. - -enum { SUCCESS, FAILURE, RUNNING } - -enum ProcessThread { IDLE, PHYSICS, MANUAL } - -signal tree_enabled -signal tree_disabled - -## Whether this behavior tree should be enabled or not. -@export var enabled: bool = true: - set(value): - enabled = value - set_physics_process(enabled and process_thread == ProcessThread.PHYSICS) - set_process(enabled and process_thread == ProcessThread.IDLE) - if value: - tree_enabled.emit() - else: - interrupt() - tree_disabled.emit() - - get: - return enabled - -## How often the tree should tick, in frames. The default value of 1 means -## tick() runs every frame. -@export var tick_rate: int = 1 - -## An optional node path this behavior tree should apply to. -@export_node_path var actor_node_path: NodePath: - set(anp): - actor_node_path = anp - if actor_node_path != null and str(actor_node_path) != "..": - actor = get_node(actor_node_path.get_as_property_path()) - else: - actor = get_parent() - if Engine.is_editor_hint(): - update_configuration_warnings() - -## Whether to run this tree in a physics or idle thread. -@export var process_thread: ProcessThread = ProcessThread.PHYSICS: - set(value): - process_thread = value - self.enabled = self.enabled and process_thread != ProcessThread.MANUAL - set_physics_process(enabled and process_thread == ProcessThread.PHYSICS) - set_process(enabled and process_thread == ProcessThread.IDLE) - -## Custom blackboard node. An internal blackboard will be used -## if no blackboard is provided explicitly. -@export var blackboard: Blackboard: - set(b): - blackboard = b - if blackboard and _internal_blackboard: - remove_child(_internal_blackboard) - _internal_blackboard.free() - _internal_blackboard = null - elif not blackboard and not _internal_blackboard: - _internal_blackboard = Blackboard.new() - add_child(_internal_blackboard, false, Node.INTERNAL_MODE_BACK) - get: - # in case blackboard is accessed before this node is, - # we need to ensure that the internal blackboard is used. - if not blackboard and not _internal_blackboard: - _internal_blackboard = Blackboard.new() - add_child(_internal_blackboard, false, Node.INTERNAL_MODE_BACK) - return blackboard if blackboard else _internal_blackboard - -## When enabled, this tree is tracked individually -## as a custom monitor. -@export var custom_monitor = false: - set(b): - custom_monitor = b - if custom_monitor and _process_time_metric_name != "": - Performance.add_custom_monitor( - _process_time_metric_name, _get_process_time_metric_value - ) - _get_global_metrics().register_tree(self) - else: - if _process_time_metric_name != "": - # Remove tree metric from the engine - Performance.remove_custom_monitor(_process_time_metric_name) - _get_global_metrics().unregister_tree(self) - - BeehaveDebuggerMessages.unregister_tree(get_instance_id()) - -@export var actor: Node: - set(a): - actor = a - if actor == null: - actor = get_parent() - if Engine.is_editor_hint(): - update_configuration_warnings() - -var status: int = -1 -var last_tick: int = -1 - -var _internal_blackboard: Blackboard -var _process_time_metric_name: String -var _process_time_metric_value: float = 0.0 -var _can_send_message: bool = false - - -func _ready() -> void: - var connect_scene_tree_signal = func(signal_name: String, is_added: bool): - if not get_tree().is_connected(signal_name, _on_scene_tree_node_added_removed.bind(is_added)): - get_tree().connect(signal_name, _on_scene_tree_node_added_removed.bind(is_added)) - connect_scene_tree_signal.call("node_added", true) - connect_scene_tree_signal.call("node_removed", false) - - if not process_thread: - process_thread = ProcessThread.PHYSICS - - if not actor: - if actor_node_path: - actor = get_node(actor_node_path) - else: - actor = get_parent() - - if not blackboard: - # invoke setter to auto-initialise the blackboard. - self.blackboard = null - - # Get the name of the parent node name for metric - _process_time_metric_name = ( - "beehave [microseconds]/process_time_%s-%s" % [actor.name, get_instance_id()] - ) - - set_physics_process(enabled and process_thread == ProcessThread.PHYSICS) - set_process(enabled and process_thread == ProcessThread.IDLE) - - # Register custom metric to the engine - if custom_monitor and not Engine.is_editor_hint(): - Performance.add_custom_monitor(_process_time_metric_name, _get_process_time_metric_value) - _get_global_metrics().register_tree(self) - - if Engine.is_editor_hint(): - update_configuration_warnings.call_deferred() - else: - # Ensure the local debugger knows about the tree *before* telling the editor. - _get_global_debugger().register_tree(self) - BeehaveDebuggerMessages.register_tree(_get_debugger_data(self)) - - -func _on_scene_tree_node_added_removed(node: Node, is_added: bool) -> void: - if Engine.is_editor_hint(): - return - - if node is BeehaveNode and is_ancestor_of(node): - var sgnal := node.ready if is_added else node.tree_exited - if is_added: - sgnal.connect( - func() -> void: BeehaveDebuggerMessages.register_tree(_get_debugger_data(self)), - CONNECT_ONE_SHOT - ) - else: - sgnal.connect( - func() -> void: - BeehaveDebuggerMessages.unregister_tree(get_instance_id()) - request_ready() - ) - - -func _physics_process(_delta: float) -> void: - tick() - - -func _process(_delta: float) -> void: - tick() - - -func tick() -> int: - if Engine.is_editor_hint(): - return -1 - if last_tick != -1 and last_tick < tick_rate - 1: - last_tick += 1 - return -1 - - last_tick = 0 - - # Start timing for metric - var start_time = Time.get_ticks_usec() - blackboard.set_value("can_send_message", _can_send_message) - - if _can_send_message and not Engine.is_editor_hint(): - BeehaveDebuggerMessages.process_begin(get_instance_id(), blackboard.get_debug_data()) - - if actor == null or get_child_count() == 0: - return FAILURE - var child := self.get_child(0) - if status != RUNNING: - child.before_run(actor, blackboard) - - status = child.tick(actor, blackboard) - if _can_send_message: - BeehaveDebuggerMessages.process_tick(child.get_instance_id(), status, blackboard.get_debug_data()) - BeehaveDebuggerMessages.process_tick(get_instance_id(), status, blackboard.get_debug_data()) - - # Clear running action if nothing is running - if status != RUNNING: - blackboard.set_value("running_action", null, str(actor.get_instance_id())) - child.after_run(actor, blackboard) - - if _can_send_message and not Engine.is_editor_hint(): - BeehaveDebuggerMessages.process_end(get_instance_id(), blackboard.get_debug_data()) - - # Check the cost for this frame and save it for metric report - _process_time_metric_value = Time.get_ticks_usec() - start_time - - return status - - -func _get_configuration_warnings() -> PackedStringArray: - var warnings: PackedStringArray = [] - - if actor == null: - warnings.append("Configure target node on tree") - - if get_children().any(func(x): return not (x is BeehaveNode)): - warnings.append("All children of this node should inherit from BeehaveNode class.") - - if get_child_count() != 1: - warnings.append("BeehaveTree should have exactly one child node.") - - return warnings - - -## Returns the currently running action -func get_running_action() -> ActionLeaf: - return blackboard.get_value("running_action", null, str(actor.get_instance_id())) - - -## Returns the last condition that was executed -func get_last_condition() -> ConditionLeaf: - return blackboard.get_value("last_condition", null, str(actor.get_instance_id())) - - -## Returns the status of the last executed condition -func get_last_condition_status() -> String: - if blackboard.has_value("last_condition_status", str(actor.get_instance_id())): - var status = blackboard.get_value( - "last_condition_status", null, str(actor.get_instance_id()) - ) - if status == SUCCESS: - return "SUCCESS" - elif status == FAILURE: - return "FAILURE" - else: - return "RUNNING" - return "" - - -## interrupts this tree if anything was running -func interrupt() -> void: - if self.get_child_count() != 0: - var first_child = self.get_child(0) - if "interrupt" in first_child: - first_child.interrupt(actor, blackboard) - - -## Enables this tree. -func enable() -> void: - self.enabled = true - - -## Disables this tree. -func disable() -> void: - self.enabled = false - - -func _exit_tree() -> void: - if Engine.is_editor_hint(): - # Skip this when running in editor - return - if custom_monitor: - if _process_time_metric_name != "": - # Remove tree metric from the engine - Performance.remove_custom_monitor(_process_time_metric_name) - _get_global_metrics().unregister_tree(self) - BeehaveDebuggerMessages.unregister_tree(get_instance_id()) - - -# Called by the engine to profile this tree -func _get_process_time_metric_value() -> int: - return int(_process_time_metric_value) - - -func _get_debugger_data(node: Node) -> Dictionary: - if not (node is BeehaveTree or node is BeehaveNode): - return {} - - var data := { - path = node.get_path(), - name = node.name, - type = node.get_class_name(), - id = str(node.get_instance_id()) - } - if node.get_child_count() > 0: - data.children = [] - for child in node.get_children(): - var child_data := _get_debugger_data(child) - if not child_data.is_empty(): - data.children.push_back(child_data) - return data - - -func get_class_name() -> Array[StringName]: - return [&"BeehaveTree"] - - -# required to avoid lifecycle issues on initial load -# due to loading order problems with autoloads -func _get_global_metrics() -> Node: - return get_tree().root.get_node("BeehaveGlobalMetrics") - - -# required to avoid lifecycle issues on initial load -# due to loading order problems with autoloads -func _get_global_debugger() -> Node: - return get_tree().root.get_node("BeehaveGlobalDebugger") diff --git a/godot/addons/beehave/nodes/beehave_tree.gd.uid b/godot/addons/beehave/nodes/beehave_tree.gd.uid deleted file mode 100644 index 0e5a153..0000000 --- a/godot/addons/beehave/nodes/beehave_tree.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bb0t2ovl7wifo diff --git a/godot/addons/beehave/nodes/composites/composite.gd b/godot/addons/beehave/nodes/composites/composite.gd deleted file mode 100644 index a657292..0000000 --- a/godot/addons/beehave/nodes/composites/composite.gd +++ /dev/null @@ -1,57 +0,0 @@ -@tool -@icon("../../icons/category_composite.svg") -class_name Composite extends BeehaveNode - -## A Composite node controls the flow of execution of its children in a specific manner. - -var running_child: BeehaveNode = null - - -func _get_configuration_warnings() -> PackedStringArray: - var warnings: PackedStringArray = super._get_configuration_warnings() - - if get_children().filter(func(x): return x is BeehaveNode).size() < 2: - warnings.append( - "Any composite node should have at least two children. Otherwise it is not useful." - ) - - return warnings - - -func interrupt(actor: Node, blackboard: Blackboard) -> void: - if running_child != null: - running_child.interrupt(actor, blackboard) - running_child = null - super.interrupt(actor, blackboard) - - -func after_run(actor: Node, blackboard: Blackboard) -> void: - running_child = null - - -func get_class_name() -> Array[StringName]: - var classes := super() - classes.push_back(&"Composite") - return classes - - -func _cleanup_running(child: Node, actor: Node, blackboard: Blackboard) -> void: - if child == running_child: - running_child = null - var id = str(actor.get_instance_id()) - if child == blackboard.get_value("running_action", null, id): - blackboard.set_value("running_action", null, id) - - -func _interrupt_children(actor: Node, blackboard: Blackboard, from_index: int, last_index: int) -> void: - var children = get_children() - var start = from_index + 1 - var end = 0 - if last_index > from_index: - end = last_index + 1 - else: - return - - for j in range(start, end): - var stale = children[j] - stale.interrupt(actor, blackboard) diff --git a/godot/addons/beehave/nodes/composites/composite.gd.uid b/godot/addons/beehave/nodes/composites/composite.gd.uid deleted file mode 100644 index a7191b4..0000000 --- a/godot/addons/beehave/nodes/composites/composite.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://fengp7jc44qv diff --git a/godot/addons/beehave/nodes/composites/randomized_composite.gd b/godot/addons/beehave/nodes/composites/randomized_composite.gd deleted file mode 100644 index 2afa5e9..0000000 --- a/godot/addons/beehave/nodes/composites/randomized_composite.gd +++ /dev/null @@ -1,176 +0,0 @@ -@tool -class_name RandomizedComposite extends Composite - -const WEIGHTS_PREFIX = "Weights/" - -## Sets a predicable seed -@export var random_seed: int = 0: - set(rs): - random_seed = rs - if random_seed != 0: - seed(random_seed) - else: - randomize() - -## Wether to use weights for every child or not. -@export var use_weights: bool: - set(value): - use_weights = value - if use_weights: - _update_weights(get_children()) - _connect_children_changing_signals() - notify_property_list_changed() - -var _weights: Dictionary -var _exiting_tree: bool - - -func _ready(): - _connect_children_changing_signals() - - -func _connect_children_changing_signals(): - if not child_entered_tree.is_connected(_on_child_entered_tree): - child_entered_tree.connect(_on_child_entered_tree) - - if not child_exiting_tree.is_connected(_on_child_exiting_tree): - child_exiting_tree.connect(_on_child_exiting_tree) - - -func get_shuffled_children() -> Array[Node]: - var children_bag: Array[Node] = get_children().duplicate() - if use_weights: - var weights: Array[int] - weights.assign(children_bag.map(func(child): return _weights[child.name])) - children_bag.assign(_weighted_shuffle(children_bag, weights)) - else: - children_bag.shuffle() - return children_bag - - -## Returns a shuffled version of a given array using the supplied array of weights. -## Think of weights as the chance of a given item being the first in the array. -func _weighted_shuffle(items: Array, weights: Array[int]) -> Array: - if len(items) != len(weights): - push_error( - ( - "items and weights size mismatch: expected %d weights, got %d instead." - % [len(items), len(weights)] - ) - ) - return items - - # This method is based on the weighted random sampling algorithm - # by Efraimidis, Spirakis; 2005. This runs in O(n log(n)). - - # For each index, it will calculate random_value^(1/weight). - var chance_calc = func(i): return [i, randf() ** (1.0 / weights[i])] - var random_distribuition = range(len(items)).map(chance_calc) - - # Now we just have to order by the calculated value, descending. - random_distribuition.sort_custom(func(a, b): return a[1] > b[1]) - - return random_distribuition.map(func(dist): return items[dist[0]]) - - -func _get_property_list(): - var properties = [] - - if use_weights: - for key in _weights.keys(): - properties.append( - { - "name": WEIGHTS_PREFIX + key, - "type": TYPE_INT, - "usage": PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR, - "hint": PROPERTY_HINT_RANGE, - "hint_string": "1,100" - } - ) - - return properties - - -func _set(property: StringName, value: Variant) -> bool: - if property.begins_with(WEIGHTS_PREFIX): - var weight_name = property.trim_prefix(WEIGHTS_PREFIX) - _weights[weight_name] = value - return true - - return false - - -func _get(property: StringName): - if property.begins_with(WEIGHTS_PREFIX): - var weight_name = property.trim_prefix(WEIGHTS_PREFIX) - return _weights[weight_name] - - return null - - -func _update_weights(children: Array[Node]) -> void: - var new_weights = {} - for c in children: - if _weights.has(c.name): - new_weights[c.name] = _weights[c.name] - else: - new_weights[c.name] = 1 - _weights = new_weights - notify_property_list_changed() - - -func _exit_tree() -> void: - _exiting_tree = true - - -func _enter_tree() -> void: - _exiting_tree = false - - -func _on_child_entered_tree(node: Node): - _update_weights(get_children()) - - var renamed_callable = _on_child_renamed.bind(node.name, node) - if not node.renamed.is_connected(renamed_callable): - node.renamed.connect(renamed_callable) - - if not node.tree_exited.is_connected(_on_child_tree_exited): - node.tree_exited.connect(_on_child_tree_exited.bind(node)) - - -func _on_child_exiting_tree(node: Node): - var renamed_callable = _on_child_renamed.bind(node.name, node) - if node.renamed.is_connected(renamed_callable): - node.renamed.disconnect(renamed_callable) - - -func _on_child_tree_exited(node: Node) -> void: - # don't erase the individual child if the whole tree is exiting together - if not _exiting_tree: - var children = get_children() - children.erase(node) - _update_weights(children) - - if node.tree_exited.is_connected(_on_child_tree_exited): - node.tree_exited.disconnect(_on_child_tree_exited) - - -func _on_child_renamed(old_name: String, renamed_child: Node): - if old_name == renamed_child.name: - return # No need to update the weights. - - # Disconnect signal with old name... - renamed_child.renamed.disconnect(_on_child_renamed.bind(old_name, renamed_child)) - # ...and connect with the new name. - renamed_child.renamed.connect(_on_child_renamed.bind(renamed_child.name, renamed_child)) - - var original_weight = _weights[old_name] - _weights.erase(old_name) - _weights[renamed_child.name] = original_weight - notify_property_list_changed() - - -func get_class_name() -> Array[StringName]: - var classes := super() - classes.push_back(&"RandomizedComposite") - return classes diff --git a/godot/addons/beehave/nodes/composites/randomized_composite.gd.uid b/godot/addons/beehave/nodes/composites/randomized_composite.gd.uid deleted file mode 100644 index 8bfa216..0000000 --- a/godot/addons/beehave/nodes/composites/randomized_composite.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://doqgfjw53d1l4 diff --git a/godot/addons/beehave/nodes/composites/selector.gd b/godot/addons/beehave/nodes/composites/selector.gd deleted file mode 100644 index 4a59cb3..0000000 --- a/godot/addons/beehave/nodes/composites/selector.gd +++ /dev/null @@ -1,102 +0,0 @@ -@tool -@icon("../../icons/selector.svg") -class_name SelectorComposite extends Composite - - -# A Selector runs its children in order until one succeeds or is running. -# On failure, skips already-processed children across ticks. - - -var last_execution_index: int = 0 -var previous_success_or_running_index: int = -1 -var ready_to_interrupt_all: bool = false - - -func tick(actor: Node, blackboard: Blackboard) -> int: - var children = get_children() - var children_count = children.size() - var processed_count = 0 - - for i in range(children.size()): - var child = children[i] - if child.get_index() < last_execution_index: - processed_count += 1 - continue - - if child != running_child: - child.before_run(actor, blackboard) - - var response = child._safe_tick(actor, blackboard) - processed_count += 1 - - if can_send_message(blackboard): - BeehaveDebuggerMessages.process_tick(child.get_instance_id(), response, blackboard.get_debug_data()) - - if child is ConditionLeaf: - var id = str(actor.get_instance_id()) - blackboard.set_value("last_condition", child, id) - blackboard.set_value("last_condition_status", response, id) - - match response: - SUCCESS: - if running_child != null: - if running_child != child: - running_child.interrupt(actor, blackboard) - _cleanup_running(running_child, actor, blackboard) - child.after_run(actor, blackboard) - _interrupt_children(actor, blackboard, i, previous_success_or_running_index) - previous_success_or_running_index = i - ready_to_interrupt_all = false - return SUCCESS - - FAILURE: - if running_child != null and running_child == child: - _cleanup_running(running_child, actor, blackboard) - child.after_run(actor, blackboard) - last_execution_index = max(last_execution_index, child.get_index() + 1) - - RUNNING: - if child != running_child: - if running_child != null: - running_child.interrupt(actor, blackboard) - running_child = child - if child is ActionLeaf: - blackboard.set_value("running_action", child, str(actor.get_instance_id())) - _interrupt_children(actor, blackboard, i, previous_success_or_running_index) - previous_success_or_running_index = i - ready_to_interrupt_all = false - return RUNNING - - # all children failed - ready_to_interrupt_all = (processed_count == children_count) - last_execution_index = 0 - return FAILURE - - -func after_run(actor: Node, blackboard: Blackboard) -> void: - last_execution_index = 0 - super(actor, blackboard) - - -func interrupt(actor: Node, blackboard: Blackboard) -> void: - if ready_to_interrupt_all: - # If all children failed, interrupt all children by using indices 0 and children.size()-1 - var children = get_children() - if children.size() > 0: - _interrupt_children(actor, blackboard, -1, children.size() - 1) - ready_to_interrupt_all = false - else: - # Use the normal interrupt logic for partial processing - _interrupt_children(actor, blackboard, last_execution_index, previous_success_or_running_index) - if running_child != null: - running_child.interrupt(actor, blackboard) - _cleanup_running(running_child, actor, blackboard) - last_execution_index = 0 - previous_success_or_running_index = -1 - super(actor, blackboard) - - -func get_class_name() -> Array[StringName]: - var classes = super() - classes.push_back(&"SelectorComposite") - return classes diff --git a/godot/addons/beehave/nodes/composites/selector.gd.uid b/godot/addons/beehave/nodes/composites/selector.gd.uid deleted file mode 100644 index ee9656a..0000000 --- a/godot/addons/beehave/nodes/composites/selector.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://8hn4kne15ac5 diff --git a/godot/addons/beehave/nodes/composites/selector_random.gd b/godot/addons/beehave/nodes/composites/selector_random.gd deleted file mode 100644 index fd5a28a..0000000 --- a/godot/addons/beehave/nodes/composites/selector_random.gd +++ /dev/null @@ -1,85 +0,0 @@ -@tool -@icon("../../icons/selector_random.svg") -class_name SelectorRandomComposite extends RandomizedComposite - -## This node will attempt to execute all of its children just like a -## [code]SelectorStar[/code] would, with the exception that the children -## will be executed in a random order. - -## A shuffled list of the children that will be executed in reverse order. -var _children_bag: Array[Node] = [] -var c: Node - - -func _ready() -> void: - super() - if random_seed == 0: - randomize() - - -func tick(actor: Node, blackboard: Blackboard) -> int: - if _children_bag.is_empty(): - _reset() - - # We need to traverse the array in reverse since we will be manipulating it. - for i in _get_reversed_indexes(): - c = _children_bag[i] - - if c != running_child: - c.before_run(actor, blackboard) - - var response: int = c._safe_tick(actor, blackboard) - if can_send_message(blackboard): - BeehaveDebuggerMessages.process_tick(c.get_instance_id(), response, blackboard.get_debug_data()) - - if c is ConditionLeaf: - blackboard.set_value("last_condition", c, str(actor.get_instance_id())) - blackboard.set_value("last_condition_status", response, str(actor.get_instance_id())) - - match response: - SUCCESS: - _children_bag.erase(c) - c.after_run(actor, blackboard) - return SUCCESS - FAILURE: - _children_bag.erase(c) - c.after_run(actor, blackboard) - RUNNING: - if c != running_child: - if running_child != null: - running_child.interrupt(actor, blackboard) - running_child = c - if c is ActionLeaf: - blackboard.set_value("running_action", c, str(actor.get_instance_id())) - return RUNNING - - return FAILURE - - -func after_run(actor: Node, blackboard: Blackboard) -> void: - _reset() - super(actor, blackboard) - - -func interrupt(actor: Node, blackboard: Blackboard) -> void: - _reset() - super(actor, blackboard) - - -func _get_reversed_indexes() -> Array[int]: - var reversed: Array[int] - reversed.assign(range(_children_bag.size())) - reversed.reverse() - return reversed - - -func _reset() -> void: - var new_order = get_shuffled_children() - _children_bag = new_order.duplicate() - _children_bag.reverse() # It needs to run the children in reverse order. - - -func get_class_name() -> Array[StringName]: - var classes := super() - classes.push_back(&"SelectorRandomComposite") - return classes diff --git a/godot/addons/beehave/nodes/composites/selector_random.gd.uid b/godot/addons/beehave/nodes/composites/selector_random.gd.uid deleted file mode 100644 index 350086c..0000000 --- a/godot/addons/beehave/nodes/composites/selector_random.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dvnmhlldp23hg diff --git a/godot/addons/beehave/nodes/composites/selector_reactive.gd b/godot/addons/beehave/nodes/composites/selector_reactive.gd deleted file mode 100644 index e2f38b5..0000000 --- a/godot/addons/beehave/nodes/composites/selector_reactive.gd +++ /dev/null @@ -1,95 +0,0 @@ -@tool -@icon("../../icons/selector_reactive.svg") -class_name SelectorReactiveComposite extends Composite - -## Selector Reactive nodes will attempt to execute each of its children until one of -## them return `SUCCESS`. If all children return `FAILURE`, this node will also -## return `FAILURE`. -## If a child returns `RUNNING` it will restart. - - - -# Track where we last succeeded – so we detect true branch changes -var previous_success_or_running_index: int = -1 -var ready_to_interrupt_all: bool = false - -func tick(actor: Node, blackboard: Blackboard) -> int: - var children := get_children() - var children_count = children.size() - var processed_count = 0 - - for i in range(children.size()): - var c = children[i] - - if c != running_child: - c.before_run(actor, blackboard) - - var response: int = c._safe_tick(actor, blackboard) - processed_count += 1 - - if can_send_message(blackboard): - BeehaveDebuggerMessages.process_tick(c.get_instance_id(), response, blackboard.get_debug_data()) - - if c is ConditionLeaf: - blackboard.set_value("last_condition", c, str(actor.get_instance_id())) - blackboard.set_value("last_condition_status", response, str(actor.get_instance_id())) - - match response: - SUCCESS: - # clean up the one that just succeeded - if running_child != null: - if running_child != c: - running_child.interrupt(actor, blackboard) - _cleanup_running(running_child, actor, blackboard) - c.after_run(actor, blackboard) - - _interrupt_children(actor, blackboard, i, previous_success_or_running_index) - previous_success_or_running_index = i - ready_to_interrupt_all = false - return SUCCESS - - FAILURE: - c.after_run(actor, blackboard) - - RUNNING: - if c != running_child: - if running_child != null: - running_child.interrupt(actor, blackboard) - running_child = c - if c is ActionLeaf: - blackboard.set_value("running_action", c, str(actor.get_instance_id())) - _interrupt_children(actor, blackboard, i, previous_success_or_running_index) - previous_success_or_running_index = i - ready_to_interrupt_all = false - return RUNNING - - # all failed → reset our success‐tracker - ready_to_interrupt_all = (processed_count == children_count) - return FAILURE - - -func after_run(actor: Node, blackboard: Blackboard) -> void: - super(actor, blackboard) - - -func interrupt(actor: Node, blackboard: Blackboard) -> void: - if ready_to_interrupt_all: - # If all children failed, interrupt all children - var children = get_children() - if children.size() > 0: - _interrupt_children(actor, blackboard, -1, children.size() - 1) - ready_to_interrupt_all = false - else: - # Use the normal interrupt logic for partial processing - _interrupt_children(actor, blackboard, -1, previous_success_or_running_index) - if running_child != null: - running_child.interrupt(actor, blackboard) - _cleanup_running(running_child, actor, blackboard) - previous_success_or_running_index = -1 - super(actor, blackboard) - - -func get_class_name() -> Array[StringName]: - var classes := super() - classes.push_back(&"SelectorReactiveComposite") - return classes diff --git a/godot/addons/beehave/nodes/composites/selector_reactive.gd.uid b/godot/addons/beehave/nodes/composites/selector_reactive.gd.uid deleted file mode 100644 index 883d250..0000000 --- a/godot/addons/beehave/nodes/composites/selector_reactive.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cw22yurt5l74k diff --git a/godot/addons/beehave/nodes/composites/sequence.gd b/godot/addons/beehave/nodes/composites/sequence.gd deleted file mode 100644 index 3e00fcd..0000000 --- a/godot/addons/beehave/nodes/composites/sequence.gd +++ /dev/null @@ -1,92 +0,0 @@ -@tool -@icon("../../icons/sequence.svg") -class_name SequenceComposite extends Composite - -## Sequence nodes will attempt to execute all of its children and report -## `SUCCESS` in case all of the children report a `SUCCESS` status code. -## If at least one child reports a `FAILURE` status code, this node will also -## return `FAILURE` and restart. -## In case a child returns `RUNNING` this node will tick again. - -var successful_index: int = 0 -# Track where we last failed – so we detect a backward jump -var previous_failure_or_running_index: int = -1 - - -func tick(actor: Node, blackboard: Blackboard) -> int: - var children = get_children() - for i in range(children.size()): - var c = children[i] - if c.get_index() < successful_index: - continue - - if c != running_child: - c.before_run(actor, blackboard) - - var response: int = c._safe_tick(actor, blackboard) - if can_send_message(blackboard): - BeehaveDebuggerMessages.process_tick(c.get_instance_id(), response, blackboard.get_debug_data()) - - if c is ConditionLeaf: - blackboard.set_value("last_condition", c, str(actor.get_instance_id())) - blackboard.set_value("last_condition_status", response, str(actor.get_instance_id())) - - match response: - SUCCESS: - if running_child != null and running_child == c: - # do not interrupt as this child finishes running! - _cleanup_running(running_child, actor, blackboard) - successful_index += 1 - c.after_run(actor, blackboard) - FAILURE: - if running_child != null: - running_child.interrupt(actor, blackboard) - _cleanup_running(running_child, actor, blackboard) - - _interrupt_children(actor, blackboard, i, previous_failure_or_running_index) - - # remember where we failed for next tick - previous_failure_or_running_index = c.get_index() - successful_index = 0 - - # Interrupt any child that was RUNNING before - # but do not reset! - if running_child != null: - running_child.interrupt(actor, blackboard) - running_child = null - - c.after_run(actor, blackboard) - return FAILURE - RUNNING: - if running_child != null and c != running_child: - running_child.interrupt(actor, blackboard) - _cleanup_running(running_child, actor, blackboard) - if c != running_child: - running_child = c - if c is ActionLeaf: - blackboard.set_value("running_action", c, str(actor.get_instance_id())) - _interrupt_children(actor, blackboard, i, previous_failure_or_running_index) - previous_failure_or_running_index = i - return RUNNING - - successful_index = 0 - return SUCCESS - - -func interrupt(actor: Node, blackboard: Blackboard) -> void: - _interrupt_children(actor, blackboard, successful_index - 1, previous_failure_or_running_index) - if running_child != null: - running_child.interrupt(actor, blackboard) - _cleanup_running(running_child, actor, blackboard) - _reset() - super(actor, blackboard) - - -func _reset() -> void: - successful_index = 0 - previous_failure_or_running_index = -1 - -func get_class_name() -> Array[StringName]: - var classes := super() - classes.push_back(&"SequenceComposite") - return classes diff --git a/godot/addons/beehave/nodes/composites/sequence.gd.uid b/godot/addons/beehave/nodes/composites/sequence.gd.uid deleted file mode 100644 index 108f546..0000000 --- a/godot/addons/beehave/nodes/composites/sequence.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cg016dbe7gs1x diff --git a/godot/addons/beehave/nodes/composites/sequence_random.gd b/godot/addons/beehave/nodes/composites/sequence_random.gd deleted file mode 100644 index 1ff08a3..0000000 --- a/godot/addons/beehave/nodes/composites/sequence_random.gd +++ /dev/null @@ -1,99 +0,0 @@ -@tool -@icon("../../icons/sequence_random.svg") -class_name SequenceRandomComposite extends RandomizedComposite - -## This node will attempt to execute all of its children just like a -## [code]SequenceStar[/code] would, with the exception that the children -## will be executed in a random order. - -# Emitted whenever the children are shuffled. -signal reset(new_order: Array[Node]) - -## Whether the sequence should start where it left off after a previous failure. -@export var resume_on_failure: bool = false -## Whether the sequence should start where it left off after a previous interruption. -@export var resume_on_interrupt: bool = false - -## A shuffled list of the children that will be executed in reverse order. -var _children_bag: Array[Node] = [] -var c: Node - - -func _ready() -> void: - super() - if random_seed == 0: - randomize() - - -func tick(actor: Node, blackboard: Blackboard) -> int: - if _children_bag.is_empty(): - _reset() - - # We need to traverse the array in reverse since we will be manipulating it. - for i in _get_reversed_indexes(): - c = _children_bag[i] - - if c != running_child: - c.before_run(actor, blackboard) - - var response: int = c._safe_tick(actor, blackboard) - if can_send_message(blackboard): - BeehaveDebuggerMessages.process_tick(c.get_instance_id(), response, blackboard.get_debug_data()) - - if c is ConditionLeaf: - blackboard.set_value("last_condition", c, str(actor.get_instance_id())) - blackboard.set_value("last_condition_status", response, str(actor.get_instance_id())) - - match response: - SUCCESS: - _children_bag.erase(c) - c.after_run(actor, blackboard) - FAILURE: - _children_bag.erase(c) - # Interrupt any child that was RUNNING before - # but do not reset! - super.interrupt(actor, blackboard) - c.after_run(actor, blackboard) - return FAILURE - RUNNING: - running_child = c - if c is ActionLeaf: - blackboard.set_value("running_action", c, str(actor.get_instance_id())) - return RUNNING - - return SUCCESS - - -func after_run(actor: Node, blackboard: Blackboard) -> void: - if not resume_on_failure: - _reset() - super(actor, blackboard) - - -func interrupt(actor: Node, blackboard: Blackboard) -> void: - if not resume_on_interrupt: - if running_child != null: - running_child.interrupt(actor, blackboard) - running_child = null - _reset() - super(actor, blackboard) - - -func _get_reversed_indexes() -> Array[int]: - var reversed: Array[int] - reversed.assign(range(_children_bag.size())) - reversed.reverse() - return reversed - - -func _reset() -> void: - var new_order: Array[Node] = get_shuffled_children() - _children_bag = new_order.duplicate() - _children_bag.reverse() # It needs to run the children in reverse order. - reset.emit(new_order) - - -func get_class_name() -> Array[StringName]: - var classes := super() - classes.push_back(&"SequenceRandomComposite") - return classes diff --git a/godot/addons/beehave/nodes/composites/sequence_random.gd.uid b/godot/addons/beehave/nodes/composites/sequence_random.gd.uid deleted file mode 100644 index 5961178..0000000 --- a/godot/addons/beehave/nodes/composites/sequence_random.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b5iop640q3aue diff --git a/godot/addons/beehave/nodes/composites/sequence_reactive.gd b/godot/addons/beehave/nodes/composites/sequence_reactive.gd deleted file mode 100644 index 0c6df90..0000000 --- a/godot/addons/beehave/nodes/composites/sequence_reactive.gd +++ /dev/null @@ -1,81 +0,0 @@ -@tool -@icon("../../icons/sequence_reactive.svg") -class_name SequenceReactiveComposite extends Composite - -## Reactive Sequence nodes will attempt to execute all of its children and report -## `SUCCESS` in case all of the children report a `SUCCESS` status code. -## If at least one child reports a `FAILURE` status code, this node will also -## return `FAILURE` and restart. -## In case a child returns `RUNNING` this node will restart. - -# Track where we last failed – so we detect a backward jump -var previous_failure_index: int = -1 -# Separate index for running as failure and running can diverge in reactive sequence -var previous_running_index: int = -1 - - -func tick(actor: Node, blackboard: Blackboard) -> int: - var children = get_children() - for i in range(children.size()): - var c = children[i] - - if c != running_child: - c.before_run(actor, blackboard) - - var response: int = c._safe_tick(actor, blackboard) - if can_send_message(blackboard): - BeehaveDebuggerMessages.process_tick(c.get_instance_id(), response, blackboard.get_debug_data()) - - if c is ConditionLeaf: - blackboard.set_value("last_condition", c, str(actor.get_instance_id())) - blackboard.set_value("last_condition_status", response, str(actor.get_instance_id())) - - match response: - SUCCESS: - if running_child != null and running_child == c: - # do not interrupt as this child finishes running! - _cleanup_running(running_child, actor, blackboard) - c.after_run(actor, blackboard) - FAILURE: - _interrupt_children(actor, blackboard, i, previous_failure_index) - - # remember where we failed for next tick - previous_failure_index = c.get_index() - - if running_child != null: - running_child.interrupt(actor, blackboard) - _cleanup_running(running_child, actor, blackboard) - c.after_run(actor, blackboard) - return FAILURE - RUNNING: - _reset() - if running_child != null and running_child != c: - running_child.interrupt(actor, blackboard) - _cleanup_running(running_child, actor, blackboard) - running_child = c - if c is ActionLeaf: - blackboard.set_value("running_action", c, str(actor.get_instance_id())) - _interrupt_children(actor, blackboard, i, previous_running_index) - previous_running_index = i - return RUNNING - return SUCCESS - - -func interrupt(actor: Node, blackboard: Blackboard) -> void: - _interrupt_children(actor, blackboard, -1, previous_running_index if previous_running_index > previous_failure_index else previous_failure_index) - if running_child != null: - running_child.interrupt(actor, blackboard) - _cleanup_running(running_child, actor, blackboard) - _reset() - super(actor, blackboard) - - -func _reset() -> void: - previous_failure_index = -1 - previous_running_index = -1 - - -func get_class_name() -> Array[StringName]: - var classes := super() - classes.push_back(&"SequenceReactiveComposite") - return classes diff --git a/godot/addons/beehave/nodes/composites/sequence_reactive.gd.uid b/godot/addons/beehave/nodes/composites/sequence_reactive.gd.uid deleted file mode 100644 index 774959f..0000000 --- a/godot/addons/beehave/nodes/composites/sequence_reactive.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dcojdhvj8qcw0 diff --git a/godot/addons/beehave/nodes/composites/sequence_star.gd b/godot/addons/beehave/nodes/composites/sequence_star.gd deleted file mode 100644 index 22b3f86..0000000 --- a/godot/addons/beehave/nodes/composites/sequence_star.gd +++ /dev/null @@ -1,86 +0,0 @@ -@tool -@icon("../../icons/sequence_reactive.svg") -class_name SequenceStarComposite extends Composite - -## Sequence Star nodes will attempt to execute all of its children and report -## `SUCCESS` in case all of the children report a `SUCCESS` status code. -## If at least one child reports a `FAILURE` status code, this node will also -## return `FAILURE` and tick again. -## In case a child returns `RUNNING` this node will tick again. - -var successful_index: int = 0 -# Track where we last failed – so we detect a backward jump -var previous_failure_or_running_index: int = -1 - - -func tick(actor: Node, blackboard: Blackboard) -> int: - var children = get_children() - for i in range(children.size()): - var c = children[i] - if c.get_index() < successful_index: - continue - - if c != running_child: - c.before_run(actor, blackboard) - - var response: int = c._safe_tick(actor, blackboard) - if can_send_message(blackboard): - BeehaveDebuggerMessages.process_tick(c.get_instance_id(), response, blackboard.get_debug_data()) - - if c is ConditionLeaf: - blackboard.set_value("last_condition", c, str(actor.get_instance_id())) - blackboard.set_value("last_condition_status", response, str(actor.get_instance_id())) - - match response: - SUCCESS: - if running_child != null and running_child == c: - # do not interrupt as this child finishes running! - _cleanup_running(running_child, actor, blackboard) - successful_index += 1 - c.after_run(actor, blackboard) - FAILURE: - _interrupt_children(actor, blackboard, i, previous_failure_or_running_index) - - # remember where we failed for next tick - previous_failure_or_running_index = c.get_index() - - # Interrupt any child that was RUNNING before - # but do not reset! - if running_child != null: - running_child.interrupt(actor, blackboard) - _cleanup_running(running_child, actor, blackboard) - - c.after_run(actor, blackboard) - return FAILURE - RUNNING: - if running_child != null and running_child != c: - running_child.interrupt(actor, blackboard) - _cleanup_running(running_child, actor, blackboard) - running_child = c - if c is ActionLeaf: - blackboard.set_value("running_action", c, str(actor.get_instance_id())) - _interrupt_children(actor, blackboard, i, previous_failure_or_running_index) - previous_failure_or_running_index = i - return RUNNING - successful_index = 0 - return SUCCESS - - -func interrupt(actor: Node, blackboard: Blackboard) -> void: - _interrupt_children(actor, blackboard, successful_index - 1, previous_failure_or_running_index) - if running_child != null: - running_child.interrupt(actor, blackboard) - running_child = null - _reset() - super(actor, blackboard) - - -func _reset() -> void: - successful_index = 0 - previous_failure_or_running_index = -1 - - -func get_class_name() -> Array[StringName]: - var classes := super() - classes.push_back(&"SequenceStarComposite") - return classes diff --git a/godot/addons/beehave/nodes/composites/sequence_star.gd.uid b/godot/addons/beehave/nodes/composites/sequence_star.gd.uid deleted file mode 100644 index 9425e65..0000000 --- a/godot/addons/beehave/nodes/composites/sequence_star.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bbaojjriq676j diff --git a/godot/addons/beehave/nodes/composites/simple_parallel.gd b/godot/addons/beehave/nodes/composites/simple_parallel.gd deleted file mode 100644 index addd62e..0000000 --- a/godot/addons/beehave/nodes/composites/simple_parallel.gd +++ /dev/null @@ -1,119 +0,0 @@ -@tool -@icon("../../icons/simple_parallel.svg") -class_name SimpleParallelComposite extends Composite - -## Simple Parallel nodes will attampt to execute all chidren at same time and -## can only have exactly two children. First child as primary node, second -## child as secondary node. -## This node will always report primary node's state, and continue tick while -## primary node return 'RUNNING'. The state of secondary node will be ignored -## and executed like a subtree. -## If primary node return 'SUCCESS' or 'FAILURE', this node will interrupt -## secondary node and return primary node's result. -## If this node is running under delay mode, it will wait seconday node -## finish its action after primary node terminates. - -#how many times should secondary node repeat, zero means loop forever -@export var secondary_node_repeat_count: int = 0 - -#wether to wait secondary node finish its current action after primary node finished -@export var delay_mode: bool = false - -var delayed_result := SUCCESS -var main_task_finished: bool = false -var secondary_node_running: bool = false -var secondary_node_repeat_left: int = 0 - - -func _get_configuration_warnings() -> PackedStringArray: - var warnings: PackedStringArray = super._get_configuration_warnings() - - if get_child_count() != 2: - warnings.append("SimpleParallel should have exactly two child nodes.") - - return warnings - - -func tick(actor, blackboard: Blackboard): - for c in get_children(): - var node_index: int = c.get_index() - if node_index == 0 and not main_task_finished: - if c != running_child: - c.before_run(actor, blackboard) - - var response: int = c._safe_tick(actor, blackboard) - if can_send_message(blackboard): - BeehaveDebuggerMessages.process_tick(c.get_instance_id(), response, blackboard.get_debug_data()) - - delayed_result = response - match response: - SUCCESS, FAILURE: - _cleanup_running_task(c, actor, blackboard) - c.after_run(actor, blackboard) - main_task_finished = true - if not delay_mode: - if secondary_node_running: - get_child(1).interrupt(actor, blackboard) - _reset() - return delayed_result - RUNNING: - running_child = c - if c is ActionLeaf: - blackboard.set_value("running_action", c, str(actor.get_instance_id())) - - elif node_index == 1: - if secondary_node_repeat_count == 0 or secondary_node_repeat_left > 0: - if not secondary_node_running: - c.before_run(actor, blackboard) - var subtree_response = c._safe_tick(actor, blackboard) - if subtree_response != RUNNING: - secondary_node_running = false - c.after_run(actor, blackboard) - if delay_mode and main_task_finished: - _reset() - return delayed_result - elif secondary_node_repeat_left > 0: - secondary_node_repeat_left -= 1 - else: - secondary_node_running = true - - return RUNNING - - -func before_run(actor: Node, blackboard: Blackboard) -> void: - secondary_node_repeat_left = secondary_node_repeat_count - super(actor, blackboard) - - -func interrupt(actor: Node, blackboard: Blackboard) -> void: - if not main_task_finished: - get_child(0).interrupt(actor, blackboard) - if secondary_node_running: - get_child(1).interrupt(actor, blackboard) - _reset() - super(actor, blackboard) - - -func after_run(actor: Node, blackboard: Blackboard) -> void: - _reset() - super(actor, blackboard) - - -func _reset() -> void: - main_task_finished = false - secondary_node_running = false - - -## Changes `running_action` and `running_child` after the node finishes executing. -func _cleanup_running_task(finished_action: Node, actor: Node, blackboard: Blackboard): - var blackboard_name = str(actor.get_instance_id()) - if finished_action == running_child: - running_child = null - if finished_action == blackboard.get_value("running_action", null, blackboard_name): - blackboard.set_value("running_action", null, blackboard_name) - - -func get_class_name() -> Array[StringName]: - var classes := super() - classes.push_back(&"SimpleParallelComposite") - return classes diff --git a/godot/addons/beehave/nodes/composites/simple_parallel.gd.uid b/godot/addons/beehave/nodes/composites/simple_parallel.gd.uid deleted file mode 100644 index d4c8be3..0000000 --- a/godot/addons/beehave/nodes/composites/simple_parallel.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bkr7qj44253ue diff --git a/godot/addons/beehave/nodes/decorators/cooldown.gd b/godot/addons/beehave/nodes/decorators/cooldown.gd deleted file mode 100644 index 1cbf663..0000000 --- a/godot/addons/beehave/nodes/decorators/cooldown.gd +++ /dev/null @@ -1,55 +0,0 @@ -@tool -@icon("../../icons/cooldown.svg") -extends Decorator -class_name CooldownDecorator - -## The Cooldown Decorator will return 'FAILURE' for a set amount of time -## after executing its child. -## The timer resets the next time its child is executed and it is not `RUNNING` -## or when the node is interrupted (such as when the behavior tree changes branches). - -## The wait time in seconds -@export var wait_time := 0.0 - -@onready var cache_key = "cooldown_%s" % self.get_instance_id() - - -func tick(actor: Node, blackboard: Blackboard) -> int: - var c: BeehaveNode = get_child(0) - var remaining_time: float = blackboard.get_value(cache_key, 0.0, str(actor.get_instance_id())) - var response: int - - if c != running_child: - c.before_run(actor, blackboard) - - if remaining_time > 0: - response = FAILURE - - remaining_time -= get_physics_process_delta_time() - blackboard.set_value(cache_key, remaining_time, str(actor.get_instance_id())) - if can_send_message(blackboard): - BeehaveDebuggerMessages.process_tick(self.get_instance_id(), response, blackboard.get_debug_data()) - else: - response = c._safe_tick(actor, blackboard) - - if can_send_message(blackboard): - BeehaveDebuggerMessages.process_tick(c.get_instance_id(), response, blackboard.get_debug_data()) - - if c is ConditionLeaf: - blackboard.set_value("last_condition", c, str(actor.get_instance_id())) - blackboard.set_value("last_condition_status", response, str(actor.get_instance_id())) - - if response == RUNNING: - running_child = c - if c is ActionLeaf: - blackboard.set_value("running_action", c, str(actor.get_instance_id())) - else: - c.after_run(actor, blackboard) - blackboard.set_value(cache_key, wait_time, str(actor.get_instance_id())) - - return response - -func interrupt(actor: Node, blackboard: Blackboard) -> void: - # Reset the cooldown when the branch changes - blackboard.set_value(cache_key, 0.0, str(actor.get_instance_id())) - super.interrupt(actor, blackboard) diff --git a/godot/addons/beehave/nodes/decorators/cooldown.gd.uid b/godot/addons/beehave/nodes/decorators/cooldown.gd.uid deleted file mode 100644 index df9fcbc..0000000 --- a/godot/addons/beehave/nodes/decorators/cooldown.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://2qri6rrfv8ui diff --git a/godot/addons/beehave/nodes/decorators/decorator.gd b/godot/addons/beehave/nodes/decorators/decorator.gd deleted file mode 100644 index 4c85f08..0000000 --- a/godot/addons/beehave/nodes/decorators/decorator.gd +++ /dev/null @@ -1,34 +0,0 @@ -@tool -@icon("../../icons/category_decorator.svg") -class_name Decorator extends BeehaveNode - -## Decorator nodes are used to transform the result received by its child. -## Must only have one child. - -var running_child: BeehaveNode = null - - -func _get_configuration_warnings() -> PackedStringArray: - var warnings: PackedStringArray = super._get_configuration_warnings() - - if get_child_count() != 1: - warnings.append("Decorator should have exactly one child node.") - - return warnings - - -func interrupt(actor: Node, blackboard: Blackboard) -> void: - if running_child != null: - running_child.interrupt(actor, blackboard) - running_child = null - super.interrupt(actor, blackboard) - - -func after_run(actor: Node, blackboard: Blackboard) -> void: - running_child = null - - -func get_class_name() -> Array[StringName]: - var classes := super() - classes.push_back(&"Decorator") - return classes diff --git a/godot/addons/beehave/nodes/decorators/decorator.gd.uid b/godot/addons/beehave/nodes/decorators/decorator.gd.uid deleted file mode 100644 index 4076b03..0000000 --- a/godot/addons/beehave/nodes/decorators/decorator.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://kfhcykujhf38 diff --git a/godot/addons/beehave/nodes/decorators/delayer.gd b/godot/addons/beehave/nodes/decorators/delayer.gd deleted file mode 100644 index 41b4321..0000000 --- a/godot/addons/beehave/nodes/decorators/delayer.gd +++ /dev/null @@ -1,57 +0,0 @@ -@tool -@icon("../../icons/delayer.svg") -extends Decorator -class_name DelayDecorator - -## The Delay Decorator will return 'RUNNING' for a set amount of time -## before executing its child. -## The timer resets when both it and its child are not `RUNNING` -## or when the node is interrupted (such as when the behavior tree changes branches). - -## The wait time in seconds -@export var wait_time := 0.0 - -@onready var cache_key = "time_limiter_%s" % self.get_instance_id() - - -func tick(actor: Node, blackboard: Blackboard) -> int: - var c: BeehaveNode = get_child(0) - var total_time: float = blackboard.get_value(cache_key, 0.0, str(actor.get_instance_id())) - var response: int - - if c != running_child: - c.before_run(actor, blackboard) - - if total_time < wait_time: - response = RUNNING - - total_time += get_physics_process_delta_time() - blackboard.set_value(cache_key, total_time, str(actor.get_instance_id())) - - if can_send_message(blackboard): - BeehaveDebuggerMessages.process_tick(self.get_instance_id(), response, blackboard.get_debug_data()) - else: - response = c._safe_tick(actor, blackboard) - - if can_send_message(blackboard): - BeehaveDebuggerMessages.process_tick(c.get_instance_id(), response, blackboard.get_debug_data()) - - if c is ConditionLeaf: - blackboard.set_value("last_condition", c, str(actor.get_instance_id())) - blackboard.set_value("last_condition_status", response, str(actor.get_instance_id())) - - if response == RUNNING: - running_child = c - if c is ActionLeaf: - blackboard.set_value("running_action", c, str(actor.get_instance_id())) - else: - c.after_run(actor, blackboard) - blackboard.set_value(cache_key, 0.0, str(actor.get_instance_id())) - - return response - -func interrupt(actor: Node, blackboard: Blackboard) -> void: - # Reset the delay timer when the branch changes - blackboard.set_value(cache_key, 0.0, str(actor.get_instance_id())) - - super(actor, blackboard) diff --git a/godot/addons/beehave/nodes/decorators/delayer.gd.uid b/godot/addons/beehave/nodes/decorators/delayer.gd.uid deleted file mode 100644 index f5ddfc0..0000000 --- a/godot/addons/beehave/nodes/decorators/delayer.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dorri1tul8gfx diff --git a/godot/addons/beehave/nodes/decorators/failer.gd b/godot/addons/beehave/nodes/decorators/failer.gd deleted file mode 100644 index 934bc71..0000000 --- a/godot/addons/beehave/nodes/decorators/failer.gd +++ /dev/null @@ -1,35 +0,0 @@ -@tool -@icon("../../icons/failer.svg") -class_name AlwaysFailDecorator extends Decorator - -## A Failer node will always return a `FAILURE` status code. - - -func tick(actor: Node, blackboard: Blackboard) -> int: - var c: BeehaveNode = get_child(0) - - if c != running_child: - c.before_run(actor, blackboard) - - var response: int = c._safe_tick(actor, blackboard) - if can_send_message(blackboard): - BeehaveDebuggerMessages.process_tick(c.get_instance_id(), response, blackboard.get_debug_data()) - - if c is ConditionLeaf: - blackboard.set_value("last_condition", c, str(actor.get_instance_id())) - blackboard.set_value("last_condition_status", response, str(actor.get_instance_id())) - - if response == RUNNING: - running_child = c - if c is ActionLeaf: - blackboard.set_value("running_action", c, str(actor.get_instance_id())) - return RUNNING - else: - c.after_run(actor, blackboard) - return FAILURE - - -func get_class_name() -> Array[StringName]: - var classes := super() - classes.push_back(&"AlwaysFailDecorator") - return classes diff --git a/godot/addons/beehave/nodes/decorators/failer.gd.uid b/godot/addons/beehave/nodes/decorators/failer.gd.uid deleted file mode 100644 index 65b2ccc..0000000 --- a/godot/addons/beehave/nodes/decorators/failer.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dwfdg523bk776 diff --git a/godot/addons/beehave/nodes/decorators/inverter.gd b/godot/addons/beehave/nodes/decorators/inverter.gd deleted file mode 100644 index 5f97fea..0000000 --- a/godot/addons/beehave/nodes/decorators/inverter.gd +++ /dev/null @@ -1,43 +0,0 @@ -@tool -@icon("../../icons/inverter.svg") -class_name InverterDecorator extends Decorator - -## An inverter will return `FAILURE` in case it's child returns a `SUCCESS` status -## code or `SUCCESS` in case its child returns a `FAILURE` status code. - - -func tick(actor: Node, blackboard: Blackboard) -> int: - var c: BeehaveNode = get_child(0) - - if c != running_child: - c.before_run(actor, blackboard) - - var response: int = c._safe_tick(actor, blackboard) - if can_send_message(blackboard): - BeehaveDebuggerMessages.process_tick(c.get_instance_id(), response, blackboard.get_debug_data()) - - if c is ConditionLeaf: - blackboard.set_value("last_condition", c, str(actor.get_instance_id())) - blackboard.set_value("last_condition_status", response, str(actor.get_instance_id())) - - match response: - SUCCESS: - c.after_run(actor, blackboard) - return FAILURE - FAILURE: - c.after_run(actor, blackboard) - return SUCCESS - RUNNING: - running_child = c - if c is ActionLeaf: - blackboard.set_value("running_action", c, str(actor.get_instance_id())) - return RUNNING - _: - push_error("This should be unreachable") - return -1 - - -func get_class_name() -> Array[StringName]: - var classes := super() - classes.push_back(&"InverterDecorator") - return classes diff --git a/godot/addons/beehave/nodes/decorators/inverter.gd.uid b/godot/addons/beehave/nodes/decorators/inverter.gd.uid deleted file mode 100644 index 0404ed0..0000000 --- a/godot/addons/beehave/nodes/decorators/inverter.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://crkjak4kyv56m diff --git a/godot/addons/beehave/nodes/decorators/limiter.gd b/godot/addons/beehave/nodes/decorators/limiter.gd deleted file mode 100644 index a51ab89..0000000 --- a/godot/addons/beehave/nodes/decorators/limiter.gd +++ /dev/null @@ -1,77 +0,0 @@ -@tool -@icon("../../icons/limiter.svg") -class_name LimiterDecorator extends Decorator - -## The limiter will execute its `RUNNING` child `x` amount of times. When the number of -## maximum ticks is reached, it will return a `FAILURE` status code. -## The count resets the next time that a child is not `RUNNING` -## or when the node is interrupted (such as when the behavior tree changes branches). - -@onready var cache_key = "limiter_%s" % self.get_instance_id() - -@export var max_count: int = 0 - - -func tick(actor: Node, blackboard: Blackboard) -> int: - if not get_child_count() == 1: - return FAILURE - - var child: BeehaveNode = get_child(0) - var current_count: int = blackboard.get_value(cache_key, 0, str(actor.get_instance_id())) - - if current_count < max_count: - blackboard.set_value(cache_key, current_count + 1, str(actor.get_instance_id())) - var response: int = child.tick(actor, blackboard) - if can_send_message(blackboard): - BeehaveDebuggerMessages.process_tick(child.get_instance_id(), response, blackboard.get_debug_data()) - - if child is ConditionLeaf: - blackboard.set_value("last_condition", child, str(actor.get_instance_id())) - blackboard.set_value("last_condition_status", response, str(actor.get_instance_id())) - - if response == RUNNING: - running_child = child - if child is ActionLeaf: - blackboard.set_value("running_action", child, str(actor.get_instance_id())) - else: - # If the child is no longer running, reset the counter for next time - _reset_counter(actor, blackboard) - child.after_run(actor, blackboard) - - return response - else: - interrupt(actor, blackboard) - child.after_run(actor, blackboard) - return FAILURE - - -func before_run(actor: Node, blackboard: Blackboard) -> void: - # Initialize the counter to 0 when we first start running - _reset_counter(actor, blackboard) - if get_child_count() > 0: - get_child(0).before_run(actor, blackboard) - - -func interrupt(actor: Node, blackboard: Blackboard) -> void: - # The tree is changing branches, so the count should reset - _reset_counter(actor, blackboard) - - # Call super, which may affect our blackboard values - super(actor, blackboard) - - -# Resets the counter in the blackboard -func _reset_counter(actor: Node, blackboard: Blackboard) -> void: - blackboard.set_value(cache_key, 0, str(actor.get_instance_id())) - - -func get_class_name() -> Array[StringName]: - var classes := super() - classes.push_back(&"LimiterDecorator") - return classes - - -func _get_configuration_warnings() -> PackedStringArray: - if not get_child_count() == 1: - return ["Requires exactly one child node"] - return [] diff --git a/godot/addons/beehave/nodes/decorators/limiter.gd.uid b/godot/addons/beehave/nodes/decorators/limiter.gd.uid deleted file mode 100644 index 2444c44..0000000 --- a/godot/addons/beehave/nodes/decorators/limiter.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://crjqmr7expgtl diff --git a/godot/addons/beehave/nodes/decorators/repeater.gd b/godot/addons/beehave/nodes/decorators/repeater.gd deleted file mode 100644 index 1cf43fa..0000000 --- a/godot/addons/beehave/nodes/decorators/repeater.gd +++ /dev/null @@ -1,66 +0,0 @@ -## The repeater will execute its child until it returns `SUCCESS` a certain amount of times. -## When the number of maximum ticks is reached, it will return a `SUCCESS` status code. -## If the child returns `FAILURE`, the repeater will return `FAILURE` immediately. -## The counter resets when the node is interrupted (such as when the behavior tree changes branches). -@tool -@icon("../../icons/repeater.svg") -class_name RepeaterDecorator extends Decorator - -@export var repetitions: int = 1 -var current_count: int = 0 - - -func before_run(actor: Node, blackboard: Blackboard): - current_count = 0 - - -func tick(actor: Node, blackboard: Blackboard) -> int: - var child: BeehaveNode = get_child(0) - - if current_count < repetitions: - if running_child == null: - child.before_run(actor, blackboard) - - var response: int = child.tick(actor, blackboard) - - if can_send_message(blackboard): - BeehaveDebuggerMessages.process_tick(child.get_instance_id(), response, blackboard.get_debug_data()) - - if child is ConditionLeaf: - blackboard.set_value("last_condition", child, str(actor.get_instance_id())) - blackboard.set_value("last_condition_status", response, str(actor.get_instance_id())) - - if response == RUNNING: - running_child = child - if child is ActionLeaf: - blackboard.set_value("running_action", child, str(actor.get_instance_id())) - return RUNNING - - current_count += 1 - child.after_run(actor, blackboard) - - if running_child != null: - running_child = null - - if response == FAILURE: - return FAILURE - - if current_count >= repetitions: - return SUCCESS - - return RUNNING - else: - return SUCCESS - - -func interrupt(actor: Node, blackboard: Blackboard) -> void: - # Reset the internal counter when the node is interrupted - current_count = 0 - - super(actor, blackboard) - - -func get_class_name() -> Array[StringName]: - var classes := super() - classes.push_back(&"LimiterDecorator") - return classes diff --git a/godot/addons/beehave/nodes/decorators/repeater.gd.uid b/godot/addons/beehave/nodes/decorators/repeater.gd.uid deleted file mode 100644 index b14f01e..0000000 --- a/godot/addons/beehave/nodes/decorators/repeater.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c5v7wuqn1xvdy diff --git a/godot/addons/beehave/nodes/decorators/succeeder.gd b/godot/addons/beehave/nodes/decorators/succeeder.gd deleted file mode 100644 index ba52f63..0000000 --- a/godot/addons/beehave/nodes/decorators/succeeder.gd +++ /dev/null @@ -1,35 +0,0 @@ -@tool -@icon("../../icons/succeeder.svg") -class_name AlwaysSucceedDecorator extends Decorator - -## A succeeder node will always return a `SUCCESS` status code. - - -func tick(actor: Node, blackboard: Blackboard) -> int: - var c: BeehaveNode = get_child(0) - - if c != running_child: - c.before_run(actor, blackboard) - - var response: int = c._safe_tick(actor, blackboard) - if can_send_message(blackboard): - BeehaveDebuggerMessages.process_tick(c.get_instance_id(), response, blackboard.get_debug_data()) - - if c is ConditionLeaf: - blackboard.set_value("last_condition", c, str(actor.get_instance_id())) - blackboard.set_value("last_condition_status", response, str(actor.get_instance_id())) - - if response == RUNNING: - running_child = c - if c is ActionLeaf: - blackboard.set_value("running_action", c, str(actor.get_instance_id())) - return RUNNING - else: - c.after_run(actor, blackboard) - return SUCCESS - - -func get_class_name() -> Array[StringName]: - var classes := super() - classes.push_back(&"AlwaysSucceedDecorator") - return classes diff --git a/godot/addons/beehave/nodes/decorators/succeeder.gd.uid b/godot/addons/beehave/nodes/decorators/succeeder.gd.uid deleted file mode 100644 index f3ae405..0000000 --- a/godot/addons/beehave/nodes/decorators/succeeder.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dsf3a8vlolhx8 diff --git a/godot/addons/beehave/nodes/decorators/time_limiter.gd b/godot/addons/beehave/nodes/decorators/time_limiter.gd deleted file mode 100644 index bcc7ca8..0000000 --- a/godot/addons/beehave/nodes/decorators/time_limiter.gd +++ /dev/null @@ -1,68 +0,0 @@ -@tool -@icon("../../icons/limiter.svg") -class_name TimeLimiterDecorator extends Decorator - -## The Time Limit Decorator will give its `RUNNING` child a set amount of time to finish -## before interrupting it and return a `FAILURE` status code. -## The timer resets the next time that a child is not `RUNNING` -## or when the node is interrupted (such as when the behavior tree changes branches). - -@export var wait_time := 0.0 - -@onready var cache_key: String = "time_limiter_%s" % self.get_instance_id() - - -func tick(actor: Node, blackboard: Blackboard) -> int: - if not get_child_count() == 1: - return FAILURE - - var child: BeehaveNode = self.get_child(0) - var time_left: float = blackboard.get_value(cache_key, 0.0, str(actor.get_instance_id())) - - if time_left < wait_time: - time_left += get_physics_process_delta_time() - blackboard.set_value(cache_key, time_left, str(actor.get_instance_id())) - var response: int = child.tick(actor, blackboard) - if can_send_message(blackboard): - BeehaveDebuggerMessages.process_tick(child.get_instance_id(), response, blackboard.get_debug_data()) - - if child is ConditionLeaf: - blackboard.set_value("last_condition", child, str(actor.get_instance_id())) - blackboard.set_value("last_condition_status", response, str(actor.get_instance_id())) - - if response == RUNNING: - running_child = child - if child is ActionLeaf: - blackboard.set_value("running_action", child, str(actor.get_instance_id())) - else: - child.after_run(actor, blackboard) - return response - else: - interrupt(actor, blackboard) - child.after_run(actor, blackboard) - return FAILURE - - -func before_run(actor: Node, blackboard: Blackboard) -> void: - blackboard.set_value(cache_key, 0.0, str(actor.get_instance_id())) - if get_child_count() > 0: - get_child(0).before_run(actor, blackboard) - - -func interrupt(actor: Node, blackboard: Blackboard) -> void: - # Reset the timer when the node is interrupted - blackboard.set_value(cache_key, 0.0, str(actor.get_instance_id())) - - super(actor, blackboard) - - -func get_class_name() -> Array[StringName]: - var classes := super() - classes.push_back(&"TimeLimiterDecorator") - return classes - - -func _get_configuration_warnings() -> PackedStringArray: - if not get_child_count() == 1: - return ["Requires exactly one child node"] - return [] diff --git a/godot/addons/beehave/nodes/decorators/time_limiter.gd.uid b/godot/addons/beehave/nodes/decorators/time_limiter.gd.uid deleted file mode 100644 index 99fbeca..0000000 --- a/godot/addons/beehave/nodes/decorators/time_limiter.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://we22430vcb44 diff --git a/godot/addons/beehave/nodes/decorators/until_fail.gd b/godot/addons/beehave/nodes/decorators/until_fail.gd deleted file mode 100644 index 55646a3..0000000 --- a/godot/addons/beehave/nodes/decorators/until_fail.gd +++ /dev/null @@ -1,35 +0,0 @@ -@tool -@icon("../../icons/until_fail.svg") -class_name UntilFailDecorator -extends Decorator - -## The UntilFail Decorator will return `RUNNING` if its child returns -## `SUCCESS` or `RUNNING` or it will return `SUCCESS` if its child returns -## `FAILURE` - - -func tick(actor: Node, blackboard: Blackboard) -> int: - var c: BeehaveNode = get_child(0) - - if c != running_child: - c.before_run(actor, blackboard) - - var response: int = c._safe_tick(actor, blackboard) - if can_send_message(blackboard): - BeehaveDebuggerMessages.process_tick(c.get_instance_id(), response, blackboard.get_debug_data()) - - if c is ConditionLeaf: - blackboard.set_value("last_condition", c, str(actor.get_instance_id())) - blackboard.set_value("last_condition_status", response, str(actor.get_instance_id())) - - if response == RUNNING: - running_child = c - if c is ActionLeaf: - blackboard.set_value("running_action", c, str(actor.get_instance_id())) - return RUNNING - if response == SUCCESS: - c.after_run(actor, blackboard) - return RUNNING - - c.after_run(actor, blackboard) - return SUCCESS diff --git a/godot/addons/beehave/nodes/decorators/until_fail.gd.uid b/godot/addons/beehave/nodes/decorators/until_fail.gd.uid deleted file mode 100644 index 008f0d7..0000000 --- a/godot/addons/beehave/nodes/decorators/until_fail.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c84st521ytmk3 diff --git a/godot/addons/beehave/nodes/leaves/action.gd b/godot/addons/beehave/nodes/leaves/action.gd deleted file mode 100644 index 9074c07..0000000 --- a/godot/addons/beehave/nodes/leaves/action.gd +++ /dev/null @@ -1,14 +0,0 @@ -@tool -@icon("../../icons/action.svg") -class_name ActionLeaf extends Leaf - -## Actions are leaf nodes that define a task to be performed by an actor. -## Their execution can be long running, potentially being called across multiple -## frame executions. In this case, the node should return `RUNNING` until the -## action is completed. - - -func get_class_name() -> Array[StringName]: - var classes := super() - classes.push_back(&"ActionLeaf") - return classes diff --git a/godot/addons/beehave/nodes/leaves/action.gd.uid b/godot/addons/beehave/nodes/leaves/action.gd.uid deleted file mode 100644 index 1bb43ae..0000000 --- a/godot/addons/beehave/nodes/leaves/action.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cv74jjdrwevpr diff --git a/godot/addons/beehave/nodes/leaves/blackboard_compare.gd b/godot/addons/beehave/nodes/leaves/blackboard_compare.gd deleted file mode 100644 index 38a870d..0000000 --- a/godot/addons/beehave/nodes/leaves/blackboard_compare.gd +++ /dev/null @@ -1,65 +0,0 @@ -@tool -class_name BlackboardCompareCondition extends ConditionLeaf - -## Compares two values using the specified comparison operator. -## Returns [code]FAILURE[/code] if any of the expression fails or the -## comparison operation returns [code]false[/code], otherwise it returns [code]SUCCESS[/code]. - -enum Operators { - EQUAL, - NOT_EQUAL, - GREATER, - LESS, - GREATER_EQUAL, - LESS_EQUAL, -} - -## Expression represetning left operand. -## This value can be any valid GDScript expression. -## In order to use the existing blackboard keys for comparison, -## use get_value("key_name") e.g. get_value("direction").length() -@export_placeholder(EXPRESSION_PLACEHOLDER) var left_operand: String = "" -## Comparison operator. -@export_enum("==", "!=", ">", "<", ">=", "<=") var operator: int = 0 -## Expression represetning right operand. -## This value can be any valid GDScript expression. -## In order to use the existing blackboard keys for comparison, -## use get_value("key_name") e.g. get_value("direction").length() -@export_placeholder(EXPRESSION_PLACEHOLDER) var right_operand: String = "" - -@onready var _left_expression: Expression = _parse_expression(left_operand) -@onready var _right_expression: Expression = _parse_expression(right_operand) - - -func tick(actor: Node, blackboard: Blackboard) -> int: - var left: Variant = _left_expression.execute([], blackboard) - - if _left_expression.has_execute_failed(): - return FAILURE - - var right: Variant = _right_expression.execute([], blackboard) - - if _right_expression.has_execute_failed(): - return FAILURE - - var result: bool = false - - match operator: - Operators.EQUAL: - result = left == right - Operators.NOT_EQUAL: - result = left != right - Operators.GREATER: - result = left > right - Operators.LESS: - result = left < right - Operators.GREATER_EQUAL: - result = left >= right - Operators.LESS_EQUAL: - result = left <= right - - return SUCCESS if result else FAILURE - - -func _get_expression_sources() -> Array[String]: - return [left_operand, right_operand] diff --git a/godot/addons/beehave/nodes/leaves/blackboard_compare.gd.uid b/godot/addons/beehave/nodes/leaves/blackboard_compare.gd.uid deleted file mode 100644 index d7d0d26..0000000 --- a/godot/addons/beehave/nodes/leaves/blackboard_compare.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://uoy6r3dbnq25 diff --git a/godot/addons/beehave/nodes/leaves/blackboard_erase.gd b/godot/addons/beehave/nodes/leaves/blackboard_erase.gd deleted file mode 100644 index e5cc1d4..0000000 --- a/godot/addons/beehave/nodes/leaves/blackboard_erase.gd +++ /dev/null @@ -1,25 +0,0 @@ -@tool -class_name BlackboardEraseAction extends ActionLeaf - -## Erases the specified key from the blackboard. -## Returns [code]FAILURE[/code] if expression execution fails, otherwise [code]SUCCESS[/code]. - -## Expression representing a blackboard key. -@export_placeholder(EXPRESSION_PLACEHOLDER) var key: String = "" - -@onready var _key_expression: Expression = _parse_expression(key) - - -func tick(actor: Node, blackboard: Blackboard) -> int: - var key_value: Variant = _key_expression.execute([], blackboard) - - if _key_expression.has_execute_failed(): - return FAILURE - - blackboard.erase_value(key_value) - - return SUCCESS - - -func _get_expression_sources() -> Array[String]: - return [key] diff --git a/godot/addons/beehave/nodes/leaves/blackboard_erase.gd.uid b/godot/addons/beehave/nodes/leaves/blackboard_erase.gd.uid deleted file mode 100644 index 622ab8d..0000000 --- a/godot/addons/beehave/nodes/leaves/blackboard_erase.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://r8b0istslwhq diff --git a/godot/addons/beehave/nodes/leaves/blackboard_has.gd b/godot/addons/beehave/nodes/leaves/blackboard_has.gd deleted file mode 100644 index 2ee5e92..0000000 --- a/godot/addons/beehave/nodes/leaves/blackboard_has.gd +++ /dev/null @@ -1,23 +0,0 @@ -@tool -class_name BlackboardHasCondition extends ConditionLeaf - -## Returns [code]FAILURE[/code] if expression execution fails or the specified key doesn't exist. -## Returns [code]SUCCESS[/code] if blackboard has the specified key. - -## Expression representing a blackboard key. -@export_placeholder(EXPRESSION_PLACEHOLDER) var key: String = "" - -@onready var _key_expression: Expression = _parse_expression(key) - - -func tick(actor: Node, blackboard: Blackboard) -> int: - var key_value: Variant = _key_expression.execute([], blackboard) - - if _key_expression.has_execute_failed(): - return FAILURE - - return SUCCESS if blackboard.has_value(key_value) else FAILURE - - -func _get_expression_sources() -> Array[String]: - return [key] diff --git a/godot/addons/beehave/nodes/leaves/blackboard_has.gd.uid b/godot/addons/beehave/nodes/leaves/blackboard_has.gd.uid deleted file mode 100644 index a672db6..0000000 --- a/godot/addons/beehave/nodes/leaves/blackboard_has.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dd8lrjdy885gg diff --git a/godot/addons/beehave/nodes/leaves/blackboard_set.gd b/godot/addons/beehave/nodes/leaves/blackboard_set.gd deleted file mode 100644 index 4f0ed9f..0000000 --- a/godot/addons/beehave/nodes/leaves/blackboard_set.gd +++ /dev/null @@ -1,33 +0,0 @@ -@tool -class_name BlackboardSetAction extends ActionLeaf - -## Sets the specified key to the specified value. -## Returns [code]FAILURE[/code] if expression execution fails, otherwise [code]SUCCESS[/code]. - -## Expression representing a blackboard key. -@export_placeholder(EXPRESSION_PLACEHOLDER) var key: String = "" -## Expression representing a blackboard value to assign to the specified key. -@export_placeholder(EXPRESSION_PLACEHOLDER) var value: String = "" - -@onready var _key_expression: Expression = _parse_expression(key) -@onready var _value_expression: Expression = _parse_expression(value) - - -func tick(actor: Node, blackboard: Blackboard) -> int: - var key_value: Variant = _key_expression.execute([], blackboard) - - if _key_expression.has_execute_failed(): - return FAILURE - - var value_value: Variant = _value_expression.execute([], blackboard) - - if _value_expression.has_execute_failed(): - return FAILURE - - blackboard.set_value(key_value, value_value) - - return SUCCESS - - -func _get_expression_sources() -> Array[String]: - return [key, value] diff --git a/godot/addons/beehave/nodes/leaves/blackboard_set.gd.uid b/godot/addons/beehave/nodes/leaves/blackboard_set.gd.uid deleted file mode 100644 index 8f9f07c..0000000 --- a/godot/addons/beehave/nodes/leaves/blackboard_set.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cvq483a337v6s diff --git a/godot/addons/beehave/nodes/leaves/condition.gd b/godot/addons/beehave/nodes/leaves/condition.gd deleted file mode 100644 index f4610b4..0000000 --- a/godot/addons/beehave/nodes/leaves/condition.gd +++ /dev/null @@ -1,12 +0,0 @@ -@tool -@icon("../../icons/condition.svg") -class_name ConditionLeaf extends Leaf - -## Conditions are leaf nodes that either return SUCCESS or FAILURE depending on -## a single simple condition. They should never return `RUNNING`. - - -func get_class_name() -> Array[StringName]: - var classes := super() - classes.push_back(&"ConditionLeaf") - return classes diff --git a/godot/addons/beehave/nodes/leaves/condition.gd.uid b/godot/addons/beehave/nodes/leaves/condition.gd.uid deleted file mode 100644 index 26451db..0000000 --- a/godot/addons/beehave/nodes/leaves/condition.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cbnbvj8prv63i diff --git a/godot/addons/beehave/nodes/leaves/leaf.gd b/godot/addons/beehave/nodes/leaves/leaf.gd deleted file mode 100644 index 4946c7d..0000000 --- a/godot/addons/beehave/nodes/leaves/leaf.gd +++ /dev/null @@ -1,48 +0,0 @@ -@tool -@icon("../../icons/category_leaf.svg") -class_name Leaf extends BeehaveNode - -## Base class for all leaf nodes of the tree. - -const EXPRESSION_PLACEHOLDER: String = "Insert an expression..." - - -func _get_configuration_warnings() -> PackedStringArray: - var warnings: PackedStringArray = [] - - var children: Array[Node] = get_children() - - if children.any(func(x): return x is BeehaveNode): - warnings.append("Leaf nodes should not have any child nodes. They won't be ticked.") - - for source in _get_expression_sources(): - var error_text: String = _parse_expression(source).get_error_text() - if not error_text.is_empty(): - warnings.append("Expression `%s` is invalid! Error text: `%s`" % [source, error_text]) - - return warnings - - -func _parse_expression(source: String) -> Expression: - var result: Expression = Expression.new() - var error: int = result.parse(source) - - if not Engine.is_editor_hint() and error != OK: - push_error( - ( - "[Leaf] Couldn't parse expression with source: `%s` Error text: `%s`" - % [source, result.get_error_text()] - ) - ) - - return result - - -func _get_expression_sources() -> Array[String]: # virtual - return [] - - -func get_class_name() -> Array[StringName]: - var classes := super() - classes.push_back(&"Leaf") - return classes diff --git a/godot/addons/beehave/nodes/leaves/leaf.gd.uid b/godot/addons/beehave/nodes/leaves/leaf.gd.uid deleted file mode 100644 index be9b695..0000000 --- a/godot/addons/beehave/nodes/leaves/leaf.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://t88253ohwyv1 diff --git a/godot/addons/beehave/plugin.cfg b/godot/addons/beehave/plugin.cfg deleted file mode 100644 index f5354ee..0000000 --- a/godot/addons/beehave/plugin.cfg +++ /dev/null @@ -1,7 +0,0 @@ -[plugin] - -name="Beehave" -description="🐝 Behavior Tree addon for Godot Engine" -author="bitbrain" -version="2.9.1" -script="plugin.gd" diff --git a/godot/addons/beehave/plugin.gd b/godot/addons/beehave/plugin.gd deleted file mode 100644 index c6805af..0000000 --- a/godot/addons/beehave/plugin.gd +++ /dev/null @@ -1,40 +0,0 @@ -@tool -extends EditorPlugin - -const BeehaveEditorDebugger := preload("debug/debugger.gd") -var editor_debugger: BeehaveEditorDebugger -var frames: RefCounted - - -func _init(): - name = "BeehavePlugin" - add_autoload_singleton("BeehaveGlobalMetrics", "metrics/beehave_global_metrics.gd") - add_autoload_singleton("BeehaveGlobalDebugger", "debug/global_debugger.gd") - - # Add project settings - if not ProjectSettings.has_setting("beehave/debugger/start_detached"): - ProjectSettings.set_setting("beehave/debugger/start_detached", false) - ProjectSettings.set_initial_value("beehave/debugger/start_detached", false) - ProjectSettings.add_property_info({ - "name": "beehave/debugger/start_detached", - "type": TYPE_BOOL, - "hint": PROPERTY_HINT_NONE, - "hint_string": "If enabled, the debugger will start in a separate window", - "usage": PROPERTY_USAGE_DEFAULT - }) - ProjectSettings.save() - - print("Beehave initialized!") - - -func _enter_tree() -> void: - editor_debugger = BeehaveEditorDebugger.new() - if Engine.get_version_info().minor >= 2: - frames = preload("debug/new_frames.gd").new() - else: - frames = preload("debug/old_frames.gd").new() - add_debugger_plugin(editor_debugger) - - -func _exit_tree() -> void: - remove_debugger_plugin(editor_debugger) diff --git a/godot/addons/beehave/plugin.gd.uid b/godot/addons/beehave/plugin.gd.uid deleted file mode 100644 index 5bd9030..0000000 --- a/godot/addons/beehave/plugin.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cpmewlew40rut diff --git a/godot/addons/beehave/utils/utils.gd b/godot/addons/beehave/utils/utils.gd deleted file mode 100644 index 5f51ce7..0000000 --- a/godot/addons/beehave/utils/utils.gd +++ /dev/null @@ -1,21 +0,0 @@ -@tool - - -static func get_plugin() -> EditorPlugin: - var tree: SceneTree = Engine.get_main_loop() - return tree.get_root().get_child(0).get_node_or_null("BeehavePlugin") - - -static func get_editor_scale() -> float: - var plugin := get_plugin() - if plugin: - return plugin.get_editor_interface().get_editor_scale() - return 1.0 - - -static func get_frames() -> RefCounted: - var plugin := get_plugin() - if plugin: - return plugin.frames - push_error("Can't find Beehave Plugin") - return null diff --git a/godot/addons/beehave/utils/utils.gd.uid b/godot/addons/beehave/utils/utils.gd.uid deleted file mode 100644 index 96a2f8a..0000000 --- a/godot/addons/beehave/utils/utils.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b7s2xntekg47c diff --git a/godot/addons/dialogic/Core/DialogicGameHandler.gd b/godot/addons/dialogic/Core/DialogicGameHandler.gd deleted file mode 100644 index 1d07f93..0000000 --- a/godot/addons/dialogic/Core/DialogicGameHandler.gd +++ /dev/null @@ -1,469 +0,0 @@ -class_name DialogicGameHandler -extends Node - -## Class that is used as the Dialogic autoload. - -## Autoload script that allows you to interact with all of Dialogic's systems:[br] -## - Holds all important information about the current state of Dialogic.[br] -## - Provides access to all the subsystems.[br] -## - Has methods to start/end timelines.[br] - - -## States indicating different phases of dialog. -enum States { - IDLE, ## Dialogic is awaiting input to advance. - REVEALING_TEXT, ## Dialogic is currently revealing text. - ANIMATING, ## Some animation is happening. - AWAITING_CHOICE, ## Dialogic awaits the selection of a choice - WAITING ## Dialogic is currently awaiting something. - } - -## Flags indicating what to clear when calling [method clear]. -enum ClearFlags { - FULL_CLEAR = 0, ## Clears all subsystems - KEEP_VARIABLES = 1, ## Clears all subsystems and info except for variables - TIMELINE_INFO_ONLY = 2 ## Doesn't clear subsystems but current timeline and index - } - -## Reference to the currently executed timeline. -var current_timeline: DialogicTimeline = null -## Copy of the [member current_timeline]'s events. -var current_timeline_events: Array = [] - -## Index of the event the timeline handling is currently at. -var current_event_idx: int = 0 -## Contains all information that subsystems consider relevant for -## the current situation -var current_state_info: Dictionary = {} - -## Current state (see [member States] enum). -var current_state := States.IDLE: - get: - return current_state - - set(new_state): - current_state = new_state - state_changed.emit(new_state) - -## Emitted when [member current_state] change. -signal state_changed(new_state:States) - -## When `true`, many dialogic processes won't continue until it's `false` again. -var paused := false: - set(value): - paused = value - - if paused: - - for subsystem in get_children(): - - if subsystem is DialogicSubsystem: - (subsystem as DialogicSubsystem).pause() - - dialogic_paused.emit() - - else: - for subsystem in get_children(): - - if subsystem is DialogicSubsystem: - (subsystem as DialogicSubsystem).resume() - - dialogic_resumed.emit() - -## A timeline that will be played when dialog ends. -## By default this timeline only contains a clear event. -var dialog_ending_timeline: DialogicTimeline - -## Emitted when [member paused] changes to `true`. -signal dialogic_paused -## Emitted when [member paused] changes to `false`. -signal dialogic_resumed - - -## Emitted when a timeline starts by calling either [method start] -## or [method start_timeline]. -signal timeline_started -## Emitted when the timeline ends. -## This can be a timeline ending or [method end_timeline] being called. -signal timeline_ended -## Emitted when an event starts being executed. -## The event may not have finished executing yet. -signal event_handled(resource: DialogicEvent) - -## Emitted when a [class SignalEvent] event was reached. -@warning_ignore("unused_signal") # This is emitted by the signal event. -signal signal_event(argument: Variant) - -## Emitted when a signal event gets fired from a [class TextEvent] event. -@warning_ignore("unused_signal") # This is emitted by the text subsystem. -signal text_signal(argument: String) - - -# Careful, this section is repopulated automatically at certain moments. -#region SUBSYSTEMS - -var Animations := preload("res://addons/dialogic/Modules/Core/subsystem_animation.gd").new(): - get: return get_subsystem("Animations") - -var Audio := preload("res://addons/dialogic/Modules/Audio/subsystem_audio.gd").new(): - get: return get_subsystem("Audio") - -var Backgrounds := preload("res://addons/dialogic/Modules/Background/subsystem_backgrounds.gd").new(): - get: return get_subsystem("Backgrounds") - -var Choices := preload("res://addons/dialogic/Modules/Choice/subsystem_choices.gd").new(): - get: return get_subsystem("Choices") - -var Expressions := preload("res://addons/dialogic/Modules/Core/subsystem_expression.gd").new(): - get: return get_subsystem("Expressions") - -var Glossary := preload("res://addons/dialogic/Modules/Glossary/subsystem_glossary.gd").new(): - get: return get_subsystem("Glossary") - -var History := preload("res://addons/dialogic/Modules/History/subsystem_history.gd").new(): - get: return get_subsystem("History") - -var Inputs := preload("res://addons/dialogic/Modules/Core/subsystem_input.gd").new(): - get: return get_subsystem("Inputs") - -var Jump := preload("res://addons/dialogic/Modules/Jump/subsystem_jump.gd").new(): - get: return get_subsystem("Jump") - -var PortraitContainers := preload("res://addons/dialogic/Modules/Character/subsystem_containers.gd").new(): - get: return get_subsystem("PortraitContainers") - -var Portraits := preload("res://addons/dialogic/Modules/Character/subsystem_portraits.gd").new(): - get: return get_subsystem("Portraits") - -var Save := preload("res://addons/dialogic/Modules/Save/subsystem_save.gd").new(): - get: return get_subsystem("Save") - -var Settings := preload("res://addons/dialogic/Modules/Settings/subsystem_settings.gd").new(): - get: return get_subsystem("Settings") - -var Styles := preload("res://addons/dialogic/Modules/Style/subsystem_styles.gd").new(): - get: return get_subsystem("Styles") - -var Text := preload("res://addons/dialogic/Modules/Text/subsystem_text.gd").new(): - get: return get_subsystem("Text") - -var TextInput := preload("res://addons/dialogic/Modules/TextInput/subsystem_text_input.gd").new(): - get: return get_subsystem("TextInput") - -var VAR := preload("res://addons/dialogic/Modules/Variable/subsystem_variables.gd").new(): - get: return get_subsystem("VAR") - -var Voice := preload("res://addons/dialogic/Modules/Voice/subsystem_voice.gd").new(): - get: return get_subsystem("Voice") - -#endregion - - -## Autoloads are added first, so this happens REALLY early on game startup. -func _ready() -> void: - _collect_subsystems() - - clear() - - DialogicResourceUtil.update_event_cache() - - dialog_ending_timeline = DialogicTimeline.new() - dialog_ending_timeline.from_text("[clear]") - - -#region TIMELINE & EVENT HANDLING -################################################################################ - -## Method to start a timeline AND ensure that a layout scene is present. -## For argument info, checkout [method start_timeline]. -## -> returns the layout node -func start(timeline:Variant, label_or_idx:Variant="") -> Node: - # If we don't have a style subsystem, default to just start_timeline() - if not has_subsystem('Styles'): - printerr("[Dialogic] You called Dialogic.start() but the Styles subsystem is missing!") - clear(ClearFlags.KEEP_VARIABLES) - start_timeline(timeline, label_or_idx) - return null - - # Otherwise make sure there is a style active. - var scene: Node = null - if !self.Styles.has_active_layout_node(): - scene = self.Styles.load_style() - else: - scene = self.Styles.get_layout_node() - scene.show() - - if not scene.is_node_ready(): - if not scene.ready.is_connected(clear.bind(ClearFlags.KEEP_VARIABLES)): - scene.ready.connect(clear.bind(ClearFlags.KEEP_VARIABLES)) - if not scene.ready.is_connected(start_timeline.bind(timeline, label_or_idx)): - scene.ready.connect(start_timeline.bind(timeline, label_or_idx)) - else: - start_timeline(timeline, label_or_idx) - - return scene - - -## Method to start a timeline without adding a layout scene. -## @timeline can be either a loaded timeline resource or a path to a timeline file. -## @label_or_idx can be a label (string) or index (int) to skip to immediatly. -func start_timeline(timeline:Variant, label_or_idx:Variant = "") -> void: - # load the resource if only the path is given - if typeof(timeline) in [TYPE_STRING, TYPE_STRING_NAME]: - #check the lookup table if it's not a full file name - if "://" in timeline: - timeline = load(timeline) - else: - timeline = DialogicResourceUtil.get_timeline_resource(timeline) - - if timeline == null: - printerr("[Dialogic] There was an error loading this timeline. Check the filename, and the timeline for errors") - return - - (timeline as DialogicTimeline).process() - - current_timeline = timeline - current_timeline_events = current_timeline.events - for event in current_timeline_events: - event.dialogic = self - current_event_idx = -1 - - if typeof(label_or_idx) in [TYPE_STRING, TYPE_STRING_NAME]: - if label_or_idx: - if has_subsystem('Jump'): - Jump.jump_to_label((label_or_idx as String)) - elif typeof(label_or_idx) == TYPE_INT: - if label_or_idx >-1: - current_event_idx = label_or_idx -1 - - if not current_timeline == dialog_ending_timeline: - timeline_started.emit() - - handle_next_event() - - -## Preloader function, prepares a timeline and returns an object to hold for later -## [param timeline_resource] can be either a path (string) or a loaded timeline (resource) -func preload_timeline(timeline_resource:Variant) -> Variant: - # I think ideally this should be on a new thread, will test - if typeof(timeline_resource) in [TYPE_STRING, TYPE_STRING_NAME]: - if "://" in timeline_resource: - timeline_resource = load(timeline_resource) - else: - timeline_resource = DialogicResourceUtil.get_timeline_resource(timeline_resource) - - if timeline_resource == null: - printerr("[Dialogic] There was an error preloading this timeline. Check the filename, and the timeline for errors") - return null - - (timeline_resource as DialogicTimeline).process() - - return timeline_resource - - -## Clears and stops the current timeline. -## If [param skip_ending] is `true`, the dialog_ending_timeline is not getting played -func end_timeline(skip_ending := false) -> void: - if not skip_ending and dialog_ending_timeline and current_timeline != dialog_ending_timeline: - start(dialog_ending_timeline) - return - - await clear(ClearFlags.TIMELINE_INFO_ONLY) - - if Styles.has_active_layout_node() and Styles.get_layout_node().is_inside_tree(): - match ProjectSettings.get_setting('dialogic/layout/end_behaviour', 0): - 0: - Styles.get_layout_node().get_parent().remove_child(Styles.get_layout_node()) - Styles.get_layout_node().queue_free() - 1: - Styles.get_layout_node().hide() - - timeline_ended.emit() - - -## Method to check if timeline exists. -## @timeline can be either a loaded timeline resource or a path to a timeline file. -func timeline_exists(timeline:Variant) -> bool: - if typeof(timeline) in [TYPE_STRING, TYPE_STRING_NAME]: - if "://" in timeline and ResourceLoader.exists(timeline): - return load(timeline) is DialogicTimeline - else: - return DialogicResourceUtil.timeline_resource_exists(timeline) - - return timeline is DialogicTimeline - - -## Handles the next event. -func handle_next_event(_ignore_argument: Variant = "") -> void: - handle_event(current_event_idx+1) - - -## Handles the event at the given index [param event_index]. -## You can call this manually, but if another event is still executing, it might have unexpected results. -func handle_event(event_index:int) -> void: - if not current_timeline: - return - - _cleanup_previous_event() - - if paused: - await dialogic_resumed - - if event_index >= len(current_timeline_events): - end_timeline() - return - - # TODO: Check if necessary. This should be impossible. - #actually process the event now, since we didnt earlier at runtime - #this needs to happen before we create the copy DialogicEvent variable, so it doesn't throw an error if not ready - if current_timeline_events[event_index].event_node_ready == false: - current_timeline_events[event_index]._load_from_string(current_timeline_events[event_index].event_node_as_text) - - current_event_idx = event_index - - if not current_timeline_events[event_index].event_finished.is_connected(handle_next_event): - current_timeline_events[event_index].event_finished.connect(handle_next_event) - - set_meta('previous_event', current_timeline_events[event_index]) - - current_timeline_events[event_index].execute(self) - event_handled.emit(current_timeline_events[event_index]) - - -## Resets Dialogic's state fully or partially. -## By using the clear flags from the [member ClearFlags] enum you can specify -## what info should be kept. -## For example, at timeline end usually it doesn't clear node or subsystem info. -func clear(clear_flags := ClearFlags.FULL_CLEAR) -> void: - _cleanup_previous_event() - - if !clear_flags & ClearFlags.TIMELINE_INFO_ONLY: - for subsystem in get_children(): - if subsystem is DialogicSubsystem: - (subsystem as DialogicSubsystem).clear_game_state(clear_flags) - - var timeline := current_timeline - - current_timeline = null - current_event_idx = -1 - current_timeline_events = [] - current_state = States.IDLE - - # Resetting variables - if timeline: - await timeline.clean() - - -## Cleanup after previous event (if any). -func _cleanup_previous_event(): - if has_meta('previous_event') and get_meta('previous_event') is DialogicEvent: - var event := get_meta('previous_event') as DialogicEvent - if event.event_finished.is_connected(handle_next_event): - event.event_finished.disconnect(handle_next_event) - event._clear_state() - remove_meta("previous_event") - -#endregion - - -#region SAVING & LOADING -################################################################################ - -## Returns a dictionary containing all necessary information to later recreate the same state with load_full_state. -## The [subsystem Save] subsystem might be more useful for you. -## However, this can be used to integrate the info into your own save system. -func get_full_state() -> Dictionary: - if current_timeline: - current_state_info['current_event_idx'] = current_event_idx - current_state_info['current_timeline'] = current_timeline.resource_path - else: - current_state_info['current_event_idx'] = -1 - current_state_info['current_timeline'] = null - - for subsystem in get_children(): - (subsystem as DialogicSubsystem).save_game_state() - - return current_state_info.duplicate(true) - - -## This method tries to load the state from the given [param state_info]. -## Will automatically start a timeline and add a layout if a timeline was running when -## the dictionary was retrieved with [method get_full_state]. -func load_full_state(state_info:Dictionary) -> void: - clear() - current_state_info = state_info - ## The Style subsystem needs to run first for others to load correctly. - var scene: Node = null - if has_subsystem('Styles'): - get_subsystem('Styles').load_game_state() - scene = self.Styles.get_layout_node() - - var load_subsystems := func() -> void: - for subsystem in get_children(): - if subsystem.name == 'Styles': - continue - (subsystem as DialogicSubsystem).load_game_state() - - if null != scene and not scene.is_node_ready(): - scene.ready.connect(load_subsystems) - else: - await get_tree().process_frame - load_subsystems.call() - - if current_state_info.get('current_timeline', null): - start_timeline(current_state_info.current_timeline, current_state_info.get('current_event_idx', 0)) - else: - end_timeline.call_deferred(true) -#endregion - - -#region SUB-SYTSEMS -################################################################################ - -func _collect_subsystems() -> void: - var subsystem_nodes := [] as Array[DialogicSubsystem] - for indexer in DialogicUtil.get_indexers(): - for subsystem in indexer._get_subsystems(): - var subsystem_node := add_subsystem(str(subsystem.name), str(subsystem.script)) - subsystem_nodes.push_back(subsystem_node) - - for subsystem in subsystem_nodes: - subsystem.post_install() - - -## Returns `true` if a subystem with the given [param subsystem_name] exists. -func has_subsystem(subsystem_name:String) -> bool: - return has_node(subsystem_name) - - -## Returns the subsystem node of the given [param subsystem_name] or null if it doesn't exist. -func get_subsystem(subsystem_name:String) -> DialogicSubsystem: - return get_node(subsystem_name) - - -## Adds a subsystem node with the given [param subsystem_name] and [param script_path]. -func add_subsystem(subsystem_name:String, script_path:String) -> DialogicSubsystem: - var node: Node = Node.new() - node.name = subsystem_name - node.set_script(load(script_path)) - node = node as DialogicSubsystem - node.dialogic = self - add_child(node) - return node - - -#endregion - - -#region HELPERS -################################################################################ - - - -func print_debug_moment() -> void: - if not current_timeline: - return - - printerr("\tAt event ", current_event_idx+1, " (",current_timeline_events[current_event_idx].event_name, ' Event) in timeline "', current_timeline.get_identifier(), '" (',current_timeline.resource_path,').') - print("\n") -#endregion diff --git a/godot/addons/dialogic/Core/DialogicGameHandler.gd.uid b/godot/addons/dialogic/Core/DialogicGameHandler.gd.uid deleted file mode 100644 index 1565a56..0000000 --- a/godot/addons/dialogic/Core/DialogicGameHandler.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ds2q0uclmolvu diff --git a/godot/addons/dialogic/Core/DialogicResourceUtil.gd b/godot/addons/dialogic/Core/DialogicResourceUtil.gd deleted file mode 100644 index e5449c8..0000000 --- a/godot/addons/dialogic/Core/DialogicResourceUtil.gd +++ /dev/null @@ -1,376 +0,0 @@ -@tool -class_name DialogicResourceUtil - -static var label_cache := {} -static var event_cache: Array[DialogicEvent] = [] -static var channel_cache := {} - -static var special_resources := {} - - -static func update() -> void: - update_directory('.dch') - update_directory('.dtl') - update_label_cache() - update_audio_channel_cache() - DialogicStylesUtil.build_style_directory() - - -#region RESOURCE DIRECTORIES -################################################################################ - -static func get_directory(extension:String) -> Dictionary: - extension = extension.trim_prefix('.') - if Engine.has_meta(extension+'_directory'): - return Engine.get_meta(extension+'_directory', {}) - - var directory: Dictionary = ProjectSettings.get_setting("dialogic/directories/"+extension+'_directory', {}) - Engine.set_meta(extension+'_directory', directory) - return directory - - -static func set_directory(extension:String, directory:Dictionary) -> void: - extension = extension.trim_prefix('.') - if Engine.is_editor_hint(): - ProjectSettings.set_setting("dialogic/directories/"+extension+'_directory', directory) - ProjectSettings.save() - Engine.set_meta(extension+'_directory', directory) - - -static func update_directory(extension:String) -> void: - var directory := get_directory(extension) - - for resource in list_resources_of_type(extension): - if not resource in directory.values(): - directory = add_resource_to_directory(resource, directory) - - var keys_to_remove := [] - for key in directory: - if not ResourceLoader.exists(directory[key]): - keys_to_remove.append(key) - for key in keys_to_remove: - directory.erase(key) - - set_directory(extension, directory) - - -static func add_resource_to_directory(file_path:String, directory:Dictionary) -> Dictionary: - var suggested_name := file_path.get_file().trim_suffix("."+file_path.get_extension()) - var temp := suggested_name - while suggested_name in directory: - suggested_name = file_path.trim_suffix("/"+suggested_name+"."+file_path.get_extension()).get_file().path_join(suggested_name) - if suggested_name == temp: - break - temp = suggested_name - directory[suggested_name] = file_path - return directory - - -## Returns the unique identifier for the given resource path. -## Returns an empty string if no identifier was found. -static func get_unique_identifier_by_path(file_path:String) -> String: - if not file_path: return "" - var identifier: Variant = get_directory(file_path.get_extension()).find_key(file_path) - if typeof(identifier) == TYPE_STRING: - return identifier - return "" - - -static func get_resource_path_from_identifier(identifier:String, extension:String) -> String: - var value: Variant = get_directory(extension).get(identifier, '') - if value is String: - return value - return "" - - -## Returns the resource associated with the given unique identifier. -## The expected extension is needed to use the right directory. -static func get_resource_from_identifier(identifier:String, extension:String) -> Resource: - var value: Variant = get_directory(extension).get(identifier, '') - if typeof(value) == TYPE_STRING and ResourceLoader.exists(value): - return load(value) - elif value is Resource: - return value - return null - - -## Returns a boolean that expresses whether the resource exists. -## The expected extension is needed to use the right directory. -static func resource_exists_from_identifier(identifier:String, extension:String) -> bool: - var value: Variant = get_directory(extension).get(identifier, '') - if typeof(value) == TYPE_STRING: - return ResourceLoader.exists(value) - return value is Resource - - -## Editor Only -static func change_unique_identifier(file_path:String, new_identifier:String) -> void: - var directory := get_directory(file_path.get_extension()) - var key: String = directory.find_key(file_path) - while key != null: - if key == new_identifier: - break - directory.erase(key) - directory[new_identifier] = file_path - key = directory.find_key(file_path) - set_directory(file_path.get_extension(), directory) - - -static func change_resource_path(old_path:String, new_path:String) -> void: - var directory := get_directory(new_path.get_extension()) - var key: String = directory.find_key(old_path) - while key != null: - directory[key] = new_path - key = directory.find_key(old_path) - set_directory(new_path.get_extension(), directory) - - -static func remove_resource(file_path:String) -> void: - var directory := get_directory(file_path.get_extension()) - var key: String = directory.find_key(file_path) - while key != null: - directory.erase(key) - key = directory.find_key(file_path) - set_directory(file_path.get_extension(), directory) - - -static func is_identifier_unused(extension:String, identifier:String) -> bool: - return not identifier in get_directory(extension) - - -## While usually the directory maps identifiers to paths, this method (only supposed to be used at runtime) -## allows mapping resources that are not saved to an identifier. -static func register_runtime_resource(resource:Resource, identifier:String, extension:String) -> void: - var directory := get_directory(extension) - directory[identifier] = resource - set_directory(extension, directory) - - -static func get_runtime_unique_identifier(resource:Resource, extension:String) -> String: - var identifier: Variant = get_directory(extension).find_key(resource) - if typeof(identifier) == TYPE_STRING: - return identifier - return "" - -#endregion - -#region LABEL CACHE -################################################################################ -# The label cache is only for the editor so we don't have to scan all timelines -# whenever we want to suggest labels. This has no use in game and is not always perfect. - -static func get_label_cache() -> Dictionary: - if not label_cache.is_empty(): - return label_cache - - label_cache = DialogicUtil.get_editor_setting('label_ref', {}) - return label_cache - - -static func set_label_cache(cache:Dictionary) -> void: - label_cache = cache - - -static func update_label_cache() -> void: - var cache := get_label_cache() - var timelines := get_timeline_directory().values() - for timeline in cache: - if !timeline in timelines: - cache.erase(timeline) - set_label_cache(cache) - -#endregion - -#region AUDIO CHANNEL CACHE -################################################################################ -# The audio channel cache is only for the editor so we don't have to scan all timelines -# whenever we want to suggest channels. This has no use in game and is not always perfect. - -static func get_audio_channel_cache() -> Dictionary: - if not channel_cache.is_empty(): - return channel_cache - - channel_cache = DialogicUtil.get_editor_setting('channel_ref', {}) - return channel_cache - - -static func get_channel_list() -> Array: - if channel_cache.is_empty(): - return [] - - var cached_names := [] - for timeline in channel_cache: - for name in channel_cache[timeline]: - if not cached_names.has(name): - cached_names.append(name) - return cached_names - - -static func set_audio_channel_cache(cache:Dictionary) -> void: - channel_cache = cache - - -static func update_audio_channel_cache() -> void: - var cache := get_audio_channel_cache() - var timelines := get_timeline_directory().values() - for timeline in cache: - if !timeline in timelines: - cache.erase(timeline) - set_audio_channel_cache(cache) - -#endregion - -#region EVENT CACHE -################################################################################ - -## Dialogic keeps a list that has each event once. This allows retrieval of that list. -static func get_event_cache() -> Array: - if not event_cache.is_empty(): - return event_cache - - event_cache = update_event_cache() - return event_cache - - -static func update_event_cache() -> Array: - event_cache = [] - for indexer in DialogicUtil.get_indexers(): - # build event cache - for event in indexer._get_events(): - if not ResourceLoader.exists(event): - continue - if not 'event_end_branch.gd' in event and not 'event_text.gd' in event: - event_cache.append(load(event).new()) - - # Events are checked in order while testing them. EndBranch needs to be first, Text needs to be last - event_cache.push_front(DialogicEndBranchEvent.new()) - event_cache.push_back(DialogicTextEvent.new()) - - return event_cache - -#endregion - -#region SPECIAL RESOURCES -################################################################################ - -static func update_special_resources() -> void: - special_resources.clear() - for indexer in DialogicUtil.get_indexers(): - var additions := indexer._get_special_resources() - for resource_type in additions: - if not resource_type in special_resources: - special_resources[resource_type] = {} - special_resources[resource_type].merge(additions[resource_type]) - - -static func list_special_resources(type:String, filter := {}) -> Dictionary: - if special_resources.is_empty(): - update_special_resources() - if type in special_resources: - if filter.is_empty(): - return special_resources[type] - else: - var results := {} - for i in special_resources[type]: - if match_resource_filter(special_resources[type][i], filter): - results[i] = special_resources[type][i] - return results - return {} - - -static func match_resource_filter(dict:Dictionary, filter:Dictionary) -> bool: - for i in filter: - if not i in dict: - return false - if typeof(filter[i]) == TYPE_ARRAY: - if not dict[i] in filter[i]: - return false - else: - if not dict[i] == filter[i]: - return false - return true - - -static func guess_special_resource(type: String, string: String, default := {}, filter := {}, ignores:PackedStringArray=[]) -> Dictionary: - if string.is_empty(): - return default - - if special_resources.is_empty(): - update_special_resources() - var resources := list_special_resources(type, filter) - if resources.is_empty(): - printerr("[Dialogic] No ", type, "s found, but attempted to use one.") - return default - - if string.begins_with('res://'): - for i in resources.values(): - if i.path == string: - return i - printerr("[Dialogic] Unable to find ", type, " at path '", string, "'.") - return default - - string = string.to_lower() - - if string in resources: - return resources[string] - - if not ignores.is_empty(): - var regex := RegEx.create_from_string(r" ?\b(" + "|".join(ignores) + r")\b") - for name in resources: - if regex.sub(name, "") == regex.sub(string, ""): - return resources[name] - - ## As a last effort check against the unfiltered list - if string in special_resources[type]: - push_warning("[Dialogic] Using ", type, " '", string,"' when not supposed to.") - return special_resources[type][string] - - printerr("[Dialogic] Unable to identify ", type, " based on string '", string, "'.") - return default - -#endregion - -#region HELPERS -################################################################################ - -static func get_character_directory() -> Dictionary: - return get_directory('dch') - - -static func get_timeline_directory() -> Dictionary: - return get_directory('dtl') - - -static func timeline_resource_exists(timeline_identifier:String) -> bool: - return resource_exists_from_identifier(timeline_identifier, 'dtl') - - -static func get_timeline_resource(timeline_identifier:String) -> DialogicTimeline: - return get_resource_from_identifier(timeline_identifier, 'dtl') - - -static func get_character_resource(character_identifier:String) -> DialogicCharacter: - return get_resource_from_identifier(character_identifier, 'dch') - - -static func list_resources_of_type(extension:String) -> Array: - var all_resources := scan_folder('res://', extension) - return all_resources - - -static func scan_folder(path:String, extension:String) -> Array: - var list: Array = [] - if DirAccess.dir_exists_absolute(path) and not FileAccess.file_exists(path + "/" + ".gdignore"): - var dir := DirAccess.open(path) - dir.list_dir_begin() - var file_name := dir.get_next() - while file_name != "": - if dir.current_is_dir() and not file_name.begins_with("."): - list += scan_folder(path.path_join(file_name), extension) - else: - if file_name.ends_with(extension): - list.append(path.path_join(file_name)) - file_name = dir.get_next() - return list - -#endregion diff --git a/godot/addons/dialogic/Core/DialogicResourceUtil.gd.uid b/godot/addons/dialogic/Core/DialogicResourceUtil.gd.uid deleted file mode 100644 index 21ba6f9..0000000 --- a/godot/addons/dialogic/Core/DialogicResourceUtil.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bdt5bbxxkvab4 diff --git a/godot/addons/dialogic/Core/DialogicUtil.gd b/godot/addons/dialogic/Core/DialogicUtil.gd deleted file mode 100644 index 897a61e..0000000 --- a/godot/addons/dialogic/Core/DialogicUtil.gd +++ /dev/null @@ -1,803 +0,0 @@ -@tool -class_name DialogicUtil - -## Script that container helper methods for both editor and game execution. -## Used whenever the same thing is needed in different parts of the plugin. - -#region EDITOR - -## This method should be used instead of EditorInterface.get_editor_scale(), because if you use that -## it will run perfectly fine from the editor, but crash when the game is exported. -static func get_editor_scale() -> float: - if Engine.is_editor_hint(): - return get_dialogic_plugin().get_editor_interface().get_editor_scale() - return 1.0 - - -## Although this does in fact always return a EditorPlugin node, -## that class is apparently not present in export and referencing it here creates a crash. -static func get_dialogic_plugin() -> Node: - for child in Engine.get_main_loop().get_root().get_children(): - if child.get_class() == "EditorNode": - return child.get_node('DialogicPlugin') - return null - -#endregion - - -## Returns the autoload when in-game. -static func autoload() -> DialogicGameHandler: - if Engine.is_editor_hint(): - return null - if not Engine.get_main_loop().root.has_node("Dialogic"): - return null - return Engine.get_main_loop().root.get_node("Dialogic") - - -#region FILE SYSTEM -################################################################################ -static func listdir(path: String, files_only:= true, _throw_error:= true, full_file_path:= false, include_imports := false) -> Array: - var files: Array = [] - if path.is_empty(): path = "res://" - if DirAccess.dir_exists_absolute(path): - var dir := DirAccess.open(path) - dir.list_dir_begin() - var file_name := dir.get_next() - while file_name != "": - if not file_name.begins_with("."): - if files_only: - if not dir.current_is_dir() and (not file_name.ends_with('.import') or include_imports): - if full_file_path: - files.append(path.path_join(file_name)) - else: - files.append(file_name) - else: - if full_file_path: - files.append(path.path_join(file_name)) - else: - files.append(file_name) - file_name = dir.get_next() - dir.list_dir_end() - return files - - -static func get_module_path(name:String, builtin:=true) -> String: - if builtin: - return "res://addons/dialogic/Modules".path_join(name) - else: - return ProjectSettings.get_setting('dialogic/extensions_folder', 'res://addons/dialogic_additions').path_join(name) - - -## This is a private and editor-only function. -## -## Populates the [class DialogicGameHandler] with new custom subsystems by -## directly manipulating the file's content and then importing the file. -static func _update_autoload_subsystem_access() -> void: - if not Engine.is_editor_hint(): - printerr("[Dialogic] This function is only available in the editor.") - return - - var script: Script = load("res://addons/dialogic/Core/DialogicGameHandler.gd") - var new_subsystem_access_list := "#region SUBSYSTEMS\n" - var subsystems_sorted := [] - - for indexer: DialogicIndexer in get_indexers(true, true): - - for subsystem: Dictionary in indexer._get_subsystems().duplicate(true): - subsystems_sorted.append(subsystem) - - subsystems_sorted.sort_custom(func (a: Dictionary, b: Dictionary) -> bool: - return a.name < b.name - ) - - for subsystem: Dictionary in subsystems_sorted: - new_subsystem_access_list += '\nvar {name} := preload("{script}").new():\n\tget: return get_subsystem("{name}")\n'.format(subsystem) - - new_subsystem_access_list += "\n#endregion" - script.source_code = RegEx.create_from_string(r"#region SUBSYSTEMS\n#*\n((?!#endregion)(.*\n))*#endregion").sub(script.source_code, new_subsystem_access_list) - ResourceSaver.save(script) - Engine.get_singleton("EditorInterface").get_resource_filesystem().reimport_files(["res://addons/dialogic/Core/DialogicGameHandler.gd"]) - - -static func get_indexers(include_custom := true, force_reload := false) -> Array[DialogicIndexer]: - if Engine.get_main_loop().has_meta('dialogic_indexers') and not force_reload: - return Engine.get_main_loop().get_meta('dialogic_indexers') - - var indexers: Array[DialogicIndexer] = [] - for file in listdir(DialogicUtil.get_module_path(''), false): - var possible_script: String = DialogicUtil.get_module_path(file).path_join("index.gd") - if ResourceLoader.exists(possible_script): - indexers.append(load(possible_script).new()) - - if include_custom: - var extensions_folder: String = ProjectSettings.get_setting('dialogic/extensions_folder', "res://addons/dialogic_additions/") - for file in listdir(extensions_folder, false, false): - var possible_script: String = extensions_folder.path_join(file + "/index.gd") - if ResourceLoader.exists(possible_script): - indexers.append(load(possible_script).new()) - - Engine.get_main_loop().set_meta('dialogic_indexers', indexers) - return indexers - - - -## Turns a [param file_path] from `some_file.png` to `Some File`. -static func pretty_name(file_path: String) -> String: - var _name := file_path.get_file().trim_suffix("." + file_path.get_extension()) - _name = _name.replace('_', ' ') - _name = _name.capitalize() - - return _name - -#endregion - - -#region EDITOR SETTINGS & COLORS -################################################################################ - -static func set_editor_setting(setting:String, value:Variant) -> void: - var cfg := ConfigFile.new() - if FileAccess.file_exists('user://dialogic/editor_settings.cfg'): - cfg.load('user://dialogic/editor_settings.cfg') - - cfg.set_value('DES', setting, value) - - if !DirAccess.dir_exists_absolute('user://dialogic'): - DirAccess.make_dir_absolute('user://dialogic') - cfg.save('user://dialogic/editor_settings.cfg') - - -static func get_editor_setting(setting:String, default:Variant=null) -> Variant: - var cfg := ConfigFile.new() - if !FileAccess.file_exists('user://dialogic/editor_settings.cfg'): - return default - - if !cfg.load('user://dialogic/editor_settings.cfg') == OK: - return default - - return cfg.get_value('DES', setting, default) - - -static func get_color_palette(default:bool = false) -> Dictionary: - var defaults := { - 'Color1': Color('#3b8bf2'), # Blue - 'Color2': Color('#00b15f'), # Green - 'Color3': Color('#e868e2'), # Pink - 'Color4': Color('#9468e8'), # Purple - 'Color5': Color('#574fb0'), # DarkPurple - 'Color6': Color('#1fa3a3'), # Aquamarine - 'Color7': Color('#fa952a'), # Orange - 'Color8': Color('#de5c5c'), # Red - 'Color9': Color('#7c7c7c'), # Gray - } - if default: - return defaults - return get_editor_setting('color_palette', defaults) - - -static func get_color(value:String) -> Color: - var colors := get_color_palette() - return colors[value] - -#endregion - - -#region TIMER PROCESS MODE -################################################################################ -static func is_physics_timer() -> bool: - return ProjectSettings.get_setting('dialogic/timer/process_in_physics', false) - - -static func update_timer_process_callback(timer:Timer) -> void: - timer.process_callback = Timer.TIMER_PROCESS_PHYSICS if is_physics_timer() else Timer.TIMER_PROCESS_IDLE - -#endregion - - -#region MULTITWEEN -################################################################################ -static func multitween(tweened_value:Variant, item:Node, property:String, part:String) -> void: - var parts: Dictionary = item.get_meta(property+'_parts', {}) - parts[part] = tweened_value - - if not item.has_meta(property+'_base_value') and not 'base' in parts: - item.set_meta(property+'_base_value', item.get(property)) - - var final_value: Variant = parts.get('base', item.get_meta(property+'_base_value', item.get(property))) - - for key in parts: - if key == 'base': - continue - else: - final_value += parts[key] - - item.set(property, final_value) - item.set_meta(property+'_parts', parts) - -#endregion - - -#region TRANSLATIONS -################################################################################ - -static func get_next_translation_id() -> String: - ProjectSettings.set_setting('dialogic/translation/id_counter', ProjectSettings.get_setting('dialogic/translation/id_counter', 16)+1) - return '%x' % ProjectSettings.get_setting('dialogic/translation/id_counter', 16) - -#endregion - - -#region VARIABLES -################################################################################ - -enum VarTypes {ANY, STRING, FLOAT, INT, BOOL} - - -static func get_default_variables() -> Dictionary: - return ProjectSettings.get_setting('dialogic/variables', {}) - - -# helper that converts a nested variable dictionary into an array with paths -static func list_variables(dict:Dictionary, path := "", type:=VarTypes.ANY) -> Array: - var array := [] - for key in dict.keys(): - if typeof(dict[key]) == TYPE_DICTIONARY: - array.append_array(list_variables(dict[key], path+key+".", type)) - else: - if type == VarTypes.ANY or get_variable_value_type(dict[key]) == type: - array.append(path+key) - return array - - -static func get_variable_value_type(value:Variant) -> VarTypes: - match typeof(value): - TYPE_STRING: - return VarTypes.STRING - TYPE_FLOAT: - return VarTypes.FLOAT - TYPE_INT: - return VarTypes.INT - TYPE_BOOL: - return VarTypes.BOOL - return VarTypes.ANY - - -static func get_variable_type(path:String, dict:Dictionary={}) -> VarTypes: - if dict.is_empty(): - dict = get_default_variables() - return get_variable_value_type(_get_value_in_dictionary(path, dict)) - - -## This will set a value in a dictionary (or a sub-dictionary based on the path) -## e.g. it could set "Something.Something.Something" in {'Something':{'Something':{'Someting':"value"}}} -static func _set_value_in_dictionary(path:String, dictionary:Dictionary, value): - if '.' in path: - var from := path.split('.')[0] - if from in dictionary.keys(): - dictionary[from] = _set_value_in_dictionary(path.trim_prefix(from+"."), dictionary[from], value) - else: - if path in dictionary.keys(): - dictionary[path] = value - return dictionary - - -## This will get a value in a dictionary (or a sub-dictionary based on the path) -## e.g. it could get "Something.Something.Something" in {'Something':{'Something':{'Someting':"value"}}} -static func _get_value_in_dictionary(path:String, dictionary:Dictionary, default= null) -> Variant: - if '.' in path: - var from := path.split('.')[0] - if from in dictionary.keys(): - return _get_value_in_dictionary(path.trim_prefix(from+"."), dictionary[from], default) - else: - if path in dictionary.keys(): - return dictionary[path] - return default - -#endregion - - -#region SCENE EXPORT OVERRIDES -################################################################################ - -static func apply_scene_export_overrides(node:Node, export_overrides:Dictionary, apply := true) -> void: - var default_info := get_scene_export_defaults(node) - if !node.script: - return - var property_info: Array[Dictionary] = node.script.get_script_property_list() - for i in property_info: - if i['usage'] & PROPERTY_USAGE_EDITOR: - if i['name'] in export_overrides: - if str_to_var(export_overrides[i['name']]) == null and typeof(node.get(i['name'])) == TYPE_STRING: - node.set(i['name'], export_overrides[i['name']]) - else: - node.set(i['name'], str_to_var(export_overrides[i['name']])) - elif i['name'] in default_info: - node.set(i['name'], default_info.get(i['name'])) - if apply: - if node.has_method('apply_export_overrides'): - node.apply_export_overrides() - - -static func get_scene_export_defaults(node:Node) -> Dictionary: - if !node.script: - return {} - - if Engine.get_main_loop().has_meta('dialogic_scene_export_defaults') and \ - node.script.resource_path in Engine.get_main_loop().get_meta('dialogic_scene_export_defaults'): - return Engine.get_main_loop().get_meta('dialogic_scene_export_defaults')[node.script.resource_path] - - if !Engine.get_main_loop().has_meta('dialogic_scene_export_defaults'): - Engine.get_main_loop().set_meta('dialogic_scene_export_defaults', {}) - var defaults := {} - var property_info: Array[Dictionary] = node.script.get_script_property_list() - for i in property_info: - if i['usage'] & PROPERTY_USAGE_EDITOR: - defaults[i['name']] = node.get(i['name']) - Engine.get_main_loop().get_meta('dialogic_scene_export_defaults')[node.script.resource_path] = defaults - return defaults - -#endregion - -#region MAKE CUSTOM - -static func make_file_custom(original_file:String, target_folder:String, new_file_name := "", new_folder_name := "") -> String: - if not ResourceLoader.exists(original_file): - push_error("[Dialogic] Unable to make file with invalid path custom!") - return "" - - if new_folder_name: - target_folder = target_folder.path_join(new_folder_name) - DirAccess.make_dir_absolute(target_folder) - - if new_file_name.is_empty(): - new_file_name = "custom_" + original_file.get_file() - - if not new_file_name.ends_with(original_file.get_extension()): - new_file_name += "." + original_file.get_extension() - - var target_file := target_folder.path_join(new_file_name) - - customize_file(original_file, target_file) - - get_dialogic_plugin().get_editor_interface().get_resource_filesystem().scan_sources() - - return target_file - - -static func customize_file(original_file:String, target_file:String) -> String: - #print("\nCUSTOMIZE FILE") - #printt(original_file, "->", target_file) - - DirAccess.copy_absolute(original_file, target_file) - - var file := FileAccess.open(target_file, FileAccess.READ) - var file_text := file.get_as_text() - file.close() - - # If we are customizing a scene, we check for any resources used in that scene that are in the same folder. - # Those will be copied as well and the scene will be modified to point to them. - if file_text.begins_with('[gd_'): - var base_path: String = original_file.get_base_dir() - - var remove_uuid_regex := r'\[gd_.* (?uid="uid:[^"]*")' - var result := RegEx.create_from_string(remove_uuid_regex).search(file_text) - if result: - file_text = file_text.replace(result.get_string("uid"), "") - - # This regex also removes the UID referencing the original resource - var file_regex := r'(uid="[^"]*" )?\Qpath="'+base_path+r'\E(?[^"]*)"' - result = RegEx.create_from_string(file_regex).search(file_text) - while result: - var found_file_name := result.get_string('file') - var found_file_path := base_path.path_join(found_file_name) - var target_file_path := target_file.get_base_dir().path_join(found_file_name) - - # Files found in this file will ALSO be customized. - customize_file(found_file_path, target_file_path) - - file_text = file_text.replace(found_file_path, target_file_path) - - result = RegEx.create_from_string(file_regex).search(file_text) - - file = FileAccess.open(target_file, FileAccess.WRITE) - file.store_string(file_text) - file.close() - - return target_file - -#endregion - -#region INSPECTOR FIELDS -################################################################################ - -static func setup_script_property_edit_node(property_info: Dictionary, value:Variant, property_changed:Callable) -> Control: - var input: Control = null - match property_info['type']: - TYPE_BOOL: - input = CheckBox.new() - if value != null: - input.button_pressed = value - input.toggled.connect(DialogicUtil._on_export_bool_submitted.bind(property_info.name, property_changed)) - TYPE_COLOR: - input = ColorPickerButton.new() - if value != null: - input.color = value - input.color_changed.connect(DialogicUtil._on_export_color_submitted.bind(property_info.name, property_changed)) - input.custom_minimum_size.x = get_editor_scale() * 50 - TYPE_INT: - if property_info['hint'] & PROPERTY_HINT_ENUM: - input = OptionButton.new() - for x in property_info['hint_string'].split(','): - input.add_item(x.split(':')[0]) - if value != null: - input.select(value) - input.item_selected.connect(DialogicUtil._on_export_int_enum_submitted.bind(property_info.name, property_changed)) - else: - input = load("res://addons/dialogic/Editor/Events/Fields/field_number.tscn").instantiate() - input.property_name = property_info['name'] - input.use_int_mode() - - if ',' in property_info.hint_string: - input.min_value = int(property_info.hint_string.get_slice(',', 0)) - input.max_value = int(property_info.hint_string.get_slice(',', 1)) - if property_info.hint_string.count(',') > 1: - input.step = int(property_info.hint_string.get_slice(',', 2)) - else: - input.step = 1 - input.max_value = INF - input.min_value = -INF - - if value != null: - input.set_value(value) - input.value_changed.connect(DialogicUtil._on_export_number_submitted.bind(property_changed)) - TYPE_FLOAT: - input = load("res://addons/dialogic/Editor/Events/Fields/field_number.tscn").instantiate() - input.property_name = property_info['name'] - input.use_float_mode() - input.step = 0.01 - if ',' in property_info.hint_string: - input.min_value = float(property_info.hint_string.get_slice(',', 0)) - input.max_value = float(property_info.hint_string.get_slice(',', 1)) - if property_info.hint_string.count(',') > 1: - input.step = float(property_info.hint_string.get_slice(',', 2)) - if value != null: - input.set_value(value) - input.value_changed.connect(DialogicUtil._on_export_number_submitted.bind(property_changed)) - TYPE_VECTOR2, TYPE_VECTOR3, TYPE_VECTOR4: - var vectorSize: String = type_string(typeof(value))[-1] - input = load("res://addons/dialogic/Editor/Events/Fields/field_vector" + vectorSize + ".tscn").instantiate() - input.property_name = property_info['name'] - input.set_value(value) - input.value_changed.connect(DialogicUtil._on_export_vector_submitted.bind(property_changed)) - TYPE_VECTOR2I, TYPE_VECTOR3I, TYPE_VECTOR4I: - var vectorSize: String = type_string(typeof(value))[-2] - input = load("res://addons/dialogic/Editor/Events/Fields/field_vector" + vectorSize + ".tscn").instantiate() - input.step = 1 - input.property_name = property_info['name'] - input.set_value(value) - input.value_changed.connect(DialogicUtil._on_export_vectori_submitted.bind(property_changed)) - TYPE_STRING: - if property_info['hint'] & PROPERTY_HINT_FILE or property_info['hint'] & PROPERTY_HINT_DIR: - input = load("res://addons/dialogic/Editor/Events/Fields/field_file.tscn").instantiate() - input.show_editing_button = true - input.file_filter = property_info['hint_string'] - input.file_mode = FileDialog.FILE_MODE_OPEN_FILE - if property_info['hint'] == PROPERTY_HINT_DIR: - input.file_mode = FileDialog.FILE_MODE_OPEN_DIR - input.property_name = property_info['name'] - input.placeholder = "Default" - input.hide_reset = true - if value != null: - input.set_value(value) - input.value_changed.connect(DialogicUtil._on_export_file_submitted.bind(property_changed)) - elif property_info['hint'] & PROPERTY_HINT_ENUM: - input = OptionButton.new() - var options: PackedStringArray = [] - for x in property_info['hint_string'].split(','): - options.append(x.split(':')[0].strip_edges()) - input.add_item(options[-1]) - if value != null: - input.select(options.find(value)) - input.item_selected.connect(DialogicUtil._on_export_string_enum_submitted.bind(property_info.name, options, property_changed)) - else: - input = LineEdit.new() - if value != null: - input.text = value - input.text_submitted.connect(DialogicUtil._on_export_input_text_submitted.bind(property_info.name, property_changed)) - TYPE_DICTIONARY: - input = load("res://addons/dialogic/Editor/Events/Fields/field_dictionary.tscn").instantiate() - input.property_name = property_info["name"] - input.set_value(value) - input.value_changed.connect(_on_export_dict_submitted.bind(property_changed)) - TYPE_OBJECT: - input = load("res://addons/dialogic/Editor/Common/hint_tooltip_icon.tscn").instantiate() - input.hint_text = "Objects/Resources as settings are currently not supported. \nUse @export_file('*.extension') instead and load the resource once needed." - - _: - input = LineEdit.new() - if value != null: - input.text = value - input.text_submitted.connect(_on_export_input_text_submitted.bind(property_info.name, property_changed)) - return input - - -static func _on_export_input_text_submitted(text:String, property_name:String, callable: Callable) -> void: - callable.call(property_name, var_to_str(text)) - -static func _on_export_bool_submitted(value:bool, property_name:String, callable: Callable) -> void: - callable.call(property_name, var_to_str(value)) - -static func _on_export_color_submitted(color:Color, property_name:String, callable: Callable) -> void: - callable.call(property_name, var_to_str(color)) - -static func _on_export_int_enum_submitted(item:int, property_name:String, callable: Callable) -> void: - callable.call(property_name, var_to_str(item)) - -static func _on_export_number_submitted(property_name:String, value:float, callable: Callable) -> void: - callable.call(property_name, var_to_str(value)) - -static func _on_export_file_submitted(property_name:String, value:String, callable: Callable) -> void: - callable.call(property_name, var_to_str(value)) - -static func _on_export_string_enum_submitted(value:int, property_name:String, list:PackedStringArray, callable: Callable): - callable.call(property_name, var_to_str(list[value])) - -static func _on_export_vector_submitted(property_name:String, value:Variant, callable: Callable) -> void: - callable.call(property_name, var_to_str(value)) - -static func _on_export_vectori_submitted(property_name:String, value:Variant, callable: Callable) -> void: - match typeof(value): - TYPE_VECTOR2: value = Vector2i(value) - TYPE_VECTOR3: value = Vector3i(value) - TYPE_VECTOR4: value = Vector4i(value) - callable.call(property_name, var_to_str(value)) - -static func _on_export_dict_submitted(property_name:String, value:Variant, callable: Callable) -> void: - callable.call(property_name, var_to_str(value)) - -#endregion - - -#region EVENT DEFAULTS -################################################################################ - -static func get_custom_event_defaults(event_name:String) -> Dictionary: - if Engine.is_editor_hint(): - return ProjectSettings.get_setting('dialogic/event_default_overrides', {}).get(event_name, {}) - else: - if !Engine.get_main_loop().has_meta('dialogic_event_defaults'): - Engine.get_main_loop().set_meta('dialogic_event_defaults', ProjectSettings.get_setting('dialogic/event_default_overrides', {})) - return Engine.get_main_loop().get_meta('dialogic_event_defaults').get(event_name, {}) - -#endregion - - -#region CONVERSION -################################################################################ - -static func str_to_bool(boolstring:String) -> bool: - return true if boolstring == "true" else false - - -static func logical_convert(value:Variant) -> Variant: - if typeof(value) == TYPE_STRING: - if value.is_valid_int(): - return value.to_int() - if value.is_valid_float(): - return value.to_float() - if value == 'true': - return true - if value == 'false': - return false - return value - - -## Takes [param source] and builds a dictionary of keys only. -## The values are `null`. -static func str_to_hash_set(source: String) -> Dictionary: - var dictionary := Dictionary() - - for character in source: - dictionary[character] = null - - return dictionary - -#endregion - - -static func get_character_suggestions(_search_text:String, current_value:DialogicCharacter = null, allow_none := true, allow_all:= false, editor_node:Node = null) -> Dictionary: - var suggestions := {} - - var icon := load("res://addons/dialogic/Editor/Images/Resources/character.svg") - - if allow_none and current_value: - suggestions['(No one)'] = {'value':'', 'editor_icon':["GuiRadioUnchecked", "EditorIcons"]} - - if allow_all: - suggestions['ALL'] = {'value':'--All--', 'tooltip':'All currently joined characters leave', 'editor_icon':["GuiEllipsis", "EditorIcons"]} - - # Get characters in the current timeline and place them at the top of suggestions. - if editor_node: - var recent_characters := [] - var timeline_node := editor_node.get_parent().find_parent("Timeline") as DialogicEditor - for event_node in timeline_node.find_child("Timeline").get_children(): - if event_node == editor_node: - break - if event_node.resource is DialogicCharacterEvent or event_node.resource is DialogicTextEvent: - recent_characters.append(event_node.resource.character) - - recent_characters.reverse() - for character in recent_characters: - if character and not character.get_character_name() in suggestions: - suggestions[character.get_character_name()] = {'value': character.get_character_name(), 'tooltip': character.resource_path, 'icon': icon.duplicate()} - - var character_directory := DialogicResourceUtil.get_character_directory() - for resource in character_directory.keys(): - suggestions[resource] = {'value': resource, 'tooltip': character_directory[resource], 'icon': icon} - - return suggestions - - -static func get_portrait_suggestions(search_text:String, character:DialogicCharacter, allow_empty := false, empty_text := "Don't Change") -> Dictionary: - var icon := load("res://addons/dialogic/Editor/Images/Resources/portrait.svg") - var suggestions := {} - - if allow_empty: - suggestions[empty_text] = {'value':'', 'editor_icon':["GuiRadioUnchecked", "EditorIcons"]} - - if "{" in search_text: - suggestions[search_text] = {'value':search_text, 'editor_icon':["Variant", "EditorIcons"]} - - if character != null: - for portrait in character.portraits: - suggestions[portrait] = {'value':portrait, 'icon':icon} - - return suggestions - - -static func get_portrait_position_suggestions(search_text := "") -> Dictionary: - var icon := load(DialogicUtil.get_module_path("Character").path_join('portrait_position.svg')) - - var setting: String = ProjectSettings.get_setting('dialogic/portraits/position_suggestion_names', 'leftmost, left, center, right, rightmost') - - var suggestions := {} - - if not search_text.is_empty(): - suggestions[search_text] = {'value':search_text.strip_edges(), 'editor_icon':["GuiScrollArrowRight", "EditorIcons"]} - - for position_id in setting.split(','): - suggestions[position_id.strip_edges()] = {'value':position_id.strip_edges(), 'icon':icon} - if not search_text.is_empty() and position_id.strip_edges().begins_with(search_text): - suggestions.erase(search_text) - - return suggestions - - -static func get_autoload_suggestions(filter:String="") -> Dictionary: - var suggestions := {} - - for prop in ProjectSettings.get_property_list(): - if prop.name.begins_with('autoload/'): - var some_autoload: String = prop.name.trim_prefix('autoload/') - suggestions[some_autoload] = {'value': some_autoload, 'tooltip':some_autoload, 'editor_icon': ["Node", "EditorIcons"]} - if filter.begins_with(some_autoload): - suggestions[filter] = {'value': filter, 'editor_icon':["GuiScrollArrowRight", "EditorIcons"]} - return suggestions - - -static func get_autoload_script_resource(autoload_name:String) -> Script: - var script: Script - if autoload_name and ProjectSettings.has_setting('autoload/'+autoload_name): - var loaded_autoload := load(ProjectSettings.get_setting('autoload/'+autoload_name).trim_prefix('*')) - - if loaded_autoload is PackedScene: - var packed_scene: PackedScene = loaded_autoload - script = packed_scene.instantiate().get_script() - - else: - script = loaded_autoload - return script - - -static func get_autoload_method_suggestions(filter:String, autoload_name:String) -> Dictionary: - var suggestions := {} - - var script := get_autoload_script_resource(autoload_name) - if script: - for script_method in script.get_script_method_list(): - if script_method.name.begins_with('@') or script_method.name.begins_with('_'): - continue - suggestions[script_method.name] = {'value': script_method.name, 'tooltip':script_method.name, 'editor_icon': ["Callable", "EditorIcons"]} - - if not filter.is_empty(): - suggestions[filter] = {'value': filter, 'editor_icon':["GuiScrollArrowRight", "EditorIcons"]} - - return suggestions - - -static func get_autoload_property_suggestions(_filter:String, autoload_name:String) -> Dictionary: - var suggestions := {} - var script := get_autoload_script_resource(autoload_name) - if script: - for property in script.get_script_property_list(): - if property.name.ends_with('.gd') or property.name.begins_with('_'): - continue - suggestions[property.name] = {'value': property.name, 'tooltip':property.name, 'editor_icon': ["MemberProperty", "EditorIcons"]} - - return suggestions - - -static func get_audio_bus_suggestions(_filter:= "") -> Dictionary: - var bus_name_list := {} - for i in range(AudioServer.bus_count): - if i == 0: - bus_name_list[AudioServer.get_bus_name(i)] = {'value':''} - else: - bus_name_list[AudioServer.get_bus_name(i)] = {'value':AudioServer.get_bus_name(i)} - return bus_name_list - - -static func get_audio_channel_suggestions(_search_text:String) -> Dictionary: - var suggestions := {} - var channel_defaults := DialogicUtil.get_audio_channel_defaults() - var cached_names := DialogicResourceUtil.get_channel_list() - - for i in channel_defaults.keys(): - if not cached_names.has(i): - cached_names.append(i) - - cached_names.sort() - - for i in cached_names: - if i.is_empty(): - continue - - suggestions[i] = {'value': i} - - if i in channel_defaults.keys(): - suggestions[i]["editor_icon"] = ["ProjectList", "EditorIcons"] - suggestions[i]["tooltip"] = "A default channel defined in the settings." - - else: - suggestions[i]["editor_icon"] = ["AudioStreamPlayer", "EditorIcons"] - suggestions[i]["tooltip"] = "A temporary channel without defaults." - - return suggestions - - -static func get_audio_channel_defaults() -> Dictionary: - return ProjectSettings.get_setting('dialogic/audio/channel_defaults', { - "": { - 'volume': 0.0, - 'audio_bus': '', - 'fade_length': 0.0, - 'loop': false, - }, - "music": { - 'volume': 0.0, - 'audio_bus': '', - 'fade_length': 0.0, - 'loop': true, - }}) - - -static func validate_audio_channel_name(text: String) -> Dictionary: - var result := {} - var channel_name_regex := RegEx.create_from_string(r'(?^-$)|(?[^\w-]{1})') - var matches := channel_name_regex.search_all(text) - var invalid_chars := [] - - for regex_match in matches: - if regex_match.get_string('dash_only'): - result['error_tooltip'] = "Channel name cannot be '-'." - result['valid_text'] = '' - else: - var invalid_char = regex_match.get_string('invalid') - if not invalid_char in invalid_chars: - invalid_chars.append(invalid_char) - - if invalid_chars: - result['valid_text'] = channel_name_regex.sub(text, '', true) - result['error_tooltip'] = "Channel names cannot contain the following characters: " + "".join(invalid_chars) - - return result diff --git a/godot/addons/dialogic/Core/DialogicUtil.gd.uid b/godot/addons/dialogic/Core/DialogicUtil.gd.uid deleted file mode 100644 index a6c1900..0000000 --- a/godot/addons/dialogic/Core/DialogicUtil.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c848iwoo6mnms diff --git a/godot/addons/dialogic/Core/Dialogic_Subsystem.gd b/godot/addons/dialogic/Core/Dialogic_Subsystem.gd deleted file mode 100644 index 3ff55e6..0000000 --- a/godot/addons/dialogic/Core/Dialogic_Subsystem.gd +++ /dev/null @@ -1,41 +0,0 @@ -class_name DialogicSubsystem -extends Node - -var dialogic: DialogicGameHandler = null - -enum LoadFlags {FULL_LOAD, ONLY_DNODES} - -# To be overriden by sub-classes -# Called once after every subsystem has been added to the tree -func post_install() -> void: - pass - - -# To be overriden by sub-classes -# Fill in everything that should be cleared (for example before loading a different state) -func clear_game_state(_clear_flag:=DialogicGameHandler.ClearFlags.FULL_CLEAR) -> void: - pass - - -# To be overriden by sub-classes -# Fill in everything that should be loaded using the dialogic_game_handler.current_state_info -# This is called when a save is loaded -func load_game_state(_load_flag:=LoadFlags.FULL_LOAD) -> void: - pass - - -# To be overriden by sub-classes -# Fill in everything that should be saved into the dialogic_game_handler.current_state_info -# This is called when a save is saved -func save_game_state() -> void: - pass - - -# To be overriden by sub-classes -func pause() -> void: - pass - - -# To be overriden by sub-classes -func resume() -> void: - pass diff --git a/godot/addons/dialogic/Core/Dialogic_Subsystem.gd.uid b/godot/addons/dialogic/Core/Dialogic_Subsystem.gd.uid deleted file mode 100644 index f1010fa..0000000 --- a/godot/addons/dialogic/Core/Dialogic_Subsystem.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://d4iojsqnbdphm diff --git a/godot/addons/dialogic/Core/index_class.gd b/godot/addons/dialogic/Core/index_class.gd deleted file mode 100644 index c6bd7c5..0000000 --- a/godot/addons/dialogic/Core/index_class.gd +++ /dev/null @@ -1,152 +0,0 @@ -@tool -class_name DialogicIndexer -extends RefCounted - -## Script that indexes events, subsystems, settings pages and more. [br] -## Place a script of this type in every folder in "addons/Events". [br] -## Overwrite the methods to return the contents of that folder. - - -var this_folder: String = get_script().resource_path.get_base_dir() - -## Overwrite if this module contains any events. [br] -## Return an array with all the paths to the event scripts.[br] -## You can use the [property this_folder].path_join('my_event.gd') -func _get_events() -> Array: - if ResourceLoader.exists(this_folder.path_join('event.gd')): - return [this_folder.path_join('event.gd')] - return [] - - -## Overwrite if this module contains any subsystems. -## Should return an array of dictionaries each with the following keys: [br] -## "name" -> name for this subsystem[br] -## "script" -> array of preview images[br] -func _get_subsystems() -> Array[Dictionary]: - return [] - - -func _get_editors() -> Array[String]: - return [] - - -func _get_settings_pages() -> Array: - return [] - - -func _get_character_editor_sections() -> Array: - return [] - - -#region TEXT EFFECTS & MODIFIERS - -## Should return array of dictionaries with the following keys:[br] -## "command" -> the text e.g. "speed"[br] -## "node_path" or "subsystem" -> whichever contains your effect method[br] -## "method" -> name of the effect method[br] -func _get_text_effects() -> Array[Dictionary]: - return [] - - -## Should return array of dictionaries with the same arguments as _get_text_effects() -func _get_text_modifiers() -> Array[Dictionary]: - return [] - -#endregion - - -## Return a list of resources, scripts, etc. -## These can later be retrieved with DialogicResourceUtil. -## Each dictionary should contain (at least "type" and "path"). -## E.g. {"type":"Animation", "path": "res://..."} -func _get_special_resources() -> Dictionary: - return {} - - -## Return a list of dictionaries, each -func _get_portrait_scene_presets() -> Array[Dictionary]: - return [] - - -#region HELPERS -################################################################################ - -func list_dir(subdir:='') -> Array: - return Array(DirAccess.get_files_at(this_folder.path_join(subdir))).map(func(file):return this_folder.path_join(subdir).path_join(file)) - - -func list_special_resources(subdir:='', extension:="") -> Dictionary: - var dict := {} - for i in list_dir(subdir): - if extension.is_empty() or i.ends_with(extension) or (extension == ".gd" and i.ends_with(".gdc")): - dict[DialogicUtil.pretty_name(i).to_lower()] = {"path":i} - return dict - - -func list_animations(subdir := "") -> Dictionary: - var full_animation_list := {} - for path in list_dir(subdir): - if not path.ends_with(".gd") and not path.ends_with(".gdc"): - continue - var anim_object: DialogicAnimation = load(path).new() - var versions := anim_object._get_named_variations() - for version_name in versions: - full_animation_list[version_name] = versions[version_name] - full_animation_list[version_name]["path"] = path - anim_object.queue_free() - return full_animation_list - -#endregion - - -#region STYLES & LAYOUTS -################################################################################ - -func _get_style_presets() -> Array[Dictionary]: - return [] - - -## Should return an array of dictionaries with the following keys:[br] -## "path" -> the path to the scene[br] -## "name" -> name for this layout[br] -## "description"-> description of this layout. list what features/events are supported[br] -## "preview_image"-> array of preview images[br] -func _get_layout_parts() -> Array[Dictionary]: - return [] - - -## Helper that allows scanning sub directories that might be layout parts or styles -func scan_for_layout_parts() -> Array[Dictionary]: - var dir := DirAccess.open(this_folder) - var style_list: Array[Dictionary] = [] - if !dir: - return style_list - dir.list_dir_begin() - var dir_name := dir.get_next() - while dir_name != "": - if !dir.current_is_dir() or !dir.file_exists(dir_name.path_join('part_config.cfg')): - dir_name = dir.get_next() - continue - var config := ConfigFile.new() - config.load(this_folder.path_join(dir_name).path_join('part_config.cfg')) - var default_image_path: String = this_folder.path_join(dir_name).path_join('preview.png') - style_list.append( - { - 'type': config.get_value('style', 'type', 'Unknown type'), - 'name': config.get_value('style', 'name', 'Unnamed Layout'), - 'path': this_folder.path_join(dir_name).path_join(config.get_value('style', 'scene', '')), - 'author': config.get_value('style', 'author', 'Anonymous'), - 'description': config.get_value('style', 'description', 'No description'), - 'preview_image': [config.get_value('style', 'image', default_image_path)], - 'style_path':config.get_value('style', 'style_path', ''), - 'icon':this_folder.path_join(dir_name).path_join(config.get_value('style', 'icon', '')), - }) - - if not style_list[-1].style_path.begins_with('res://'): - style_list[-1].style_path = this_folder.path_join(dir_name).path_join(style_list[-1].style_path) - - dir_name = dir.get_next() - - return style_list - -#endregion diff --git a/godot/addons/dialogic/Core/index_class.gd.uid b/godot/addons/dialogic/Core/index_class.gd.uid deleted file mode 100644 index 92c8db9..0000000 --- a/godot/addons/dialogic/Core/index_class.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ciwsx3rjhhmg7 diff --git a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_exports.gd b/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_exports.gd deleted file mode 100644 index 9ad94cb..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_exports.gd +++ /dev/null @@ -1,91 +0,0 @@ -@tool -extends DialogicCharacterEditorPortraitSection - -## Section that allows setting values of exported scene variables -## for custom portrait scenes - -var current_portrait_data := {} -var last_scene := "" - -func _get_title() -> String: - return "Settings" - - -func _load_portrait_data(data:Dictionary) -> void: - _recheck(data, true) - - -## Recheck section visibility and reload export fields. -## This allows reacting to changes of the portrait_scene setting. -func _recheck(data: Dictionary, force:=false): - if last_scene == data.get("scene", "") and not force: - current_portrait_data = data - last_scene = data.get("scene", "") - return - - last_scene = data.get("scene", "") - current_portrait_data = data - - for child in $Grid.get_children(): - child.get_parent().remove_child(child) - child.queue_free() - - var scene: Variant = null - - if current_portrait_data.get('scene', '').is_empty(): - if ProjectSettings.get_setting('dialogic/portraits/default_portrait', '').is_empty(): - scene = load(character_editor.def_portrait_path) - else: - scene = load(ProjectSettings.get_setting('dialogic/portraits/default_portrait', '')) - else: - scene = load(current_portrait_data.get('scene')) - - if not scene: - return - - scene = scene.instantiate() - - var skip := false - for i in scene.script.get_script_property_list(): - if i['usage'] & PROPERTY_USAGE_EDITOR and !skip: - var label := Label.new() - label.text = i['name'].capitalize() - $Grid.add_child(label) - - var current_value: Variant = scene.get(i['name']) - if current_portrait_data.has('export_overrides') and current_portrait_data['export_overrides'].has(i['name']): - current_value = str_to_var(current_portrait_data.export_overrides[i['name']]) - if current_value == null and typeof(scene.get(i['name'])) == TYPE_STRING: - current_value = current_portrait_data['export_overrides'][i['name']] - - var input: Node = DialogicUtil.setup_script_property_edit_node(i, current_value, set_export_override) - input.size_flags_horizontal = SIZE_EXPAND_FILL - $Grid.add_child(input) - - if i['usage'] & PROPERTY_USAGE_GROUP: - if i['name'] == 'Main' or i["name"] == "Private": - skip = true - continue - else: - skip = false - - if $Grid.get_child_count(): - get_parent().get_child(get_index()-1).show() - show() - else: - hide() - get_parent().get_child(get_index()-1).hide() - get_parent().get_child(get_index()+1).hide() - - -## On any change, save the export override to the portrait items metadata. -func set_export_override(property_name:String, value:String = "") -> void: - var data: Dictionary = selected_item.get_metadata(0) - if !data.has('export_overrides'): - data['export_overrides'] = {} - if !value.is_empty(): - data.export_overrides[property_name] = value - else: - data.export_overrides.erase(property_name) - changed.emit() - update_preview.emit() diff --git a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_exports.gd.uid b/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_exports.gd.uid deleted file mode 100644 index 3ed27df..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_exports.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bcsda7vbawlgv diff --git a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_exports.tscn b/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_exports.tscn deleted file mode 100644 index 6b23ccd..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_exports.tscn +++ /dev/null @@ -1,16 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://cfcs7lb6gqnmd"] - -[ext_resource type="Script" uid="uid://bcsda7vbawlgv" path="res://addons/dialogic/Editor/CharacterEditor/char_edit_p_section_exports.gd" id="1_isys8"] - -[node name="Settings" type="VBoxContainer"] -custom_minimum_size = Vector2(0, 35) -offset_right = 367.0 -offset_bottom = 82.0 -script = ExtResource("1_isys8") - -[node name="Grid" type="GridContainer" parent="."] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_constants/h_separation = 10 -columns = 2 diff --git a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_layout.gd b/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_layout.gd deleted file mode 100644 index 2c92085..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_layout.gd +++ /dev/null @@ -1,44 +0,0 @@ -@tool -extends DialogicCharacterEditorPortraitSection - -## Tab that allows setting size, offset and mirror of a portrait. - - -func _get_title() -> String: - return "Scale, Offset & Mirror" - - -func _load_portrait_data(data:Dictionary) -> void: - %IgnoreScale.set_pressed_no_signal(data.get('ignore_char_scale', false)) - %PortraitScale.set_value(data.get('scale', 1.0)*100) - %PortraitOffset.set_value(data.get('offset', Vector2())) - %PortraitOffset._load_display_info({'step':1}) - %PortraitMirror.set_pressed_no_signal(data.get('mirror', false)) - - -func _on_portrait_scale_value_changed(_property:String, value:float) -> void: - var data: Dictionary = selected_item.get_metadata(0) - data['scale'] = value/100.0 - update_preview.emit() - changed.emit() - - -func _on_portrait_mirror_toggled(button_pressed:bool)-> void: - var data: Dictionary = selected_item.get_metadata(0) - data['mirror'] = button_pressed - update_preview.emit() - changed.emit() - - -func _on_ignore_scale_toggled(button_pressed:bool) -> void: - var data: Dictionary = selected_item.get_metadata(0) - data['ignore_char_scale'] = button_pressed - update_preview.emit() - changed.emit() - - -func _on_portrait_offset_value_changed(_property:String, value:Vector2) -> void: - var data: Dictionary = selected_item.get_metadata(0) - data['offset'] = value - update_preview.emit() - changed.emit() diff --git a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_layout.gd.uid b/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_layout.gd.uid deleted file mode 100644 index 4f28f27..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_layout.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://uv6dx3sofwae diff --git a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_layout.tscn b/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_layout.tscn deleted file mode 100644 index 89121d9..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_layout.tscn +++ /dev/null @@ -1,65 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://crke8suvv52c6"] - -[ext_resource type="Script" uid="uid://uv6dx3sofwae" path="res://addons/dialogic/Editor/CharacterEditor/char_edit_p_section_layout.gd" id="1_76vf2"] -[ext_resource type="PackedScene" uid="uid://dtimnsj014cu" path="res://addons/dialogic/Editor/Events/Fields/field_vector2.tscn" id="2_c8kyi"] -[ext_resource type="PackedScene" uid="uid://kdpp3mibml33" path="res://addons/dialogic/Editor/Events/Fields/field_number.tscn" id="2_daw3l"] - -[node name="Layout" type="HFlowContainer"] -offset_right = 428.0 -offset_bottom = 128.0 -size_flags_horizontal = 3 -script = ExtResource("1_76vf2") - -[node name="Label3" type="Label" parent="."] -layout_mode = 2 -text = "Ignore Main Scale: " - -[node name="IgnoreScale" type="CheckBox" parent="."] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "This portrait will ignore the main scale." - -[node name="HBoxContainer" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="Label" type="Label" parent="HBoxContainer"] -layout_mode = 2 -text = "Scale:" - -[node name="PortraitScale" parent="HBoxContainer" instance=ExtResource("2_daw3l")] -unique_name_in_owner = true -layout_mode = 2 -mode = 1 -step = 1.0 -min_value = 0.0 -max_value = 100.0 -suffix = "%" - -[node name="HBoxContainer2" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="Label2" type="Label" parent="HBoxContainer2"] -layout_mode = 2 -text = "Offset:" - -[node name="PortraitOffset" parent="HBoxContainer2" instance=ExtResource("2_c8kyi")] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Offset that is applied on top of the main portrait offset." - -[node name="MirrorOption" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="Label" type="Label" parent="MirrorOption"] -layout_mode = 2 -text = "Mirror:" - -[node name="PortraitMirror" type="CheckBox" parent="MirrorOption"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Mirroring that is applied on top of the main portrait mirror." - -[connection signal="toggled" from="IgnoreScale" to="." method="_on_ignore_scale_toggled"] -[connection signal="value_changed" from="HBoxContainer/PortraitScale" to="." method="_on_portrait_scale_value_changed"] -[connection signal="value_changed" from="HBoxContainer2/PortraitOffset" to="." method="_on_portrait_offset_value_changed"] -[connection signal="toggled" from="MirrorOption/PortraitMirror" to="." method="_on_portrait_mirror_toggled"] diff --git a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main.gd b/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main.gd deleted file mode 100644 index a4be43e..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main.gd +++ /dev/null @@ -1,101 +0,0 @@ -@tool -extends DialogicCharacterEditorPortraitSection - -## Tab that allows setting a custom scene for a portrait. - -func _get_title() -> String: - return "Scene" - -func _init() -> void: - hint_text = "You can use a custom scene for this portrait." - -func _start_opened() -> bool: - return true - -func _ready() -> void: - %ChangeSceneButton.icon = get_theme_icon("Loop", "EditorIcons") - %ScenePicker.file_filter = "*.tscn, *.scn; Scenes" - %ScenePicker.resource_icon = get_theme_icon('PackedScene', 'EditorIcons') - %ScenePicker.placeholder = 'Default scene' - - %OpenSceneButton.icon = get_theme_icon("ExternalLink", "EditorIcons") - - -func _load_portrait_data(data:Dictionary) -> void: - reload_ui(data) - - -func _on_open_scene_button_pressed() -> void: - var data: Dictionary = selected_item.get_metadata(0) - if ResourceLoader.exists(data.get("scene", "")): - DialogicUtil.get_dialogic_plugin().get_editor_interface().open_scene_from_path(data.get("scene", "")) - await get_tree().process_frame - EditorInterface.set_main_screen_editor("2D") - - -func _on_change_scene_button_pressed() -> void: - %PortraitSceneBrowserWindow.popup_centered_ratio(0.6) - - -func _on_portrait_scene_browser_activate_part(part_info: Dictionary) -> void: - %PortraitSceneBrowserWindow.hide() - match part_info.type: - "General": - set_scene_path(part_info.path) - "Preset": - find_parent("EditorView").godot_file_dialog( - create_new_portrait_scene.bind(part_info), - '*.tscn,*.scn', - EditorFileDialog.FILE_MODE_SAVE_FILE, - "Select where to save the new scene", - part_info.path.get_file().trim_suffix("."+part_info.path.get_extension())+"_"+character_editor.current_resource.get_character_name().to_lower()) - "Custom": - find_parent("EditorView").godot_file_dialog( - set_scene_path, - '*.tscn, *.scn', - EditorFileDialog.FILE_MODE_OPEN_FILE, - "Select custom portrait scene",) - "Default": - set_scene_path("") - - -func create_new_portrait_scene(target_file: String, info: Dictionary) -> void: - var path := make_portrait_preset_custom(target_file, info) - set_scene_path(path) - - -func make_portrait_preset_custom(target_file:String, info: Dictionary) -> String: - var previous_file: String = info.path - - var result_path := DialogicUtil.make_file_custom(previous_file, target_file.get_base_dir(), target_file.get_file()) - - return result_path - - -func set_scene_path(path:String) -> void: - var data: Dictionary = selected_item.get_metadata(0) - data['scene'] = path - update_preview.emit() - changed.emit() - reload_ui(data) - - -func reload_ui(data: Dictionary) -> void: - var path: String = data.get('scene', '') - %OpenSceneButton.hide() - - if path.is_empty(): - %SceneLabel.text = "Default Portrait Scene" - %SceneLabel.tooltip_text = "Can be changed in the settings." - %SceneLabel.add_theme_color_override("font_color", get_theme_color("readonly_color", "Editor")) - - elif %PortraitSceneBrowser.is_premade_portrait_scene(path): - %SceneLabel.text = %PortraitSceneBrowser.portrait_scenes_info[path].name - %SceneLabel.tooltip_text = path - %SceneLabel.add_theme_color_override("font_color", get_theme_color("accent_color", "Editor")) - - else: - %SceneLabel.text = path.get_file() - %SceneLabel.tooltip_text = path - %SceneLabel.add_theme_color_override("font_color", get_theme_color("property_color_x", "Editor")) - %OpenSceneButton.show() diff --git a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main.gd.uid b/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main.gd.uid deleted file mode 100644 index ca57828..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://busjn8oo7kl1s diff --git a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main.tscn b/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main.tscn deleted file mode 100644 index 431f940..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main.tscn +++ /dev/null @@ -1,72 +0,0 @@ -[gd_scene load_steps=6 format=3 uid="uid://djq4aasoihexj"] - -[ext_resource type="Script" uid="uid://busjn8oo7kl1s" path="res://addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main.gd" id="1_ht8lu"] -[ext_resource type="PackedScene" uid="uid://7mvxuaulctcq" path="res://addons/dialogic/Editor/Events/Fields/field_file.tscn" id="2_k8xs0"] -[ext_resource type="PackedScene" uid="uid://b1wn8r84uh11b" path="res://addons/dialogic/Editor/CharacterEditor/portrait_scene_browser.tscn" id="3_ngvgq"] - -[sub_resource type="Image" id="Image_m6kd3"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_f5xt2"] -image = SubResource("Image_m6kd3") - -[node name="Scene" type="GridContainer"] -offset_right = 298.0 -offset_bottom = 86.0 -size_flags_horizontal = 3 -script = ExtResource("1_ht8lu") - -[node name="HBox" type="HBoxContainer" parent="."] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="ChangeSceneButton" type="Button" parent="HBox"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Change Scene" -icon = SubResource("ImageTexture_f5xt2") - -[node name="SceneLabel" type="Label" parent="HBox"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -mouse_filter = 0 -theme_override_colors/font_color = Color(0, 0, 0, 1) -text = "asdsdasdasd" -clip_text = true - -[node name="ScenePicker" parent="HBox" instance=ExtResource("2_k8xs0")] -unique_name_in_owner = true -visible = false -layout_mode = 2 -size_flags_horizontal = 3 -file_filter = "*.tscn, *.scn; Scenes" -placeholder = "Default scene" - -[node name="OpenSceneButton" type="Button" parent="HBox"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Open/Edit Scene" -icon = SubResource("ImageTexture_f5xt2") - -[node name="PortraitSceneBrowserWindow" type="Window" parent="."] -unique_name_in_owner = true -title = "Portrait Scene Browser" -position = Vector2i(0, 36) -visible = false -wrap_controls = true -transient = true -popup_window = true - -[node name="PortraitSceneBrowser" parent="PortraitSceneBrowserWindow" instance=ExtResource("3_ngvgq")] -unique_name_in_owner = true - -[connection signal="pressed" from="HBox/ChangeSceneButton" to="." method="_on_change_scene_button_pressed"] -[connection signal="pressed" from="HBox/OpenSceneButton" to="." method="_on_open_scene_button_pressed"] -[connection signal="activate_part" from="PortraitSceneBrowserWindow/PortraitSceneBrowser" to="." method="_on_portrait_scene_browser_activate_part"] diff --git a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main_exports.gd b/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main_exports.gd deleted file mode 100644 index d9ff6e5..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main_exports.gd +++ /dev/null @@ -1,80 +0,0 @@ -@tool -extends DialogicCharacterEditorPortraitSection - -## Portrait Settings Section that only shows the MAIN settings of a portrait scene. - -var current_portrait_data := {} -var last_scene := "" - -func _show_title() -> bool: - return false - - -func _load_portrait_data(data:Dictionary) -> void: - _recheck(data, true) - - -func _recheck(data:Dictionary, force := false) -> void: - get_parent().get_child(get_index()+1).hide() - if last_scene == data.get("scene", "") and not force: - current_portrait_data = data - last_scene = data.get("scene", "") - return - - last_scene = data.get("scene", "") - current_portrait_data = data - - load_portrait_scene_export_variables() - - -func load_portrait_scene_export_variables() -> void: - for child in $Grid.get_children(): - child.queue_free() - - var scene: Variant = null - if current_portrait_data.get('scene', '').is_empty(): - if ProjectSettings.get_setting('dialogic/portraits/default_portrait', '').is_empty(): - scene = load(character_editor.def_portrait_path) - else: - scene = load(ProjectSettings.get_setting('dialogic/portraits/default_portrait', '')) - else: - scene = load(current_portrait_data.get('scene')) - - if not scene: - return - - scene = scene.instantiate() - var skip := true - for i in scene.script.get_script_property_list(): - if i['usage'] & PROPERTY_USAGE_EDITOR and !skip: - var label := Label.new() - label.text = i['name'].capitalize() - $Grid.add_child(label) - - var current_value: Variant = scene.get(i['name']) - if current_portrait_data.has('export_overrides') and current_portrait_data['export_overrides'].has(i['name']): - current_value = str_to_var(current_portrait_data['export_overrides'][i['name']]) - if current_value == null and typeof(scene.get(i['name'])) == TYPE_STRING: - current_value = current_portrait_data['export_overrides'][i['name']] - - var input: Node = DialogicUtil.setup_script_property_edit_node(i, current_value, set_export_override) - input.size_flags_horizontal = SIZE_EXPAND_FILL - $Grid.add_child(input) - - if i['usage'] & PROPERTY_USAGE_GROUP: - if i['name'] == 'Main': - skip = false - else: - skip = true - continue - -func set_export_override(property_name:String, value:String = "") -> void: - var data: Dictionary = selected_item.get_metadata(0) - if !data.has('export_overrides'): - data['export_overrides'] = {} - if !value.is_empty(): - data['export_overrides'][property_name] = value - else: - data['export_overrides'].erase(property_name) - changed.emit() - update_preview.emit() diff --git a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main_exports.gd.uid b/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main_exports.gd.uid deleted file mode 100644 index d21f2ad..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main_exports.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cp0o6sycac85b diff --git a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main_exports.tscn b/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main_exports.tscn deleted file mode 100644 index 98c290f..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main_exports.tscn +++ /dev/null @@ -1,15 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://ba5w02lm3ewkj"] - -[ext_resource type="Script" uid="uid://cp0o6sycac85b" path="res://addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main_exports.gd" id="1_mttrr"] - -[node name="MainExports" type="VBoxContainer"] -offset_right = 374.0 -offset_bottom = 82.0 -script = ExtResource("1_mttrr") - -[node name="Grid" type="GridContainer" parent="."] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_constants/h_separation = 10 -columns = 2 diff --git a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_general.gd b/godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_general.gd deleted file mode 100644 index a5fe514..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_general.gd +++ /dev/null @@ -1,53 +0,0 @@ -@tool -extends DialogicCharacterEditorMainSection - -var min_width := 200 - -## The general character settings tab -func _get_title() -> String: - return "General" - - -func _start_opened() -> bool: - return true - - -func _ready() -> void: - # Connecting all necessary signals - %ColorPickerButton.custom_minimum_size.x = DialogicUtil.get_editor_scale() * 30 - %ColorPickerButton.color_changed.connect(character_editor.something_changed) - %DisplayNameLineEdit.text_changed.connect(character_editor.something_changed) - %NicknameLineEdit.text_changed.connect(character_editor.something_changed) - %DescriptionTextEdit.text_changed.connect(character_editor.something_changed) - min_width = get_minimum_size().x - resized.connect(_on_resized) - -func _load_character(resource:DialogicCharacter) -> void: - %DisplayNameLineEdit.text = resource.display_name - %ColorPickerButton.color = resource.color - - %NicknameLineEdit.text = "" - for nickname in resource.nicknames: - %NicknameLineEdit.text += nickname +", " - %NicknameLineEdit.text = %NicknameLineEdit.text.trim_suffix(', ') - - %DescriptionTextEdit.text = resource.description - - -func _save_changes(resource:DialogicCharacter) -> DialogicCharacter: - resource.display_name = %DisplayNameLineEdit.text - resource.color = %ColorPickerButton.color - var nicknames := [] - for n_name in %NicknameLineEdit.text.split(','): - nicknames.append(n_name.strip_edges()) - resource.nicknames = nicknames - resource.description = %DescriptionTextEdit.text - - return resource - - -func _on_resized() -> void: - if size.x > min_width+20: - self.columns = 2 - else: - self.columns = 1 diff --git a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_general.gd.uid b/godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_general.gd.uid deleted file mode 100644 index 3d1db09..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_general.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c0nilv2pybryh diff --git a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_general.tscn b/godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_general.tscn deleted file mode 100644 index 2ce41fe..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_general.tscn +++ /dev/null @@ -1,114 +0,0 @@ -[gd_scene load_steps=5 format=3 uid="uid://bnkck3hocbkk5"] - -[ext_resource type="Script" uid="uid://c0nilv2pybryh" path="res://addons/dialogic/Editor/CharacterEditor/char_edit_section_general.gd" id="1_3e1i1"] -[ext_resource type="PackedScene" uid="uid://dbpkta2tjsqim" path="res://addons/dialogic/Editor/Common/hint_tooltip_icon.tscn" id="2_cxfqm"] - -[sub_resource type="Image" id="Image_ywoka"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_hx3oq"] -image = SubResource("Image_ywoka") - -[node name="General" type="GridContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = 7.5 -offset_top = 38.5 -offset_right = -7.5 -offset_bottom = -7.5 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_constants/h_separation = 6 -theme_override_constants/v_separation = 6 -columns = 2 -script = ExtResource("1_3e1i1") - -[node name="HBox" type="HBoxContainer" parent="."] -layout_mode = 2 -size_flags_vertical = 0 - -[node name="Label2" type="Label" parent="HBox"] -layout_mode = 2 -size_flags_vertical = 0 -text = "Display Name" - -[node name="HintTooltip" parent="HBox" instance=ExtResource("2_cxfqm")] -layout_mode = 2 -tooltip_text = "This name will be displayed on the name label. You can use a dialogic variable. E.g. :{Player.name}" -texture = SubResource("ImageTexture_hx3oq") -hint_text = "This name will be displayed on the name label. You can use a dialogic variable. E.g. :{Player.name}" - -[node name="DisplayName" type="HBoxContainer" parent="."] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="DisplayNameLineEdit" type="LineEdit" parent="DisplayName"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -caret_blink = true -caret_blink_interval = 0.5 - -[node name="HintTooltip4" parent="DisplayName" instance=ExtResource("2_cxfqm")] -layout_mode = 2 -tooltip_text = "This color can be used on the name label and for occurences of the characters name in text (autocolor names)." -texture = SubResource("ImageTexture_hx3oq") -hint_text = "This color can be used on the name label and for occurences of the characters name in text (autocolor names)." - -[node name="ColorPickerButton" type="ColorPickerButton" parent="DisplayName"] -unique_name_in_owner = true -custom_minimum_size = Vector2(30, 0) -layout_mode = 2 -color = Color(1, 1, 1, 1) -edit_alpha = false - -[node name="HBox2" type="HBoxContainer" parent="."] -layout_mode = 2 -size_flags_vertical = 0 - -[node name="Label3" type="Label" parent="HBox2"] -layout_mode = 2 -size_flags_vertical = 0 -text = "Nicknames" - -[node name="HintTooltip2" parent="HBox2" instance=ExtResource("2_cxfqm")] -layout_mode = 2 -tooltip_text = "If autocolor names is enabled, these will be colored in the characters color as well." -texture = SubResource("ImageTexture_hx3oq") -hint_text = "If autocolor names is enabled, these will be colored in the characters color as well." - -[node name="NicknameLineEdit" type="LineEdit" parent="."] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -caret_blink = true -caret_blink_interval = 0.5 - -[node name="HBox3" type="HBoxContainer" parent="."] -layout_mode = 2 -size_flags_vertical = 0 - -[node name="Label4" type="Label" parent="HBox3"] -layout_mode = 2 -size_flags_vertical = 0 -text = "Description" - -[node name="HintTooltip3" parent="HBox3" instance=ExtResource("2_cxfqm")] -layout_mode = 2 -tooltip_text = "No effect, just for you." -texture = SubResource("ImageTexture_hx3oq") -hint_text = "No effect, just for you." - -[node name="DescriptionTextEdit" type="TextEdit" parent="."] -unique_name_in_owner = true -custom_minimum_size = Vector2(0, 65) -layout_mode = 2 -size_flags_horizontal = 3 -wrap_mode = 1 diff --git a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_portraits.gd b/godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_portraits.gd deleted file mode 100644 index 127aa08..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_portraits.gd +++ /dev/null @@ -1,76 +0,0 @@ -@tool -extends DialogicCharacterEditorMainSection - -## The general portrait settings section - -var loading := false - -func _get_title() -> String: - return "Portraits" - - -func _ready() -> void: - # Connecting all necessary signals - %DefaultPortraitPicker.value_changed.connect(default_portrait_changed) - %MainScale.value_changed.connect(main_portrait_settings_update) - %MainOffset._load_display_info({'step':1}) - %MainOffset.value_changed.connect(main_portrait_settings_update) - %MainMirror.toggled.connect(main_portrait_settings_update) - - # Setting up Default Portrait Picker - %DefaultPortraitPicker.resource_icon = load("res://addons/dialogic/Editor/Images/Resources/portrait.svg") - %DefaultPortraitPicker.suggestions_func = suggest_portraits - - -## Make sure preview get's updated when portrait settings change -func main_portrait_settings_update(_something=null, _value=null) -> void: - if loading: - return - character_editor.current_resource.scale = %MainScale.value/100.0 - character_editor.current_resource.offset = %MainOffset.current_value - character_editor.current_resource.mirror = %MainMirror.button_pressed - character_editor.update_preview() - character_editor.something_changed() - - -func default_portrait_changed(_property:String, value:String) -> void: - character_editor.current_resource.default_portrait = value - character_editor.update_default_portrait_star(value) - - -func set_default_portrait(portrait_name:String) -> void: - %DefaultPortraitPicker.set_value(portrait_name) - default_portrait_changed("", portrait_name) - - -func _load_character(resource:DialogicCharacter) -> void: - loading = true - %DefaultPortraitPicker.set_value(resource.default_portrait) - - %MainScale.set_value(100*resource.scale) - %MainOffset.set_value(resource.offset) - %MainMirror.button_pressed = resource.mirror - loading = false - - -func _save_changes(resource:DialogicCharacter) -> DialogicCharacter: - # Portrait settings - if %DefaultPortraitPicker.current_value in resource.portraits.keys(): - resource.default_portrait = %DefaultPortraitPicker.current_value - elif !resource.portraits.is_empty(): - resource.default_portrait = resource.portraits.keys()[0] - else: - resource.default_portrait = "" - - resource.scale = %MainScale.value/100.0 - resource.offset = %MainOffset.current_value - resource.mirror = %MainMirror.button_pressed - return resource - - -## Get suggestions for DefaultPortraitPicker -func suggest_portraits(_search:String) -> Dictionary: - var suggestions := {} - for portrait in character_editor.get_updated_portrait_dict().keys(): - suggestions[portrait] = {'value':portrait} - return suggestions diff --git a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_portraits.gd.uid b/godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_portraits.gd.uid deleted file mode 100644 index b5a784f..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_portraits.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://yulfiomudcob diff --git a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_portraits.tscn b/godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_portraits.tscn deleted file mode 100644 index 99bb34c..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/char_edit_section_portraits.tscn +++ /dev/null @@ -1,71 +0,0 @@ -[gd_scene load_steps=5 format=3 uid="uid://cmrgbo8qi145o"] - -[ext_resource type="Script" uid="uid://yulfiomudcob" path="res://addons/dialogic/Editor/CharacterEditor/char_edit_section_portraits.gd" id="1_6sxsl"] -[ext_resource type="PackedScene" uid="uid://dpwhshre1n4t6" path="res://addons/dialogic/Editor/Events/Fields/field_options_dynamic.tscn" id="2_birla"] -[ext_resource type="PackedScene" uid="uid://dtimnsj014cu" path="res://addons/dialogic/Editor/Events/Fields/field_vector2.tscn" id="3_vcvin"] -[ext_resource type="PackedScene" uid="uid://kdpp3mibml33" path="res://addons/dialogic/Editor/Events/Fields/field_number.tscn" id="4_w4pvv"] - -[node name="Portraits" type="GridContainer"] -offset_right = 453.0 -offset_bottom = 141.0 -theme_override_constants/h_separation = 1 -theme_override_constants/v_separation = 6 -columns = 2 -script = ExtResource("1_6sxsl") - -[node name="Label5" type="Label" parent="."] -layout_mode = 2 -size_flags_vertical = 0 -text = "Default" - -[node name="DefaultPortraitPicker" parent="." instance=ExtResource("2_birla")] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -placeholder_text = "Select Default Portrait" -fit_text_length = false - -[node name="Label" type="Label" parent="."] -layout_mode = 2 -size_flags_vertical = 0 -text = "Main Scale" - -[node name="MainScaleOld" type="SpinBox" parent="."] -unique_name_in_owner = true -visible = false -layout_mode = 2 -size_flags_horizontal = 8 -value = 100.0 -allow_greater = true -alignment = 1 -suffix = "%" - -[node name="MainScale" parent="." instance=ExtResource("4_w4pvv")] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 8 -mode = 1 -step = 1.0 -min_value = 0.0 -max_value = 100.0 -suffix = "%" - -[node name="Label2" type="Label" parent="."] -layout_mode = 2 -size_flags_vertical = 0 -text = "Main Offset" - -[node name="MainOffset" parent="." instance=ExtResource("3_vcvin")] -unique_name_in_owner = true -layout_mode = 2 -alignment = 2 - -[node name="Label3" type="Label" parent="."] -layout_mode = 2 -size_flags_vertical = 0 -text = "Main Mirror" - -[node name="MainMirror" type="CheckBox" parent="."] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 8 diff --git a/godot/addons/dialogic/Editor/CharacterEditor/character_editor.gd b/godot/addons/dialogic/Editor/CharacterEditor/character_editor.gd deleted file mode 100644 index 3233674..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/character_editor.gd +++ /dev/null @@ -1,694 +0,0 @@ -@tool -extends DialogicEditor - -## Editor for editing character resources. - -signal character_loaded(resource_path:String) -signal portrait_selected() - - -# Current state -var loading := false -var current_previewed_scene: Variant = null -var current_scene_path: String = "" - -# References -var selected_item: TreeItem -var def_portrait_path: String = DialogicUtil.get_module_path('Character').path_join('default_portrait.tscn') - - -######### EDITOR STUFF and LOADING/SAVING ###################################### - -#region Resource Logic -## Method is called once editors manager is ready to accept registers. -func _register() -> void: - ## Makes the editor open this when a .dch file is selected. - ## Then _open_resource() is called. - editors_manager.register_resource_editor("dch", self) - - ## Add an "add character" button - var add_character_button: Button = editors_manager.add_icon_button( - load("res://addons/dialogic/Editor/Images/Toolbar/add-character.svg"), - 'Add Character', - self) - add_character_button.pressed.connect(_on_create_character_button_pressed) - add_character_button.shortcut = Shortcut.new() - add_character_button.shortcut.events.append(InputEventKey.new()) - add_character_button.shortcut.events[0].keycode = KEY_2 - add_character_button.shortcut.events[0].ctrl_pressed = true - - ## By default show the no character screen - $NoCharacterScreen.show() - - -func _get_title() -> String: - return "Character" - - -func _get_icon() -> Texture: - return load("res://addons/dialogic/Editor/Images/Resources/character.svg") - - -## Called when a character is opened somehow -func _open_resource(resource:Resource) -> void: - if resource == null: - $NoCharacterScreen.show() - return - - ## Update resource - current_resource = (resource as DialogicCharacter) - - ## Make sure changes in the ui won't trigger saving - loading = true - - ## Load other main tabs - for child in %MainSettingsSections.get_children(): - if child is DialogicCharacterEditorMainSection: - child._load_character(current_resource) - - ## Clear and then load Portrait section - %PortraitSearch.text = "" - load_portrait_tree() - - loading = false - character_loaded.emit(current_resource.resource_path) - - %CharacterName.text = current_resource.get_identifier() - - $NoCharacterScreen.hide() - %PortraitChangeInfo.hide() - - -## Called when the character is opened. -func _open(extra_info:Variant="") -> void: - if !ProjectSettings.get_setting('dialogic/portraits/default_portrait', '').is_empty(): - def_portrait_path = ProjectSettings.get_setting('dialogic/portraits/default_portrait', '') - else: - def_portrait_path = DialogicUtil.get_module_path('Character').path_join('default_portrait.tscn') - - if current_resource == null: - $NoCharacterScreen.show() - return - - update_preview(true) - %PortraitChangeInfo.hide() - - -func _clear() -> void: - current_resource = null - current_resource_state = ResourceStates.SAVED - $NoCharacterScreen.show() - - -func _save() -> void: - if ! visible or not current_resource: - return - - ## Portrait list - current_resource.portraits = get_updated_portrait_dict() - - ## Main tabs - for child in %MainSettingsSections.get_children(): - if child is DialogicCharacterEditorMainSection: - current_resource = child._save_changes(current_resource) - - ResourceSaver.save(current_resource, current_resource.resource_path) - current_resource_state = ResourceStates.SAVED - DialogicResourceUtil.update_directory('dch') - - -## Saves a new empty character to the given path -func new_character(path: String) -> void: - if not path.ends_with(".dch"): - path = path.trim_suffix(".") - path += ".dch" - var resource := DialogicCharacter.new() - resource.resource_path = path - resource.display_name = path.get_file().trim_suffix("."+path.get_extension()) - resource.color = Color(1,1,1,1) - resource.default_portrait = "" - resource.custom_info = {} - ResourceSaver.save(resource, path) - EditorInterface.get_resource_filesystem().update_file(path) - DialogicResourceUtil.update_directory('dch') - editors_manager.edit_resource(resource) - -#endregion - - -######### INTERFACE ############################################################ - -#region Interface -func _ready() -> void: - if get_parent() is SubViewport: - return - - DialogicUtil.get_dialogic_plugin().resource_saved.connect(_on_some_resource_saved) - # NOTE: This check is required because up to 4.2 this signal is not exposed. - if DialogicUtil.get_dialogic_plugin().has_signal("scene_saved"): - DialogicUtil.get_dialogic_plugin().scene_saved.connect(_on_some_resource_saved) - - $NoCharacterScreen.color = get_theme_color("dark_color_2", "Editor") - $NoCharacterScreen.show() - setup_portrait_list_tab() - - _on_fit_preview_toggle_toggled(DialogicUtil.get_editor_setting('character_preview_fit', true)) - %PreviewLabel.add_theme_color_override("font_color", get_theme_color("readonly_color", "Editor")) - - %PortraitChangeWarning.add_theme_color_override("font_color", get_theme_color("warning_color", "Editor")) - - %RealPreviewPivot.texture = get_theme_icon("EditorPivot", "EditorIcons") - - %MainSettingsCollapse.icon = get_theme_icon("GuiVisibilityVisible", "EditorIcons") - - set_portrait_settings_position(DialogicUtil.get_editor_setting('portrait_settings_position', true)) - - await find_parent('EditorView').ready - - ## Add general tabs - add_settings_section(load("res://addons/dialogic/Editor/CharacterEditor/char_edit_section_general.tscn").instantiate(), %MainSettingsSections) - add_settings_section(load("res://addons/dialogic/Editor/CharacterEditor/char_edit_section_portraits.tscn").instantiate(), %MainSettingsSections) - add_settings_section(load("res://addons/dialogic/Editor/CharacterEditor/character_prefix_suffix.tscn").instantiate(), %MainSettingsSections) - - - add_settings_section(load("res://addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main_exports.tscn").instantiate(), %PortraitSettingsSection) - add_settings_section(load("res://addons/dialogic/Editor/CharacterEditor/char_edit_p_section_exports.tscn").instantiate(), %PortraitSettingsSection) - add_settings_section(load("res://addons/dialogic/Editor/CharacterEditor/char_edit_p_section_main.tscn").instantiate(), %PortraitSettingsSection) - add_settings_section(load("res://addons/dialogic/Editor/CharacterEditor/char_edit_p_section_layout.tscn").instantiate(), %PortraitSettingsSection) - - ## Load custom sections from modules - for indexer in DialogicUtil.get_indexers(): - for path in indexer._get_character_editor_sections(): - var scene: Control = load(path).instantiate() - if scene is DialogicCharacterEditorMainSection: - add_settings_section(scene, %MainSettingsSections) - elif scene is DialogicCharacterEditorPortraitSection: - add_settings_section(scene, %PortraitSettingsSection) - - -## Add a section (a control) either to the given settings section (Main or Portraits) -## - sets up the title of the section -## - connects to various signals -func add_settings_section(edit:Control, parent:Node) -> void: - edit.changed.connect(something_changed) - edit.character_editor = self - - if edit.has_signal('update_preview'): - edit.update_preview.connect(update_preview) - - var button: Button - - if edit._show_title(): - var hbox := HBoxContainer.new() - hbox.name = edit._get_title()+"BOX" - button = Button.new() - button.flat = true - button.theme_type_variation = "DialogicSection" - button.alignment = HORIZONTAL_ALIGNMENT_LEFT - button.size_flags_horizontal = Control.SIZE_SHRINK_BEGIN - button.text = edit._get_title() - button.icon_alignment = HORIZONTAL_ALIGNMENT_RIGHT - button.pressed.connect(_on_section_button_pressed.bind(button)) - button.focus_mode = Control.FOCUS_NONE - button.icon = get_theme_icon("CodeFoldDownArrow", "EditorIcons") - button.add_theme_color_override('icon_normal_color', get_theme_color("font_color", "DialogicSection")) - - hbox.size_flags_horizontal = Control.SIZE_EXPAND_FILL - hbox.add_child(button) - - if !edit.hint_text.is_empty(): - var hint: Node = load("res://addons/dialogic/Editor/Common/hint_tooltip_icon.tscn").instantiate() - hint.hint_text = edit.hint_text - hbox.add_child(hint) - - parent.add_child(hbox) - parent.add_child(edit) - parent.add_child(HSeparator.new()) - if button and !edit._start_opened(): - _on_section_button_pressed(button) - - -func get_settings_section_by_name(name:String, main:=true) -> Node: - var parent := %MainSettingsSections - if not main: - parent = %PortraitSettingsSection - - if parent.has_node(name): - return parent.get_node(name) - elif parent.has_node(name+"BOX/"+name): - return parent.get_node(name+"BOX/"+name) - else: - return null - - -func _on_section_button_pressed(button:Button) -> void: - var section_header := button.get_parent() - var section := section_header.get_parent().get_child(section_header.get_index()+1) - if section.visible: - button.icon = get_theme_icon("CodeFoldedRightArrow", "EditorIcons") - section.visible = false - else: - button.icon = get_theme_icon("CodeFoldDownArrow", "EditorIcons") - section.visible = true - - if section_header.get_parent().get_child_count() > section_header.get_index()+2 and section_header.get_parent().get_child(section_header.get_index()+2) is Separator: - section_header.get_parent().get_child(section_header.get_index()+2).visible = section_header.get_parent().get_child(section_header.get_index()+1).visible - - -func something_changed(fake_argument = "", fake_arg2 = null) -> void: - if not loading: - current_resource_state = ResourceStates.UNSAVED - - -func _on_main_settings_collapse_toggled(button_pressed:bool) -> void: - %MainSettingsTitle.visible = !button_pressed - %MainSettingsScroll.visible = !button_pressed - if button_pressed: - %MainSettings.hide() - %MainSettingsCollapse.icon = get_theme_icon("GuiVisibilityHidden", "EditorIcons") - else: - %MainSettings.show() - %MainSettingsCollapse.icon = get_theme_icon("GuiVisibilityVisible", "EditorIcons") - - -func _on_switch_portrait_settings_position_pressed() -> void: - set_portrait_settings_position(!%RightSection.vertical) - - -func set_portrait_settings_position(is_below:bool) -> void: - %RightSection.vertical = is_below - DialogicUtil.set_editor_setting('portrait_settings_position', is_below) - if is_below: - %SwitchPortraitSettingsPosition.icon = get_theme_icon("ControlAlignRightWide", "EditorIcons") - else: - %SwitchPortraitSettingsPosition.icon = get_theme_icon("ControlAlignBottomWide", "EditorIcons") - -#endregion - - -########## PORTRAIT SECTION #################################################### - -#region Portrait Section -func setup_portrait_list_tab() -> void: - %PortraitTree.editor = self - - ## Portrait section styling/connections - %AddPortraitButton.icon = get_theme_icon("Add", "EditorIcons") - %AddPortraitButton.pressed.connect(add_portrait) - %AddPortraitGroupButton.icon = load("res://addons/dialogic/Editor/Images/Pieces/add-folder.svg") - %AddPortraitGroupButton.pressed.connect(add_portrait_group) - %ImportPortraitsButton.icon = get_theme_icon("Load", "EditorIcons") - %ImportPortraitsButton.pressed.connect(open_portrait_folder_select) - %PortraitSearch.right_icon = get_theme_icon("Search", "EditorIcons") - %PortraitSearch.text_changed.connect(filter_portrait_list) - - %PortraitTree.item_selected.connect(load_selected_portrait) - %PortraitTree.item_edited.connect(_on_item_edited) - %PortraitTree.item_activated.connect(_on_item_activated) - - -func open_portrait_folder_select() -> void: - find_parent("EditorView").godot_file_dialog( - import_portraits_from_folder, "*.svg, *.png", - EditorFileDialog.FILE_MODE_OPEN_DIR) - - -func import_portraits_from_folder(path:String) -> void: - var parent: TreeItem = %PortraitTree.get_root() - - if %PortraitTree.get_selected() and %PortraitTree.get_selected() != parent and %PortraitTree.get_selected().get_metadata(0).has('group'): - parent = %PortraitTree.get_selected() - - var dir := DirAccess.open(path) - dir.list_dir_begin() - var file_name: String = dir.get_next() - var files := [] - while file_name != "": - if not dir.current_is_dir(): - var file_lower := file_name.to_lower() - if '.svg' in file_lower or '.png' in file_lower: - if not '.import' in file_lower: - files.append(file_name) - file_name = dir.get_next() - - var prefix: String = files[0] - for file in files: - while true: - if file.begins_with(prefix): - break - if prefix.is_empty(): - break - prefix = prefix.substr(0, len(prefix)-1) - - for file in files: - %PortraitTree.add_portrait_item(file.trim_prefix(prefix).trim_suffix('.'+file.get_extension()), - {'scene':"",'export_overrides':{'image':var_to_str(path.path_join(file))}, 'scale':1, 'offset':Vector2(), 'mirror':false}, parent) - - ## Handle selection - if parent.get_child_count(): - parent.get_first_child().select(0) - else: - # Call anyways to clear preview and hide portrait settings section - load_selected_portrait() - - something_changed() - - -func add_portrait(portrait_name:String='New portrait', portrait_data:Dictionary={'scene':"", 'export_overrides':{'image':''}, 'scale':1, 'offset':Vector2(), 'mirror':false}) -> void: - var parent: TreeItem = %PortraitTree.get_root() - if %PortraitTree.get_selected(): - if %PortraitTree.get_selected().get_metadata(0) and %PortraitTree.get_selected().get_metadata(0).has('group'): - parent = %PortraitTree.get_selected() - else: - parent = %PortraitTree.get_selected().get_parent() - var item: TreeItem = %PortraitTree.add_portrait_item(portrait_name, portrait_data, parent) - item.set_meta('new', true) - item.set_editable(0, true) - item.select(0) - %PortraitTree.call_deferred('edit_selected') - something_changed() - - -func add_portrait_group() -> void: - var parent_item: TreeItem = %PortraitTree.get_root() - if %PortraitTree.get_selected() and %PortraitTree.get_selected().get_metadata(0) and %PortraitTree.get_selected().get_metadata(0).has('group'): - parent_item = %PortraitTree.get_selected() - var item: TreeItem = %PortraitTree.add_portrait_group("Group", parent_item) - item.set_meta('new', true) - item.set_editable(0, true) - item.select(0) - %PortraitTree.call_deferred('edit_selected') - - -func load_portrait_tree() -> void: - %PortraitTree.clear_tree() - var root: TreeItem = %PortraitTree.create_item() - - for portrait in current_resource.portraits.keys(): - var portrait_label: String = portrait - var parent: TreeItem = %PortraitTree.get_root() - if '/' in portrait: - parent = %PortraitTree.create_necessary_group_items(portrait) - portrait_label = portrait.split('/')[-1] - - %PortraitTree.add_portrait_item(portrait_label, current_resource.portraits[portrait], parent) - - update_default_portrait_star(current_resource.default_portrait) - - if root.get_child_count(): - root.get_first_child().select(0) - while %PortraitTree.get_selected().get_child_count(): - %PortraitTree.get_selected().get_child(0).select(0) - else: - # Call anyways to clear preview and hide portrait settings section - load_selected_portrait() - - -func filter_portrait_list(filter_term := "") -> void: - filter_branch(%PortraitTree.get_root(), filter_term) - - -func filter_branch(parent: TreeItem, filter_term: String) -> bool: - var anything_visible := false - for item in parent.get_children(): - if item.get_metadata(0).has('group'): - item.visible = filter_branch(item, filter_term) - anything_visible = item.visible - elif filter_term.is_empty() or filter_term.to_lower() in item.get_text(0).to_lower(): - item.visible = true - anything_visible = true - else: - item.visible = false - return anything_visible - - -## This is used to save the portrait data -func get_updated_portrait_dict() -> Dictionary: - return list_portraits(%PortraitTree.get_root().get_children()) - - -func list_portraits(tree_items: Array[TreeItem], dict := {}, path_prefix := "") -> Dictionary: - for item in tree_items: - if item.get_metadata(0).has('group'): - dict = list_portraits(item.get_children(), dict, path_prefix+item.get_text(0)+"/") - else: - dict[path_prefix +item.get_text(0)] = item.get_metadata(0) - return dict - - -func load_selected_portrait() -> void: - if selected_item and is_instance_valid(selected_item): - selected_item.set_editable(0, false) - - selected_item = %PortraitTree.get_selected() - - if selected_item and selected_item.get_metadata(0) != null and !selected_item.get_metadata(0).has('group'): - %PortraitSettingsSection.show() - var current_portrait_data: Dictionary = selected_item.get_metadata(0) - portrait_selected.emit(%PortraitTree.get_full_item_name(selected_item), current_portrait_data) - - update_preview() - - for child in %PortraitSettingsSection.get_children(): - if child is DialogicCharacterEditorPortraitSection: - child.selected_item = selected_item - child._load_portrait_data(current_portrait_data) - - else: - %PortraitSettingsSection.hide() - update_preview() - - -func delete_portrait_item(item: TreeItem) -> void: - if item.get_next_visible(true) and item.get_next_visible(true) != item: - item.get_next_visible(true).select(0) - else: - selected_item = null - load_selected_portrait() - item.free() - something_changed() - - -func duplicate_item(item: TreeItem) -> void: - var new_item: TreeItem = %PortraitTree.add_portrait_item(item.get_text(0)+'_duplicated', item.get_metadata(0).duplicate(true), item.get_parent()) - new_item.set_meta('new', true) - new_item.select(0) - - -func _input(event: InputEvent) -> void: - if !is_visible_in_tree() or (get_viewport().gui_get_focus_owner()!= null and !name+'/' in str(get_viewport().gui_get_focus_owner().get_path())): - return - if event is InputEventKey and event.pressed: - if event.keycode == KEY_F2 and %PortraitTree.get_selected(): - %PortraitTree.get_selected().set_editable(0, true) - %PortraitTree.edit_selected() - get_viewport().set_input_as_handled() - elif event.keycode == KEY_DELETE and get_viewport().gui_get_focus_owner() is Tree and %PortraitTree.get_selected(): - delete_portrait_item(%PortraitTree.get_selected()) - get_viewport().set_input_as_handled() - - -func _on_portrait_right_click_menu_index_pressed(id: int) -> void: - # RENAME BUTTON - if id == 0: - _on_item_activated() - # DELETE BUTTON - if id == 2: - delete_portrait_item(%PortraitTree.get_selected()) - # DUPLICATE ITEM - elif id == 1: - duplicate_item(%PortraitTree.get_selected()) - elif id == 4: - get_settings_section_by_name("Portraits").set_default_portrait(%PortraitTree.get_full_item_name(%PortraitTree.get_selected())) - - -## This removes/and adds the DEFAULT star on the portrait list -func update_default_portrait_star(default_portrait_name: String) -> void: - var item_list: Array = %PortraitTree.get_root().get_children() - if item_list.is_empty() == false: - while true: - var item: TreeItem = item_list.pop_back() - if item.get_button_by_id(0, 2) != -1: - item.erase_button(0, item.get_button_by_id(0, 2)) - if %PortraitTree.get_full_item_name(item) == default_portrait_name: - item.add_button(0, get_theme_icon("Favorites", "EditorIcons"), 2, true, "Default") - item_list.append_array(item.get_children()) - if item_list.is_empty(): - break - - -func _on_item_edited() -> void: - selected_item = %PortraitTree.get_selected() - something_changed() - if selected_item: - if %PreviewLabel.text.trim_prefix('Preview of "').trim_suffix('"') == current_resource.default_portrait: - current_resource.default_portrait = %PortraitTree.get_full_item_name(selected_item) - selected_item.set_editable(0, false) - - if !selected_item.has_meta('new') and %PortraitTree.get_full_item_name(selected_item) != selected_item.get_meta('previous_name'): - report_name_change(selected_item) - %PortraitChangeInfo.show() - update_preview() - - -func _on_item_activated() -> void: - if %PortraitTree.get_selected() == null: - return - %PortraitTree.get_selected().set_editable(0, true) - %PortraitTree.edit_selected() - - -func report_name_change(item: TreeItem) -> void: - if item.get_metadata(0).has('group'): - for s_item in item.get_children(): - if s_item.get_metadata(0).has('group') or !s_item.has_meta('new'): - report_name_change(s_item) - else: - if item.get_meta('previous_name') == %PortraitTree.get_full_item_name(item): - return - editors_manager.reference_manager.add_portrait_ref_change( - item.get_meta('previous_name'), - %PortraitTree.get_full_item_name(item), - [current_resource.get_identifier()]) - item.set_meta('previous_name', %PortraitTree.get_full_item_name(item)) - %PortraitChangeInfo.show() - -#endregion - -########### PREVIEW ############################################################ - -#region Preview -func update_preview(force := false, ignore_settings_reload := false) -> void: - %ScenePreviewWarning.hide() - - if selected_item and is_instance_valid(selected_item) and selected_item.get_metadata(0) != null and !selected_item.get_metadata(0).has('group'): - %PreviewLabel.text = 'Preview of "'+%PortraitTree.get_full_item_name(selected_item)+'"' - - var current_portrait_data: Dictionary = selected_item.get_metadata(0) - - if not force and current_previewed_scene != null \ - and scene_file_path == current_portrait_data.get('scene') \ - and current_previewed_scene.has_method('_should_do_portrait_update') \ - and is_instance_valid(current_previewed_scene.get_script()) \ - and current_previewed_scene._should_do_portrait_update(current_resource, selected_item.get_text(0)): - # We keep the same scene. - pass - else: - - for node in %RealPreviewPivot.get_children(): - node.queue_free() - - current_previewed_scene = null - current_scene_path = "" - - var scene_path := def_portrait_path - if not current_portrait_data.get('scene', '').is_empty(): - scene_path = current_portrait_data.get('scene') - - if ResourceLoader.exists(scene_path): - current_previewed_scene = load(scene_path).instantiate() - current_scene_path = scene_path - - if not current_previewed_scene == null: - %RealPreviewPivot.add_child(current_previewed_scene) - - if not current_previewed_scene == null: - var scene: Node = current_previewed_scene - - scene.show_behind_parent = true - DialogicUtil.apply_scene_export_overrides(scene, current_portrait_data.get('export_overrides', {})) - - var mirror: bool = current_portrait_data.get('mirror', false) != current_resource.mirror - var scale: float = current_portrait_data.get('scale', 1) * current_resource.scale - - if current_portrait_data.get('ignore_char_scale', false): - scale = current_portrait_data.get('scale', 1) - - var offset: Vector2 = current_portrait_data.get('offset', Vector2()) + current_resource.offset - - if is_instance_valid(scene.get_script()) and scene.script.is_tool(): - - if scene.has_method('_update_portrait'): - ## Create a fake duplicate resource that has all the portrait changes applied already - var preview_character := current_resource.duplicate() - preview_character.portraits = get_updated_portrait_dict() - scene._update_portrait(preview_character, %PortraitTree.get_full_item_name(selected_item)) - - if scene.has_method('_set_mirror'): - scene._set_mirror(mirror) - - if !%FitPreview_Toggle.button_pressed: - scene.position = Vector2() + offset - scene.scale = Vector2(1,1)*scale - else: - - if not scene.get_script() == null and scene.script.is_tool() and scene.has_method('_get_covered_rect'): - var rect: Rect2 = scene._get_covered_rect() - var available_rect: Rect2 = %FullPreviewAvailableRect.get_rect() - scene.scale = Vector2(1,1) * min(available_rect.size.x/rect.size.x, available_rect.size.y/rect.size.y) - %RealPreviewPivot.position = (rect.position)*-1*scene.scale - %RealPreviewPivot.position.x = %FullPreviewAvailableRect.size.x/2 - scene.position = Vector2() - - else: - %ScenePreviewWarning.show() - else: - %PreviewLabel.text = 'Nothing to preview' - - if not ignore_settings_reload: - for child in %PortraitSettingsSection.get_children(): - if child is DialogicCharacterEditorPortraitSection: - child._recheck(current_portrait_data) - - else: - %PreviewLabel.text = 'No portrait to preview.' - - for node in %RealPreviewPivot.get_children(): - node.queue_free() - - current_previewed_scene = null - current_scene_path = "" - - -func _on_some_resource_saved(file:Variant) -> void: - if current_previewed_scene == null: - return - - if file is Resource and file == current_previewed_scene.script: - update_preview(true) - - if typeof(file) == TYPE_STRING and file == current_previewed_scene.get_meta("path", ""): - update_preview(true) - - -func _on_full_preview_available_rect_resized() -> void: - if %FitPreview_Toggle.button_pressed: - update_preview(false, true) - - -func _on_create_character_button_pressed() -> void: - editors_manager.show_add_resource_dialog( - new_character, - '*.dch; DialogicCharacter', - 'Create new character', - 'character', - ) - - -func _on_fit_preview_toggle_toggled(button_pressed): - %FitPreview_Toggle.set_pressed_no_signal(button_pressed) - if button_pressed: - %FitPreview_Toggle.icon = get_theme_icon("ScrollContainer", "EditorIcons") - %FitPreview_Toggle.tooltip_text = "Real scale" - else: - %FitPreview_Toggle.tooltip_text = "Fit into preview" - %FitPreview_Toggle.icon = get_theme_icon("CenterContainer", "EditorIcons") - DialogicUtil.set_editor_setting('character_preview_fit', button_pressed) - update_preview(false, true) - -#endregion - -## Open the reference manager -func _on_reference_manger_button_pressed() -> void: - editors_manager.reference_manager.open() - %PortraitChangeInfo.hide() diff --git a/godot/addons/dialogic/Editor/CharacterEditor/character_editor.gd.uid b/godot/addons/dialogic/Editor/CharacterEditor/character_editor.gd.uid deleted file mode 100644 index 4997d86..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/character_editor.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cwhe7tpe75oh7 diff --git a/godot/addons/dialogic/Editor/CharacterEditor/character_editor.tscn b/godot/addons/dialogic/Editor/CharacterEditor/character_editor.tscn deleted file mode 100644 index 49fc117..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/character_editor.tscn +++ /dev/null @@ -1,456 +0,0 @@ -[gd_scene load_steps=11 format=3 uid="uid://dlskc36c5hrwv"] - -[ext_resource type="Script" uid="uid://cwhe7tpe75oh7" path="res://addons/dialogic/Editor/CharacterEditor/character_editor.gd" id="2"] -[ext_resource type="PackedScene" uid="uid://dbpkta2tjsqim" path="res://addons/dialogic/Editor/Common/hint_tooltip_icon.tscn" id="2_uhhqs"] -[ext_resource type="Script" uid="uid://deliic6d8vajo" path="res://addons/dialogic/Editor/CharacterEditor/character_editor_portrait_tree.gd" id="2_vad0i"] -[ext_resource type="Texture2D" uid="uid://babwe22dqjta" path="res://addons/dialogic/Editor/Images/Pieces/add-folder.svg" id="3_v1qnr"] - -[sub_resource type="Image" id="Image_r5ayh"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_oab13"] -image = SubResource("Image_r5ayh") - -[sub_resource type="Image" id="Image_2j4b6"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_u1a6g"] -image = SubResource("Image_2j4b6") - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_es2rd"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_4xgdx"] - -[node name="CharacterEditor" type="Control"] -self_modulate = Color(0, 0, 0, 1) -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("2") - -[node name="Scroll" type="ScrollContainer" parent="."] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="VBox" type="VBoxContainer" parent="Scroll"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -size_flags_stretch_ratio = 0.3 -theme_override_constants/separation = 0 - -[node name="TopSection" type="HBoxContainer" parent="Scroll/VBox"] -layout_mode = 2 - -[node name="NameContainer" type="HBoxContainer" parent="Scroll/VBox/TopSection"] -layout_mode = 2 - -[node name="CharacterName" type="Label" parent="Scroll/VBox/TopSection/NameContainer"] -unique_name_in_owner = true -layout_mode = 2 -theme_type_variation = &"DialogicTitle" -text = "My Character" - -[node name="NameTooltip" parent="Scroll/VBox/TopSection/NameContainer" instance=ExtResource("2_uhhqs")] -layout_mode = 2 -tooltip_text = "This unique identifier is based on the file name. You can change it in the Reference Manager. -Use this name in timelines to reference this character." -texture = SubResource("ImageTexture_oab13") -hint_text = "This unique identifier is based on the file name. You can change it in the Reference Manager. -Use this name in timelines to reference this character." - -[node name="MainSettingsCollapse" type="Button" parent="Scroll/VBox/TopSection"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 10 -size_flags_vertical = 4 -toggle_mode = true -text = "Main Settings" -icon = SubResource("ImageTexture_u1a6g") - -[node name="MainHSplit" type="HSplitContainer" parent="Scroll/VBox"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="MainSettings" type="VBoxContainer" parent="Scroll/VBox/MainHSplit"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_stretch_ratio = 0.2 - -[node name="MainSettingsTitle" type="Label" parent="Scroll/VBox/MainHSplit/MainSettings"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -theme_type_variation = &"DialogicSubTitle" -text = "Main Settings" - -[node name="MainSettingsScroll" type="ScrollContainer" parent="Scroll/VBox/MainHSplit/MainSettings"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 3 -theme_override_styles/panel = SubResource("StyleBoxEmpty_es2rd") -horizontal_scroll_mode = 0 - -[node name="MainSettingsSections" type="VBoxContainer" parent="Scroll/VBox/MainHSplit/MainSettings/MainSettingsScroll"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="Split" type="HSplitContainer" parent="Scroll/VBox/MainHSplit"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="HBoxContainer" type="HBoxContainer" parent="Scroll/VBox/MainHSplit/Split"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_stretch_ratio = 0.2 -theme_override_constants/separation = 0 - -[node name="MarginContainer" type="MarginContainer" parent="Scroll/VBox/MainHSplit/Split/HBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_stretch_ratio = 0.2 -theme_override_constants/margin_bottom = 10 - -[node name="PortraitListSection" type="PanelContainer" parent="Scroll/VBox/MainHSplit/Split/HBoxContainer/MarginContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -theme_type_variation = &"DialogicPanelA" - -[node name="Portraits" type="VBoxContainer" parent="Scroll/VBox/MainHSplit/Split/HBoxContainer/MarginContainer/PortraitListSection"] -layout_mode = 2 - -[node name="PortraitsTitle" type="Label" parent="Scroll/VBox/MainHSplit/Split/HBoxContainer/MarginContainer/PortraitListSection/Portraits"] -layout_mode = 2 -theme_type_variation = &"DialogicSubTitle" -text = "Portraits" - -[node name="PortraitListTools" type="HBoxContainer" parent="Scroll/VBox/MainHSplit/Split/HBoxContainer/MarginContainer/PortraitListSection/Portraits"] -layout_mode = 2 - -[node name="AddPortraitButton" type="Button" parent="Scroll/VBox/MainHSplit/Split/HBoxContainer/MarginContainer/PortraitListSection/Portraits/PortraitListTools"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Add portrait" -icon = SubResource("ImageTexture_u1a6g") - -[node name="AddPortraitGroupButton" type="Button" parent="Scroll/VBox/MainHSplit/Split/HBoxContainer/MarginContainer/PortraitListSection/Portraits/PortraitListTools"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Add Group" -icon = ExtResource("3_v1qnr") - -[node name="ImportPortraitsButton" type="Button" parent="Scroll/VBox/MainHSplit/Split/HBoxContainer/MarginContainer/PortraitListSection/Portraits/PortraitListTools"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Import images from folder" -icon = SubResource("ImageTexture_u1a6g") - -[node name="PortraitSearch" type="LineEdit" parent="Scroll/VBox/MainHSplit/Split/HBoxContainer/MarginContainer/PortraitListSection/Portraits/PortraitListTools"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 4 -placeholder_text = "Search" -expand_to_text_length = true -clear_button_enabled = true -right_icon = SubResource("ImageTexture_u1a6g") -caret_blink = true -caret_blink_interval = 0.5 - -[node name="PortraitTreePanel" type="PanelContainer" parent="Scroll/VBox/MainHSplit/Split/HBoxContainer/MarginContainer/PortraitListSection/Portraits"] -layout_mode = 2 -size_flags_vertical = 3 -theme_override_styles/panel = SubResource("StyleBoxEmpty_4xgdx") - -[node name="PortraitTree" type="Tree" parent="Scroll/VBox/MainHSplit/Split/HBoxContainer/MarginContainer/PortraitListSection/Portraits/PortraitTreePanel"] -unique_name_in_owner = true -layout_mode = 2 -allow_rmb_select = true -hide_root = true -drop_mode_flags = 3 -script = ExtResource("2_vad0i") - -[node name="PortraitRightClickMenu" type="PopupMenu" parent="Scroll/VBox/MainHSplit/Split/HBoxContainer/MarginContainer/PortraitListSection/Portraits/PortraitTreePanel/PortraitTree"] -size = Vector2i(118, 100) -item_count = 5 -item_0/text = "Rename" -item_0/icon = SubResource("ImageTexture_oab13") -item_0/id = 2 -item_1/text = "Duplicate" -item_1/icon = SubResource("ImageTexture_oab13") -item_1/id = 0 -item_2/text = "Delete" -item_2/icon = SubResource("ImageTexture_oab13") -item_2/id = 1 -item_3/text = "" -item_3/id = 3 -item_3/separator = true -item_4/text = "Make Default" -item_4/icon = SubResource("ImageTexture_oab13") -item_4/id = 4 - -[node name="PortraitChangeInfo" type="HBoxContainer" parent="Scroll/VBox/MainHSplit/Split/HBoxContainer/MarginContainer/PortraitListSection/Portraits"] -unique_name_in_owner = true -layout_mode = 2 - -[node name="PortraitChangeWarning" type="Label" parent="Scroll/VBox/MainHSplit/Split/HBoxContainer/MarginContainer/PortraitListSection/Portraits/PortraitChangeInfo"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -theme_override_colors/font_color = Color(0, 0, 0, 1) -text = "Some portraits were renamed. Make sure no references broke!" -autowrap_mode = 3 - -[node name="ReferenceMangerButton" type="Button" parent="Scroll/VBox/MainHSplit/Split/HBoxContainer/MarginContainer/PortraitListSection/Portraits/PortraitChangeInfo"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 4 -text = "Reference -Manager" - -[node name="RightSection2" type="VBoxContainer" parent="Scroll/VBox/MainHSplit/Split"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -size_flags_stretch_ratio = 0.5 - -[node name="Spacer" type="Control" parent="Scroll/VBox/MainHSplit/Split/RightSection2"] -custom_minimum_size = Vector2(0, 10) -layout_mode = 2 - -[node name="RightSection" type="SplitContainer" parent="Scroll/VBox/MainHSplit/Split/RightSection2"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -size_flags_stretch_ratio = 0.5 -vertical = true - -[node name="PortraitPreviewSection" type="Panel" parent="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection"] -unique_name_in_owner = true -show_behind_parent = true -custom_minimum_size = Vector2(100, 0) -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_type_variation = &"DialogicPanelB" - -[node name="ClipRect" type="Control" parent="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection/PortraitPreviewSection"] -clip_contents = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="Node2D" type="Node2D" parent="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection/PortraitPreviewSection/ClipRect"] -position = Vector2(13, 17) - -[node name="RealPreviewPivot" type="Sprite2D" parent="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection/PortraitPreviewSection/ClipRect/Node2D"] -unique_name_in_owner = true -position = Vector2(326.5, 267) -texture = SubResource("ImageTexture_u1a6g") - -[node name="ScenePreviewWarning" type="Label" parent="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection/PortraitPreviewSection"] -unique_name_in_owner = true -visible = false -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -143.0 -offset_top = -44.5 -offset_right = 143.0 -offset_bottom = 85.5 -grow_horizontal = 2 -grow_vertical = 2 -text = "Custom scenes can only be viewed in \"Full mode\" if they are in @tool mode and override _get_covered_rect" -horizontal_alignment = 1 -vertical_alignment = 1 -autowrap_mode = 3 -metadata/_edit_layout_mode = 1 - -[node name="PreviewReal" type="CenterContainer" parent="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection/PortraitPreviewSection"] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 7 -anchor_left = 0.5 -anchor_top = 1.0 -anchor_right = 0.5 -anchor_bottom = 1.0 -offset_left = -302.0 -offset_top = -80.0 -offset_right = 302.0 -grow_horizontal = 2 -grow_vertical = 0 -mouse_filter = 2 -metadata/_edit_layout_mode = 1 - -[node name="Control" type="Control" parent="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection/PortraitPreviewSection/PreviewReal"] -layout_mode = 2 - -[node name="RealSizeRemotePivotTransform" type="RemoteTransform2D" parent="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection/PortraitPreviewSection/PreviewReal/Control"] -unique_name_in_owner = true -remote_path = NodePath("../../../ClipRect/Node2D/RealPreviewPivot") -update_rotation = false -update_scale = false - -[node name="FullPreviewAvailableRect" type="Control" parent="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection/PortraitPreviewSection"] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = 10.0 -offset_top = 28.0 -offset_right = -10.0 -offset_bottom = -16.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 -metadata/_edit_layout_mode = 1 - -[node name="HBoxContainer" type="HBoxContainer" parent="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection/PortraitPreviewSection"] -layout_mode = 1 -anchors_preset = 10 -anchor_right = 1.0 -offset_left = 6.0 -offset_top = 7.0 -offset_right = -6.0 -offset_bottom = 43.0 -grow_horizontal = 2 -mouse_filter = 2 - -[node name="PreviewLabel" type="Label" parent="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection/PortraitPreviewSection/HBoxContainer"] -unique_name_in_owner = true -show_behind_parent = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 0 -theme_override_colors/font_color = Color(0, 0, 0, 1) -text = "No portrait to preview." -text_overrun_behavior = 1 - -[node name="FitPreview_Toggle" type="Button" parent="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection/PortraitPreviewSection/HBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 0 -tooltip_text = "Real scale" -focus_mode = 0 -toggle_mode = true -button_pressed = true -icon = SubResource("ImageTexture_u1a6g") -flat = true -metadata/_edit_layout_mode = 1 - -[node name="VBox" type="VBoxContainer" parent="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -size_flags_stretch_ratio = 0.75 - -[node name="Hbox" type="HBoxContainer" parent="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection/VBox"] -layout_mode = 2 - -[node name="PortraitSettingsTitle" type="Label" parent="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection/VBox/Hbox"] -unique_name_in_owner = true -layout_mode = 2 -theme_type_variation = &"DialogicSubTitle" -text = "Portrait Settings" - -[node name="SwitchPortraitSettingsPosition" type="Button" parent="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection/VBox/Hbox"] -unique_name_in_owner = true -modulate = Color(1, 1, 1, 0.647059) -layout_mode = 2 -tooltip_text = "Switch position" -focus_mode = 0 -icon = SubResource("ImageTexture_u1a6g") -flat = true - -[node name="Scroll" type="ScrollContainer" parent="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection/VBox"] -layout_mode = 2 -size_flags_vertical = 3 -size_flags_stretch_ratio = 0.4 - -[node name="PortraitSettingsSection" type="VBoxContainer" parent="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection/VBox/Scroll"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -size_flags_stretch_ratio = 0.3 - -[node name="Spacer2" type="Control" parent="Scroll/VBox/MainHSplit/Split/RightSection2"] -custom_minimum_size = Vector2(0, 20) -layout_mode = 2 - -[node name="NoCharacterScreen" type="ColorRect" parent="."] -visible = false -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 3 -color = Color(0, 0, 0, 1) - -[node name="CenterContainer" type="CenterContainer" parent="NoCharacterScreen"] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="VBoxContainer" type="VBoxContainer" parent="NoCharacterScreen/CenterContainer"] -custom_minimum_size = Vector2(250, 0) -layout_mode = 2 - -[node name="Label" type="Label" parent="NoCharacterScreen/CenterContainer/VBoxContainer"] -layout_mode = 2 -text = "No character opened. -Create a character or double-click one in the file system dock." -horizontal_alignment = 1 -autowrap_mode = 3 - -[node name="CreateCharacterButton" type="Button" parent="NoCharacterScreen/CenterContainer/VBoxContainer"] -layout_mode = 2 -text = "Create New Character" - -[connection signal="toggled" from="Scroll/VBox/TopSection/MainSettingsCollapse" to="." method="_on_main_settings_collapse_toggled"] -[connection signal="item_mouse_selected" from="Scroll/VBox/MainHSplit/Split/HBoxContainer/MarginContainer/PortraitListSection/Portraits/PortraitTreePanel/PortraitTree" to="Scroll/VBox/MainHSplit/Split/HBoxContainer/MarginContainer/PortraitListSection/Portraits/PortraitTreePanel/PortraitTree" method="_on_item_mouse_selected"] -[connection signal="index_pressed" from="Scroll/VBox/MainHSplit/Split/HBoxContainer/MarginContainer/PortraitListSection/Portraits/PortraitTreePanel/PortraitTree/PortraitRightClickMenu" to="." method="_on_portrait_right_click_menu_index_pressed"] -[connection signal="pressed" from="Scroll/VBox/MainHSplit/Split/HBoxContainer/MarginContainer/PortraitListSection/Portraits/PortraitChangeInfo/ReferenceMangerButton" to="." method="_on_reference_manger_button_pressed"] -[connection signal="resized" from="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection/PortraitPreviewSection/FullPreviewAvailableRect" to="." method="_on_full_preview_available_rect_resized"] -[connection signal="toggled" from="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection/PortraitPreviewSection/HBoxContainer/FitPreview_Toggle" to="." method="_on_fit_preview_toggle_toggled"] -[connection signal="pressed" from="Scroll/VBox/MainHSplit/Split/RightSection2/RightSection/VBox/Hbox/SwitchPortraitSettingsPosition" to="." method="_on_switch_portrait_settings_position_pressed"] -[connection signal="pressed" from="NoCharacterScreen/CenterContainer/VBoxContainer/CreateCharacterButton" to="." method="_on_create_character_button_pressed"] diff --git a/godot/addons/dialogic/Editor/CharacterEditor/character_editor_main_settings_section.gd b/godot/addons/dialogic/Editor/CharacterEditor/character_editor_main_settings_section.gd deleted file mode 100644 index 55253f3..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/character_editor_main_settings_section.gd +++ /dev/null @@ -1,42 +0,0 @@ -@tool -class_name DialogicCharacterEditorMainSection -extends Control - -## Base class for all character editor main sections. Methods should be overriden. - -## Emit this, if something changed -@warning_ignore("unused_signal") # this is used by extending scripts -signal changed - -## Reference to the character editor, set when instantiated -var character_editor: Control - -## If not empty, a hint icon is added to the section title. -var hint_text := "" - - -## Overwrite to set the title of this section -func _get_title() -> String: - return "MainSection" - - -## Overwrite to set the visibility of the section title -func _show_title() -> bool: - return true - - -## Overwrite to set whether this should initially be opened. -func _start_opened() -> bool: - return false - - -## Overwrite to load all the information from the character into this section. -func _load_character(_resource:DialogicCharacter) -> void: - pass - - -## Overwrite to save all changes made in this section to the resource. -## In custom sections you will mostly likely save to the [resource.custom_info] -## dictionary. -func _save_changes(resource:DialogicCharacter) -> DialogicCharacter: - return resource diff --git a/godot/addons/dialogic/Editor/CharacterEditor/character_editor_main_settings_section.gd.uid b/godot/addons/dialogic/Editor/CharacterEditor/character_editor_main_settings_section.gd.uid deleted file mode 100644 index bc89421..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/character_editor_main_settings_section.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://wltbab3qq63b diff --git a/godot/addons/dialogic/Editor/CharacterEditor/character_editor_portrait_settings_section.gd b/godot/addons/dialogic/Editor/CharacterEditor/character_editor_portrait_settings_section.gd deleted file mode 100644 index 920f8a5..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/character_editor_portrait_settings_section.gd +++ /dev/null @@ -1,48 +0,0 @@ -@tool -class_name DialogicCharacterEditorPortraitSection -extends Control - -## Base class for all portrait settings sections. Methods should be overriden. -## Changes made through fields in such a section should instantly be "saved" -## to the portrait_items metadata from where they will be saved to the resource. - -## Emit this, if something changed -signal changed -## Emit this if the preview should reload -signal update_preview - -## Reference to the character editor, set when instantiated -var character_editor: Control -## Reference to the selected portrait item. -## `selected_item.get_metadata(0)` can access the portraits data -var selected_item: TreeItem = null - -## If not empty a hint icon is added to the section title -var hint_text := "" - - -## Overwrite to set the title of this section -func _get_title() -> String: - return "CustomSection" - - -## Overwrite to set the visibility of the section title -func _show_title() -> bool: - return true - - -## Overwrite to set whether this should initially be opened. -func _start_opened() -> bool: - return false - - -## Overwrite to load all the information from the character into this section. -func _load_portrait_data(data:Dictionary) -> void: - pass - - -## Overwrite to recheck visibility of your section and the content of your fields. -## This is called whenever the preview is updated so it allows reacting to major -## changes in other portrait sections. -func _recheck(data:Dictionary) -> void: - pass diff --git a/godot/addons/dialogic/Editor/CharacterEditor/character_editor_portrait_settings_section.gd.uid b/godot/addons/dialogic/Editor/CharacterEditor/character_editor_portrait_settings_section.gd.uid deleted file mode 100644 index 0067938..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/character_editor_portrait_settings_section.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ckblurnjla80i diff --git a/godot/addons/dialogic/Editor/CharacterEditor/character_editor_portrait_tree.gd b/godot/addons/dialogic/Editor/CharacterEditor/character_editor_portrait_tree.gd deleted file mode 100644 index 82ac137..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/character_editor_portrait_tree.gd +++ /dev/null @@ -1,142 +0,0 @@ -@tool -extends Tree - -## Tree that displays the portrait list as a hirarchy - -var editor := find_parent('Character Editor') -var current_group_nodes := {} - - -func _ready() -> void: - $PortraitRightClickMenu.set_item_icon(0, get_theme_icon('Rename', 'EditorIcons')) - $PortraitRightClickMenu.set_item_icon(1, get_theme_icon('Duplicate', 'EditorIcons')) - $PortraitRightClickMenu.set_item_icon(2, get_theme_icon('Remove', 'EditorIcons')) - $PortraitRightClickMenu.set_item_icon(4, get_theme_icon("Favorites", "EditorIcons")) - - -func clear_tree() -> void: - clear() - current_group_nodes = {} - - -func add_portrait_item(portrait_name: String, portrait_data: Dictionary, parent_item: TreeItem, previous_name := "") -> TreeItem: - var item: TreeItem = %PortraitTree.create_item(parent_item) - item.set_text(0, portrait_name) - item.set_metadata(0, portrait_data) - if previous_name.is_empty(): - item.set_meta('previous_name', get_full_item_name(item)) - else: - item.set_meta('previous_name', previous_name) - if portrait_name == editor.current_resource.default_portrait: - item.add_button(0, get_theme_icon('Favorites', 'EditorIcons'), 2, true, 'Default') - return item - - -func add_portrait_group(goup_name := "Group", parent_item: TreeItem = get_root(), previous_name := "") -> TreeItem: - var item: TreeItem = %PortraitTree.create_item(parent_item) - item.set_icon(0, get_theme_icon("Folder", "EditorIcons")) - item.set_text(0, goup_name) - item.set_metadata(0, {'group':true}) - if previous_name.is_empty(): - item.set_meta('previous_name', get_full_item_name(item)) - else: - item.set_meta('previous_name', previous_name) - return item - - -func get_full_item_name(item: TreeItem) -> String: - var item_name := item.get_text(0) - while item.get_parent() != get_root() and item != get_root(): - item_name = item.get_parent().get_text(0)+"/"+item_name - item = item.get_parent() - return item_name - - -## Will create all not yet existing folders in the given path. -## Returns the last folder (the parent of the portrait item of this path). -func create_necessary_group_items(path: String) -> TreeItem: - var last_item := get_root() - var item_path := "" - - for i in Array(path.split('/')).slice(0, -1): - item_path += "/"+i - item_path = item_path.trim_prefix('/') - if current_group_nodes.has(item_path+"/"+i): - last_item = current_group_nodes[item_path+"/"+i] - else: - var new_item: TreeItem = add_portrait_group(i, last_item) - current_group_nodes[item_path+"/"+i] = new_item - last_item = new_item - return last_item - - -func _on_item_mouse_selected(pos: Vector2, mouse_button_index: int) -> void: - if mouse_button_index == MOUSE_BUTTON_RIGHT: - $PortraitRightClickMenu.set_item_disabled(1, get_selected().get_metadata(0).has('group')) - $PortraitRightClickMenu.popup_on_parent(Rect2(get_global_mouse_position(),Vector2())) - - -################################################################################ -## DRAG AND DROP -################################################################################ - -func _get_drag_data(at_position: Vector2) -> Variant: - var drag_item := get_item_at_position(at_position) - if not drag_item: - return null - - drop_mode_flags = DROP_MODE_INBETWEEN - var preview := Label.new() - preview.text = " "+drag_item.get_text(0) - preview.add_theme_stylebox_override('normal', get_theme_stylebox("Background", "EditorStyles")) - set_drag_preview(preview) - - return drag_item - - -func _can_drop_data(_at_position: Vector2, data: Variant) -> bool: - return data is TreeItem - - -func _drop_data(at_position: Vector2, item: Variant) -> void: - var to_item := get_item_at_position(at_position) - if to_item: - var test_item := to_item - while true: - if test_item == item: - return - test_item = test_item.get_parent() - if test_item == get_root(): - break - - var drop_section := get_drop_section_at_position(at_position) - var parent := get_root() - if to_item: - parent = to_item.get_parent() - - if to_item and to_item.get_metadata(0).has('group') and drop_section == 1: - parent = to_item - - var new_item := copy_branch_or_item(item, parent) - - if to_item and !to_item.get_metadata(0).has('group') and drop_section == 1: - new_item.move_after(to_item) - - if drop_section == -1: - new_item.move_before(to_item) - - editor.report_name_change(new_item) - - item.free() - - -func copy_branch_or_item(item: TreeItem, new_parent: TreeItem) -> TreeItem: - var new_item: TreeItem = null - if item.get_metadata(0).has('group'): - new_item = add_portrait_group(item.get_text(0), new_parent, item.get_meta('previous_name')) - else: - new_item = add_portrait_item(item.get_text(0), item.get_metadata(0), new_parent, item.get_meta('previous_name')) - - for child in item.get_children(): - copy_branch_or_item(child, new_item) - return new_item diff --git a/godot/addons/dialogic/Editor/CharacterEditor/character_editor_portrait_tree.gd.uid b/godot/addons/dialogic/Editor/CharacterEditor/character_editor_portrait_tree.gd.uid deleted file mode 100644 index 9f24a8c..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/character_editor_portrait_tree.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://deliic6d8vajo diff --git a/godot/addons/dialogic/Editor/CharacterEditor/character_prefix_suffix.gd b/godot/addons/dialogic/Editor/CharacterEditor/character_prefix_suffix.gd deleted file mode 100644 index 6c54255..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/character_prefix_suffix.gd +++ /dev/null @@ -1,79 +0,0 @@ -@tool -class_name DialogicCharacterPrefixSuffixSection -extends DialogicCharacterEditorMainSection -## Character Editor Section for setting the prefix and suffix of a character. -## -## loads and sets the prefix and suffix of a character. -## Provides [const PREFIX_CUSTOM_KEY] and [const SUFFIX_CUSTOM_KEY] to -## access the `custom_info` dictionary of the [class DialogicCharacter]. - -@export var prefix_input: LineEdit -@export var suffix_input: LineEdit - -## We won't force any prefixes or suffixes onto the player, -## to ensure their games are working as previously when updating. -const DEFAULT_PREFIX = "" -const DEFAULT_SUFFIX = "" - -## `custom_info` dictionary keys for the prefix. -const PREFIX_CUSTOM_KEY = "prefix" - -## `custom_info` dictionary keys for the prefix. -const SUFFIX_CUSTOM_KEY = "suffix" - -var suffix := "" -var prefix := "" - - -func _ready() -> void: - suffix_input.text_changed.connect(_suffix_changed) - prefix_input.text_changed.connect(_prefix_changed) - - -func _suffix_changed(text: String) -> void: - suffix = text - - -func _prefix_changed(text: String) -> void: - prefix = text - - -func _get_title() -> String: - return "Character Prefix & Suffix" - - -func _show_title() -> bool: - return true - - -func _start_opened() -> bool: - return false - - -func _load_portrait_data(portrait_data: Dictionary) -> void: - _load_prefix_data(portrait_data) - - -## We load the prefix and suffix from the character's `custom_info` dictionary. -func _load_character(resource: DialogicCharacter) -> void: - _load_prefix_data(resource.custom_info) - - -func _load_prefix_data(data: Dictionary) -> void: - suffix = data.get(SUFFIX_CUSTOM_KEY, DEFAULT_SUFFIX) - prefix = data.get(PREFIX_CUSTOM_KEY, DEFAULT_PREFIX) - - suffix_input.text = suffix - prefix_input.text = prefix - - -## Whenever the user makes a save to the character, we save the prefix and suffix. -func _save_changes(character: DialogicCharacter) -> DialogicCharacter: - if not character: - printerr("[Dialogic] Unable to save Prefix and Suffix, the character is missing.") - return character - - character.custom_info[PREFIX_CUSTOM_KEY] = prefix - character.custom_info[SUFFIX_CUSTOM_KEY] = suffix - - return character diff --git a/godot/addons/dialogic/Editor/CharacterEditor/character_prefix_suffix.gd.uid b/godot/addons/dialogic/Editor/CharacterEditor/character_prefix_suffix.gd.uid deleted file mode 100644 index 7a3aeb7..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/character_prefix_suffix.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://i1ujoar8jf80 diff --git a/godot/addons/dialogic/Editor/CharacterEditor/character_prefix_suffix.tscn b/godot/addons/dialogic/Editor/CharacterEditor/character_prefix_suffix.tscn deleted file mode 100644 index 2ab9c95..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/character_prefix_suffix.tscn +++ /dev/null @@ -1,48 +0,0 @@ -[gd_scene load_steps=3 format=3 uid="uid://1ctcs6ywjjtd"] - -[ext_resource type="PackedScene" uid="uid://dbpkta2tjsqim" path="res://addons/dialogic/Editor/Common/hint_tooltip_icon.tscn" id="1_o3alv"] -[ext_resource type="Script" uid="uid://i1ujoar8jf80" path="res://addons/dialogic/Editor/CharacterEditor/character_prefix_suffix.gd" id="1_tkxff"] - -[node name="CharacterPrefixSuffix" type="GridContainer" node_paths=PackedStringArray("prefix_input", "suffix_input")] -offset_right = 121.0 -offset_bottom = 66.0 -columns = 2 -script = ExtResource("1_tkxff") -prefix_input = NodePath("PrefixInput") -suffix_input = NodePath("SuffixInput") - -[node name="Prefix" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="Label" type="Label" parent="Prefix"] -layout_mode = 2 -text = "Prefix" - -[node name="HintTooltip" parent="Prefix" instance=ExtResource("1_o3alv")] -layout_mode = 2 -texture = null -hint_text = "If a character speaks, this appears before their text. -Example: Color Tags or Quotation Marks." - -[node name="PrefixInput" type="LineEdit" parent="."] -layout_mode = 2 -size_flags_horizontal = 3 -caret_blink = true - -[node name="Suffix" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="Label" type="Label" parent="Suffix"] -layout_mode = 2 -text = "Suffix" - -[node name="HintTooltip" parent="Suffix" instance=ExtResource("1_o3alv")] -layout_mode = 2 -texture = null -hint_text = "If a character speaks, this appears after their text. -Example: Color Tags or Quotation Marks." - -[node name="SuffixInput" type="LineEdit" parent="."] -layout_mode = 2 -size_flags_horizontal = 3 -caret_blink = true diff --git a/godot/addons/dialogic/Editor/CharacterEditor/portrait_scene_browser.gd b/godot/addons/dialogic/Editor/CharacterEditor/portrait_scene_browser.gd deleted file mode 100644 index 119f813..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/portrait_scene_browser.gd +++ /dev/null @@ -1,126 +0,0 @@ -@tool -extends Control - -var ListItem := load("res://addons/dialogic/Editor/Common/BrowserItem.tscn") - -enum Types {ALL, GENERAL, PRESET} -var current_type := Types.ALL -var current_info := {} - -var portrait_scenes_info := {} - -signal activate_part(part_info:Dictionary) - - -func _ready() -> void: - collect_portrait_scenes() - - %Search.right_icon = get_theme_icon("Search", "EditorIcons") - %CloseButton.icon = get_theme_icon("Close", "EditorIcons") - - get_parent().close_requested.connect(_on_close_button_pressed) - get_parent().visibility_changed.connect(func():if get_parent().visible: open()) - - -func collect_portrait_scenes() -> void: - for indexer in DialogicUtil.get_indexers(): - for element in indexer._get_portrait_scene_presets(): - portrait_scenes_info[element.get('path', '')] = element - - -func open() -> void: - collect_portrait_scenes() - load_parts() - - -func is_premade_portrait_scene(scene_path:String) -> bool: - return scene_path in portrait_scenes_info - - -func load_parts() -> void: - for i in %PartGrid.get_children(): - i.queue_free() - - %Search.placeholder_text = "Search for " - %Search.text = "" - match current_type: - Types.GENERAL: %Search.placeholder_text += "general portrait scenes" - Types.PRESET: %Search.placeholder_text += "portrait scene presets" - Types.ALL: %Search.placeholder_text += "general portrait scenes and presets" - - for info in portrait_scenes_info.values(): - var type: String = info.get('type', '_') - if (current_type == Types.GENERAL and type != "General") or (current_type == Types.PRESET and type != "Preset"): - continue - - var item: Node = ListItem.instantiate() - item.load_info(info) - %PartGrid.add_child(item) - item.set_meta('info', info) - item.clicked.connect(_on_item_clicked.bind(item, info)) - item.focused.connect(_on_item_clicked.bind(item, info)) - item.double_clicked.connect(emit_signal.bind('activate_part', info)) - - await get_tree().process_frame - - if %PartGrid.get_child_count() > 0: - %PartGrid.get_child(0).clicked.emit() - %PartGrid.get_child(0).grab_focus() - - -func _on_item_clicked(item: Node, info:Dictionary) -> void: - load_part_info(info) - - -func load_part_info(info:Dictionary) -> void: - current_info = info - %PartTitle.text = info.get('name', 'Unknown Part') - %PartAuthor.text = "by "+info.get('author', 'Anonymus') - %PartDescription.text = info.get('description', '') - - if info.get('preview_image', null) and ResourceLoader.exists(info.preview_image[0]): - %PreviewImage.texture = load(info.preview_image[0]) - %PreviewImage.show() - else: - %PreviewImage.hide() - - match info.type: - "General": - %ActivateButton.text = "Use this scene" - %TypeDescription.text = "This is a general use scene, it can be used directly." - "Preset": - %ActivateButton.text = "Customize this scene" - %TypeDescription.text = "This is a preset you can use for a custom portrait scene. Dialogic will promt you to save a copy of this scene that you can then use and customize." - "Default": - %ActivateButton.text = "Use default scene" - %TypeDescription.text = "" - "Custom": - %ActivateButton.text = "Select a custom scene" - %TypeDescription.text = "" - - if info.get("documentation", ""): - %DocumentationButton.show() - %DocumentationButton.uri = info.documentation - else: - %DocumentationButton.hide() - - -func _on_activate_button_pressed() -> void: - activate_part.emit(current_info) - - -func _on_close_button_pressed() -> void: - get_parent().hide() - - -func _on_search_text_changed(new_text: String) -> void: - for item in %PartGrid.get_children(): - if new_text.is_empty(): - item.show() - continue - - if new_text.to_lower() in item.get_meta('info').name.to_lower(): - item.show() - continue - - item.hide() diff --git a/godot/addons/dialogic/Editor/CharacterEditor/portrait_scene_browser.gd.uid b/godot/addons/dialogic/Editor/CharacterEditor/portrait_scene_browser.gd.uid deleted file mode 100644 index f8b8094..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/portrait_scene_browser.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://iwv7qff6g0f0 diff --git a/godot/addons/dialogic/Editor/CharacterEditor/portrait_scene_browser.tscn b/godot/addons/dialogic/Editor/CharacterEditor/portrait_scene_browser.tscn deleted file mode 100644 index f760591..0000000 --- a/godot/addons/dialogic/Editor/CharacterEditor/portrait_scene_browser.tscn +++ /dev/null @@ -1,260 +0,0 @@ -[gd_scene load_steps=11 format=3 uid="uid://b1wn8r84uh11b"] - -[ext_resource type="Script" uid="uid://iwv7qff6g0f0" path="res://addons/dialogic/Editor/CharacterEditor/portrait_scene_browser.gd" id="1_an6nc"] - -[sub_resource type="Gradient" id="Gradient_0o1u0"] -colors = PackedColorArray(0.100572, 0.303996, 0.476999, 1, 0.296448, 0.231485, 0.52887, 1) - -[sub_resource type="GradientTexture2D" id="GradientTexture2D_gxpvv"] -gradient = SubResource("Gradient_0o1u0") -fill = 2 -fill_from = Vector2(0.478632, 1) -fill_to = Vector2(0, 0) - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_we8bq"] -content_margin_left = 6.0 -content_margin_top = 3.0 -content_margin_right = 6.0 -content_margin_bottom = 3.0 -draw_center = false -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -border_color = Color(1, 1, 1, 0.615686) -corner_radius_top_left = 5 -corner_radius_top_right = 5 -corner_radius_bottom_right = 5 -corner_radius_bottom_left = 5 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_3x0xw"] -content_margin_left = 6.0 -content_margin_top = 3.0 -content_margin_right = 6.0 -content_margin_bottom = 3.0 -draw_center = false -border_width_left = 3 -border_width_top = 3 -border_width_right = 3 -border_width_bottom = 3 -border_color = Color(1, 1, 1, 1) -corner_radius_top_left = 5 -corner_radius_top_right = 5 -corner_radius_bottom_right = 5 -corner_radius_bottom_left = 5 -expand_margin_left = 2.0 -expand_margin_top = 2.0 -expand_margin_right = 2.0 -expand_margin_bottom = 2.0 - -[sub_resource type="Image" id="Image_h0nfr"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_d2gam"] -image = SubResource("Image_h0nfr") - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_lf1ht"] -bg_color = Color(0.0588235, 0.0313726, 0.0980392, 1) -border_width_left = 5 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_a5iyu"] -bg_color = Color(1, 1, 1, 1) -draw_center = false -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 -shadow_color = Color(0.992157, 0.992157, 0.992157, 0.101961) -shadow_size = 10 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_htwsp"] -bg_color = Color(1, 1, 1, 1) -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 - -[node name="PortraitSceneBrowser" type="Control"] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("1_an6nc") - -[node name="BGColor" type="TextureRect" parent="."] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -texture = SubResource("GradientTexture2D_gxpvv") - -[node name="HSplitContainer" type="HSplitContainer" parent="."] -clip_contents = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_vertical = 3 - -[node name="Margin" type="MarginContainer" parent="HSplitContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_stretch_ratio = 1.5 -theme_override_constants/margin_left = 10 -theme_override_constants/margin_top = 10 -theme_override_constants/margin_right = 10 -theme_override_constants/margin_bottom = 10 - -[node name="VBox" type="VBoxContainer" parent="HSplitContainer/Margin"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="BrowserTitle" type="Label" parent="HSplitContainer/Margin/VBox"] -layout_mode = 2 -theme_type_variation = &"DialogicSubTitle" -theme_override_font_sizes/font_size = 25 -text = "Dialogic Portrait Scene Browser" - -[node name="HBox" type="HBoxContainer" parent="HSplitContainer/Margin/VBox"] -layout_mode = 2 - -[node name="Search" type="LineEdit" parent="HSplitContainer/Margin/VBox/HBox"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -theme_override_styles/normal = SubResource("StyleBoxFlat_we8bq") -theme_override_styles/focus = SubResource("StyleBoxFlat_3x0xw") -placeholder_text = "Search" -right_icon = SubResource("ImageTexture_d2gam") - -[node name="ScrollContainer" type="ScrollContainer" parent="HSplitContainer/Margin/VBox"] -layout_mode = 2 -size_flags_vertical = 3 - -[node name="PartGrid" type="HFlowContainer" parent="HSplitContainer/Margin/VBox/ScrollContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="Buttons" type="HBoxContainer" parent="HSplitContainer/Margin/VBox"] -layout_mode = 2 -alignment = 1 - -[node name="CloseButton" type="Button" parent="HSplitContainer/Margin/VBox/Buttons"] -unique_name_in_owner = true -layout_mode = 2 -text = "Close" -icon = SubResource("ImageTexture_d2gam") - -[node name="PanelContainer" type="PanelContainer" parent="HSplitContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -theme_override_styles/panel = SubResource("StyleBoxFlat_lf1ht") - -[node name="Control" type="Control" parent="HSplitContainer/PanelContainer"] -layout_mode = 2 - -[node name="Panel" type="Panel" parent="HSplitContainer/PanelContainer/Control"] -layout_mode = 1 -anchors_preset = 9 -anchor_bottom = 1.0 -offset_left = -4.0 -offset_right = 40.0 -offset_bottom = 71.0 -grow_vertical = 2 -rotation = 0.0349066 -theme_override_styles/panel = SubResource("StyleBoxFlat_lf1ht") - -[node name="MarginContainer" type="MarginContainer" parent="HSplitContainer/PanelContainer"] -layout_mode = 2 -theme_override_constants/margin_left = 5 -theme_override_constants/margin_top = 10 -theme_override_constants/margin_right = 10 -theme_override_constants/margin_bottom = 10 - -[node name="VBox" type="VBoxContainer" parent="HSplitContainer/PanelContainer/MarginContainer"] -layout_mode = 2 -alignment = 1 - -[node name="Panel" type="PanelContainer" parent="HSplitContainer/PanelContainer/MarginContainer/VBox"] -layout_mode = 2 -theme_override_styles/panel = SubResource("StyleBoxFlat_a5iyu") - -[node name="Panel" type="PanelContainer" parent="HSplitContainer/PanelContainer/MarginContainer/VBox/Panel"] -clip_children = 1 -layout_mode = 2 -theme_override_styles/panel = SubResource("StyleBoxFlat_htwsp") - -[node name="PreviewImage" type="TextureRect" parent="HSplitContainer/PanelContainer/MarginContainer/VBox/Panel/Panel"] -unique_name_in_owner = true -layout_mode = 2 -expand_mode = 5 -stretch_mode = 6 - -[node name="HFlowContainer" type="HFlowContainer" parent="HSplitContainer/PanelContainer/MarginContainer/VBox"] -layout_mode = 2 - -[node name="PartTitle" type="Label" parent="HSplitContainer/PanelContainer/MarginContainer/VBox/HFlowContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 8 -theme_type_variation = &"DialogicTitle" -text = "Cool Style Part" - -[node name="PartAuthor" type="Label" parent="HSplitContainer/PanelContainer/MarginContainer/VBox/HFlowContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 8 -theme_type_variation = &"DialogicHintText" -text = "by Jowan" - -[node name="PartType" type="Label" parent="HSplitContainer/PanelContainer/MarginContainer/VBox/HFlowContainer"] -visible = false -layout_mode = 2 -size_flags_vertical = 8 -theme_type_variation = &"DialogicHintText" -text = "a style" - -[node name="PartDescription" type="Label" parent="HSplitContainer/PanelContainer/MarginContainer/VBox"] -unique_name_in_owner = true -layout_mode = 2 -theme_type_variation = &"DialogicHintText2" -text = "A cool textbox layer" -autowrap_mode = 3 - -[node name="DocumentationButton" type="LinkButton" parent="HSplitContainer/PanelContainer/MarginContainer/VBox"] -unique_name_in_owner = true -layout_mode = 2 -text = "Learn more" - -[node name="HSeparator" type="HSeparator" parent="HSplitContainer/PanelContainer/MarginContainer/VBox"] -layout_mode = 2 - -[node name="ActivateButton" type="Button" parent="HSplitContainer/PanelContainer/MarginContainer/VBox"] -unique_name_in_owner = true -layout_mode = 2 -text = "Use" - -[node name="TypeDescription" type="Label" parent="HSplitContainer/PanelContainer/MarginContainer/VBox"] -unique_name_in_owner = true -layout_mode = 2 -theme_type_variation = &"DialogicHintText" -text = "A cool textbox layer" -autowrap_mode = 3 - -[connection signal="text_changed" from="HSplitContainer/Margin/VBox/HBox/Search" to="." method="_on_search_text_changed"] -[connection signal="pressed" from="HSplitContainer/Margin/VBox/Buttons/CloseButton" to="." method="_on_close_button_pressed"] -[connection signal="pressed" from="HSplitContainer/PanelContainer/MarginContainer/VBox/ActivateButton" to="." method="_on_activate_button_pressed"] diff --git a/godot/addons/dialogic/Editor/Common/BrowserItem.gd b/godot/addons/dialogic/Editor/Common/BrowserItem.gd deleted file mode 100644 index 7bfb3cf..0000000 --- a/godot/addons/dialogic/Editor/Common/BrowserItem.gd +++ /dev/null @@ -1,86 +0,0 @@ -@tool -extends Container - -signal clicked -signal middle_clicked -signal double_clicked -signal focused - -var base_size := 1 - - -func _ready() -> void: - if get_parent() is SubViewport: - return - - %Name.add_theme_font_override("font", get_theme_font("bold", "EditorFonts")) - custom_minimum_size = base_size * Vector2(200, 150) * DialogicUtil.get_editor_scale() - %CurrentIcon.texture = get_theme_icon("Favorites", "EditorIcons") - if %Image.texture == null: - %Image.texture = get_theme_icon("ImportFail", "EditorIcons") - %Image.stretch_mode = TextureRect.STRETCH_KEEP_CENTERED - - -func load_info(info:Dictionary) -> void: - %Name.text = info.name - if not info.has("preview_image"): - pass - elif info.preview_image[0] == 'custom': - await ready - %Image.texture = get_theme_icon("CreateNewSceneFrom", "EditorIcons") - %Image.stretch_mode = TextureRect.STRETCH_KEEP_CENTERED - %Panel.self_modulate = get_theme_color("property_color_z", "Editor") - elif info.preview_image[0].ends_with('scn'): - DialogicUtil.get_dialogic_plugin().get_editor_interface().get_resource_previewer().queue_resource_preview(info.preview_image[0], self, 'set_scene_preview', null) - elif ResourceLoader.exists(info.preview_image[0]): - %Image.texture = load(info.preview_image[0]) - elif info.preview_image[0].is_valid_html_color(): - %Image.texture = null - %Panel.self_modulate = Color(info.preview_image[0]) - - if ResourceLoader.exists(info.get('icon', '')): - %Icon.get_parent().show() - %Icon.texture = load(info.get('icon')) - else: - %Icon.get_parent().hide() - - tooltip_text = info.description - - -func set_scene_preview(path:String, preview:Texture2D, thumbnail:Texture2D, userdata:Variant) -> void: - if preview: - %Image.texture = preview - else: - %Image.texture = get_theme_icon("PackedScene", "EditorIcons") - - - -func set_current(current:bool): - %CurrentIcon.visible = current - - -func _on_mouse_entered() -> void: - %HoverBG.show() - - -func _on_mouse_exited() -> void: - %HoverBG.hide() - - -func _on_gui_input(event): - if event.is_action_pressed('ui_accept') or event.is_action_pressed("ui_select") or ( - event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT): - clicked.emit() - if not event is InputEventMouseButton or event.double_click: - double_clicked.emit() - elif event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_MIDDLE: - middle_clicked.emit() - - -func _on_focus_entered() -> void: - $FocusFG.show() - focused.emit() - - -func _on_focus_exited() -> void: - $FocusFG.hide() diff --git a/godot/addons/dialogic/Editor/Common/BrowserItem.gd.uid b/godot/addons/dialogic/Editor/Common/BrowserItem.gd.uid deleted file mode 100644 index 6dc7cc1..0000000 --- a/godot/addons/dialogic/Editor/Common/BrowserItem.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ckthmmkodqqwt diff --git a/godot/addons/dialogic/Editor/Common/BrowserItem.tscn b/godot/addons/dialogic/Editor/Common/BrowserItem.tscn deleted file mode 100644 index 8d47d20..0000000 --- a/godot/addons/dialogic/Editor/Common/BrowserItem.tscn +++ /dev/null @@ -1,154 +0,0 @@ -[gd_scene load_steps=6 format=3 uid="uid://ddlxjde1cx035"] - -[ext_resource type="Script" uid="uid://ckthmmkodqqwt" path="res://addons/dialogic/Editor/Common/BrowserItem.gd" id="1_s3kf0"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_pfw08"] -bg_color = Color(1, 1, 1, 0.32549) -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 -expand_margin_left = 4.0 -expand_margin_top = 4.0 -expand_margin_right = 4.0 -expand_margin_bottom = 4.0 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ab24c"] -bg_color = Color(1, 1, 1, 1) -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_qnehp"] -bg_color = Color(0, 0, 0, 1) -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 -shadow_color = Color(0.847059, 0.847059, 0.847059, 0.384314) -shadow_size = 5 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_nxx8t"] -bg_color = Color(0.435294, 0.435294, 0.435294, 0.211765) -draw_center = false -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 -expand_margin_left = 4.0 -expand_margin_top = 4.0 -expand_margin_right = 4.0 -expand_margin_bottom = 4.0 - -[node name="BrowserItem" type="MarginContainer"] -custom_minimum_size = Vector2(200, 150) -offset_left = 1.0 -offset_top = 1.0 -offset_right = 128.0 -offset_bottom = 102.0 -size_flags_horizontal = 0 -focus_mode = 2 -theme_override_constants/margin_left = 4 -theme_override_constants/margin_top = 4 -theme_override_constants/margin_right = 4 -theme_override_constants/margin_bottom = 4 -script = ExtResource("1_s3kf0") - -[node name="HoverBG" type="Panel" parent="."] -unique_name_in_owner = true -visible = false -layout_mode = 2 -mouse_filter = 2 -theme_override_styles/panel = SubResource("StyleBoxFlat_pfw08") - -[node name="VBox" type="VBoxContainer" parent="."] -layout_mode = 2 -mouse_filter = 2 -theme_override_constants/separation = 0 -alignment = 1 - -[node name="Panel" type="PanelContainer" parent="VBox"] -unique_name_in_owner = true -self_modulate = Color(0.0705882, 0.0705882, 0.0705882, 1) -clip_children = 2 -layout_mode = 2 -size_flags_vertical = 3 -mouse_filter = 2 -theme_override_styles/panel = SubResource("StyleBoxFlat_ab24c") - -[node name="Image" type="TextureRect" parent="VBox/Panel"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 3 -mouse_filter = 2 -expand_mode = 1 -stretch_mode = 6 - -[node name="CurrentIcon" type="TextureRect" parent="VBox/Panel/Image"] -unique_name_in_owner = true -visible = false -layout_mode = 1 -anchors_preset = 1 -anchor_left = 1.0 -anchor_right = 1.0 -offset_left = -22.0 -offset_top = 5.0 -offset_right = -6.0 -offset_bottom = 21.0 -grow_horizontal = 0 -tooltip_text = "Currently in use" -stretch_mode = 2 - -[node name="Panel" type="Panel" parent="VBox/Panel/Image"] -layout_mode = 1 -anchors_preset = 3 -anchor_left = 1.0 -anchor_top = 1.0 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = -37.0 -offset_top = -36.0 -offset_right = -7.0 -offset_bottom = -6.0 -grow_horizontal = 0 -grow_vertical = 0 -theme_override_styles/panel = SubResource("StyleBoxFlat_qnehp") - -[node name="Icon" type="TextureRect" parent="VBox/Panel/Image/Panel"] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = 4.0 -offset_top = 4.0 -offset_right = -4.0 -offset_bottom = -4.0 -grow_horizontal = 2 -grow_vertical = 2 -expand_mode = 1 -stretch_mode = 5 - -[node name="Name" type="Label" parent="VBox"] -unique_name_in_owner = true -layout_mode = 2 -text = "Dialogic Theme" -horizontal_alignment = 1 - -[node name="FocusFG" type="Panel" parent="."] -unique_name_in_owner = true -visible = false -layout_mode = 2 -mouse_filter = 2 -theme_override_styles/panel = SubResource("StyleBoxFlat_nxx8t") - -[connection signal="focus_entered" from="." to="." method="_on_focus_entered"] -[connection signal="focus_exited" from="." to="." method="_on_focus_exited"] -[connection signal="gui_input" from="." to="." method="_on_gui_input"] -[connection signal="mouse_entered" from="." to="." method="_on_mouse_entered"] -[connection signal="mouse_exited" from="." to="." method="_on_mouse_exited"] diff --git a/godot/addons/dialogic/Editor/Common/DCSS.gd b/godot/addons/dialogic/Editor/Common/DCSS.gd deleted file mode 100644 index 2a1f95a..0000000 --- a/godot/addons/dialogic/Editor/Common/DCSS.gd +++ /dev/null @@ -1,47 +0,0 @@ -@tool -class_name DCSS - -static func inline(style: Dictionary) -> StyleBoxFlat: - var scale: float = DialogicUtil.get_editor_scale() - var s := StyleBoxFlat.new() - for property in style.keys(): - match property: - 'border-left': - s.set('border_width_left', style[property] * scale) - 'border-radius': - var radius: float = style[property] * scale - s.set('corner_radius_top_left', radius) - s.set('corner_radius_top_right', radius) - s.set('corner_radius_bottom_left', radius) - s.set('corner_radius_bottom_right', radius) - 'background': - if typeof(style[property]) == TYPE_STRING and style[property] == "none": - s.set('draw_center', false) - else: - s.set('bg_color', style[property]) - 'border': - var width: float = style[property] * scale - s.set('border_width_left', width) - s.set('border_width_right', width) - s.set('border_width_top', width) - s.set('border_width_bottom', width) - 'border-color': - s.set('border_color', style[property]) - 'padding': - var value_v: float = 0.0 - var value_h: float = 0.0 - if style[property] is int: - value_v = style[property] * scale - value_h = value_v - else: - value_v = style[property][0] * scale - value_h = style[property][1] * scale - s.set('content_margin_top', value_v) - s.set('content_margin_bottom', value_v) - s.set('content_margin_left', value_h) - s.set('content_margin_right', value_h) - 'padding-right': - s.set('content_margin_right', style[property] * scale) - 'padding-left': - s.set('content_margin_left', style[property] * scale) - return s diff --git a/godot/addons/dialogic/Editor/Common/DCSS.gd.uid b/godot/addons/dialogic/Editor/Common/DCSS.gd.uid deleted file mode 100644 index 6f4fa14..0000000 --- a/godot/addons/dialogic/Editor/Common/DCSS.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://m3ufop8ao16l diff --git a/godot/addons/dialogic/Editor/Common/ReferenceManager_AddReplacementPanel.gd b/godot/addons/dialogic/Editor/Common/ReferenceManager_AddReplacementPanel.gd deleted file mode 100644 index 7d3f355..0000000 --- a/godot/addons/dialogic/Editor/Common/ReferenceManager_AddReplacementPanel.gd +++ /dev/null @@ -1,122 +0,0 @@ -@tool -extends PanelContainer - - -enum Modes {EDIT, ADD} - -var mode := Modes.EDIT -var item: TreeItem = null - - -func _ready() -> void: - hide() - %Character.resource_icon = load("res://addons/dialogic/Editor/Images/Resources/character.svg") - %Character.suggestions_func = get_character_suggestions - - %WholeWords.icon = get_theme_icon("FontItem", "EditorIcons") - %MatchCase.icon = get_theme_icon("MatchCase", "EditorIcons") - -func _on_add_pressed() -> void: - if visible: - if mode == Modes.ADD: - hide() - return - elif mode == Modes.EDIT: - save() - - %AddButton.text = "Add" - mode = Modes.ADD - show() - %Type.selected = 0 - _on_type_item_selected(0) - %Where.selected = 2 - _on_where_item_selected(2) - %Old.text = "" - %New.text = "" - - -func open_existing(_item:TreeItem, info:Dictionary): - mode = Modes.EDIT - item = _item - show() - %AddButton.text = "Update" - %Type.selected = info.type - _on_type_item_selected(info.type) - if !info.character_names.is_empty(): - %Where.selected = 1 - %Character.set_value(info.character_names[0]) - else: - %Where.selected = 0 - _on_where_item_selected(%Where.selected) - - %Old.text = info.what - %New.text = info.forwhat - - %MatchCase.button_pressed = info.case_sensitive - %WholeWords.button_pressed = info.whole_words - -func _on_type_item_selected(index:int) -> void: - match index: - 0: - %Where.select(0) - %Where.set_item_disabled(0, false) - %Where.set_item_disabled(1, false) - %Where.set_item_disabled(2, true) - 1: - %Where.select(0) - %Where.set_item_disabled(0, false) - %Where.set_item_disabled(1, false) - %Where.set_item_disabled(2, true) - 2: - %Where.select(1) - %Where.set_item_disabled(0, true) - %Where.set_item_disabled(1, false) - %Where.set_item_disabled(2, true) - 3,4: - %Where.select(0) - %Where.set_item_disabled(0, false) - %Where.set_item_disabled(1, true) - %Where.set_item_disabled(2, true) - %PureTextFlags.visible = index == 0 - _on_where_item_selected(%Where.selected) - - -func _on_where_item_selected(index:int) -> void: - %Character.visible = index == 1 - - -func get_character_suggestions(search_text:String) -> Dictionary: - var suggestions := {} - - #override the previous _character_directory with the meta, specifically for searching otherwise new nodes wont work - var _character_directory := DialogicResourceUtil.get_character_directory() - - var icon := load("res://addons/dialogic/Editor/Images/Resources/character.svg") - suggestions['(No one)'] = {'value':null, 'editor_icon':["GuiRadioUnchecked", "EditorIcons"]} - - for resource in _character_directory.keys(): - suggestions[resource] = { - 'value' : resource, - 'tooltip' : _character_directory[resource], - 'icon' : icon.duplicate()} - return suggestions - - -func save() -> void: - if %Old.text.is_empty() or %New.text.is_empty(): - return - if %Where.selected == 1 and %Character.current_value == null: - return - - var previous := {} - if mode == Modes.EDIT: - previous = item.get_metadata(0) - item.get_parent() - item.free() - - var ref_manager := find_parent('ReferenceManager') - var character_names := [] - if %Character.current_value != null: - character_names = [%Character.current_value] - ref_manager.add_ref_change(%Old.text, %New.text, %Type.selected, %Where.selected, character_names, %WholeWords.button_pressed, %MatchCase.button_pressed, previous) - hide() diff --git a/godot/addons/dialogic/Editor/Common/ReferenceManager_AddReplacementPanel.gd.uid b/godot/addons/dialogic/Editor/Common/ReferenceManager_AddReplacementPanel.gd.uid deleted file mode 100644 index 6b38dc4..0000000 --- a/godot/addons/dialogic/Editor/Common/ReferenceManager_AddReplacementPanel.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dca6a1a74jfur diff --git a/godot/addons/dialogic/Editor/Common/TitleBgStylebox.tres b/godot/addons/dialogic/Editor/Common/TitleBgStylebox.tres deleted file mode 100644 index f08bb2c..0000000 --- a/godot/addons/dialogic/Editor/Common/TitleBgStylebox.tres +++ /dev/null @@ -1,8 +0,0 @@ -[gd_resource type="StyleBoxFlat" format=3 uid="uid://dmsjhgv22dns8"] - -[resource] -content_margin_left = 5.0 -content_margin_top = 5.0 -content_margin_right = 5.0 -content_margin_bottom = 5.0 -bg_color = Color(0.545098, 0.545098, 0.545098, 0.211765) diff --git a/godot/addons/dialogic/Editor/Common/broken_reference_manager.gd b/godot/addons/dialogic/Editor/Common/broken_reference_manager.gd deleted file mode 100644 index 5113c54..0000000 --- a/godot/addons/dialogic/Editor/Common/broken_reference_manager.gd +++ /dev/null @@ -1,391 +0,0 @@ -@tool -extends VSplitContainer - -## This manager shows a list of changed references and allows searching for them and replacing them. - -var reference_changes: Array[Dictionary] = []: - set(changes): - reference_changes = changes - update_indicator() - -var search_regexes: Array[Array] -var finder_thread: Thread -var progress_mutex: Mutex -var progress_percent: float = 0.0 -var progress_message: String = "" - - -func _ready() -> void: - if owner.get_parent() is SubViewport: - return - - %TabA.text = "Broken References" - %TabA.icon = get_theme_icon("Unlinked", "EditorIcons") - - owner.get_parent().visibility_changed.connect(func(): if is_visible_in_tree(): open()) - - %ReplacementSection.hide() - - %CheckButton.icon = get_theme_icon("Search", "EditorIcons") - %Replace.icon = get_theme_icon("ArrowRight", "EditorIcons") - - %State.add_theme_color_override("font_color", get_theme_color("warning_color", "Editor")) - visibility_changed.connect(func(): if !visible: close()) - await get_parent().ready - - var tab_button: Control = %TabA - var dot := Sprite2D.new() - dot.texture = get_theme_icon("GuiGraphNodePort", "EditorIcons") - dot.scale = Vector2(0.8, 0.8) - dot.z_index = 10 - dot.position = Vector2(tab_button.size.x, tab_button.size.y*0.25) - dot.modulate = get_theme_color("warning_color", "Editor").lightened(0.5) - - tab_button.add_child(dot) - update_indicator() - - -func open() -> void: - %ReplacementEditPanel.hide() - %ReplacementSection.hide() - %ChangeTree.clear() - %ChangeTree.create_item() - %ChangeTree.set_column_expand(0, false) - %ChangeTree.set_column_expand(2, false) - %ChangeTree.set_column_custom_minimum_width(2, 50) - var categories := {null:%ChangeTree.get_root()} - for i in reference_changes: - var parent: TreeItem = null - if !i.get('category', null) in categories: - parent = %ChangeTree.create_item() - parent.set_text(1, i.category) - parent.set_custom_color(1, get_theme_color("disabled_font_color", "Editor")) - categories[i.category] = parent - else: - parent = categories[i.get('category')] - - var item: TreeItem = %ChangeTree.create_item(parent) - item.set_text(1, i.what+" -> "+i.forwhat) - item.add_button(1, get_theme_icon("Edit", "EditorIcons"), 1, false, 'Edit') - item.add_button(1, get_theme_icon("Remove", "EditorIcons"), 0, false, 'Remove Change from List') - item.set_cell_mode(0, TreeItem.CELL_MODE_CHECK) - item.set_checked(0, true) - item.set_editable(0, true) - item.set_metadata(0, i) - %CheckButton.disabled = reference_changes.is_empty() - - -func _on_change_tree_button_clicked(item:TreeItem, column:int, id:int, mouse_button_index:int) -> void: - if id == 0: - reference_changes.erase(item.get_metadata(0)) - if item.get_parent().get_child_count() == 1: - item.get_parent().free() - else: - item.free() - update_indicator() - %CheckButton.disabled = reference_changes.is_empty() - - if id == 1: - %ReplacementEditPanel.open_existing(item, item.get_metadata(0)) - - %ReplacementSection.hide() - - -func _on_change_tree_item_edited() -> void: - if !%ChangeTree.get_selected(): - return - %CheckButton.disabled = false - - -func _on_check_button_pressed() -> void: - var to_be_checked: Array[Dictionary]= [] - var item: TreeItem = %ChangeTree.get_root() - while item.get_next_visible(): - item = item.get_next_visible() - - if item.get_child_count(): - continue - - if item.is_checked(0): - to_be_checked.append(item.get_metadata(0)) - to_be_checked[-1]['item'] = item - to_be_checked[-1]['count'] = 0 - - open_finder(to_be_checked) - %CheckButton.disabled = true - - -func open_finder(replacements:Array[Dictionary]) -> void: - %ReplacementSection.show() - %Progress.show() - %ReferenceTree.hide() - - search_regexes = [] - for i in replacements: - if i.has('character_names') and !i.character_names.is_empty(): - i['character_regex'] = RegEx.create_from_string("(?m)^(join|update|leave)?\\s*("+str(i.character_names).replace('"', '').replace(', ', '|').trim_suffix(']').trim_prefix('[').replace('/', '\\/')+")(?(1).*|.*:)") - - for regex_string in i.regex: - var regex := RegEx.create_from_string(regex_string) - search_regexes.append([regex, i]) - - finder_thread = Thread.new() - progress_mutex = Mutex.new() - finder_thread.start(search_timelines.bind(search_regexes)) - - -func _process(delta: float) -> void: - if finder_thread and finder_thread.is_started(): - if finder_thread.is_alive(): - progress_mutex.lock() - %State.text = progress_message - %Progress.value = progress_percent - progress_mutex.unlock() - else: - var finds: Variant = finder_thread.wait_to_finish() - display_search_results(finds) - - - -func display_search_results(finds:Array[Dictionary]) -> void: - %Progress.hide() - %ReferenceTree.show() - for regex_info in search_regexes: - regex_info[1]['item'].set_text(2, str(regex_info[1]['count'])) - - update_count_coloring() - %State.text = str(len(finds))+ " occurrences found" - - %ReferenceTree.clear() - %ReferenceTree.set_column_expand(0, false) - %ReferenceTree.set_column_expand(1, false) - %ReferenceTree.set_column_custom_minimum_width(1, 50) - %ReferenceTree.create_item() - - var timelines := {} - var height := 0 - for i in finds: - var parent: TreeItem = null - if !i.timeline in timelines: - parent = %ReferenceTree.create_item() - parent.set_text(0, i.timeline) - parent.set_custom_color(0, get_theme_color("disabled_font_color", "Editor")) - parent.set_expand_right(0, true) - timelines[i.timeline] = parent - height += %ReferenceTree.get_item_area_rect(parent).size.y+10 - else: - parent = timelines[i.timeline] - - var item: TreeItem = %ReferenceTree.create_item(parent) - item.set_cell_mode(0, TreeItem.CELL_MODE_CHECK) - item.set_checked(0, true) - item.set_editable(0, true) - item.set_metadata(0, i) - item.set_text(1, str(i.line_number)+':') - item.set_text_alignment(1, HORIZONTAL_ALIGNMENT_RIGHT) - item.set_cell_mode(2, TreeItem.CELL_MODE_CUSTOM) - item.set_text(2, i.line) - item.set_tooltip_text(2, i.info.what+' -> '+i.info.forwhat) - item.set_custom_draw_callback(2, _custom_draw) - height += %ReferenceTree.get_item_area_rect(item).size.y+10 - var change_item: TreeItem = i.info.item - change_item.set_meta('found_items', change_item.get_meta('found_items', [])+[item]) - - %ReferenceTree.custom_minimum_size.y = min(height, 200) - - %ReferenceTree.visible = !finds.is_empty() - %Replace.disabled = finds.is_empty() - if finds.is_empty(): - %State.text = "Nothing found" - else: - %Replace.grab_focus() - - -## Highlights the found text in the result tree -## Inspired by how godot highlights stuff in its search results -func _custom_draw(item:TreeItem, rect:Rect2) -> void: - var text := item.get_text(2) - var find: Dictionary = item.get_metadata(0) - - var font: Font = %ReferenceTree.get_theme_font("font") - var font_size: int = %ReferenceTree.get_theme_font_size("font_size") - - var match_rect := rect - var beginning_index: int = find.match.get_start("replace")-find.line_start-1 - match_rect.position.x += font.get_string_size(text.left(beginning_index), HORIZONTAL_ALIGNMENT_LEFT, -1, font_size).x -1 - match_rect.size.x = font.get_string_size(find.info.what, HORIZONTAL_ALIGNMENT_LEFT, -1, font_size).x + 1 - match_rect.position.y += 1 * DialogicUtil.get_editor_scale() - match_rect.size.y -= 2 * DialogicUtil.get_editor_scale() - match_rect.position.x += 4 - - %ReferenceTree.draw_rect(match_rect, get_theme_color("highlight_color", "Editor"), true) - %ReferenceTree.draw_rect(match_rect, get_theme_color("box_selection_stroke_color", "Editor"), false) - - -func search_timelines(regexes:Array[Array]) -> Array[Dictionary]: - var finds: Array[Dictionary] = [] - - var timeline_paths := DialogicResourceUtil.list_resources_of_type('.dtl') - - var progress := 0 - var progress_max: float = len(timeline_paths)*len(regexes) - - for timeline_path:String in timeline_paths: - - var timeline_file := FileAccess.open(timeline_path, FileAccess.READ) - var timeline_text: String = timeline_file.get_as_text() - var timeline_event: PackedStringArray = timeline_text.split('\n') - timeline_file.close() - - for regex_info in regexes: - progress += 1 - progress_mutex.lock() - progress_percent = 1/progress_max*progress - progress_message = "Searching '"+timeline_path+"' for "+regex_info[1].what+' -> '+regex_info[1].forwhat - progress_mutex.unlock() - for i in regex_info[0].search_all(timeline_text): - if regex_info[1].has('character_regex'): - if regex_info[1].character_regex.search(get_line(timeline_text, i.get_start()+1)) == null: - continue - - var line_number := timeline_text.count('\n', 0, i.get_start()+1)+1 - var line := timeline_text.get_slice('\n', line_number-1) - finds.append({ - 'match':i, - 'timeline':timeline_path, - 'info': regex_info[1], - 'line_number': line_number, - 'line': line, - 'line_start': timeline_text.rfind('\n', i.get_start()) - }) - regex_info[1]['count'] += 1 - return finds - - -func _exit_tree() -> void: - # Shutting of - if finder_thread and finder_thread.is_alive(): - finder_thread.wait_to_finish() - - -func get_line(string:String, at_index:int) -> String: - return string.substr(max(string.rfind('\n', at_index), 0), string.find('\n', at_index)-string.rfind('\n', at_index)) - - -func update_count_coloring() -> void: - var item: TreeItem = %ChangeTree.get_root() - while item.get_next_visible(): - item = item.get_next_visible() - - if item.get_child_count(): - continue - if int(item.get_text(2)) > 0: - item.set_custom_bg_color(1, get_theme_color("warning_color", "Editor").darkened(0.8)) - item.set_custom_color(1, get_theme_color("warning_color", "Editor")) - item.set_custom_color(2, get_theme_color("warning_color", "Editor")) - else: - item.set_custom_color(2, get_theme_color("success_color", "Editor")) - item.set_custom_color(1, get_theme_color("readonly_font_color", "Editor")) - if item.get_button_count(1): - item.erase_button(1, 1) - item.add_button(1, get_theme_icon("Eraser", "EditorIcons"), -1, true, "This reference was not found anywhere and will be removed from this list.") - - -func _on_replace_pressed() -> void: - var to_be_replaced: Array[Dictionary]= [] - var item: TreeItem = %ReferenceTree.get_root() - var affected_timelines: Array[String]= [] - - while item.get_next_visible(): - item = item.get_next_visible() - - if item.get_child_count(): - continue - - if item.is_checked(0): - to_be_replaced.append(item.get_metadata(0)) - to_be_replaced[-1]['f_item'] = item - if !item.get_metadata(0).timeline in affected_timelines: - affected_timelines.append(item.get_metadata(0).timeline) - replace(affected_timelines, to_be_replaced) - - -func replace(timelines:Array[String], replacement_info:Array[Dictionary]) -> void: - var reopen_timeline := "" - var timeline_editor: DialogicEditor = find_parent('EditorView').editors_manager.editors['Timeline'].node - if timeline_editor.current_resource != null and timeline_editor.current_resource.resource_path in timelines: - reopen_timeline = timeline_editor.current_resource.resource_path - find_parent('EditorView').editors_manager.clear_editor(timeline_editor) - - replacement_info.sort_custom(func(a,b): return a.match.get_start() < b.match.get_start()) - - for timeline_path in timelines: - %State.text = "Loading '"+timeline_path+"'" - - var timeline_file := FileAccess.open(timeline_path, FileAccess.READ_WRITE) - var timeline_text: String = timeline_file.get_as_text() - var timeline_events := timeline_text.split('\n') - timeline_file.close() - - var idx := 1 - var offset_correction := 0 - for replacement in replacement_info: - if replacement.timeline != timeline_path: - continue - - %State.text = "Replacing in '"+timeline_path + "' ("+str(idx)+"/"+str(len(replacement_info))+")" - var group := 'replace' - if not 'replace' in replacement.match.names: - group = '' - - - timeline_text = timeline_text.substr(0, replacement.match.get_start(group) + offset_correction) + \ - replacement.info.regex_replacement + \ - timeline_text.substr(replacement.match.get_end(group) + offset_correction) - offset_correction += len(replacement.info.regex_replacement)-len(replacement.match.get_string(group)) - - replacement.info.count -= 1 - replacement.info.item.set_text(2, str(replacement.info.count)) - replacement.f_item.set_custom_bg_color(1, get_theme_color("success_color", "Editor").darkened(0.8)) - - timeline_file = FileAccess.open(timeline_path, FileAccess.WRITE) - timeline_file.store_string(timeline_text.strip_edges(false, true)) - timeline_file.close() - - if ResourceLoader.has_cached(timeline_path): - var tml := load(timeline_path) - tml.from_text(timeline_text) - - if !reopen_timeline.is_empty(): - find_parent('EditorView').editors_manager.edit_resource(load(reopen_timeline), false, true) - - update_count_coloring() - - %Replace.disabled = true - %CheckButton.disabled = false - %State.text = "Done Replacing" - - -func update_indicator() -> void: - %TabA.get_child(0).visible = !reference_changes.is_empty() - - -func close() -> void: - var item: TreeItem = %ChangeTree.get_root() - if item: - while item.get_next_visible(): - item = item.get_next_visible() - - if item.get_child_count(): - continue - if item.get_text(2) != "" and int(item.get_text(2)) == 0: - reference_changes.erase(item.get_metadata(0)) - for i in reference_changes: - i.item = null - DialogicUtil.set_editor_setting('reference_changes', reference_changes) - update_indicator() - find_parent("ReferenceManager").update_indicator() - - -func _on_add_button_pressed() -> void: - %ReplacementEditPanel._on_add_pressed() diff --git a/godot/addons/dialogic/Editor/Common/broken_reference_manager.gd.uid b/godot/addons/dialogic/Editor/Common/broken_reference_manager.gd.uid deleted file mode 100644 index c18902b..0000000 --- a/godot/addons/dialogic/Editor/Common/broken_reference_manager.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://nrhtjk2rgmgk diff --git a/godot/addons/dialogic/Editor/Common/hint_tooltip_icon.gd b/godot/addons/dialogic/Editor/Common/hint_tooltip_icon.gd deleted file mode 100644 index 702fe98..0000000 --- a/godot/addons/dialogic/Editor/Common/hint_tooltip_icon.gd +++ /dev/null @@ -1,12 +0,0 @@ -@tool -extends TextureRect - -@export_multiline var hint_text := "" - -func _ready() -> void: - if owner and owner.get_parent() is SubViewport: - texture = null - return - texture = get_theme_icon("NodeInfo", "EditorIcons") - modulate = get_theme_color("contrast_color_1", "Editor") - tooltip_text = hint_text diff --git a/godot/addons/dialogic/Editor/Common/hint_tooltip_icon.gd.uid b/godot/addons/dialogic/Editor/Common/hint_tooltip_icon.gd.uid deleted file mode 100644 index 9aeec68..0000000 --- a/godot/addons/dialogic/Editor/Common/hint_tooltip_icon.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b0vm440bs3ckd diff --git a/godot/addons/dialogic/Editor/Common/hint_tooltip_icon.tscn b/godot/addons/dialogic/Editor/Common/hint_tooltip_icon.tscn deleted file mode 100644 index b12c058..0000000 --- a/godot/addons/dialogic/Editor/Common/hint_tooltip_icon.tscn +++ /dev/null @@ -1,21 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://dbpkta2tjsqim"] - -[ext_resource type="Script" uid="uid://b0vm440bs3ckd" path="res://addons/dialogic/Editor/Common/hint_tooltip_icon.gd" id="1_x8t45"] - -[sub_resource type="Image" id="Image_c5s34"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_ydy7j"] -image = SubResource("Image_c5s34") - -[node name="HintTooltip" type="TextureRect"] -modulate = Color(0, 0, 0, 1) -texture = SubResource("ImageTexture_ydy7j") -stretch_mode = 3 -script = ExtResource("1_x8t45") diff --git a/godot/addons/dialogic/Editor/Common/reference_manager.gd b/godot/addons/dialogic/Editor/Common/reference_manager.gd deleted file mode 100644 index 915e594..0000000 --- a/godot/addons/dialogic/Editor/Common/reference_manager.gd +++ /dev/null @@ -1,38 +0,0 @@ -@tool -extends PanelContainer - - -func _ready() -> void: - if get_parent() is SubViewport: - return - - add_theme_stylebox_override("panel", get_theme_stylebox("Background", "EditorStyles")) - $Tabs/Close.icon = get_theme_icon("Close", "EditorIcons") - - for tab in $Tabs/Tabs.get_children(): - tab.add_theme_color_override("font_selected_color", get_theme_color("accent_color", "Editor")) - tab.add_theme_font_override("font", get_theme_font("main", "EditorFonts")) - tab.toggled.connect(tab_changed.bind(tab.get_index()+1)) - - -func tab_changed(enabled:bool, index:int) -> void: - for child in $Tabs.get_children(): - if child.get_index() == 0 or child.get_index() == index or child is Button: - child.show() - if child.get_index() == index: - child.open() - else: - if child.visible: - child.close() - child.hide() - for child in $Tabs/Tabs.get_children(): - child.set_pressed_no_signal(index-1 == child.get_index()) - - -func open() -> void: - show() - $Tabs/BrokenReferences.update_indicator() - - -func _on_close_pressed() -> void: - get_parent()._on_close_requested() diff --git a/godot/addons/dialogic/Editor/Common/reference_manager.gd.uid b/godot/addons/dialogic/Editor/Common/reference_manager.gd.uid deleted file mode 100644 index 566b3ec..0000000 --- a/godot/addons/dialogic/Editor/Common/reference_manager.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dugy11ebty3yq diff --git a/godot/addons/dialogic/Editor/Common/reference_manager.tscn b/godot/addons/dialogic/Editor/Common/reference_manager.tscn deleted file mode 100644 index 3154a38..0000000 --- a/godot/addons/dialogic/Editor/Common/reference_manager.tscn +++ /dev/null @@ -1,333 +0,0 @@ -[gd_scene load_steps=14 format=3 uid="uid://c7lmt5cp7bxcm"] - -[ext_resource type="Script" uid="uid://dugy11ebty3yq" path="res://addons/dialogic/Editor/Common/reference_manager.gd" id="1_3t531"] -[ext_resource type="Script" uid="uid://nrhtjk2rgmgk" path="res://addons/dialogic/Editor/Common/broken_reference_manager.gd" id="1_agmg4"] -[ext_resource type="Script" uid="uid://dca6a1a74jfur" path="res://addons/dialogic/Editor/Common/ReferenceManager_AddReplacementPanel.gd" id="2_tt4jd"] -[ext_resource type="PackedScene" uid="uid://dpwhshre1n4t6" path="res://addons/dialogic/Editor/Events/Fields/field_options_dynamic.tscn" id="3_yomsc"] -[ext_resource type="PackedScene" uid="uid://dbpkta2tjsqim" path="res://addons/dialogic/Editor/Common/hint_tooltip_icon.tscn" id="5_sdymt"] -[ext_resource type="Script" uid="uid://bvbsqai5sh0na" path="res://addons/dialogic/Editor/Common/unique_identifiers_manager.gd" id="5_wnvbq"] - -[sub_resource type="ButtonGroup" id="ButtonGroup_l6uiy"] - -[sub_resource type="Image" id="Image_pnutm"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_a0gfq"] -image = SubResource("Image_pnutm") - -[sub_resource type="Image" id="Image_asrh0"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_2hc6a"] -image = SubResource("Image_asrh0") - -[sub_resource type="Image" id="Image_xvpjt"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_lce2m"] -image = SubResource("Image_xvpjt") - -[node name="Manager" type="PanelContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("1_3t531") - -[node name="Tabs" type="VBoxContainer" parent="."] -layout_mode = 2 - -[node name="Tabs" type="HBoxContainer" parent="Tabs"] -layout_mode = 2 -alignment = 1 - -[node name="TabA" type="Button" parent="Tabs/Tabs"] -unique_name_in_owner = true -layout_mode = 2 -toggle_mode = true -button_pressed = true -text = "Broken References" -flat = true - -[node name="TabB" type="Button" parent="Tabs/Tabs"] -unique_name_in_owner = true -layout_mode = 2 -toggle_mode = true -button_group = SubResource("ButtonGroup_l6uiy") -text = "Unique Identifiers" -flat = true - -[node name="BrokenReferences" type="VSplitContainer" parent="Tabs"] -layout_mode = 2 -size_flags_vertical = 3 -script = ExtResource("1_agmg4") - -[node name="ChangesList" type="PanelContainer" parent="Tabs/BrokenReferences"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 3 -theme_type_variation = &"DialogicPanelA" - -[node name="VBox" type="VBoxContainer" parent="Tabs/BrokenReferences/ChangesList"] -layout_mode = 2 - -[node name="HBoxContainer" type="HBoxContainer" parent="Tabs/BrokenReferences/ChangesList/VBox"] -layout_mode = 2 - -[node name="SectionTitle" type="Label" parent="Tabs/BrokenReferences/ChangesList/VBox/HBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -theme_override_font_sizes/font_size = 16 -text = "Recent renames" - -[node name="AddButton" type="Button" parent="Tabs/BrokenReferences/ChangesList/VBox/HBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 2 -tooltip_text = "Add custom rename" -icon = SubResource("ImageTexture_a0gfq") - -[node name="ReplacementEditPanel" type="PanelContainer" parent="Tabs/BrokenReferences/ChangesList/VBox"] -unique_name_in_owner = true -visible = false -layout_mode = 2 -script = ExtResource("2_tt4jd") - -[node name="VBox" type="HFlowContainer" parent="Tabs/BrokenReferences/ChangesList/VBox/ReplacementEditPanel"] -layout_mode = 2 - -[node name="HBoxContainer3" type="HBoxContainer" parent="Tabs/BrokenReferences/ChangesList/VBox/ReplacementEditPanel/VBox"] -layout_mode = 2 - -[node name="Type" type="OptionButton" parent="Tabs/BrokenReferences/ChangesList/VBox/ReplacementEditPanel/VBox/HBoxContainer3"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "This decides the regexes for searching. Pure text allows you to enter your own regex into \"Old\". " -selected = 0 -item_count = 5 -popup/item_0/text = "Pure Text" -popup/item_1/text = "Variable" -popup/item_1/id = 1 -popup/item_2/text = "Portrait" -popup/item_2/id = 2 -popup/item_3/text = "Character (Ref)" -popup/item_3/id = 3 -popup/item_4/text = "Timeline (Ref)" -popup/item_4/id = 4 - -[node name="HBoxContainer" type="HBoxContainer" parent="Tabs/BrokenReferences/ChangesList/VBox/ReplacementEditPanel/VBox"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="Old" type="LineEdit" parent="Tabs/BrokenReferences/ChangesList/VBox/ReplacementEditPanel/VBox/HBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -placeholder_text = "Old" - -[node name="Label2" type="Label" parent="Tabs/BrokenReferences/ChangesList/VBox/ReplacementEditPanel/VBox/HBoxContainer"] -layout_mode = 2 -text = "->" - -[node name="New" type="LineEdit" parent="Tabs/BrokenReferences/ChangesList/VBox/ReplacementEditPanel/VBox/HBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -placeholder_text = "New" - -[node name="PureTextFlags" type="HBoxContainer" parent="Tabs/BrokenReferences/ChangesList/VBox/ReplacementEditPanel/VBox"] -unique_name_in_owner = true -layout_mode = 2 -alignment = 2 - -[node name="MatchCase" type="Button" parent="Tabs/BrokenReferences/ChangesList/VBox/ReplacementEditPanel/VBox/PureTextFlags"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Match Case" -toggle_mode = true -icon = SubResource("ImageTexture_2hc6a") - -[node name="WholeWords" type="Button" parent="Tabs/BrokenReferences/ChangesList/VBox/ReplacementEditPanel/VBox/PureTextFlags"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Whole World" -toggle_mode = true -icon = SubResource("ImageTexture_2hc6a") - -[node name="HBoxContainer4" type="HBoxContainer" parent="Tabs/BrokenReferences/ChangesList/VBox/ReplacementEditPanel/VBox"] -layout_mode = 2 - -[node name="Where" type="OptionButton" parent="Tabs/BrokenReferences/ChangesList/VBox/ReplacementEditPanel/VBox/HBoxContainer4"] -unique_name_in_owner = true -layout_mode = 2 -selected = 0 -fit_to_longest_item = false -item_count = 3 -popup/item_0/text = "Everywhere" -popup/item_1/text = "Only for Character" -popup/item_1/id = 1 -popup/item_2/text = "Texts only" -popup/item_2/id = 2 - -[node name="Character" parent="Tabs/BrokenReferences/ChangesList/VBox/ReplacementEditPanel/VBox/HBoxContainer4" instance=ExtResource("3_yomsc")] -unique_name_in_owner = true -layout_mode = 2 - -[node name="AddButton" type="Button" parent="Tabs/BrokenReferences/ChangesList/VBox/ReplacementEditPanel/VBox"] -unique_name_in_owner = true -layout_mode = 2 -text = "Add/Save" - -[node name="ChangeTree" type="Tree" parent="Tabs/BrokenReferences/ChangesList/VBox"] -unique_name_in_owner = true -custom_minimum_size = Vector2(0, 50) -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_constants/draw_relationship_lines = 1 -columns = 3 -hide_root = true - -[node name="CheckButton" type="Button" parent="Tabs/BrokenReferences/ChangesList/VBox"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 4 -tooltip_text = "Search timelines for occurences of these renames" -text = "Check Selected" -icon = SubResource("ImageTexture_lce2m") - -[node name="ReplacementSection" type="PanelContainer" parent="Tabs/BrokenReferences"] -unique_name_in_owner = true -layout_mode = 2 -theme_type_variation = &"DialogicPanelA" - -[node name="FindList" type="VBoxContainer" parent="Tabs/BrokenReferences/ReplacementSection"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 3 - -[node name="HBox" type="HBoxContainer" parent="Tabs/BrokenReferences/ReplacementSection/FindList"] -layout_mode = 2 - -[node name="SectionTitle2" type="Label" parent="Tabs/BrokenReferences/ReplacementSection/FindList/HBox"] -unique_name_in_owner = true -layout_mode = 2 -theme_override_font_sizes/font_size = 16 -text = "Found references" - -[node name="State" type="Label" parent="Tabs/BrokenReferences/ReplacementSection/FindList/HBox"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 8 -theme_override_colors/font_color = Color(0, 0, 0, 1) -text = "State" - -[node name="ReferenceTree" type="Tree" parent="Tabs/BrokenReferences/ReplacementSection/FindList"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 3 -theme_override_constants/draw_relationship_lines = 1 -columns = 3 -hide_root = true - -[node name="Progress" type="ProgressBar" parent="Tabs/BrokenReferences/ReplacementSection/FindList"] -unique_name_in_owner = true -layout_mode = 2 -max_value = 1.0 - -[node name="HBoxContainer" type="HBoxContainer" parent="Tabs/BrokenReferences/ReplacementSection/FindList"] -layout_mode = 2 -alignment = 1 - -[node name="Replace" type="Button" parent="Tabs/BrokenReferences/ReplacementSection/FindList/HBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 4 -tooltip_text = "Replace all selected findings (Careful, no undo!)" -text = "Replace Selected" -icon = SubResource("ImageTexture_lce2m") - -[node name="HintTooltip" parent="Tabs/BrokenReferences/ReplacementSection/FindList/HBoxContainer" instance=ExtResource("5_sdymt")] -layout_mode = 2 -texture = null -hint_text = "Note that searching and replacing is only implemented for timelines. -E.g. variables used in character display names or glossary entries will have to be replaced manually." - -[node name="UniqueIdentifiers" type="PanelContainer" parent="Tabs"] -visible = false -layout_mode = 2 -size_flags_vertical = 3 -theme_type_variation = &"DialogicPanelA" -script = ExtResource("5_wnvbq") - -[node name="VBox" type="VBoxContainer" parent="Tabs/UniqueIdentifiers"] -layout_mode = 2 - -[node name="Tools" type="HBoxContainer" parent="Tabs/UniqueIdentifiers/VBox"] -layout_mode = 2 -alignment = 1 - -[node name="Search" type="LineEdit" parent="Tabs/UniqueIdentifiers/VBox/Tools"] -unique_name_in_owner = true -custom_minimum_size = Vector2(400, 0) -layout_mode = 2 -placeholder_text = "Search" - -[node name="IdentifierTable" type="Tree" parent="Tabs/UniqueIdentifiers/VBox"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 3 -columns = 2 -column_titles_visible = true -hide_root = true - -[node name="RenameNotification" type="Label" parent="Tabs/UniqueIdentifiers/VBox"] -unique_name_in_owner = true -custom_minimum_size = Vector2(100, 0) -layout_mode = 2 -text = "You've renamed some identifier(s)! Use the \"Broken References\" tab to check if you have used this identifier (and fix it if so)." -autowrap_mode = 3 - -[node name="Close" type="Button" parent="Tabs"] -layout_mode = 2 -size_flags_horizontal = 4 -text = "Close" - -[node name="HelpButton" type="LinkButton" parent="."] -layout_mode = 2 -size_flags_horizontal = 8 -size_flags_vertical = 0 -text = "Documentation" -uri = "https://docs.dialogic.pro/reference-manager.html" - -[connection signal="pressed" from="Tabs/BrokenReferences/ChangesList/VBox/HBoxContainer/AddButton" to="Tabs/BrokenReferences" method="_on_add_button_pressed"] -[connection signal="item_selected" from="Tabs/BrokenReferences/ChangesList/VBox/ReplacementEditPanel/VBox/HBoxContainer3/Type" to="Tabs/BrokenReferences/ChangesList/VBox/ReplacementEditPanel" method="_on_type_item_selected"] -[connection signal="item_selected" from="Tabs/BrokenReferences/ChangesList/VBox/ReplacementEditPanel/VBox/HBoxContainer4/Where" to="Tabs/BrokenReferences/ChangesList/VBox/ReplacementEditPanel" method="_on_where_item_selected"] -[connection signal="pressed" from="Tabs/BrokenReferences/ChangesList/VBox/ReplacementEditPanel/VBox/AddButton" to="Tabs/BrokenReferences/ChangesList/VBox/ReplacementEditPanel" method="save"] -[connection signal="button_clicked" from="Tabs/BrokenReferences/ChangesList/VBox/ChangeTree" to="Tabs/BrokenReferences" method="_on_change_tree_button_clicked"] -[connection signal="item_edited" from="Tabs/BrokenReferences/ChangesList/VBox/ChangeTree" to="Tabs/BrokenReferences" method="_on_change_tree_item_edited"] -[connection signal="pressed" from="Tabs/BrokenReferences/ChangesList/VBox/CheckButton" to="Tabs/BrokenReferences" method="_on_check_button_pressed"] -[connection signal="pressed" from="Tabs/BrokenReferences/ReplacementSection/FindList/HBoxContainer/Replace" to="Tabs/BrokenReferences" method="_on_replace_pressed"] -[connection signal="text_changed" from="Tabs/UniqueIdentifiers/VBox/Tools/Search" to="Tabs/UniqueIdentifiers" method="_on_search_text_changed"] -[connection signal="button_clicked" from="Tabs/UniqueIdentifiers/VBox/IdentifierTable" to="Tabs/UniqueIdentifiers" method="_on_identifier_table_button_clicked"] -[connection signal="item_edited" from="Tabs/UniqueIdentifiers/VBox/IdentifierTable" to="Tabs/UniqueIdentifiers" method="_on_identifier_table_item_edited"] -[connection signal="pressed" from="Tabs/Close" to="." method="_on_close_pressed"] diff --git a/godot/addons/dialogic/Editor/Common/reference_manager_window.gd b/godot/addons/dialogic/Editor/Common/reference_manager_window.gd deleted file mode 100644 index c8d8581..0000000 --- a/godot/addons/dialogic/Editor/Common/reference_manager_window.gd +++ /dev/null @@ -1,196 +0,0 @@ -@tool -extends Window - -## This window manages communication with the replacement manager it contains. -## Other scripts can call the add_ref_change() method to register changes directly -## or use the helpers add_variable_ref_change() and add_portrait_ref_change() - -@onready var editors_manager := get_node("../EditorsManager") -@onready var broken_manager := get_node("Manager/Tabs/BrokenReferences") -enum Where {EVERYWHERE, BY_CHARACTER, TEXTS_ONLY} -enum Types {TEXT, VARIABLE, PORTRAIT, CHARACTER_NAME, TIMELINE_NAME} - -var icon_button: Button = null - - -func _ready() -> void: - if owner.get_parent() is SubViewport: - return - - $Manager.theme = owner.get_theme() - - icon_button = editors_manager.add_icon_button(get_theme_icon("Unlinked", "EditorIcons"), 'Reference Manager') - icon_button.pressed.connect(open) - - var dot := Sprite2D.new() - dot.texture = get_theme_icon("GuiGraphNodePort", "EditorIcons") - dot.scale = Vector2(0.8, 0.8) - dot.z_index = 10 - dot.position = Vector2(icon_button.size.x*0.8, icon_button.size.x*0.2) - dot.modulate = get_theme_color("warning_color", "Editor").lightened(0.5) - - icon_button.add_child(dot) - - var old_changes: Array = DialogicUtil.get_editor_setting('reference_changes', []) - if !old_changes.is_empty(): - broken_manager.reference_changes = old_changes - - update_indicator() - - hide() - - get_parent().plugin_reference.get_editor_interface().get_file_system_dock().files_moved.connect(_on_file_moved) - get_parent().plugin_reference.get_editor_interface().get_file_system_dock().file_removed.connect(_on_file_removed) - get_parent().get_node('ResourceRenameWarning').confirmed.connect(open) - - -func add_ref_change(old_name:String, new_name:String, type:Types, where:=Where.TEXTS_ONLY, character_names:=[], - whole_words:=false, case_sensitive:=false, previous:Dictionary = {}) -> void: - var regexes := [] - var category_name := "" - match type: - Types.TEXT: - category_name = "Texts" - if '' in old_name: - regexes = [old_name] - else: - regexes = [ - r'(?%s)' % old_name.replace('/', '\\/') - ] - if !case_sensitive: - regexes[0] = '(?i)'+regexes[0] - if whole_words: - regexes = ['\\b'+regexes[0]+'\\b'] - - Types.VARIABLE: - regexes = [ - r'{(?\s*%s\s*)}' % old_name.replace("/", "\\/"), - r'var\s*=\s*"(?\s*%s\s*)"' % old_name.replace("/", "\\/") - ] - category_name = "Variables" - - Types.PORTRAIT: - regexes = [ - r'(?m)^[^:(\n]*\((?%s)\)' % old_name.replace('/', '\\/'), - r'\[\s*portrait\s*=(?\s*%s\s*)\]' % old_name.replace('/', '\\/') - ] - category_name = "Portraits by "+character_names[0] - - Types.CHARACTER_NAME: - # for reference: ((join|leave|update) )?(?NAME)(?!\B)(?(1)|(?!([^:\n]|\\:)*(\n|$))) - regexes = [ - r'((join|leave|update) )?(?%s)(?!\B)(?(1)|(?!([^:\n]|\\:)*(\n|$)))' % old_name - ] - category_name = "Renamed Character Files" - - Types.TIMELINE_NAME: - regexes = [ - r'timeline ?= ?" ?(?%s) ?"' % old_name - ] - category_name = "Renamed Timeline Files" - - if where != Where.BY_CHARACTER: - character_names = [] - - # previous is only given when an existing item is edited - # in that case the old one is removed first - var idx := len(broken_manager.reference_changes) - if previous in broken_manager.reference_changes: - idx = broken_manager.reference_changes.find(previous) - broken_manager.reference_changes.erase(previous) - - if _check_for_ref_change_cycle(old_name, new_name, category_name): - update_indicator() - return - - broken_manager.reference_changes.insert(idx, - {'what':old_name, - 'forwhat':new_name, - 'regex': regexes, - 'regex_replacement':new_name, - 'category':category_name, - 'character_names':character_names, - 'texts_only':where == Where.TEXTS_ONLY, - 'type':type, - 'case_sensitive':case_sensitive, - 'whole_words':whole_words, - }) - - update_indicator() - - if visible: - $Manager.open() - broken_manager.open() - - -## Checks for reference cycles or chains. -## E.g. if you first rename a portrait from "happy" to "happy1" and then to "Happy/happy1" -## This will make sure only a change "happy" -> "Happy/happy1" is remembered -## This is very important for correct replacement -func _check_for_ref_change_cycle(old_name:String, new_name:String, category:String) -> bool: - for ref in broken_manager.reference_changes: - if ref['forwhat'] == old_name and ref['category'] == category: - if new_name == ref['what']: - broken_manager.reference_changes.erase(ref) - else: - broken_manager.reference_changes[broken_manager.reference_changes.find(ref)]['forwhat'] = new_name - broken_manager.reference_changes[broken_manager.reference_changes.find(ref)]['regex_replacement'] = new_name - return true - return false - - -## Helper for adding variable ref changes -func add_variable_ref_change(old_name:String, new_name:String) -> void: - add_ref_change(old_name, new_name, Types.VARIABLE, Where.EVERYWHERE) - - -## Helper for adding portrait ref changes -func add_portrait_ref_change(old_name:String, new_name:String, character_names:PackedStringArray) -> void: - add_ref_change(old_name, new_name, Types.PORTRAIT, Where.BY_CHARACTER, character_names) - - -## Helper for adding character name ref changes -func add_character_name_ref_change(old_name:String, new_name:String) -> void: - add_ref_change(old_name, new_name, Types.CHARACTER_NAME, Where.EVERYWHERE) - - -## Helper for adding timeline name ref changes -func add_timeline_name_ref_change(old_name:String, new_name:String) -> void: - add_ref_change(old_name, new_name, Types.TIMELINE_NAME, Where.EVERYWHERE) - - -func open() -> void: - DialogicResourceUtil.update_directory('dch') - DialogicResourceUtil.update_directory('dtl') - popup_centered_ratio(0.5) - grab_focus() - - -func _on_close_requested() -> void: - hide() - broken_manager.close() - - -func get_change_count() -> int: - return len(broken_manager.reference_changes) - - -func update_indicator() -> void: - icon_button.get_child(0).visible = !broken_manager.reference_changes.is_empty() - - -## FILE MANAGEMENT: -func _on_file_moved(old_file:String, new_file:String) -> void: - if old_file.ends_with('.dch') and new_file.ends_with('.dch'): - DialogicResourceUtil.change_resource_path(old_file, new_file) - if old_file.get_file() != new_file.get_file(): - get_parent().get_node('ResourceRenameWarning').popup_centered() - elif old_file.ends_with('.dtl') and new_file.ends_with('.dtl'): - DialogicResourceUtil.change_resource_path(old_file, new_file) - if old_file.get_file() != new_file.get_file(): - get_parent().get_node('ResourceRenameWarning').popup_centered() - - -func _on_file_removed(file:String) -> void: - if file.get_extension() in ['dch', 'dtl']: - DialogicResourceUtil.remove_resource(file) diff --git a/godot/addons/dialogic/Editor/Common/reference_manager_window.gd.uid b/godot/addons/dialogic/Editor/Common/reference_manager_window.gd.uid deleted file mode 100644 index 90b9f2f..0000000 --- a/godot/addons/dialogic/Editor/Common/reference_manager_window.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bxr2qomm7wm85 diff --git a/godot/addons/dialogic/Editor/Common/side_bar.tscn b/godot/addons/dialogic/Editor/Common/side_bar.tscn deleted file mode 100644 index 1950d70..0000000 --- a/godot/addons/dialogic/Editor/Common/side_bar.tscn +++ /dev/null @@ -1,211 +0,0 @@ -[gd_scene load_steps=7 format=3 uid="uid://cwe3r2tbh2og1"] - -[ext_resource type="Script" uid="uid://myogqmakusx3" path="res://addons/dialogic/Editor/Common/sidebar.gd" id="1_jnq65"] -[ext_resource type="Texture2D" uid="uid://bff65e82555qr" path="res://addons/dialogic/Editor/Images/Pieces/close-icon.svg" id="2_54pks"] -[ext_resource type="Texture2D" uid="uid://dx3o2ild56i76" path="res://addons/dialogic/Editor/Images/Pieces/closed-icon.svg" id="2_ilyps"] - -[sub_resource type="Theme" id="Theme_pn0f4"] -VBoxContainer/constants/separation = 4 - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_gxwm6"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_n8rql"] - -[node name="SideBar" type="VSplitContainer"] -custom_minimum_size = Vector2(100, 130) -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -theme = SubResource("Theme_pn0f4") -split_offset = 100 -script = ExtResource("1_jnq65") - -[node name="VBoxHidden" type="VBoxContainer" parent="."] -unique_name_in_owner = true -visible = false -layout_mode = 2 - -[node name="OpenButton" type="Button" parent="VBoxHidden"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 3 -tooltip_text = "Show Sidebar" -theme_override_constants/icon_max_width = 20 -icon = ExtResource("2_ilyps") -flat = true -icon_alignment = 1 - -[node name="VBoxPrimary" type="VBoxContainer" parent="."] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 3 - -[node name="Margin" type="MarginContainer" parent="VBoxPrimary"] -layout_mode = 2 -size_flags_vertical = 3 - -[node name="MainVSplit" type="VSplitContainer" parent="VBoxPrimary/Margin"] -unique_name_in_owner = true -layout_mode = 2 - -[node name="VBox" type="VBoxContainer" parent="VBoxPrimary/Margin/MainVSplit"] -layout_mode = 2 -size_flags_vertical = 3 - -[node name="Logo" type="TextureRect" parent="VBoxPrimary/Margin/MainVSplit/VBox"] -unique_name_in_owner = true -modulate = Color(1, 1, 1, 0.623529) -texture_filter = 6 -custom_minimum_size = Vector2(0, 25) -layout_mode = 2 -expand_mode = 3 -stretch_mode = 4 - -[node name="HBox" type="HBoxContainer" parent="VBoxPrimary/Margin/MainVSplit/VBox"] -layout_mode = 2 - -[node name="CurrentResource" type="LineEdit" parent="VBoxPrimary/Margin/MainVSplit/VBox/HBox"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -text = "No resource" -alignment = 1 -editable = false - -[node name="CloseButton" type="Button" parent="VBoxPrimary/Margin/MainVSplit/VBox/HBox"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Hide Sidebar" -text = " " -icon = ExtResource("2_54pks") -flat = true -icon_alignment = 1 -expand_icon = true - -[node name="HBoxSearchSort" type="HBoxContainer" parent="VBoxPrimary/Margin/MainVSplit/VBox"] -layout_mode = 2 - -[node name="Search" type="LineEdit" parent="VBoxPrimary/Margin/MainVSplit/VBox/HBoxSearchSort"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -tooltip_text = "Filter Resources" -placeholder_text = "Filter Resources" -caret_blink = true -caret_blink_interval = 0.5 - -[node name="Options" type="Button" parent="VBoxPrimary/Margin/MainVSplit/VBox/HBoxSearchSort"] -unique_name_in_owner = true -layout_mode = 2 - -[node name="OptionsPopup" type="Popup" parent="VBoxPrimary/Margin/MainVSplit/VBox/HBoxSearchSort/Options"] -unique_name_in_owner = true -transparent_bg = true -position = Vector2i(890, 65) -size = Vector2i(165, 101) -visible = true -transparent = true - -[node name="OptionsPanel" type="PanelContainer" parent="VBoxPrimary/Margin/MainVSplit/VBox/HBoxSearchSort/Options/OptionsPopup"] -unique_name_in_owner = true -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="VBox" type="VBoxContainer" parent="VBoxPrimary/Margin/MainVSplit/VBox/HBoxSearchSort/Options/OptionsPopup/OptionsPanel"] -layout_mode = 2 - -[node name="GroupingOptions" type="OptionButton" parent="VBoxPrimary/Margin/MainVSplit/VBox/HBoxSearchSort/Options/OptionsPopup/OptionsPanel/VBox"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Grouping -- None: No Grouping, sorted alphabetically -- Type: Group by type (Characters/Timeilnes) -- Folder: Group based on the parent folder name. -- Path: Group based on folders." -text_overrun_behavior = 1 -clip_text = true -selected = 0 -item_count = 4 -popup/item_0/text = "No Grouping" -popup/item_1/text = "Type Grouping" -popup/item_1/id = 1 -popup/item_2/text = "Folder Grouping" -popup/item_2/id = 2 -popup/item_3/text = "Path Grouping" -popup/item_3/id = 3 - -[node name="FolderColors" type="CheckBox" parent="VBoxPrimary/Margin/MainVSplit/VBox/HBoxSearchSort/Options/OptionsPopup/OptionsPanel/VBox"] -unique_name_in_owner = true -layout_mode = 2 -text = "Use Folder Colors" - -[node name="TrimFolderPaths" type="CheckBox" parent="VBoxPrimary/Margin/MainVSplit/VBox/HBoxSearchSort/Options/OptionsPopup/OptionsPanel/VBox"] -unique_name_in_owner = true -layout_mode = 2 -text = "Trim Folder Paths" - -[node name="ResourceTree" type="Tree" parent="VBoxPrimary/Margin/MainVSplit/VBox"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 3 -allow_rmb_select = true -hide_root = true -scroll_horizontal_enabled = false - -[node name="HBoxContainer" type="HBoxContainer" parent="VBoxPrimary/Margin/MainVSplit/VBox"] -visible = false -layout_mode = 2 - -[node name="Label" type="Label" parent="VBoxPrimary/Margin/MainVSplit/VBox/HBoxContainer"] -layout_mode = 2 -size_flags_vertical = 1 -text = "Sort Order" -vertical_alignment = 1 - -[node name="SortOption" type="OptionButton" parent="VBoxPrimary/Margin/MainVSplit/VBox/HBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -item_count = 1 -popup/item_0/text = "Alphabetical (All)" - -[node name="ContentListSection" type="VBoxContainer" parent="VBoxPrimary/Margin/MainVSplit"] -unique_name_in_owner = true -custom_minimum_size = Vector2(0, 15) -layout_mode = 2 -size_flags_vertical = 3 - -[node name="ContentList" type="ItemList" parent="VBoxPrimary/Margin/MainVSplit/ContentListSection"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 3 -tooltip_text = "Label events in your timeline will appear here, allowing you to jump to them." -theme_override_styles/selected = SubResource("StyleBoxEmpty_gxwm6") -theme_override_styles/selected_focus = SubResource("StyleBoxEmpty_n8rql") -allow_reselect = true -same_column_width = true - -[node name="CurrentVersion" type="Button" parent="VBoxPrimary"] -unique_name_in_owner = true -layout_mode = 2 -text = "Some Version" -flat = true -clip_text = true - -[node name="RightClickMenu" type="PopupMenu" parent="."] -unique_name_in_owner = true -size = Vector2i(164, 100) - -[connection signal="dragged" from="VBoxPrimary/Margin/MainVSplit" to="." method="_on_main_v_split_dragged"] -[connection signal="gui_input" from="VBoxPrimary/Margin/MainVSplit/VBox/Logo" to="." method="_on_logo_gui_input"] -[connection signal="text_changed" from="VBoxPrimary/Margin/MainVSplit/VBox/HBoxSearchSort/Search" to="." method="_on_search_text_changed"] -[connection signal="text_submitted" from="VBoxPrimary/Margin/MainVSplit/VBox/HBoxSearchSort/Search" to="." method="_on_search_text_submitted"] -[connection signal="pressed" from="VBoxPrimary/Margin/MainVSplit/VBox/HBoxSearchSort/Options" to="." method="_on_options_pressed"] -[connection signal="toggled" from="VBoxPrimary/Margin/MainVSplit/VBox/HBoxSearchSort/Options/OptionsPopup/OptionsPanel/VBox/FolderColors" to="." method="_on_folder_colors_toggled"] -[connection signal="toggled" from="VBoxPrimary/Margin/MainVSplit/VBox/HBoxSearchSort/Options/OptionsPopup/OptionsPanel/VBox/TrimFolderPaths" to="." method="_on_trim_folder_paths_toggled"] -[connection signal="id_pressed" from="RightClickMenu" to="." method="_on_right_click_menu_id_pressed"] diff --git a/godot/addons/dialogic/Editor/Common/sidebar.gd b/godot/addons/dialogic/Editor/Common/sidebar.gd deleted file mode 100644 index dd328f5..0000000 --- a/godot/addons/dialogic/Editor/Common/sidebar.gd +++ /dev/null @@ -1,529 +0,0 @@ -@tool -class_name DialogicSidebar extends Control - -## Script that handles the editor sidebar. - -signal content_item_activated(item_name) -signal show_sidebar(show: bool) - -# References -@onready var editors_manager = get_parent().get_parent() -@onready var resource_tree: Tree = %ResourceTree - -var current_resource_list: Array = [] - -enum GroupMode { - NONE, - TYPE, - FOLDER, - PATH, -} -var group_mode: GroupMode = GroupMode.TYPE - - -func _ready() -> void: - if owner != null and owner.get_parent() is SubViewport: - return - if editors_manager is SubViewportContainer: - return - - ## CONNECTIONS - editors_manager.resource_opened.connect(_on_editors_resource_opened) - editors_manager.editor_changed.connect(_on_editors_editor_changed) - - resource_tree.item_activated.connect(_on_resources_tree_item_activated) - resource_tree.item_mouse_selected.connect(_on_resources_tree_item_clicked) - resource_tree.item_collapsed.connect(_on_resources_tree_item_collapsed) - - %ContentList.item_selected.connect( - func(idx: int): content_item_activated.emit(%ContentList.get_item_text(idx)) - ) - - %OpenButton.pressed.connect(_show_sidebar) - %CloseButton.pressed.connect(_hide_sidebar) - - var editor_scale := DialogicUtil.get_editor_scale() - - ## ICONS - %Logo.texture = load("res://addons/dialogic/Editor/Images/dialogic-logo.svg") - %Logo.custom_minimum_size.y = 30 * editor_scale - %Search.right_icon = get_theme_icon("Search", "EditorIcons") - %Options.icon = get_theme_icon("GuiTabMenuHl", "EditorIcons") - %OptionsPanel.add_theme_stylebox_override("panel", get_theme_stylebox("PanelForeground", "EditorStyles")) - %OptionsPopup.hide() - - %ContentList.add_theme_color_override( - "font_hovered_color", get_theme_color("warning_color", "Editor") - ) - %ContentList.add_theme_color_override( - "font_selected_color", get_theme_color("property_color_z", "Editor") - ) - - ## RIGHT CLICK MENU - %RightClickMenu.clear() - %RightClickMenu.add_icon_item(get_theme_icon("Remove", "EditorIcons"), "Remove From List", 1) - %RightClickMenu.add_separator() - %RightClickMenu.add_icon_item(get_theme_icon("ActionCopy", "EditorIcons"), "Copy Identifier", 4) - %RightClickMenu.add_separator() - %RightClickMenu.add_icon_item( - get_theme_icon("Filesystem", "EditorIcons"), "Show in FileSystem", 2 - ) - %RightClickMenu.add_icon_item( - get_theme_icon("ExternalLink", "EditorIcons"), "Open in External Program", 3 - ) - - ## SORT MENU - %GroupingOptions.set_item_icon(0, get_theme_icon("AnimationTrackGroup", "EditorIcons")) - %GroupingOptions.set_item_icon(1, get_theme_icon("Folder", "EditorIcons")) - %GroupingOptions.set_item_icon(2, get_theme_icon("FolderBrowse", "EditorIcons")) - %GroupingOptions.set_item_icon(3, get_theme_icon("AnimationTrackList", "EditorIcons")) - %GroupingOptions.item_selected.connect(_on_grouping_changed) - - await get_tree().process_frame - if DialogicUtil.get_editor_setting("sidebar_collapsed", false): - _hide_sidebar() - - %MainVSplit.split_offset = DialogicUtil.get_editor_setting("sidebar_v_split", 0) - group_mode = DialogicUtil.get_editor_setting("sidebar_group_mode", 0) - %GroupingOptions.select(%GroupingOptions.get_item_index(group_mode)) - - %FolderColors.button_pressed = DialogicUtil.get_editor_setting("sidebar_use_folder_colors", true) - %TrimFolderPaths.button_pressed = DialogicUtil.get_editor_setting("sidebar_trim_folder_paths", true) - - update_resource_list() - - -func set_unsaved_indicator(saved: bool = true) -> void: - if saved and %CurrentResource.text.ends_with("(*)"): - %CurrentResource.text = %CurrentResource.text.trim_suffix("(*)") - if not saved and not %CurrentResource.text.ends_with("(*)"): - %CurrentResource.text = %CurrentResource.text + "(*)" - - -func _on_logo_gui_input(event: InputEvent) -> void: - if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.pressed: - editors_manager.open_editor(editors_manager.editors["HomePage"].node) - - -#region SHOW/HIDE SIDEBAR -################################################################################ - -func _show_sidebar() -> void: - %VBoxPrimary.show() - %VBoxHidden.hide() - DialogicUtil.set_editor_setting("sidebar_collapsed", false) - show_sidebar.emit(true) - - -func _hide_sidebar() -> void: - %VBoxPrimary.hide() - %VBoxHidden.show() - DialogicUtil.set_editor_setting("sidebar_collapsed", true) - show_sidebar.emit(false) - -#endregion - - -################################################################################ -## RESOURCE LIST -################################################################################ - - -func _on_editors_resource_opened(_resource: Resource) -> void: - update_resource_list() - - -func _on_editors_editor_changed(_previous: DialogicEditor, current: DialogicEditor) -> void: - %ContentListSection.visible = current.current_resource is DialogicTimeline - update_resource_list() - - -## Cleans resources that have been deleted from the resource list -func clean_resource_list(resources_list: Array = []) -> PackedStringArray: - return PackedStringArray(resources_list.filter(func(x): return ResourceLoader.exists(x))) - - -#region BULDING/FILTERING THE RESOURCE LIST - -func update_resource_list(resources_list: PackedStringArray = []) -> void: - var filter: String = %Search.text - var current_file := "" - if editors_manager.current_editor and editors_manager.current_editor.current_resource: - current_file = editors_manager.current_editor.current_resource.resource_path - - var character_directory: Dictionary = DialogicResourceUtil.get_character_directory() - var timeline_directory: Dictionary = DialogicResourceUtil.get_timeline_directory() - if resources_list.is_empty(): - resources_list = DialogicUtil.get_editor_setting("last_resources", []) - if not current_file in resources_list: - resources_list.append(current_file) - - resources_list = clean_resource_list(resources_list) - - %CurrentResource.text = "No Resource" - %CurrentResource.add_theme_color_override( - "font_uneditable_color", get_theme_color("disabled_font_color", "Editor") - ) - - resource_tree.clear() - - var character_items: Array = get_directory_items.call(character_directory, filter, load("res://addons/dialogic/Editor/Images/Resources/character.svg"), resources_list) - var timeline_items: Array = get_directory_items.call(timeline_directory, filter, load("res://addons/dialogic/Editor/Images/Resources/timeline.svg"), resources_list) - var all_items := character_items + timeline_items - - # BUILD TREE - var root: TreeItem = resource_tree.create_item() - - match group_mode: - GroupMode.NONE: - all_items.sort_custom(_sort_by_item_text) - for item in all_items: - add_item(item, root, current_file) - - - GroupMode.TYPE: - character_items.sort_custom(_sort_by_item_text) - timeline_items.sort_custom(_sort_by_item_text) - if character_items.size() > 0: - var character_tree := add_folder_item("Characters", root) - for item in character_items: - add_item(item, character_tree, current_file) - - if timeline_items.size() > 0: - var timeline_tree := add_folder_item("Timelines", root) - for item in timeline_items: - add_item(item, timeline_tree, current_file) - - - GroupMode.FOLDER: - var dirs := {} - for item in all_items: - var dir := item.get_parent_directory() as String - if not dirs.has(dir): - dirs[dir] = [] - dirs[dir].append(item) - - for dir in dirs: - var dir_item := add_folder_item(dir, root) - - for item in dirs[dir]: - add_item(item, dir_item, current_file) - - - GroupMode.PATH: - # Collect all different directories that contain resources - var dirs := {} - for item in all_items: - var path := (item.metadata.get_base_dir() as String).trim_prefix("res://") - if not dirs.has(path): - dirs[path] = [] - dirs[path].append(item) - - # Sort them into ones with the same folder name - var dir_names := {} - for dir in dirs: - var sliced: String = dir.get_slice("/", dir.get_slice_count("/")-1) - if not sliced in dir_names: - dir_names[sliced] = {"folders":[dir]} - else: - dir_names[sliced].folders.append(dir) - - # Create a dictionary mapping a unique name to each directory - # If two have been found to have the same folder name, the parent directory is added - var unique_folder_names := {} - for dir_name in dir_names: - if dir_names[dir_name].folders.size() > 1: - for i in dir_names[dir_name].folders: - if "/" in i: - unique_folder_names[i.get_slice("/", i.get_slice_count("/")-2)+"/"+i.get_slice("/", i.get_slice_count("/")-1)] = i - else: - unique_folder_names[i] = i - else: - unique_folder_names[dir_name] = dir_names[dir_name].folders[0] - - # Sort the folder names by their folder name (not by the full path) - var sorted_dir_keys := unique_folder_names.keys() - sorted_dir_keys.sort_custom( - func(x, y): - return x.get_slice("/", x.get_slice_count("/")-1) < y.get_slice("/", y.get_slice_count("/")-1) - ) - var folder_colors: Dictionary = ProjectSettings.get_setting("file_customization/folder_colors", {}) - - for dir in sorted_dir_keys: - var display_name: String = dir - if not %TrimFolderPaths.button_pressed: - display_name = unique_folder_names[dir] - var dir_path: String = unique_folder_names[dir] - var dir_color_path := "" - var dir_color := Color.BLACK - if %FolderColors.button_pressed: - for path in folder_colors: - if String("res://"+dir_path+"/").begins_with(path) and len(path) > len(dir_color_path): - dir_color_path = path - dir_color = folder_colors[path] - - var dir_item := add_folder_item(display_name, root, dir_color, dir_path) - - for item in dirs[dir_path]: - add_item(item, dir_item, current_file) - - - if %CurrentResource.text != "No Resource": - %CurrentResource.add_theme_color_override( - "font_uneditable_color", get_theme_color("font_color", "Editor") - ) - - DialogicUtil.set_editor_setting("last_resources", resources_list) - - -func add_item(item:ResourceListItem, parent:TreeItem, current_file := "") -> TreeItem: - var tree_item := resource_tree.create_item(parent) - tree_item.set_text(0, item.text) - tree_item.set_icon(0, item.icon) - tree_item.set_metadata(0, item.metadata) - tree_item.set_tooltip_text(0, item.tooltip) - - if item.metadata == current_file: - %CurrentResource.text = item.metadata.get_file() - resource_tree.set_selected(tree_item, 0) - - var bg_color := parent.get_custom_bg_color(0) - if bg_color != get_theme_color("base_color", "Editor"): - bg_color.a = 0.1 - tree_item.set_custom_bg_color(0, bg_color) - - return tree_item - - -func add_folder_item(label: String, parent:TreeItem, color:= Color.BLACK, tooltip:="") -> TreeItem: - var folder_item := resource_tree.create_item(parent) - folder_item.set_text(0, label) - folder_item.set_icon(0, get_theme_icon("Folder", "EditorIcons")) - folder_item.set_tooltip_text(0, tooltip) - if color == Color.BLACK: - folder_item.set_custom_bg_color(0, get_theme_color("base_color", "Editor")) - else: - color.a = 0.2 - folder_item.set_custom_bg_color(0, color) - - if label in DialogicUtil.get_editor_setting("resource_list_collapsed_info", []): - folder_item.collapsed = true - - return folder_item - - -func get_directory_items(directory:Dictionary, filter:String, icon:Texture2D, resources_list:Array) -> Array: - var items := [] - for item_name in directory: - if (directory[item_name] in resources_list) and (filter.is_empty() or filter.to_lower() in item_name.to_lower()): - var item := ResourceListItem.new() - item.text = item_name - item.icon = icon - item.metadata = directory[item_name] - item.tooltip = directory[item_name] - items.append(item) - return items - - -class ResourceListItem: - extends Object - - var text: String - var index: int = -1 - var icon: Texture - var metadata: String - var tooltip: String - - func _to_string() -> String: - return JSON.stringify( - { - "text": text, - "index": index, - "icon": icon.resource_path, - "metadata": metadata, - "tooltip": tooltip, - "parent_dir": get_parent_directory() - }, - "\t", - false - ) - - func get_parent_directory() -> String: - return (metadata.get_base_dir() as String).split("/")[-1] - - -func _sort_by_item_text(a: ResourceListItem, b: ResourceListItem) -> bool: - return a.text < b.text - -#endregion - - -#region INTERACTING WITH RESOURCES - - -func _on_resources_tree_item_activated() -> void: - if resource_tree.get_selected() == null: - return - var item := resource_tree.get_selected() - if item.get_metadata(0) == null: - return - edit_resource(item.get_metadata(0)) - - -func _on_resources_tree_item_clicked(_pos: Vector2, mouse_button_index: int) -> void: - match mouse_button_index: - MOUSE_BUTTON_LEFT: - var selected_item := resource_tree.get_selected() - if selected_item == null: - return - if selected_item.get_metadata(0) == null: - return - var resource_item := load(selected_item.get_metadata(0)) - call_deferred("edit_resource", resource_item) - - MOUSE_BUTTON_MIDDLE: - remove_item_from_list(resource_tree.get_selected()) - - MOUSE_BUTTON_RIGHT: - if resource_tree.get_selected().get_metadata(0): - %RightClickMenu.popup_on_parent(Rect2(get_global_mouse_position(), Vector2())) - %RightClickMenu.set_meta("item_clicked", resource_tree.get_selected()) - - -func _on_resources_tree_item_collapsed(item:TreeItem) -> void: - var collapsed_info: Array = DialogicUtil.get_editor_setting("resource_list_collapsed_info", []) - if item.get_text(0) in collapsed_info: - if not item.collapsed: - collapsed_info.erase(item.get_text(0)) - else: - if item.collapsed: - collapsed_info.append(item.get_text(0)) - DialogicUtil.set_editor_setting("resource_list_collapsed_info", collapsed_info) - - -func edit_resource(resource_item: Variant) -> void: - if resource_item is Resource: - editors_manager.edit_resource(resource_item) - else: - editors_manager.edit_resource(load(resource_item)) - - -func remove_item_from_list(item: TreeItem) -> void: - var new_list := [] - for entry in DialogicUtil.get_editor_setting("last_resources", []): - if entry != item.get_metadata(0): - new_list.append(entry) - DialogicUtil.set_editor_setting("last_resources", new_list) - update_resource_list(new_list) - - -func _on_right_click_menu_id_pressed(id: int) -> void: - match id: - 1: # REMOVE ITEM FROM LIST - remove_item_from_list(%RightClickMenu.get_meta("item_clicked")) - 2: # OPEN IN FILESYSTEM - EditorInterface.get_file_system_dock().navigate_to_path( - %RightClickMenu.get_meta("item_clicked").get_metadata(0) - ) - 3: # OPEN IN EXTERNAL EDITOR - OS.shell_open( - ProjectSettings.globalize_path( - %RightClickMenu.get_meta("item_clicked").get_metadata(0) - ) - ) - 4: # COPY IDENTIFIER - DisplayServer.clipboard_set( - DialogicResourceUtil.get_unique_identifier_by_path( - %RightClickMenu.get_meta("item_clicked").get_metadata(0) - ) - ) -#endregion - - -#region FILTERING - -func _on_search_text_changed(_new_text: String) -> void: - update_resource_list() - for item in resource_tree.get_root().get_children(): - if item.get_children().size() > 0: - resource_tree.set_selected(item.get_child(0), 0) - break - - -func _on_search_text_submitted(_new_text: String) -> void: - if resource_tree.get_selected() == null: - return - var item := resource_tree.get_selected() - if item.get_metadata(0) == null: - return - edit_resource(item.get_metadata(0)) - %Search.clear() - -#endregion - - -#region CONTENT LIST - -func update_content_list(list: PackedStringArray) -> void: - var prev_selected := "" - if %ContentList.is_anything_selected(): - prev_selected = %ContentList.get_item_text(%ContentList.get_selected_items()[0]) - %ContentList.clear() - %ContentList.add_item("~ Top") - for i in list: - if i.is_empty(): - continue - %ContentList.add_item(i) - if i == prev_selected: - %ContentList.select(%ContentList.item_count - 1) - if list.is_empty(): - return - - var current_resource: Resource = editors_manager.get_current_editor().current_resource - - var timeline_directory := DialogicResourceUtil.get_timeline_directory() - var label_directory := DialogicResourceUtil.get_label_cache() - if current_resource != null: - for i in timeline_directory: - if timeline_directory[i] == current_resource.resource_path: - label_directory[i] = list - - # also always store the current timelines labels for easy access - label_directory[""] = list - - DialogicResourceUtil.set_label_cache(label_directory) - -#endregion - - -#region RESOURCE LIST OPTIONS - -func _on_options_pressed() -> void: - %OptionsPopup.popup_on_parent(Rect2(%Options.global_position+%Options.size*Vector2(0,1), Vector2())) - - -func _on_grouping_changed(idx: int) -> void: - var id: int = %GroupingOptions.get_item_id(idx) - if (GroupMode as Dictionary).values().has(id): - group_mode = (id as GroupMode) - DialogicUtil.set_editor_setting("sidebar_group_mode", id) - update_resource_list() - - %FolderColors.disabled = group_mode != GroupMode.PATH - %TrimFolderPaths.disabled = group_mode != GroupMode.PATH - - -func _on_folder_colors_toggled(toggled_on: bool) -> void: - DialogicUtil.set_editor_setting("sidebar_use_folder_colors", toggled_on) - update_resource_list() - - -func _on_trim_folder_paths_toggled(toggled_on: bool) -> void: - DialogicUtil.set_editor_setting("sidebar_trim_folder_paths", toggled_on) - update_resource_list() - -#endregion - - -func _on_main_v_split_dragged(offset: int) -> void: - DialogicUtil.set_editor_setting("sidebar_v_split", offset) diff --git a/godot/addons/dialogic/Editor/Common/sidebar.gd.uid b/godot/addons/dialogic/Editor/Common/sidebar.gd.uid deleted file mode 100644 index f695352..0000000 --- a/godot/addons/dialogic/Editor/Common/sidebar.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://myogqmakusx3 diff --git a/godot/addons/dialogic/Editor/Common/toolbar.gd b/godot/addons/dialogic/Editor/Common/toolbar.gd deleted file mode 100644 index e4658d3..0000000 --- a/godot/addons/dialogic/Editor/Common/toolbar.gd +++ /dev/null @@ -1,46 +0,0 @@ -@tool -extends HBoxContainer - -# Dialogic Editor toolbar. Works together with editors_mangager. - -################################################################################ -## EDITOR BUTTONS/LABELS -################################################################################ -func _ready() -> void: - if owner.get_parent() is SubViewport: - return - %CustomButtons.custom_minimum_size.y = 33 * DialogicUtil.get_editor_scale() - - for child in get_children(): - if child is Button: - child.queue_free() - - -func add_icon_button(icon: Texture, tooltip: String) -> Button: - var button := Button.new() - button.icon = icon - button.tooltip_text = tooltip - button.flat = true - button.size_flags_vertical = Control.SIZE_SHRINK_BEGIN - button.add_theme_color_override('icon_hover_color', get_theme_color('warning_color', 'Editor')) - button.add_theme_stylebox_override('focus', StyleBoxEmpty.new()) - add_child(button) - move_child(button, -2) - return button - - -func add_custom_button(label:String, icon:Texture) -> Button: - var button := Button.new() - button.text = label - button.icon = icon -# button.flat = true - - button.size_flags_vertical = Control.SIZE_SHRINK_BEGIN - %CustomButtons.add_child(button) -# custom_minimum_size.y = button.size.y - return button - - -func hide_all_custom_buttons() -> void: - for button in %CustomButtons.get_children(): - button.hide() diff --git a/godot/addons/dialogic/Editor/Common/toolbar.gd.uid b/godot/addons/dialogic/Editor/Common/toolbar.gd.uid deleted file mode 100644 index 6bebec8..0000000 --- a/godot/addons/dialogic/Editor/Common/toolbar.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://1m3sqaws1hin diff --git a/godot/addons/dialogic/Editor/Common/unique_identifiers_manager.gd b/godot/addons/dialogic/Editor/Common/unique_identifiers_manager.gd deleted file mode 100644 index fc7c993..0000000 --- a/godot/addons/dialogic/Editor/Common/unique_identifiers_manager.gd +++ /dev/null @@ -1,95 +0,0 @@ -@tool -extends PanelContainer - - -func _ready() -> void: - if owner.get_parent() is SubViewport: - return - - %TabB.text = "Unique Identifiers" - %TabB.icon = get_theme_icon("CryptoKey", "EditorIcons") - - owner.get_parent().visibility_changed.connect(func(): if is_visible_in_tree(): open()) - - %RenameNotification.add_theme_color_override("font_color", get_theme_color("warning_color", "Editor")) - - -func open() -> void: - fill_table() - %RenameNotification.hide() - - -func close() -> void: - pass - -func fill_table() -> void: - var t: Tree = %IdentifierTable - t.set_column_expand(1, true) - t.clear() - t.set_column_title(1, "Identifier") - t.set_column_title(0, "Resource Path") - t.set_column_title_alignment(0, 0) - t.set_column_title_alignment(1, 0) - t.create_item() - - for d in [["Characters", 'dch'], ["Timelines", "dtl"]]: - var directory := DialogicResourceUtil.get_directory(d[1]) - var directory_item := t.create_item() - directory_item.set_text(0, d[0]) - directory_item.set_metadata(0, d[1]) - for key in directory: - var item: TreeItem = t.create_item(directory_item) - item.set_text(0, directory[key]) - item.set_text(1, key) - item.set_editable(1, true) - item.set_metadata(1, key) - item.add_button(1, get_theme_icon("Edit", "EditorIcons"), 0, false, "Edit") - - -func _on_identifier_table_item_edited() -> void: - var item: TreeItem = %IdentifierTable.get_edited() - var new_identifier: String = item.get_text(1) - - - if new_identifier == item.get_metadata(1): - return - - if new_identifier.is_empty() or not DialogicResourceUtil.is_identifier_unused(item.get_parent().get_metadata(0), new_identifier): - item.set_text(1, item.get_metadata(1)) - return - - DialogicResourceUtil.change_unique_identifier(item.get_text(0), new_identifier) - - match item.get_parent().get_metadata(0): - 'dch': - owner.get_parent().add_character_name_ref_change(item.get_metadata(1), new_identifier) - 'dtl': - owner.get_parent().add_timeline_name_ref_change(item.get_metadata(1), new_identifier) - - %RenameNotification.show() - item.set_metadata(1, new_identifier) - - -func _on_identifier_table_button_clicked(item: TreeItem, column: int, id: int, mouse_button_index: int) -> void: - item.select(column) - %IdentifierTable.edit_selected(true) - - -func filter_tree(filter:String= "", item:TreeItem = null) -> bool: - if item == null: - item = %IdentifierTable.get_root() - - var any := false - for child in item.get_children(): - if child.get_child_count() > 0: - child.visible = filter_tree(filter, child) - if child.visible: any = true - else: - child.visible = filter.is_empty() or filter.to_lower() in child.get_text(0).to_lower() or filter.to_lower() in child.get_text(1).to_lower() - if child.visible: any = true - - return any - - -func _on_search_text_changed(new_text: String) -> void: - filter_tree(new_text) diff --git a/godot/addons/dialogic/Editor/Common/unique_identifiers_manager.gd.uid b/godot/addons/dialogic/Editor/Common/unique_identifiers_manager.gd.uid deleted file mode 100644 index 50b0d67..0000000 --- a/godot/addons/dialogic/Editor/Common/unique_identifiers_manager.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bvbsqai5sh0na diff --git a/godot/addons/dialogic/Editor/Common/update_install_window.gd b/godot/addons/dialogic/Editor/Common/update_install_window.gd deleted file mode 100644 index 128c62e..0000000 --- a/godot/addons/dialogic/Editor/Common/update_install_window.gd +++ /dev/null @@ -1,179 +0,0 @@ -@tool -extends Control - -var current_info := {} -@onready var editor_view := find_parent('EditorView') - - -func _ready() -> void: - await editor_view.ready - theme = editor_view.theme - - %Install.icon = editor_view.get_theme_icon("AssetLib", "EditorIcons") - %LoadingIcon.texture = editor_view.get_theme_icon("KeyTrackScale", "EditorIcons") - %InstallWarning.modulate = editor_view.get_theme_color("warning_color", "Editor") - %CloseButton.icon = editor_view.get_theme_icon("Close", "EditorIcons") - DialogicUtil.get_dialogic_plugin().get_editor_interface().get_resource_filesystem().resources_reimported.connect(_on_resources_reimported) - - -func open() -> void: - get_parent().popup_centered_ratio(0.5) - get_parent().mode = Window.MODE_WINDOWED - get_parent().grab_focus() - - -func load_info(info:Dictionary, update_type:int) -> void: - current_info = info - if update_type == 2: - %State.text = "No Information Available" - %UpdateName.text = "Unable to access versions." - %UpdateName.add_theme_color_override("font_color", editor_view.get_theme_color("readonly_color", "Editor")) - %Content.text = "You are probably not connected to the internet. Fair enough." - %ShortInfo.text = "Huh, what happened here?" - %ReadFull.hide() - %Install.disabled = true - return - - # If we are up to date (or beyond): - if info.is_empty(): - info['name'] = "You are in the future, Marty!" - info["body"] = "# 😎 You are using the WIP branch!\nSeems like you are using a version that isn't even released yet. Be careful and give us your feedback ;)" - info["published_at"] = "????T" - info["author"] = {'login':"???"} - %State.text = "Where are we Doc?" - %UpdateName.add_theme_color_override("font_color", editor_view.get_theme_color("property_color_z", "Editor")) - %Install.disabled = true - - elif update_type == 0: - %State.text = "Update Available!" - %UpdateName.add_theme_color_override("font_color", editor_view.get_theme_color("warning_color", "Editor")) - %Install.disabled = false - else: - %State.text = "You are up to date:" - %UpdateName.add_theme_color_override("font_color", editor_view.get_theme_color("success_color", "Editor")) - %Install.disabled = true - - %UpdateName.text = info.name - %Content.text = markdown_to_bbcode(info.body).get_slice("\n[font_size", 0).strip_edges() - %ShortInfo.text = "Published on "+info.published_at.substr(0, info.published_at.find('T'))+" by "+info.author.login - if info.has("html_url"): - %ReadFull.uri = info.html_url - %ReadFull.show() - else: - %ReadFull.hide() - if info.has('reactions'): - %Reactions.show() - var reactions := {"laugh":"😂", "hooray":"🎉", "confused":"😕", "heart":"❤️", "rocket":"🚀", "eyes":"👀"} - for i in reactions: - %Reactions.get_node(i.capitalize()).visible = info.reactions[i] > 0 - %Reactions.get_node(i.capitalize()).text = reactions[i]+" "+str(info.reactions[i]) if info.reactions[i] > 0 else reactions[i] - if info.reactions['+1']+info.reactions['-1'] > 0: - %Reactions.get_node("Likes").visible = true - %Reactions.get_node("Likes").text = "👍 "+str(info.reactions['+1']+info.reactions['-1']) - else: - %Reactions.get_node("Likes").visible = false - else: - %Reactions.hide() - -func _on_window_close_requested() -> void: - get_parent().visible = false - - -func _on_install_pressed() -> void: - find_parent('UpdateManager').request_update_download() - - %InfoLabel.text = "Downloading. This can take a moment." - %Loading.show() - %LoadingIcon.create_tween().set_loops().tween_property(%LoadingIcon, 'rotation', 2*PI, 1).from(0) - - -func _on_refresh_pressed() -> void: - find_parent('UpdateManager').request_update_check() - - -func _on_update_manager_downdload_completed(result:int): - %Loading.hide() - match result: - 0: # success - %InfoLabel.text = "Installed successfully. Restart needed!" - %InfoLabel.modulate = editor_view.get_theme_color("success_color", "Editor") - %Restart.show() - %Restart.grab_focus() - 1: # failure - %InfoLabel.text = "Download failed." - %InfoLabel.modulate = editor_view.get_theme_color("readonly_color", "Editor") - - -func _on_resources_reimported(resources:Array) -> void: - if is_inside_tree(): - await get_tree().process_frame - get_parent().grab_focus() - - -func markdown_to_bbcode(text:String) -> String: - var font_sizes := {1:20, 2:16, 3:16,4:14, 5:14} - var title_regex := RegEx.create_from_string('(^|\n)((?#+)(?.*))\\n') - var res := title_regex.search(text) - while res: - text = text.replace(res.get_string(2), '[font_size='+str(font_sizes[len(res.get_string('level'))])+']'+res.get_string('title').strip_edges()+'[/font_size]') - res = title_regex.search(text) - - var link_regex := RegEx.create_from_string('(?<!\\!)\\[(?<text>[^\\]]*)]\\((?<link>[^)]*)\\)') - res = link_regex.search(text) - while res: - text = text.replace(res.get_string(), '[url='+res.get_string('link')+']'+res.get_string('text').strip_edges()+'[/url]') - res = link_regex.search(text) - - var image_regex := RegEx.create_from_string('\\!\\[(?<text>[^\\]]*)]\\((?<link>[^)]*)\\)\n*') - res = image_regex.search(text) - while res: - text = text.replace(res.get_string(), '[url='+res.get_string('link')+']'+res.get_string('text').strip_edges()+'[/url]') - res = image_regex.search(text) - - var italics_regex := RegEx.create_from_string('\\*(?<text>[^\\*\\n]*)\\*') - res = italics_regex.search(text) - while res: - text = text.replace(res.get_string(), '[i]'+res.get_string('text').strip_edges()+'[/i]') - res = italics_regex.search(text) - - var bullets_regex := RegEx.create_from_string('(?<=\\n)(\\*|-)(?<text>[^\\*\\n]*)\\n') - res = bullets_regex.search(text) - while res: - text = text.replace(res.get_string(), '[ul]'+res.get_string('text').strip_edges()+'[/ul]\n') - res = bullets_regex.search(text) - - var small_code_regex := RegEx.create_from_string('(?<!`)`(?<text>[^`]+)`') - res = small_code_regex.search(text) - while res: - text = text.replace(res.get_string(), '[code][color='+get_theme_color("accent_color", "Editor").to_html()+']'+res.get_string('text').strip_edges()+'[/color][/code]') - res = small_code_regex.search(text) - - var big_code_regex := RegEx.create_from_string('(?<!`)```(?<text>[^`]+)```') - res = big_code_regex.search(text) - while res: - text = text.replace(res.get_string(), '[code][bgcolor='+get_theme_color("box_selection_fill_color", "Editor").to_html()+']'+res.get_string('text').strip_edges()+'[/bgcolor][/code]') - res = big_code_regex.search(text) - - return text - - - -func _on_content_meta_clicked(meta:Variant) -> void: - OS.shell_open(str(meta)) - - -func _on_install_mouse_entered() -> void: - if not %Install.disabled: - %InstallWarning.show() - - -func _on_install_mouse_exited() -> void: - %InstallWarning.hide() - - -func _on_restart_pressed() -> void: - DialogicUtil.get_dialogic_plugin().get_editor_interface().restart_editor(true) - - -func _on_close_button_pressed() -> void: - get_parent().hide() diff --git a/godot/addons/dialogic/Editor/Common/update_install_window.gd.uid b/godot/addons/dialogic/Editor/Common/update_install_window.gd.uid deleted file mode 100644 index 4964b43..0000000 --- a/godot/addons/dialogic/Editor/Common/update_install_window.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cskkip1wso0pu diff --git a/godot/addons/dialogic/Editor/Common/update_install_window.tscn b/godot/addons/dialogic/Editor/Common/update_install_window.tscn deleted file mode 100644 index 58186db..0000000 --- a/godot/addons/dialogic/Editor/Common/update_install_window.tscn +++ /dev/null @@ -1,308 +0,0 @@ -[gd_scene load_steps=9 format=3 uid="uid://vv3m5m68fwg7"] - -[ext_resource type="Script" uid="uid://cskkip1wso0pu" path="res://addons/dialogic/Editor/Common/update_install_window.gd" id="1_p1pbx"] -[ext_resource type="Texture2D" uid="uid://dybg3l5pwetne" path="res://addons/dialogic/Editor/Images/plugin-icon.svg" id="2_20ke0"] - -[sub_resource type="Gradient" id="Gradient_lt7uf"] -colors = PackedColorArray(0.296484, 0.648457, 1, 1, 0.732014, 0.389374, 1, 1) - -[sub_resource type="GradientTexture2D" id="GradientTexture2D_nl8ke"] -gradient = SubResource("Gradient_lt7uf") -fill_from = Vector2(0.151515, 0.272727) -fill_to = Vector2(1, 1) - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1g1am"] -content_margin_left = 0.0 -content_margin_top = 15.0 -content_margin_right = 15.0 -content_margin_bottom = 15.0 -bg_color = Color(0.0627451, 0.0627451, 0.0627451, 0.407843) -corner_radius_top_left = 20 -corner_radius_top_right = 20 -corner_radius_bottom_right = 20 -corner_radius_bottom_left = 20 -expand_margin_left = 20.0 -expand_margin_right = 20.0 - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_j1mw2"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_h4v2s"] -content_margin_left = 5.0 -content_margin_top = 3.0 -content_margin_right = 5.0 -content_margin_bottom = 3.0 -bg_color = Color(0, 0, 0, 0.631373) -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_utju1"] -content_margin_left = 5.0 -content_margin_top = 3.0 -content_margin_right = 5.0 -content_margin_bottom = 3.0 -bg_color = Color(0.0470588, 0.0470588, 0.0470588, 1) -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 - -[node name="UpdateInstallWindow" type="ColorRect"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -color = Color(0.207843, 0.129412, 0.372549, 1) -script = ExtResource("1_p1pbx") - -[node name="TextureRect" type="TextureRect" parent="."] -modulate = Color(0.447059, 0.447059, 0.447059, 1) -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -texture = SubResource("GradientTexture2D_nl8ke") - -[node name="VBoxContainer" type="VBoxContainer" parent="."] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = 14.0 -offset_top = 13.0 -offset_right = -14.0 -offset_bottom = -13.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"] -layout_mode = 2 -size_flags_vertical = 3 - -[node name="Control" type="Control" parent="VBoxContainer/HBoxContainer2"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 7 - -[node name="VBox" type="VBoxContainer" parent="VBoxContainer/HBoxContainer2"] -custom_minimum_size = Vector2(450, 0) -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_stretch_ratio = 3.74 -alignment = 1 - -[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer/HBoxContainer2/VBox"] -clip_contents = false -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -alignment = 1 - -[node name="Panel" type="PanelContainer" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer"] -layout_mode = 2 -theme_override_styles/panel = SubResource("StyleBoxFlat_1g1am") - -[node name="VBox" type="VBoxContainer" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/Panel"] -layout_mode = 2 -theme_override_constants/separation = -8 - -[node name="State" type="Label" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/Panel/VBox"] -unique_name_in_owner = true -layout_mode = 2 -theme_type_variation = &"DialogicSubTitle" -text = "Update Available!" - -[node name="UpdateName" type="Label" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/Panel/VBox"] -unique_name_in_owner = true -layout_mode = 2 -theme_type_variation = &"DialogicTitle" -theme_override_font_sizes/font_size = 25 -text = "Dialogic 2.0 - alpha 9" -uppercase = true - -[node name="ShortInfo" type="Label" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/Panel/VBox"] -unique_name_in_owner = true -layout_mode = 2 -theme_type_variation = &"DialogicHintText2" -theme_override_font_sizes/font_size = 10 -text = "12/31/23" - -[node name="Refresh" type="Button" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/Panel"] -layout_mode = 2 -size_flags_horizontal = 8 -size_flags_vertical = 0 -text = "Refresh -" -flat = true - -[node name="Content" type="RichTextLabel" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -theme_override_font_sizes/normal_font_size = 14 -theme_override_styles/normal = SubResource("StyleBoxEmpty_j1mw2") -bbcode_enabled = true -text = "[font_size=25]🎉 New alpha, new stuff![/font_size] -If you are using dialogic 2 alphas then we've got an exciting update. It's not the beta yet, but we are getting closer! As always if you have questions or feedback it's best to reach out on [url=https://discord.gg/2hHQzkf2pX]emilios discord[/url]. - -This alpha brings a couple of very useful new features to dialogic as well as some syntax changes and a design overhaul (and many, many bug fixes). -" -fit_content = true - -[node name="Reactions" type="HBoxContainer" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 - -[node name="Likes" type="Label" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/Reactions"] -layout_mode = 2 -theme_override_font_sizes/font_size = 14 -theme_override_styles/normal = SubResource("StyleBoxFlat_h4v2s") -text = "👍12" - -[node name="Hooray" type="Label" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/Reactions"] -layout_mode = 2 -theme_override_font_sizes/font_size = 14 -theme_override_styles/normal = SubResource("StyleBoxFlat_h4v2s") -text = "🎉12" - -[node name="Laugh" type="Label" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/Reactions"] -layout_mode = 2 -theme_override_font_sizes/font_size = 14 -theme_override_styles/normal = SubResource("StyleBoxFlat_h4v2s") -text = "👀12" - -[node name="Heart" type="Label" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/Reactions"] -layout_mode = 2 -theme_override_font_sizes/font_size = 14 -theme_override_styles/normal = SubResource("StyleBoxFlat_h4v2s") -text = "❤️12" - -[node name="Rocket" type="Label" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/Reactions"] -layout_mode = 2 -theme_override_font_sizes/font_size = 14 -theme_override_styles/normal = SubResource("StyleBoxFlat_h4v2s") -text = "😕12" - -[node name="Eyes" type="Label" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/Reactions"] -layout_mode = 2 -theme_override_font_sizes/font_size = 14 -theme_override_styles/normal = SubResource("StyleBoxFlat_h4v2s") -text = "🚀12" - -[node name="Confused" type="Label" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/Reactions"] -layout_mode = 2 -theme_override_font_sizes/font_size = 14 -theme_override_styles/normal = SubResource("StyleBoxFlat_h4v2s") -text = "😂12" - -[node name="ReadFull" type="LinkButton" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/Reactions"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 10 -text = "Read Full Announcement" - -[node name="Control" type="Control" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer"] -custom_minimum_size = Vector2(0, 20) -layout_mode = 2 - -[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer"] -layout_mode = 2 -alignment = 2 - -[node name="InfoLabel" type="Label" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/HBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -horizontal_alignment = 2 -autowrap_mode = 3 - -[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/HBoxContainer"] -self_modulate = Color(0, 0, 0, 1) -layout_mode = 2 -size_flags_horizontal = 4 -theme_override_styles/panel = SubResource("StyleBoxFlat_h4v2s") - -[node name="HBox" type="HBoxContainer" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/HBoxContainer/PanelContainer"] -layout_mode = 2 -alignment = 2 - -[node name="Loading" type="CenterContainer" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/HBoxContainer/PanelContainer/HBox"] -unique_name_in_owner = true -visible = false -custom_minimum_size = Vector2(30, 0) -layout_mode = 2 - -[node name="Control" type="Control" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/HBoxContainer/PanelContainer/HBox/Loading"] -layout_mode = 2 - -[node name="LoadingIcon" type="Sprite2D" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/HBoxContainer/PanelContainer/HBox/Loading/Control"] -unique_name_in_owner = true -texture = ExtResource("2_20ke0") - -[node name="Restart" type="Button" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/HBoxContainer/PanelContainer/HBox"] -unique_name_in_owner = true -visible = false -layout_mode = 2 -size_flags_vertical = 4 -text = "Restart Now" -flat = true - -[node name="Install" type="Button" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/HBoxContainer/PanelContainer/HBox"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 4 -text = "Install" -flat = true - -[node name="InstallWarning" type="PanelContainer" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/HBoxContainer/PanelContainer/HBox/Install"] -unique_name_in_owner = true -visible = false -self_modulate = Color(0, 0, 0, 1) -layout_mode = 1 -anchors_preset = 1 -anchor_left = 1.0 -anchor_right = 1.0 -offset_left = -493.0 -offset_top = -92.0 -offset_right = 5.0 -offset_bottom = -8.0 -grow_horizontal = 0 -theme_override_styles/panel = SubResource("StyleBoxFlat_utju1") - -[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/HBoxContainer/PanelContainer/HBox/Install/InstallWarning"] -layout_mode = 2 -theme_override_font_sizes/font_size = 14 -text = "Be careful. This will delete the addons/dialogic folder and install the new version. Any custom changes in that folder will be lost. -To be on the save side, use version control!" -autowrap_mode = 3 - -[node name="Control2" type="Control" parent="VBoxContainer/HBoxContainer2"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 7 - -[node name="Close" type="HBoxContainer" parent="VBoxContainer"] -layout_mode = 2 -alignment = 1 - -[node name="CloseButton" type="Button" parent="VBoxContainer/Close"] -unique_name_in_owner = true -layout_mode = 2 -text = "Close" - -[connection signal="pressed" from="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/Panel/Refresh" to="." method="_on_refresh_pressed"] -[connection signal="meta_clicked" from="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/Content" to="." method="_on_content_meta_clicked"] -[connection signal="pressed" from="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/HBoxContainer/PanelContainer/HBox/Restart" to="." method="_on_restart_pressed"] -[connection signal="mouse_entered" from="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/HBoxContainer/PanelContainer/HBox/Install" to="." method="_on_install_mouse_entered"] -[connection signal="mouse_exited" from="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/HBoxContainer/PanelContainer/HBox/Install" to="." method="_on_install_mouse_exited"] -[connection signal="pressed" from="VBoxContainer/HBoxContainer2/VBox/ScrollContainer/VBoxContainer/HBoxContainer/PanelContainer/HBox/Install" to="." method="_on_install_pressed"] -[connection signal="pressed" from="VBoxContainer/Close/CloseButton" to="." method="_on_close_button_pressed"] diff --git a/godot/addons/dialogic/Editor/Common/update_manager.gd b/godot/addons/dialogic/Editor/Common/update_manager.gd deleted file mode 100644 index cb33506..0000000 --- a/godot/addons/dialogic/Editor/Common/update_manager.gd +++ /dev/null @@ -1,190 +0,0 @@ -@tool -extends Node - -## Script that checks for new versions and can install them. - -signal update_check_completed(result:UpdateCheckResult) -signal downdload_completed(result:DownloadResult) - -enum UpdateCheckResult {UPDATE_AVAILABLE, UP_TO_DATE, NO_ACCESS} -enum DownloadResult {SUCCESS, FAILURE} -enum ReleaseState {ALPHA, BETA, STABLE} - -const REMOTE_RELEASES_URL := "https://api.github.com/repos/dialogic-godot/dialogic/releases" -const TEMP_FILE_NAME := "user://temp.zip" - -var current_version := "" -var update_info: Dictionary -var current_info: Dictionary - -var version_indicator: Button - -func _ready() -> void: - request_update_check() - - setup_version_indicator() - - - -func get_current_version() -> String: - var plugin_cfg := ConfigFile.new() - plugin_cfg.load("res://addons/dialogic/plugin.cfg") - return plugin_cfg.get_value('plugin', 'version', 'unknown version') - - -func request_update_check() -> void: - if $UpdateCheckRequest.get_http_client_status() == HTTPClient.STATUS_DISCONNECTED: - $UpdateCheckRequest.request(REMOTE_RELEASES_URL) - - -func _on_UpdateCheck_request_completed(result:int, response_code:int, headers:PackedStringArray, body:PackedByteArray) -> void: - if result != HTTPRequest.RESULT_SUCCESS: - update_check_completed.emit(UpdateCheckResult.NO_ACCESS) - return - - # Work out the next version from the releases information on GitHub - var response: Variant = JSON.parse_string(body.get_string_from_utf8()) - if typeof(response) != TYPE_ARRAY: return - - - var current_release_info := get_release_tag_info(get_current_version()) - - # GitHub releases are in order of creation, not order of version - var versions: Array = (response as Array).filter(compare_versions.bind(current_release_info)) - if versions.size() > 0: - update_info = versions[0] - update_check_completed.emit(UpdateCheckResult.UPDATE_AVAILABLE) - else: - update_info = current_info - update_check_completed.emit(UpdateCheckResult.UP_TO_DATE) - - -func compare_versions(release, current_release_info:Dictionary) -> bool: - var checked_release_info := get_release_tag_info(release.tag_name) - - if checked_release_info.major < current_release_info.major: - return false - - if checked_release_info.minor < current_release_info.minor: - return false - - if checked_release_info.state < current_release_info.state: - return false - - elif checked_release_info.state == current_release_info.state: - if checked_release_info.state_version < current_release_info.state_version: - return false - - if checked_release_info.state_version == current_release_info.state_version: - current_info = release - return false - - if checked_release_info.state == ReleaseState.STABLE: - if checked_release_info.minor == current_release_info.minor: - current_info = release - return false - - return true - - -func get_release_tag_info(release_tag:String) -> Dictionary: - release_tag = release_tag.strip_edges().trim_prefix('v') - release_tag = release_tag.substr(0, release_tag.find('(')) - release_tag = release_tag.to_lower() - - var regex := RegEx.create_from_string(r"(?<major>\d+\.\d+)(-(?<state>alpha|beta)-)?(?(2)(?<stateversion>\d*)|\.(?<minor>\d*))?") - - var result: RegExMatch = regex.search(release_tag) - if !result: - return {} - - var info: Dictionary = {'tag':release_tag} - info['major'] = float(result.get_string('major')) - info['minor'] = int(result.get_string('minor')) - - match result.get_string('state'): - 'alpha': - info['state'] = ReleaseState.ALPHA - 'beta': - info['state'] = ReleaseState.BETA - _: - info['state'] = ReleaseState.STABLE - - info['state_version'] = int(result.get_string('stateversion')) - - return info - - -func request_update_download() -> void: - # Safeguard the actual dialogue manager repo from accidentally updating itself - if DirAccess.dir_exists_absolute("res://test-project/"): - prints("[Dialogic] Looks like you are working on the addon. You can't update the addon from within itself.") - downdload_completed.emit(DownloadResult.FAILURE) - return - - $DownloadRequest.request(update_info.zipball_url) - - -func _on_DownloadRequest_completed(result:int, response_code:int, headers:PackedStringArray, body:PackedByteArray): - if result != HTTPRequest.RESULT_SUCCESS: - downdload_completed.emit(DownloadResult.FAILURE) - return - - # Save the downloaded zip - var zip_file: FileAccess = FileAccess.open(TEMP_FILE_NAME, FileAccess.WRITE) - zip_file.store_buffer(body) - zip_file.close() - - OS.move_to_trash(ProjectSettings.globalize_path("res://addons/dialogic")) - - var zip_reader: ZIPReader = ZIPReader.new() - zip_reader.open(TEMP_FILE_NAME) - var files: PackedStringArray = zip_reader.get_files() - - var base_path: String = files[0].path_join('addons/') - for path in files: - if not "dialogic/" in path: - continue - - var new_file_path: String = path.replace(base_path, "") - if path.ends_with("/"): - DirAccess.make_dir_recursive_absolute("res://addons/".path_join(new_file_path)) - else: - var file: FileAccess = FileAccess.open("res://addons/".path_join(new_file_path), FileAccess.WRITE) - file.store_buffer(zip_reader.read_file(path)) - - zip_reader.close() - DirAccess.remove_absolute(TEMP_FILE_NAME) - - downdload_completed.emit(DownloadResult.SUCCESS) - - -###################### SOME UI MANAGEMENT ##################################### -################################################################################ - -func setup_version_indicator() -> void: - version_indicator = %Sidebar.get_node('%CurrentVersion') - version_indicator.pressed.connect($Window/UpdateInstallWindow.open) - version_indicator.text = get_current_version() - - -func _on_update_check_completed(result:int): - var result_color: Color - match result: - UpdateCheckResult.UPDATE_AVAILABLE: - result_color = version_indicator.get_theme_color("warning_color", "Editor") - version_indicator.icon = version_indicator.get_theme_icon("StatusWarning", "EditorIcons") - $Window/UpdateInstallWindow.load_info(update_info, result) - UpdateCheckResult.UP_TO_DATE: - result_color = version_indicator.get_theme_color("success_color", "Editor") - version_indicator.icon = version_indicator.get_theme_icon("StatusSuccess", "EditorIcons") - $Window/UpdateInstallWindow.load_info(current_info, result) - UpdateCheckResult.NO_ACCESS: - result_color = version_indicator.get_theme_color("success_color", "Editor") - version_indicator.icon = version_indicator.get_theme_icon("GuiRadioCheckedDisabled", "EditorIcons") - $Window/UpdateInstallWindow.load_info(update_info, result) - - version_indicator.add_theme_color_override('font_color', result_color) - version_indicator.add_theme_color_override('font_hover_color', result_color.lightened(0.5)) - version_indicator.add_theme_color_override('font_pressed_color', result_color) - version_indicator.add_theme_color_override('font_focus_color', result_color) diff --git a/godot/addons/dialogic/Editor/Common/update_manager.gd.uid b/godot/addons/dialogic/Editor/Common/update_manager.gd.uid deleted file mode 100644 index c6e01cf..0000000 --- a/godot/addons/dialogic/Editor/Common/update_manager.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://1tph6ios6ry2 diff --git a/godot/addons/dialogic/Editor/Events/BranchEnd.gd b/godot/addons/dialogic/Editor/Events/BranchEnd.gd deleted file mode 100644 index d43ebe3..0000000 --- a/godot/addons/dialogic/Editor/Events/BranchEnd.gd +++ /dev/null @@ -1,85 +0,0 @@ -@tool -extends Control -## A scene shown at the end of events that contain other events - -var resource: DialogicEndBranchEvent - -# References -var parent_node: Control = null -var end_control: Control = null - -# Indent -var indent_size := 22 -var current_indent_level := 1 - -var selected := false - -func _ready() -> void: - $Icon.icon = get_theme_icon("GuiSpinboxUpdown", "EditorIcons") - $Spacer.custom_minimum_size.x = 90 * DialogicUtil.get_editor_scale() - visual_deselect() - parent_node_changed() - - -## Called by the visual timeline editor -func visual_select() -> void: - modulate = get_theme_color("highlighted_font_color", "Editor") - selected = true - - -## Called by the visual timeline editor -func visual_deselect() -> void: - if !parent_node:return - selected = false - modulate = parent_node.resource.event_color.lerp(get_theme_color("font_color", "Editor"), 0.3) - - -func is_selected() -> bool: - return selected - - -## Called by the visual timeline editor -func highlight() -> void: - if !parent_node:return - modulate = parent_node.resource.event_color.lerp(get_theme_color("font_color", "Editor"), 0.6) - - -## Called by the visual timeline editor -func unhighlight() -> void: - modulate = parent_node.resource.event_color - - -func update_hidden_events_indicator(hidden_events_count:int = 0) -> void: - $HiddenEventsLabel.visible = hidden_events_count > 0 - if hidden_events_count == 1: - $HiddenEventsLabel.text = "[1 event hidden]" - else: - $HiddenEventsLabel.text = "["+str(hidden_events_count)+ " events hidden]" - - -## Called by the visual timeline editor -func set_indent(indent: int) -> void: - $Indent.custom_minimum_size = Vector2(indent_size * indent * DialogicUtil.get_editor_scale(), 0) - $Indent.visible = indent != 0 - current_indent_level = indent - queue_redraw() - - -## Called by the visual timeline editor if something was edited on the parent event block -func parent_node_changed() -> void: - if parent_node and end_control and end_control.has_method('refresh'): - end_control.refresh() - - -## Called on creation if the parent event provides an end control -func add_end_control(control:Control) -> void: - if !control: - return - add_child(control) - control.size_flags_vertical = SIZE_SHRINK_CENTER - if "parent_resource" in control: - control.parent_resource = parent_node.resource - if control.has_method('refresh'): - control.refresh() - end_control = control - diff --git a/godot/addons/dialogic/Editor/Events/BranchEnd.gd.uid b/godot/addons/dialogic/Editor/Events/BranchEnd.gd.uid deleted file mode 100644 index f190a6c..0000000 --- a/godot/addons/dialogic/Editor/Events/BranchEnd.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cyjmcay08lmr8 diff --git a/godot/addons/dialogic/Editor/Events/BranchEnd.tscn b/godot/addons/dialogic/Editor/Events/BranchEnd.tscn deleted file mode 100644 index 63df64e..0000000 --- a/godot/addons/dialogic/Editor/Events/BranchEnd.tscn +++ /dev/null @@ -1,48 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://de13fdeebrkcb"] - -[ext_resource type="Script" uid="uid://cyjmcay08lmr8" path="res://addons/dialogic/Editor/Events/BranchEnd.gd" id="1"] - -[sub_resource type="Image" id="Image_6aqdp"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_44ap0"] -image = SubResource("Image_6aqdp") - -[node name="EndBranch" type="HBoxContainer"] -anchors_preset = 10 -anchor_right = 1.0 -offset_bottom = 24.0 -grow_horizontal = 2 -mouse_filter = 0 -script = ExtResource("1") - -[node name="Indent" type="Control" parent="."] -layout_mode = 2 -size_flags_vertical = 0 - -[node name="Spacer" type="Control" parent="."] -custom_minimum_size = Vector2(90, 0) -layout_mode = 2 -size_flags_vertical = 0 - -[node name="Icon" type="Button" parent="."] -unique_name_in_owner = true -custom_minimum_size = Vector2(20, 0) -layout_mode = 2 -size_flags_vertical = 4 -tooltip_text = "Click and drag" -focus_mode = 0 -mouse_filter = 1 -icon = SubResource("ImageTexture_44ap0") -flat = true - -[node name="HiddenEventsLabel" type="Label" parent="."] -visible = false -layout_mode = 2 -text = "XX Events hidden" diff --git a/godot/addons/dialogic/Editor/Events/EventBlock/event_block.gd b/godot/addons/dialogic/Editor/Events/EventBlock/event_block.gd deleted file mode 100644 index 47fa94d..0000000 --- a/godot/addons/dialogic/Editor/Events/EventBlock/event_block.gd +++ /dev/null @@ -1,430 +0,0 @@ -@tool -extends MarginContainer - -## Scene that represents an event in the visual timeline editor. - -signal content_changed() - -## REFERENCES -var resource: DialogicEvent -var editor_reference -# for choice and condition -var end_node: Node = null: - get: - return end_node - set(node): - end_node = node - %ToggleChildrenVisibilityButton.visible = true if end_node else false - - -## FLAGS -var selected := false -# Whether the body is visible -var expanded := true -var body_was_build := false -var has_any_enabled_body_content := false -# Whether contained events (e.g. in choices) are visible -var collapsed := false - - -## CONSTANTS -const icon_size := 28 -const indent_size := 22 - -## STATE -# List that stores visibility conditions -var field_list := [] -var current_indent_level := 1 - - -#region UI AND LOGIC INITIALIZATION -################################################################################ - -func _ready() -> void: - if get_parent() is SubViewport: - return - - if not resource: - printerr("[Dialogic] Event block was added without a resource specified.") - return - - initialize_ui() - initialize_logic() - - -func initialize_ui() -> void: - var _scale := DialogicUtil.get_editor_scale() - - add_theme_constant_override("margin_bottom", DialogicUtil.get_editor_setting("event_block_margin", 0) * _scale) - - $PanelContainer.self_modulate = get_theme_color("accent_color", "Editor") - - # Warning Icon - %Warning.texture = get_theme_icon("NodeWarning", "EditorIcons") - %Warning.size = Vector2(16 * _scale, 16 * _scale) - %Warning.position = Vector2(-5 * _scale, -10 * _scale) - - # Expand Button - %ToggleBodyVisibilityButton.icon = get_theme_icon("CodeFoldedRightArrow", "EditorIcons") - %ToggleBodyVisibilityButton.set("theme_override_colors/icon_normal_color", get_theme_color("contrast_color_2", "Editor")) - %ToggleBodyVisibilityButton.set("theme_override_colors/icon_hover_color", get_theme_color("accent_color", "Editor")) - %ToggleBodyVisibilityButton.set("theme_override_colors/icon_pressed_color", get_theme_color("contrast_color_2", "Editor")) - %ToggleBodyVisibilityButton.set("theme_override_colors/icon_hover_pressed_color", get_theme_color("accent_color", "Editor")) - %ToggleBodyVisibilityButton.add_theme_stylebox_override('hover_pressed', StyleBoxEmpty.new()) - - # Icon Panel - %IconPanel.tooltip_text = resource.event_name - %IconPanel.self_modulate = resource.event_color - - # Event Icon - %IconTexture.texture = resource._get_icon() - - %IconPanel.custom_minimum_size = Vector2(icon_size, icon_size) * _scale - %IconTexture.custom_minimum_size = %IconPanel.custom_minimum_size - - var custom_style: StyleBoxFlat = %IconPanel.get_theme_stylebox('panel') - custom_style.set_corner_radius_all(5 * _scale) - - # Focus Mode - set_focus_mode(1) # Allowing this node to grab focus - - # Separation on the header - %Header.add_theme_constant_override("custom_constants/separation", 5 * _scale) - - # Collapse Button - %ToggleChildrenVisibilityButton.toggled.connect(_on_collapse_toggled) - %ToggleChildrenVisibilityButton.icon = get_theme_icon("Collapse", "EditorIcons") - %ToggleChildrenVisibilityButton.hide() - - %Body.add_theme_constant_override("margin_left", icon_size * _scale) - - visual_deselect() - - -func initialize_logic() -> void: - resized.connect(get_parent().get_parent().queue_redraw) - - resource.ui_update_needed.connect(_on_resource_ui_update_needed) - resource.ui_update_warning.connect(set_warning) - - content_changed.connect(recalculate_field_visibility) - - _on_ToggleBodyVisibility_toggled(resource.expand_by_default or resource.created_by_button) - -#endregion - - -#region VISUAL METHODS -################################################################################ - -func visual_select() -> void: - $PanelContainer.add_theme_stylebox_override('panel', load("res://addons/dialogic/Editor/Events/styles/selected_styleboxflat.tres")) - selected = true - %IconPanel.self_modulate = resource.event_color - %IconTexture.modulate = get_theme_color("icon_saturation", "Editor") - - -func visual_deselect() -> void: - $PanelContainer.add_theme_stylebox_override('panel', load("res://addons/dialogic/Editor/Events/styles/unselected_stylebox.tres")) - selected = false - %IconPanel.self_modulate = resource.event_color.lerp(Color.DARK_SLATE_GRAY, 0.1) - %IconTexture.modulate = get_theme_color('font_color', 'Label') - - -func is_selected() -> bool: - return selected - - -func set_warning(text:String= "") -> void: - if !text.is_empty(): - %Warning.show() - %Warning.tooltip_text = text - else: - %Warning.hide() - - -func set_indent(indent: int) -> void: - add_theme_constant_override("margin_left", indent_size * indent * DialogicUtil.get_editor_scale()) - current_indent_level = indent - -#endregion - - -#region EVENT FIELDS -################################################################################ - -var FIELD_SCENES := { - DialogicEvent.ValueType.MULTILINE_TEXT: "res://addons/dialogic/Editor/Events/Fields/field_text_multiline.tscn", - DialogicEvent.ValueType.SINGLELINE_TEXT: "res://addons/dialogic/Editor/Events/Fields/field_text_singleline.tscn", - DialogicEvent.ValueType.FILE: "res://addons/dialogic/Editor/Events/Fields/field_file.tscn", - DialogicEvent.ValueType.BOOL: "res://addons/dialogic/Editor/Events/Fields/field_bool_check.tscn", - DialogicEvent.ValueType.BOOL_BUTTON: "res://addons/dialogic/Editor/Events/Fields/field_bool_button.tscn", - DialogicEvent.ValueType.CONDITION: "res://addons/dialogic/Editor/Events/Fields/field_condition.tscn", - DialogicEvent.ValueType.ARRAY: "res://addons/dialogic/Editor/Events/Fields/field_array.tscn", - DialogicEvent.ValueType.DICTIONARY: "res://addons/dialogic/Editor/Events/Fields/field_dictionary.tscn", - DialogicEvent.ValueType.DYNAMIC_OPTIONS: "res://addons/dialogic/Editor/Events/Fields/field_options_dynamic.tscn", - DialogicEvent.ValueType.FIXED_OPTIONS : "res://addons/dialogic/Editor/Events/Fields/field_options_fixed.tscn", - DialogicEvent.ValueType.NUMBER: "res://addons/dialogic/Editor/Events/Fields/field_number.tscn", - DialogicEvent.ValueType.VECTOR2: "res://addons/dialogic/Editor/Events/Fields/field_vector2.tscn", - DialogicEvent.ValueType.VECTOR3: "res://addons/dialogic/Editor/Events/Fields/field_vector3.tscn", - DialogicEvent.ValueType.VECTOR4: "res://addons/dialogic/Editor/Events/Fields/field_vector4.tscn", - DialogicEvent.ValueType.COLOR: "res://addons/dialogic/Editor/Events/Fields/field_color.tscn", - DialogicEvent.ValueType.AUDIO_PREVIEW: "res://addons/dialogic/Editor/Events/Fields/field_audio_preview.tscn", - DialogicEvent.ValueType.IMAGE_PREVIEW: "res://addons/dialogic/Editor/Events/Fields/field_image_preview.tscn", - } - -func build_editor(build_header:bool = true, build_body:bool = false) -> void: - var current_body_container: HFlowContainer = null - - if build_body and body_was_build: - build_body = false - - if build_body: - if body_was_build: - return - current_body_container = HFlowContainer.new() - %BodyContent.add_child(current_body_container) - body_was_build = true - - for p in resource.get_event_editor_info(): - field_list.append({'node':null, 'location':p.location}) - if p.has('condition'): - field_list[-1]['condition'] = p.condition - - if !build_body and p.location == 1: - continue - elif !build_header and p.location == 0: - continue - - ### -------------------------------------------------------------------- - ### 1. CREATE A NODE OF THE CORRECT TYPE FOR THE PROPERTY - var editor_node: Control - - ### LINEBREAK - if p.name == "linebreak": - field_list.remove_at(field_list.size()-1) - if !current_body_container.get_child_count(): - current_body_container.queue_free() - current_body_container = HFlowContainer.new() - %BodyContent.add_child(current_body_container) - continue - - elif p.field_type in FIELD_SCENES: - editor_node = load(FIELD_SCENES[p.field_type]).instantiate() - - elif p.field_type == resource.ValueType.LABEL: - editor_node = Label.new() - editor_node.text = p.display_info.text - editor_node.vertical_alignment = VERTICAL_ALIGNMENT_CENTER - editor_node.set('custom_colors/font_color', Color("#7b7b7b")) - editor_node.add_theme_color_override('font_color', resource.event_color.lerp(get_theme_color("font_color", "Editor"), 0.8)) - - elif p.field_type == resource.ValueType.BUTTON: - editor_node = Button.new() - editor_node.text = p.display_info.text - editor_node.tooltip_text = p.display_info.get('tooltip', '') - if typeof(p.display_info.icon) == TYPE_ARRAY: - editor_node.icon = callv('get_theme_icon', p.display_info.icon) - else: - editor_node.icon = p.display_info.icon - editor_node.flat = true - editor_node.custom_minimum_size.x = 30 * DialogicUtil.get_editor_scale() - editor_node.pressed.connect(p.display_info.callable) - - ## CUSTOM - elif p.field_type == resource.ValueType.CUSTOM: - if p.display_info.has('path'): - editor_node = load(p.display_info.path).instantiate() - - ## ELSE - else: - editor_node = Label.new() - editor_node.text = p.name - editor_node.add_theme_color_override('font_color', resource.event_color.lerp(get_theme_color("font_color", "Editor"), 0.8)) - - - field_list[-1]['node'] = editor_node - ### -------------------------------------------------------------------- - # Some things need to be called BEFORE the field is added to the tree - if editor_node is DialogicVisualEditorField: - editor_node.event_resource = resource - - editor_node.property_name = p.name - field_list[-1]['property'] = p.name - - editor_node._load_display_info(p.display_info) - - var location: Control = %HeaderContent - if p.location == 1: - location = current_body_container - location.add_child(editor_node) - - # Some things need to be called AFTER the field is added to the tree - if editor_node is DialogicVisualEditorField: - # Only set the value if the field is visible - # - # This prevents events with varied value types (event_setting, event_variable) - # from injecting incorrect types into hidden fields, which then throw errors - # in the console. - if p.has('condition') and not p.condition.is_empty(): - if _evaluate_visibility_condition(p): - editor_node._set_value(resource.get(p.name)) - else: - editor_node._set_value(resource.get(p.name)) - - editor_node.value_changed.connect(set_property) - - editor_node.tooltip_text = p.display_info.get('tooltip', '') - - # Apply autofocus - if resource.created_by_button and p.display_info.get('autofocus', false): - editor_node.call_deferred('take_autofocus') - - ### -------------------------------------------------------------------- - ### 4. ADD LEFT AND RIGHT TEXT - var left_label: Label = null - var right_label: Label = null - if !p.get('left_text', '').is_empty(): - left_label = Label.new() - left_label.text = p.get('left_text') - left_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER - left_label.add_theme_color_override('font_color', resource.event_color.lerp(get_theme_color("font_color", "Editor"), 0.8)) - location.add_child(left_label) - location.move_child(left_label, editor_node.get_index()) - if !p.get('right_text', '').is_empty(): - right_label = Label.new() - right_label.text = p.get('right_text') - right_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER - right_label.add_theme_color_override('font_color', resource.event_color.lerp(get_theme_color("font_color", "Editor"), 0.8)) - location.add_child(right_label) - location.move_child(right_label, editor_node.get_index()+1) - - ### -------------------------------------------------------------------- - ### 5. REGISTER CONDITION - if p.has('condition'): - field_list[-1]['condition'] = p.condition - if left_label: - field_list.append({'node': left_label, 'condition':p.condition, 'location':p.location}) - if right_label: - field_list.append({'node': right_label, 'condition':p.condition, 'location':p.location}) - - - if build_body: - if current_body_container.get_child_count() == 0: - expanded = false - %Body.visible = false - - recalculate_field_visibility() - - -func recalculate_field_visibility() -> void: - has_any_enabled_body_content = false - for p in field_list: - if !p.has('condition') or p.condition.is_empty(): - if p.node != null: - p.node.show() - if p.location == 1: - has_any_enabled_body_content = true - else: - if _evaluate_visibility_condition(p): - if p.node != null: - if p.node.visible == false and p.has("property"): - p.node._set_value(resource.get(p.property)) - p.node.show() - if p.location == 1: - has_any_enabled_body_content = true - else: - if p.node != null: - p.node.hide() - %ToggleBodyVisibilityButton.visible = has_any_enabled_body_content - - -func set_property(property_name:String, value:Variant) -> void: - resource.set(property_name, value) - content_changed.emit() - if end_node: - end_node.parent_node_changed() - - -func _evaluate_visibility_condition(p: Dictionary) -> bool: - var expr := Expression.new() - expr.parse(p.condition) - var result: bool - if expr.execute([], resource): - result = true - else: - result = false - if expr.has_execute_failed(): - printerr("[Dialogic] Failed executing visibility condition for '",p.get('property', 'unnamed'),"': " + expr.get_error_text()) - return result - - -func get_field_node(property_name:String) -> Node: - for i in field_list: - if i.get("property", "") == property_name: - return i.node - return null - - -func _on_resource_ui_update_needed() -> void: - for node_info in field_list: - if node_info.node and node_info.node.has_method('set_value'): - # Only set the value if the field is visible - # - # This prevents events with varied value types (event_setting, event_variable) - # from injecting incorrect types into hidden fields, which then throw errors - # in the console. - if node_info.has('condition') and not node_info.condition.is_empty(): - if _evaluate_visibility_condition(node_info): - node_info.node.set_value(resource.get(node_info.property)) - else: - node_info.node.set_value(resource.get(node_info.property)) - recalculate_field_visibility() - - -#region SIGNALS -################################################################################ - -func _on_collapse_toggled(toggled:bool) -> void: - collapsed = toggled - var timeline_editor: Node = find_parent('VisualEditor') - if (timeline_editor != null): - # @todo select item and clear selection is marked as "private" in TimelineEditor.gd - # consider to make it "public" or add a public helper function - timeline_editor.indent_events() - - - -func _on_ToggleBodyVisibility_toggled(button_pressed:bool) -> void: - if button_pressed and !body_was_build: - build_editor(false, true) - %ToggleBodyVisibilityButton.set_pressed_no_signal(button_pressed) - - if button_pressed: - %ToggleBodyVisibilityButton.icon = get_theme_icon("CodeFoldDownArrow", "EditorIcons") - else: - %ToggleBodyVisibilityButton.icon = get_theme_icon("CodeFoldedRightArrow", "EditorIcons") - - expanded = button_pressed - %Body.visible = button_pressed - - if find_parent('VisualEditor') != null: - find_parent('VisualEditor').indent_events() - - -func _on_EventNode_gui_input(event:InputEvent) -> void: - if event is InputEventMouseButton and event.is_pressed() and event.button_index == 1: - grab_focus() # Grab focus to avoid copy pasting text or events - if event.double_click: - if has_any_enabled_body_content: - _on_ToggleBodyVisibility_toggled(!expanded) - # For opening the context menu - if event is InputEventMouseButton: - if event.button_index == MOUSE_BUTTON_RIGHT and event.pressed: - var popup: PopupMenu = get_parent().get_parent().get_node('EventPopupMenu') - popup.current_event = self - popup.popup_on_parent(Rect2(get_global_mouse_position(),Vector2())) - if resource.help_page_path == "": - popup.set_item_disabled(4, true) - else: - popup.set_item_disabled(4, false) diff --git a/godot/addons/dialogic/Editor/Events/EventBlock/event_block.gd.uid b/godot/addons/dialogic/Editor/Events/EventBlock/event_block.gd.uid deleted file mode 100644 index d383047..0000000 --- a/godot/addons/dialogic/Editor/Events/EventBlock/event_block.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dbncx2w0btjyx diff --git a/godot/addons/dialogic/Editor/Events/EventBlock/event_block.tscn b/godot/addons/dialogic/Editor/Events/EventBlock/event_block.tscn deleted file mode 100644 index 5402273..0000000 --- a/godot/addons/dialogic/Editor/Events/EventBlock/event_block.tscn +++ /dev/null @@ -1,133 +0,0 @@ -[gd_scene load_steps=8 format=3 uid="uid://bwaxj1n401fp4"] - -[ext_resource type="Script" uid="uid://dbncx2w0btjyx" path="res://addons/dialogic/Editor/Events/EventBlock/event_block.gd" id="1"] -[ext_resource type="StyleBox" uid="uid://cl75ikyq2is7c" path="res://addons/dialogic/Editor/Events/styles/unselected_stylebox.tres" id="2_axj84"] -[ext_resource type="Texture2D" uid="uid://dybg3l5pwetne" path="res://addons/dialogic/Editor/Images/plugin-icon.svg" id="6"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_otutu"] -bg_color = Color(1, 1, 1, 1) -corner_radius_top_left = 5 -corner_radius_top_right = 5 -corner_radius_bottom_right = 5 -corner_radius_bottom_left = 5 - -[sub_resource type="Image" id="Image_cl0tj"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_rc1wh"] -image = SubResource("Image_cl0tj") - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ee4ub"] - -[node name="EventNode" type="MarginContainer"] -anchors_preset = 10 -anchor_right = 1.0 -grow_horizontal = 2 -size_flags_horizontal = 3 -size_flags_vertical = 9 -focus_mode = 1 -script = ExtResource("1") - -[node name="PanelContainer" type="PanelContainer" parent="."] -self_modulate = Color(0, 0, 0, 1) -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -mouse_filter = 2 -theme_override_styles/panel = ExtResource("2_axj84") - -[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="Header" type="HBoxContainer" parent="PanelContainer/VBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="IconPanel" type="Panel" parent="PanelContainer/VBoxContainer/Header"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 4 -size_flags_vertical = 4 -mouse_filter = 1 -mouse_default_cursor_shape = 6 -theme_override_styles/panel = SubResource("StyleBoxFlat_otutu") - -[node name="IconTexture" type="TextureRect" parent="PanelContainer/VBoxContainer/Header/IconPanel"] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 0 -grow_vertical = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -texture = ExtResource("6") -expand_mode = 1 -stretch_mode = 5 - -[node name="Warning" type="TextureRect" parent="PanelContainer/VBoxContainer/Header/IconPanel"] -unique_name_in_owner = true -visible = false -layout_mode = 0 -offset_left = -5.5 -offset_top = -11.0 -offset_right = 12.1 -offset_bottom = 6.6 -texture = SubResource("ImageTexture_rc1wh") -stretch_mode = 5 - -[node name="HeaderContent" type="HBoxContainer" parent="PanelContainer/VBoxContainer/Header"] -unique_name_in_owner = true -layout_mode = 2 - -[node name="ToggleBodyVisibilityButton" type="Button" parent="PanelContainer/VBoxContainer/Header"] -unique_name_in_owner = true -custom_minimum_size = Vector2(20, 0) -layout_mode = 2 -size_flags_horizontal = 0 -tooltip_text = "Fold/Unfold Settings" -theme_override_styles/normal = SubResource("StyleBoxEmpty_ee4ub") -theme_override_styles/hover = SubResource("StyleBoxEmpty_ee4ub") -theme_override_styles/pressed = SubResource("StyleBoxEmpty_ee4ub") -theme_override_styles/disabled = SubResource("StyleBoxEmpty_ee4ub") -theme_override_styles/focus = SubResource("StyleBoxEmpty_ee4ub") -toggle_mode = true -icon = SubResource("ImageTexture_rc1wh") -flat = true - -[node name="ToggleChildrenVisibilityButton" type="Button" parent="PanelContainer/VBoxContainer/Header"] -unique_name_in_owner = true -visible = false -layout_mode = 2 -size_flags_horizontal = 10 -tooltip_text = "Collapse Contained Events" -toggle_mode = true -icon = SubResource("ImageTexture_rc1wh") -flat = true - -[node name="Body" type="MarginContainer" parent="PanelContainer/VBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -theme_override_constants/margin_left = 4 - -[node name="BodyContent" type="VBoxContainer" parent="PanelContainer/VBoxContainer/Body"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -mouse_filter = 2 - -[connection signal="gui_input" from="." to="." method="_on_EventNode_gui_input"] -[connection signal="toggled" from="PanelContainer/VBoxContainer/Header/ToggleBodyVisibilityButton" to="." method="_on_ToggleBodyVisibility_toggled"] diff --git a/godot/addons/dialogic/Editor/Events/EventBlock/event_right_click_menu.gd b/godot/addons/dialogic/Editor/Events/EventBlock/event_right_click_menu.gd deleted file mode 100644 index 7fad397..0000000 --- a/godot/addons/dialogic/Editor/Events/EventBlock/event_right_click_menu.gd +++ /dev/null @@ -1,24 +0,0 @@ -@tool -extends PopupMenu - -var current_event: Node = null - -func _ready() -> void: - clear() - add_icon_item(get_theme_icon("Duplicate", "EditorIcons"), "Duplicate", 0) - add_separator() - add_icon_item(get_theme_icon("PlayStart", "EditorIcons"), "Play from here", 1) - add_separator() - add_icon_item(get_theme_icon("Help", "EditorIcons"), "Documentation", 2) - add_icon_item(get_theme_icon("CodeHighlighter", "EditorIcons"), "Open Code", 3) - add_separator() - add_icon_item(get_theme_icon("ArrowUp", "EditorIcons"), "Move up", 4) - add_icon_item(get_theme_icon("ArrowDown", "EditorIcons"), "Move down", 5) - add_separator() - add_icon_item(get_theme_icon("Remove", "EditorIcons"), "Delete", 6) - - var menu_background := StyleBoxFlat.new() - menu_background.bg_color = get_parent().get_theme_color("base_color", "Editor") - add_theme_stylebox_override('panel', menu_background) - add_theme_stylebox_override('hover', get_theme_stylebox("FocusViewport", "EditorStyles")) - add_theme_color_override('font_color_hover', get_parent().get_theme_color("accent_color", "Editor")) diff --git a/godot/addons/dialogic/Editor/Events/EventBlock/event_right_click_menu.gd.uid b/godot/addons/dialogic/Editor/Events/EventBlock/event_right_click_menu.gd.uid deleted file mode 100644 index 1bf4860..0000000 --- a/godot/addons/dialogic/Editor/Events/EventBlock/event_right_click_menu.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://n1knm2ohcehu diff --git a/godot/addons/dialogic/Editor/Events/Fields/array_part.gd b/godot/addons/dialogic/Editor/Events/Fields/array_part.gd deleted file mode 100644 index 20c7c72..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/array_part.gd +++ /dev/null @@ -1,28 +0,0 @@ -@tool -extends PanelContainer - -## Event block field part for the Array field. - -signal value_changed() - -var value_field: Node -var value_type: int = -1 - -var current_value: Variant - -func _ready() -> void: - %FlexValue.value_changed.connect(emit_signal.bind("value_changed")) - %Delete.icon = get_theme_icon("Remove", "EditorIcons") - - -func set_value(value:Variant): - %FlexValue.set_value(value) - - -func get_value() -> Variant: - return %FlexValue.current_value - - -func _on_delete_pressed() -> void: - queue_free() - value_changed.emit() diff --git a/godot/addons/dialogic/Editor/Events/Fields/array_part.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/array_part.gd.uid deleted file mode 100644 index 693d1c8..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/array_part.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cm8w2iamuulp7 diff --git a/godot/addons/dialogic/Editor/Events/Fields/array_part.tscn b/godot/addons/dialogic/Editor/Events/Fields/array_part.tscn deleted file mode 100644 index 75932ec..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/array_part.tscn +++ /dev/null @@ -1,39 +0,0 @@ -[gd_scene load_steps=5 format=3 uid="uid://ch4j2lesn1sis"] - -[ext_resource type="Script" uid="uid://cm8w2iamuulp7" path="res://addons/dialogic/Editor/Events/Fields/array_part.gd" id="1"] -[ext_resource type="PackedScene" uid="uid://dl08ubinx6ugu" path="res://addons/dialogic/Editor/Events/Fields/field_flex_value.tscn" id="3_s4j7i"] - -[sub_resource type="Image" id="Image_28ws6"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_cpbga"] -image = SubResource("Image_28ws6") - -[node name="ArrayValue" type="PanelContainer"] -offset_left = 2.0 -offset_right = 76.0 -offset_bottom = 24.0 -theme_type_variation = &"DialogicEventEditGroup" -script = ExtResource("1") - -[node name="Value" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="FlexValue" parent="Value" instance=ExtResource("3_s4j7i")] -unique_name_in_owner = true -layout_mode = 2 - -[node name="Delete" type="Button" parent="Value"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Remove" -icon = SubResource("ImageTexture_cpbga") -flat = true - -[connection signal="pressed" from="Value/Delete" to="." method="_on_delete_pressed"] diff --git a/godot/addons/dialogic/Editor/Events/Fields/dictionary_part.gd b/godot/addons/dialogic/Editor/Events/Fields/dictionary_part.gd deleted file mode 100644 index c5b8b39..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/dictionary_part.gd +++ /dev/null @@ -1,43 +0,0 @@ -@tool -extends PanelContainer - -## Event block field part for the Dictionary field. - -signal value_changed() - - -func set_key(value:String) -> void: - %Key.text = str(value) - - -func get_key() -> String: - return %Key.text - - -func set_value(value:Variant) -> void: - %FlexValue.set_value(value) - - -func get_value() -> Variant: - return %FlexValue.current_value - - -func _ready() -> void: - %Delete.icon = get_theme_icon("Remove", "EditorIcons") - - -func focus_key() -> void: - %Key.grab_focus() - - -func _on_key_text_changed(new_text: String) -> void: - value_changed.emit() - - -func _on_flex_value_value_changed() -> void: - value_changed.emit() - - -func _on_delete_pressed() -> void: - queue_free() - value_changed.emit() diff --git a/godot/addons/dialogic/Editor/Events/Fields/dictionary_part.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/dictionary_part.gd.uid deleted file mode 100644 index a73c516..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/dictionary_part.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b41laec1d54io diff --git a/godot/addons/dialogic/Editor/Events/Fields/dictionary_part.tscn b/godot/addons/dialogic/Editor/Events/Fields/dictionary_part.tscn deleted file mode 100644 index e0824b1..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/dictionary_part.tscn +++ /dev/null @@ -1,54 +0,0 @@ -[gd_scene load_steps=5 format=3 uid="uid://b27yweami3mxi"] - -[ext_resource type="Script" uid="uid://b41laec1d54io" path="res://addons/dialogic/Editor/Events/Fields/dictionary_part.gd" id="2_q88pg"] -[ext_resource type="PackedScene" uid="uid://dl08ubinx6ugu" path="res://addons/dialogic/Editor/Events/Fields/field_flex_value.tscn" id="3_p082d"] - -[sub_resource type="Image" id="Image_teqf1"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_cpbga"] -image = SubResource("Image_teqf1") - -[node name="DictionaryPart" type="PanelContainer"] -offset_left = 1.0 -offset_top = -1.0 -offset_right = 131.0 -offset_bottom = 32.0 -theme_type_variation = &"DialogicEventEditGroup" -script = ExtResource("2_q88pg") - -[node name="HBox" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="Key" type="LineEdit" parent="HBox"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -theme_type_variation = &"DialogicEventEdit" -expand_to_text_length = true -select_all_on_focus = true - -[node name="Label" type="Label" parent="HBox"] -layout_mode = 2 -text = ":" - -[node name="FlexValue" parent="HBox" instance=ExtResource("3_p082d")] -unique_name_in_owner = true -layout_mode = 2 - -[node name="Delete" type="Button" parent="HBox"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Remove" -icon = SubResource("ImageTexture_cpbga") -flat = true - -[connection signal="text_changed" from="HBox/Key" to="." method="_on_key_text_changed"] -[connection signal="value_changed" from="HBox/FlexValue" to="." method="_on_flex_value_value_changed"] -[connection signal="pressed" from="HBox/Delete" to="." method="_on_delete_pressed"] diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_array.gd b/godot/addons/dialogic/Editor/Events/Fields/field_array.gd deleted file mode 100644 index 301ade5..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_array.gd +++ /dev/null @@ -1,48 +0,0 @@ -@tool -extends DialogicVisualEditorField - -## Event block field for editing arrays. - - -const ArrayValue := "res://addons/dialogic/Editor/Events/Fields/array_part.tscn" - - -func _ready() -> void: - %Add.icon = get_theme_icon("Add", "EditorIcons") - %Add.pressed.connect(_on_AddButton_pressed) - - -func _set_value(value:Variant) -> void: - value = value as Array - for child in get_children(): - if child != %Add: - child.queue_free() - - for item in value: - var x: Node = load(ArrayValue).instantiate() - add_child(x) - x.set_value(item) - x.value_changed.connect(recalculate_values) - move_child(%Add, -1) - - -func _on_value_changed(value:Variant) -> void: - value_changed.emit(property_name, value) - - -func recalculate_values() -> void: - var arr := [] - for child in get_children(): - if child != %Add and !child.is_queued_for_deletion(): - arr.append(child.get_value()) - _on_value_changed(arr) - - -func _on_AddButton_pressed() -> void: - var x: Control = load(ArrayValue).instantiate() - add_child(x) - x.set_value("") - x.value_changed.connect(recalculate_values) - recalculate_values() - move_child(%Add, -1) - diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_array.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/field_array.gd.uid deleted file mode 100644 index 5c155b8..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_array.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://kmn7rns1g4fc diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_array.tscn b/godot/addons/dialogic/Editor/Events/Fields/field_array.tscn deleted file mode 100644 index 4ba17ff..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_array.tscn +++ /dev/null @@ -1,28 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://btmy7ageqpyq1"] - -[ext_resource type="Script" uid="uid://kmn7rns1g4fc" path="res://addons/dialogic/Editor/Events/Fields/field_array.gd" id="2"] - -[sub_resource type="Image" id="Image_v6fhx"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_cpbga"] -image = SubResource("Image_v6fhx") - -[node name="Field_Array" type="HFlowContainer"] -offset_right = 329.0 -offset_bottom = 256.0 -size_flags_horizontal = 3 -script = ExtResource("2") - -[node name="Add" type="Button" parent="."] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Add value" -icon = SubResource("ImageTexture_cpbga") -flat = true diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_audio_preview.gd b/godot/addons/dialogic/Editor/Events/Fields/field_audio_preview.gd deleted file mode 100644 index d7da2bc..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_audio_preview.gd +++ /dev/null @@ -1,52 +0,0 @@ -@tool -extends DialogicVisualEditorField - - -var file_path: String - - -func _ready() -> void: - self.pressed.connect(_on_pressed) - %AudioStreamPlayer.finished.connect(_on_finished) - - -#region OVERWRITES -################################################################################ - - -## To be overwritten -func _set_value(value:Variant) -> void: - file_path = value - self.disabled = file_path.is_empty() - _stop() - -#endregion - - -#region SIGNAL METHODS -################################################################################ - -func _on_pressed() -> void: - if %AudioStreamPlayer.playing: - _stop() - elif not file_path.is_empty(): - _play() - - -func _on_finished() -> void: - _stop() - -#endregion - - -func _stop() -> void: - %AudioStreamPlayer.stop() - %AudioStreamPlayer.stream = null - self.icon = get_theme_icon("Play", "EditorIcons") - - -func _play() -> void: - if ResourceLoader.exists(file_path): - %AudioStreamPlayer.stream = load(file_path) - %AudioStreamPlayer.play() - self.icon = get_theme_icon("Stop", "EditorIcons") diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_audio_preview.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/field_audio_preview.gd.uid deleted file mode 100644 index 185e71c..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_audio_preview.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://lnr24bngydn2 diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_audio_preview.tscn b/godot/addons/dialogic/Editor/Events/Fields/field_audio_preview.tscn deleted file mode 100644 index 949d94c..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_audio_preview.tscn +++ /dev/null @@ -1,12 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://dotvrsumm5y5c"] - -[ext_resource type="Script" uid="uid://lnr24bngydn2" path="res://addons/dialogic/Editor/Events/Fields/field_audio_preview.gd" id="1_7wm54"] - -[node name="Field_Audio_Preview" type="Button"] -offset_right = 8.0 -offset_bottom = 8.0 -flat = true -script = ExtResource("1_7wm54") - -[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] -unique_name_in_owner = true diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_bool_button.gd b/godot/addons/dialogic/Editor/Events/Fields/field_bool_button.gd deleted file mode 100644 index 1593be3..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_bool_button.gd +++ /dev/null @@ -1,38 +0,0 @@ -@tool -extends DialogicVisualEditorField - -## Event block field for boolean values. - -#region MAIN METHODS -################################################################################ - -func _ready() -> void: - add_theme_color_override("icon_normal_color", get_theme_color("disabled_font_color", "Editor")) - add_theme_color_override("icon_hover_color", get_theme_color("warning_color", "Editor")) - add_theme_color_override("icon_pressed_color", get_theme_color("icon_saturation", "Editor")) - add_theme_color_override("icon_hover_pressed_color", get_theme_color("warning_color", "Editor")) - add_theme_color_override("icon_focus_color", get_theme_color("disabled_font_color", "Editor")) - self.toggled.connect(_on_value_changed) - - -func _load_display_info(info:Dictionary) -> void: - if info.has('editor_icon'): - if not is_inside_tree(): - await ready - self.icon = callv('get_theme_icon', info.editor_icon) - else: - self.icon = info.get('icon', null) - - -func _set_value(value:Variant) -> void: - self.button_pressed = true if value else false - -#endregion - - -#region SIGNAL METHODS -################################################################################ - -func _on_value_changed(value:bool) -> void: - value_changed.emit(property_name, value) -#endregion diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_bool_button.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/field_bool_button.gd.uid deleted file mode 100644 index 7696868..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_bool_button.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://do3x030t162u1 diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_bool_button.tscn b/godot/addons/dialogic/Editor/Events/Fields/field_bool_button.tscn deleted file mode 100644 index 9a8a4df..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_bool_button.tscn +++ /dev/null @@ -1,13 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://iypxcctv080u"] - -[ext_resource type="Script" uid="uid://do3x030t162u1" path="res://addons/dialogic/Editor/Events/Fields/field_bool_button.gd" id="1_t1n1f"] - -[node name="Field_BoolButton" type="Button"] -theme_override_colors/icon_normal_color = Color(0, 0, 0, 1) -theme_override_colors/icon_pressed_color = Color(0, 0, 0, 1) -theme_override_colors/icon_hover_color = Color(0, 0, 0, 1) -theme_override_colors/icon_hover_pressed_color = Color(0, 0, 0, 1) -theme_override_colors/icon_focus_color = Color(0, 0, 0, 1) -toggle_mode = true -flat = true -script = ExtResource("1_t1n1f") diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_bool_check.gd b/godot/addons/dialogic/Editor/Events/Fields/field_bool_check.gd deleted file mode 100644 index d01a116..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_bool_check.gd +++ /dev/null @@ -1,30 +0,0 @@ -@tool -extends DialogicVisualEditorField - -## Event block field for boolean values. - -#region MAIN METHODS -################################################################################ -func _ready() -> void: - self.toggled.connect(_on_value_changed) - - -func _load_display_info(info:Dictionary) -> void: - pass - - -func _set_value(value:Variant) -> void: - match DialogicUtil.get_variable_value_type(value): - DialogicUtil.VarTypes.STRING: - self.button_pressed = value and not value.strip_edges() == "false" - _: - self.button_pressed = value and true -#endregion - - -#region SIGNAL METHODS -################################################################################ -func _on_value_changed(value:bool) -> void: - value_changed.emit(property_name, value) - -#endregion diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_bool_check.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/field_bool_check.gd.uid deleted file mode 100644 index 716669b..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_bool_check.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ddxcyihcistll diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_bool_check.tscn b/godot/addons/dialogic/Editor/Events/Fields/field_bool_check.tscn deleted file mode 100644 index 3eb2eda..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_bool_check.tscn +++ /dev/null @@ -1,8 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://dm5hxmhyyxgq"] - -[ext_resource type="Script" uid="uid://ddxcyihcistll" path="res://addons/dialogic/Editor/Events/Fields/field_bool_check.gd" id="1_ckmtx"] - -[node name="Field_BoolCheck" type="CheckButton"] -offset_right = 44.0 -offset_bottom = 24.0 -script = ExtResource("1_ckmtx") diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_color.gd b/godot/addons/dialogic/Editor/Events/Fields/field_color.gd deleted file mode 100644 index 707dfc5..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_color.gd +++ /dev/null @@ -1,30 +0,0 @@ -@tool -extends DialogicVisualEditorField - -## Event block field for color values. - -#region MAIN METHODS -################################################################################ - -func _ready() -> void: - self.color_changed.connect(_on_value_changed) - - -func _load_display_info(info:Dictionary) -> void: - self.edit_alpha = info.get("edit_alpha", true) - - -func _set_value(value:Variant) -> void: - if value is Color: - self.color = Color(value) - -#endregion - - -#region SIGNAL METHODS -################################################################################ - -func _on_value_changed(value: Color) -> void: - value_changed.emit(property_name, value) - -#endregion diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_color.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/field_color.gd.uid deleted file mode 100644 index 8bdd8f6..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_color.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://o26ppdmyst02 diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_color.tscn b/godot/addons/dialogic/Editor/Events/Fields/field_color.tscn deleted file mode 100644 index 3b8fb36..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_color.tscn +++ /dev/null @@ -1,12 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://4e0kjekan5e7"] - -[ext_resource type="Script" uid="uid://o26ppdmyst02" path="res://addons/dialogic/Editor/Events/Fields/field_color.gd" id="1_l666a"] - -[node name="Field_Color" type="ColorPickerButton"] -custom_minimum_size = Vector2(48, 0) -offset_right = 64.0 -offset_bottom = 31.0 -theme_type_variation = &"DialogicEventEdit" -text = " " -color = Color(1, 1, 1, 1) -script = ExtResource("1_l666a") diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_condition.gd b/godot/addons/dialogic/Editor/Events/Fields/field_condition.gd deleted file mode 100644 index 9e0ef1a..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_condition.gd +++ /dev/null @@ -1,266 +0,0 @@ -@tool -extends DialogicVisualEditorField - -## Event block field for displaying conditions in either a simple or complex way. - -var _current_value1: Variant = "" -var _current_value2: Variant = "" - -#region MAIN METHODS -################################################################################ - -func _set_value(value:Variant) -> void: - var too_complex := is_too_complex(value) - %ToggleComplex.disabled = too_complex - %ToggleComplex.button_pressed = too_complex - %ComplexEditor.visible = too_complex - %SimpleEditor.visible = !too_complex - %ComplexEditor.text = value - if not too_complex: - load_simple_editor(value) - - - -func _autofocus() -> void: - %Value1Variable.grab_focus() - -#endregion - -func _ready() -> void: - for i in [%Value1Type, %Value2Type]: - i.options = [{ - 'label': 'String', - 'icon': ["String", "EditorIcons"], - 'value': 0 - },{ - 'label': 'Number', - 'icon': ["float", "EditorIcons"], - 'value': 1 - },{ - 'label': 'Variable', - 'icon': load("res://addons/dialogic/Editor/Images/Pieces/variable.svg"), - 'value': 2 - },{ - 'label': 'Bool', - 'icon': ["bool", "EditorIcons"], - 'value': 3 - },{ - 'label': 'Expression', - 'icon': ["Variant", "EditorIcons"], - 'value': 4 - }] - i.symbol_only = true - i.value_changed.connect(value_type_changed.bind(i.name)) - i.value_changed.connect(something_changed) - i.tooltip_text = "Change type" - - - for i in [%Value1Variable, %Value2Variable]: - i.suggestions_func = get_variable_suggestions - i.value_changed.connect(something_changed) - - %Value1Number.value_changed.connect(something_changed) - %Value2Number.value_changed.connect(something_changed) - %Value1Text.value_changed.connect(something_changed) - %Value2Text.value_changed.connect(something_changed) - %Value1Bool.value_changed.connect(something_changed) - %Value2Bool.value_changed.connect(something_changed) - - %ToggleComplex.icon = get_theme_icon("Enum", "EditorIcons") - - %Operator.value_changed.connect(something_changed) - %Operator.options = [ - {'label': '==', 'value': '=='}, - {'label': '>', 'value': '>'}, - {'label': '<', 'value': '<'}, - {'label': '<=', 'value': '<='}, - {'label': '>=', 'value': '>='}, - {'label': '!=', 'value': '!='} - ] - - -func load_simple_editor(condition_string:String) -> void: - var data := complex2simple(condition_string) - %Value1Type.set_value(get_value_type(data[0], 2)) - _current_value1 = data[0] - value_type_changed('', get_value_type(data[0], 2), 'Value1') - %Operator.set_value(data[1].strip_edges()) - %Value2Type.set_value(get_value_type(data[2], 0)) - _current_value2 = data[2] - value_type_changed('', get_value_type(data[2], 0), 'Value2') - - -func value_type_changed(property:String, value_type:int, value_name:String) -> void: - value_name = value_name.trim_suffix('Type') - get_node('%'+value_name+'Variable').hide() - get_node('%'+value_name+'Text').hide() - get_node('%'+value_name+'Number').hide() - get_node('%'+value_name+'Bool').hide() - var current_val: Variant = "" - if '1' in value_name: - current_val = _current_value1 - else: - current_val = _current_value2 - match value_type: - 0: - get_node('%'+value_name+'Text').show() - get_node('%'+value_name+'Text').set_value(trim_value(current_val, value_type)) - 1: - get_node('%'+value_name+'Number').show() - get_node('%'+value_name+'Number').set_value(float(current_val.strip_edges())) - 2: - get_node('%'+value_name+'Variable').show() - get_node('%'+value_name+'Variable').set_value(trim_value(current_val, value_type)) - 3: - get_node('%'+value_name+'Bool').show() - get_node('%'+value_name+'Bool').set_value(trim_value(current_val, value_type)) - 4: - get_node('%'+value_name+'Text').show() - get_node('%'+value_name+'Text').set_value(str(current_val)) - - -func get_value_type(value:String, default:int) -> int: - value = value.strip_edges() - if value.begins_with('"') and value.ends_with('"') and value.count('"')-value.count('\\"') == 2: - return 0 - elif value.begins_with('{') and value.ends_with('}') and value.count('{') == 1: - return 2 - elif value == "true" or value == "false": - return 3 - else: - if value.is_empty(): - return default - if value.is_valid_float(): - return 1 - else: - return 4 - - -func prep_value(value:Variant, value_type:int) -> String: - if value != null: value = str(value) - else: value = "" - value = value.strip_edges() - match value_type: - 0: return '"'+value.replace('"', '\\"')+'"' - 2: return '{'+value+'}' - _: return value - - -func trim_value(value:Variant, value_type:int) -> String: - value = value.strip_edges() - match value_type: - 0: return value.trim_prefix('"').trim_suffix('"').replace('\\"', '"') - 2: return value.trim_prefix('{').trim_suffix('}') - 3: - if value == "true" or (value and (typeof(value) != TYPE_STRING or value != "false")): - return "true" - else: - return "false" - _: return value - - -func something_changed(fake_arg1=null, fake_arg2 = null): - if %ComplexEditor.visible: - value_changed.emit(property_name, %ComplexEditor.text) - return - - - match %Value1Type.current_value: - 0: _current_value1 = prep_value(%Value1Text.text, %Value1Type.current_value) - 1: _current_value1 = str(%Value1Number.get_value()) - 2: _current_value1 = prep_value(%Value1Variable.current_value, %Value1Type.current_value) - 3: _current_value1 = prep_value(%Value1Bool.button_pressed, %Value1Type.current_value) - _: _current_value1 = prep_value(%Value1Text.text, %Value1Type.current_value) - - match %Value2Type.current_value: - 0: _current_value2 = prep_value(%Value2Text.text, %Value2Type.current_value) - 1: _current_value2 = str(%Value2Number.get_value()) - 2: _current_value2 = prep_value(%Value2Variable.current_value, %Value2Type.current_value) - 3: _current_value2 = prep_value(%Value2Bool.button_pressed, %Value2Type.current_value) - _: _current_value2 = prep_value(%Value2Text.text, %Value2Type.current_value) - - if event_resource: - if not %Operator.text in ['==', '!='] and get_value_type(_current_value2, 0) in [0, 3]: - event_resource.ui_update_warning.emit("This operator doesn't work with strings and booleans.") - else: - event_resource.ui_update_warning.emit("") - - value_changed.emit(property_name, get_simple_condition()) - - -func is_too_complex(condition:String) -> bool: - if condition.strip_edges().is_empty(): - return false - - var comparison_count: int = 0 - for i in ['==', '!=', '<=', '<', '>', '>=']: - comparison_count += condition.count(i) - if comparison_count == 1: - return false - - return true - - -## Combines the info from the simple editor fields into a string condition -func get_simple_condition() -> String: - return _current_value1 +" "+ %Operator.text +" "+ _current_value2 - - -func complex2simple(condition:String) -> Array: - if is_too_complex(condition) or condition.strip_edges().is_empty(): - return ['', '==',''] - - for i in ['==', '!=', '<=', '<', '>', '>=']: - if i in condition: - var cond_split := Array(condition.split(i, false)) - return [cond_split[0], i, cond_split[1]] - - return ['', '==',''] - - -func _on_toggle_complex_toggled(button_pressed:bool) -> void: - if button_pressed: - %ComplexEditor.show() - %SimpleEditor.hide() - %ComplexEditor.text = get_simple_condition() - else: - if !is_too_complex(%ComplexEditor.text): - %ComplexEditor.hide() - %SimpleEditor.show() - load_simple_editor(%ComplexEditor.text) - - -func _on_complex_editor_text_changed(new_text:String) -> void: - %ToggleComplex.disabled = is_too_complex(%ComplexEditor.text) - something_changed() - - -func get_variable_suggestions(filter:String) -> Dictionary: - var suggestions := {} - var vars: Dictionary = ProjectSettings.get_setting('dialogic/variables', {}) - for var_path in DialogicUtil.list_variables(vars): - suggestions[var_path] = {'value':var_path, 'editor_icon':["ClassList", "EditorIcons"]} - return suggestions - - -func _on_value_1_variable_value_changed(property_name: Variant, value: Variant) -> void: - var type := DialogicUtil.get_variable_type(value) - match type: - DialogicUtil.VarTypes.BOOL: - if not %Operator.text in ["==", "!="]: - %Operator.text = "==" - if get_value_type(_current_value2, 3) in [0, 1]: - %Value2Type.insert_options() - %Value2Type.index_pressed(3) - DialogicUtil.VarTypes.STRING: - if not %Operator.text in ["==", "!="]: - %Operator.text = "==" - if get_value_type(_current_value2, 0) in [1, 3]: - %Value2Type.insert_options() - %Value2Type.index_pressed(0) - DialogicUtil.VarTypes.FLOAT, DialogicUtil.VarTypes.INT: - if get_value_type(_current_value2, 1) in [0,3]: - %Value2Type.insert_options() - %Value2Type.index_pressed(1) - - something_changed() diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_condition.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/field_condition.gd.uid deleted file mode 100644 index 5c18a72..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_condition.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://gx1mq5xn4mri diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_condition.tscn b/godot/addons/dialogic/Editor/Events/Fields/field_condition.tscn deleted file mode 100644 index 67ef8df..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_condition.tscn +++ /dev/null @@ -1,101 +0,0 @@ -[gd_scene load_steps=9 format=3 uid="uid://ir6334lqtuwt"] - -[ext_resource type="Script" uid="uid://gx1mq5xn4mri" path="res://addons/dialogic/Editor/Events/Fields/field_condition.gd" id="1_owjj0"] -[ext_resource type="PackedScene" uid="uid://d3bhehatwoio" path="res://addons/dialogic/Editor/Events/Fields/field_options_fixed.tscn" id="2_f6v80"] -[ext_resource type="PackedScene" uid="uid://c0vkcehgjsjy" path="res://addons/dialogic/Editor/Events/Fields/field_text_singleline.tscn" id="3_3kfwc"] -[ext_resource type="PackedScene" uid="uid://kdpp3mibml33" path="res://addons/dialogic/Editor/Events/Fields/field_number.tscn" id="4_6q3a6"] -[ext_resource type="PackedScene" uid="uid://dm5hxmhyyxgq" path="res://addons/dialogic/Editor/Events/Fields/field_bool_check.tscn" id="5_1x02a"] -[ext_resource type="PackedScene" uid="uid://dpwhshre1n4t6" path="res://addons/dialogic/Editor/Events/Fields/field_options_dynamic.tscn" id="6_5a2xd"] - -[sub_resource type="Image" id="Image_dmt4s"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_81s3d"] -image = SubResource("Image_dmt4s") - -[node name="Field_Condition" type="HBoxContainer"] -offset_right = 77.0 -offset_bottom = 31.0 -script = ExtResource("1_owjj0") - -[node name="SimpleEditor" type="HBoxContainer" parent="."] -unique_name_in_owner = true -layout_mode = 2 - -[node name="Value1Type" parent="SimpleEditor" instance=ExtResource("2_f6v80")] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Change type" -text = "" - -[node name="Value1Text" parent="SimpleEditor" instance=ExtResource("3_3kfwc")] -unique_name_in_owner = true -layout_mode = 2 - -[node name="Value1Number" parent="SimpleEditor" instance=ExtResource("4_6q3a6")] -unique_name_in_owner = true -layout_mode = 2 - -[node name="Value1Bool" parent="SimpleEditor" instance=ExtResource("5_1x02a")] -unique_name_in_owner = true -layout_mode = 2 - -[node name="Value1Variable" parent="SimpleEditor" instance=ExtResource("6_5a2xd")] -unique_name_in_owner = true -layout_mode = 2 -placeholder_text = "Variable" - -[node name="Operator" parent="SimpleEditor" instance=ExtResource("2_f6v80")] -unique_name_in_owner = true -layout_mode = 2 - -[node name="Value2Type" parent="SimpleEditor" instance=ExtResource("2_f6v80")] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Change type" -text = "" - -[node name="Value2Text" parent="SimpleEditor" instance=ExtResource("3_3kfwc")] -unique_name_in_owner = true -layout_mode = 2 - -[node name="Value2Number" parent="SimpleEditor" instance=ExtResource("4_6q3a6")] -unique_name_in_owner = true -layout_mode = 2 - -[node name="Value2Variable" parent="SimpleEditor" instance=ExtResource("6_5a2xd")] -unique_name_in_owner = true -layout_mode = 2 -placeholder_text = "Variable" - -[node name="Value2Bool" parent="SimpleEditor" instance=ExtResource("5_1x02a")] -unique_name_in_owner = true -layout_mode = 2 - -[node name="ComplexEditor" type="LineEdit" parent="."] -unique_name_in_owner = true -visible = false -custom_minimum_size = Vector2(150, 0) -layout_mode = 2 -mouse_filter = 1 -theme_type_variation = &"DialogicEventEdit" -text = "VAR.Player.Health > 20 and VAR.Counter < 3 and randi()%3 == 2" -placeholder_text = "Enter condition" -expand_to_text_length = true - -[node name="ToggleComplex" type="Button" parent="."] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Use complex expression" -toggle_mode = true -icon = SubResource("ImageTexture_81s3d") - -[connection signal="value_changed" from="SimpleEditor/Value1Variable" to="." method="_on_value_1_variable_value_changed"] -[connection signal="text_changed" from="ComplexEditor" to="." method="_on_complex_editor_text_changed"] -[connection signal="toggled" from="ToggleComplex" to="." method="_on_toggle_complex_toggled"] diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_dictionary.gd b/godot/addons/dialogic/Editor/Events/Fields/field_dictionary.gd deleted file mode 100644 index f76ef27..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_dictionary.gd +++ /dev/null @@ -1,60 +0,0 @@ -@tool -extends DialogicVisualEditorField - -## Event block field for editing dictionaries. - -const DictionaryValue = "res://addons/dialogic/Editor/Events/Fields/dictionary_part.tscn" - -func _ready() -> void: - %Add.icon = get_theme_icon("Add", "EditorIcons") - - -func _set_value(value:Variant) -> void: - for child in get_children(): - if child != %Add: - child.queue_free() - - var dict: Dictionary - - # attempt to take dictionary values, create a fresh one if not possible - if typeof(value) == TYPE_DICTIONARY: - dict = value - elif typeof(value) == TYPE_STRING: - if value.begins_with('{'): - var result: Variant = JSON.parse_string(value) - if result != null: - dict = result as Dictionary - - var keys := dict.keys() - var values := dict.values() - - for index in dict.size(): - var x: Node = load(DictionaryValue).instantiate() - add_child(x) - x.set_value(values[index]) - x.set_key(keys[index]) - x.value_changed.connect(recalculate_values) - move_child(%Add, -1) - - -func _on_value_changed(value:Variant) -> void: - value_changed.emit(property_name, value) - - -func recalculate_values() -> void: - var dict := {} - for child in get_children(): - if child != %Add and !child.is_queued_for_deletion(): - dict[child.get_key()] = child.get_value() - _on_value_changed(dict) - - -func _on_AddButton_pressed() -> void: - var x: Control = load(DictionaryValue).instantiate() - add_child(x) - x.set_key("") - x.set_value("") - x.value_changed.connect(recalculate_values) - x.focus_key() - recalculate_values() - move_child(%Add, -1) diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_dictionary.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/field_dictionary.gd.uid deleted file mode 100644 index 4dcbcef..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_dictionary.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cjhy1b218xsh0 diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_dictionary.tscn b/godot/addons/dialogic/Editor/Events/Fields/field_dictionary.tscn deleted file mode 100644 index 801906e..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_dictionary.tscn +++ /dev/null @@ -1,28 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://c74bnmhefu72w"] - -[ext_resource type="Script" uid="uid://cjhy1b218xsh0" path="res://addons/dialogic/Editor/Events/Fields/field_dictionary.gd" id="1_p4kmu"] - -[sub_resource type="Image" id="Image_mpo34"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_cpbga"] -image = SubResource("Image_mpo34") - -[node name="Field_Dictionary" type="HFlowContainer"] -size_flags_horizontal = 3 -script = ExtResource("1_p4kmu") - -[node name="Add" type="Button" parent="."] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Add key-value pair" -icon = SubResource("ImageTexture_cpbga") -flat = true - -[connection signal="pressed" from="Add" to="." method="_on_AddButton_pressed"] diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_file.gd b/godot/addons/dialogic/Editor/Events/Fields/field_file.gd deleted file mode 100644 index 4ad03a0..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_file.gd +++ /dev/null @@ -1,152 +0,0 @@ -@tool -extends DialogicVisualEditorField - -## Event block field for selecting a file or directory. - -#region VARIABLES -################################################################################ - -@export var file_filter := "" -@export var placeholder := "" -@export var file_mode: EditorFileDialog.FileMode = EditorFileDialog.FILE_MODE_OPEN_FILE -var resource_icon: Texture: - get: - return resource_icon - set(new_icon): - resource_icon = new_icon - %Icon.texture = new_icon - if new_icon == null: - %Field.theme_type_variation = "" - else: - %Field.theme_type_variation = "LineEditWithIcon" - -var max_width := 200 -var current_value: String -var hide_reset := false -var show_editing_button := false - -#endregion - - -#region MAIN METHODS -################################################################################ - -func _ready() -> void: - $FocusStyle.add_theme_stylebox_override('panel', get_theme_stylebox('focus', 'DialogicEventEdit')) - - %OpenButton.icon = get_theme_icon("Folder", "EditorIcons") - %OpenButton.button_down.connect(_on_OpenButton_pressed) - - %EditButton.icon = get_theme_icon("Edit", "EditorIcons") - %EditButton.button_down.connect(_on_EditButton_pressed) - - %ClearButton.icon = get_theme_icon("Reload", "EditorIcons") - %ClearButton.button_up.connect(clear_path) - %ClearButton.visible = !hide_reset - - %Field.set_drag_forwarding(Callable(), self._can_drop_data_fw, self._drop_data_fw) - %Field.placeholder_text = placeholder - - -func _load_display_info(info:Dictionary) -> void: - file_filter = info.get('file_filter', '') - placeholder = info.get('placeholder', '') - resource_icon = info.get('icon', null) - await ready - - if resource_icon == null and info.has('editor_icon'): - resource_icon = callv('get_theme_icon', info.editor_icon) - - -func _set_value(value: Variant) -> void: - current_value = value - var text: String = value - - if file_mode != EditorFileDialog.FILE_MODE_OPEN_DIR: - text = value.get_file() - %Field.tooltip_text = value - - if %Field.get_theme_font('font').get_string_size( - text, 0, -1, - %Field.get_theme_font_size('font_size')).x > max_width: - %Field.expand_to_text_length = false - %Field.custom_minimum_size.x = max_width - %Field.size.x = 0 - else: - %Field.custom_minimum_size.x = 0 - %Field.expand_to_text_length = true - - %EditButton.visible = show_editing_button and value - - if not %Field.text == text: - value_changed.emit(property_name, current_value) - %Field.text = text - - %ClearButton.visible = not value.is_empty() and not hide_reset - - -#endregion - - -#region BUTTONS -################################################################################ - -func _on_OpenButton_pressed() -> void: - find_parent('EditorView').godot_file_dialog(_on_file_dialog_selected, file_filter, file_mode, "Open "+ property_name) - - -func _on_file_dialog_selected(path:String) -> void: - _set_value(path) - value_changed.emit(property_name, path) - - -func _on_EditButton_pressed() -> void: - if ResourceLoader.exists(current_value): - EditorInterface.inspect_object(load(current_value), "", true) - - -func clear_path() -> void: - _set_value("") - value_changed.emit(property_name, "") - -#endregion - - -#region DRAG AND DROP -################################################################################ - -func _can_drop_data_fw(_at_position: Vector2, data: Variant) -> bool: - if typeof(data) == TYPE_DICTIONARY and data.has('files') and len(data.files) == 1: - - if file_filter: - - if '*.'+data.files[0].get_extension() in file_filter: - return true - - else: return true - - return false - - -func _drop_data_fw(_at_position: Vector2, data: Variant) -> void: - var file: String = data.files[0] - _on_file_dialog_selected(file) - -#endregion - - -#region VISUALS FOR FOCUS -################################################################################ - -func _on_field_focus_entered() -> void: - $FocusStyle.show() - - -func _on_field_focus_exited() -> void: - $FocusStyle.hide() - var field_text: String = %Field.text - if current_value == field_text or (file_mode != EditorFileDialog.FILE_MODE_OPEN_DIR and current_value.get_file() == field_text): - return - _on_file_dialog_selected(field_text) - -#endregion diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_file.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/field_file.gd.uid deleted file mode 100644 index 0c00aa9..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_file.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://buepm260xnmaa diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_file.tscn b/godot/addons/dialogic/Editor/Events/Fields/field_file.tscn deleted file mode 100644 index f8dccd3..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_file.tscn +++ /dev/null @@ -1,78 +0,0 @@ -[gd_scene load_steps=6 format=3 uid="uid://7mvxuaulctcq"] - -[ext_resource type="Script" uid="uid://buepm260xnmaa" path="res://addons/dialogic/Editor/Events/Fields/field_file.gd" id="1_0grcf"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_tr837"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_6b7on"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_wq6bt"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ye6ml"] -content_margin_left = 4.0 -content_margin_top = 4.0 -content_margin_right = 4.0 -content_margin_bottom = 4.0 -bg_color = Color(1, 0.365, 0.365, 1) -draw_center = false -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -corner_detail = 1 - -[node name="Field_File" type="MarginContainer"] -offset_right = 314.0 -offset_bottom = 40.0 -theme_type_variation = &"DialogicEventEdit" -script = ExtResource("1_0grcf") - -[node name="BG" type="PanelContainer" parent="."] -layout_mode = 2 -theme_type_variation = &"DialogicEventEdit" - -[node name="HBox" type="HBoxContainer" parent="BG"] -layout_mode = 2 -alignment = 2 - -[node name="Icon" type="TextureRect" parent="BG/HBox"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 4 -mouse_filter = 2 - -[node name="Field" type="LineEdit" parent="BG/HBox"] -unique_name_in_owner = true -custom_minimum_size = Vector2(100, 0) -layout_mode = 2 -size_flags_horizontal = 3 -mouse_filter = 1 -theme_override_styles/normal = SubResource("StyleBoxEmpty_tr837") -theme_override_styles/read_only = SubResource("StyleBoxEmpty_6b7on") -theme_override_styles/focus = SubResource("StyleBoxEmpty_wq6bt") -expand_to_text_length = true - -[node name="OpenButton" type="Button" parent="BG/HBox"] -unique_name_in_owner = true -layout_mode = 2 -flat = true - -[node name="EditButton" type="Button" parent="BG/HBox"] -unique_name_in_owner = true -layout_mode = 2 -flat = true - -[node name="ClearButton" type="Button" parent="BG/HBox"] -unique_name_in_owner = true -layout_mode = 2 -flat = true - -[node name="FocusStyle" type="Panel" parent="."] -visible = false -layout_mode = 2 -mouse_filter = 2 -theme_override_styles/panel = SubResource("StyleBoxFlat_ye6ml") - -[connection signal="focus_entered" from="BG/HBox/Field" to="." method="_on_field_focus_entered"] -[connection signal="focus_exited" from="BG/HBox/Field" to="." method="_on_field_focus_exited"] -[connection signal="text_submitted" from="BG/HBox/Field" to="." method="_on_file_dialog_selected"] diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_flex_value.gd b/godot/addons/dialogic/Editor/Events/Fields/field_flex_value.gd deleted file mode 100644 index be7a98d..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_flex_value.gd +++ /dev/null @@ -1,154 +0,0 @@ -@tool -extends HBoxContainer - -## Event block field part for a value that can change type. - -signal value_changed - -var value_field: Node -var value_type: int = -1 - -var current_value: Variant - -func _ready() -> void: - %ValueType.options = [{ - 'label': 'String', - 'icon': ["String", "EditorIcons"], - 'value': TYPE_STRING - },{ - 'label': 'Number (int)', - 'icon': ["int", "EditorIcons"], - 'value': TYPE_INT - },{ - 'label': 'Number (float)', - 'icon': ["float", "EditorIcons"], - 'value': TYPE_FLOAT - },{ - 'label': 'Boolean', - 'icon': ["bool", "EditorIcons"], - 'value': TYPE_BOOL - },{ - 'label': 'Expression', - 'icon': ["Variant", "EditorIcons"], - 'value': TYPE_MAX - } - ] - %ValueType.symbol_only = true - %ValueType.value_changed.connect(_on_type_changed.bind()) - %ValueType.tooltip_text = "Change type" - - -func set_value(value:Variant): - change_field_type(deduce_type(value)) - %ValueType.set_value(deduce_type(value)) - current_value = value - match value_type: - TYPE_BOOL: - value_field.button_pressed = value - TYPE_STRING: - value_field.text = value - TYPE_FLOAT, TYPE_INT: - value_field.set_value(value) - TYPE_MAX, _: - value_field.text = value.trim_prefix('@') - - -func deduce_type(value:Variant) -> int: - if value is String and value.begins_with('@'): - return TYPE_MAX - else: - return typeof(value) - - -func _on_type_changed(prop:String, type:Variant) -> void: - if type == value_type: - return - - match type: - TYPE_BOOL: - if typeof(current_value) == TYPE_STRING: - current_value = DialogicUtil.str_to_bool(current_value) - elif value_type == TYPE_FLOAT or value_type == TYPE_INT: - current_value = bool(current_value) - else: - current_value = true if current_value else false - set_value(current_value) - TYPE_STRING: - current_value = str(current_value).trim_prefix('@') - set_value(current_value) - TYPE_FLOAT: - current_value = float(current_value) - set_value(current_value) - TYPE_INT: - current_value = int(current_value) - set_value(current_value) - TYPE_MAX,_: - current_value = var_to_str(current_value) - set_value('@'+current_value) - - - emit_signal.call_deferred('value_changed') - - -func get_value() -> Variant: - return current_value - - -func _on_delete_pressed() -> void: - queue_free() - value_changed.emit() - - -func change_field_type(type:int) -> void: - if type == value_type: - return - - value_type = type - - if value_field: - value_field.queue_free() - match type: - TYPE_BOOL: - value_field = CheckBox.new() - value_field.toggled.connect(_on_bool_toggled) - TYPE_STRING: - value_field = LineEdit.new() - value_field.theme_type_variation = "DialogicEventEdit" - value_field.text_changed.connect(_on_str_text_changed) - value_field.expand_to_text_length = true - TYPE_FLOAT, TYPE_INT: - value_field = load("res://addons/dialogic/Editor/Events/Fields/field_number.tscn").instantiate() - if type == TYPE_FLOAT: - value_field.use_float_mode() - else: - value_field.use_int_mode() - value_field.value_changed.connect(_on_number_value_changed.bind(type == TYPE_INT)) - TYPE_MAX, _: - value_field = LineEdit.new() - value_field.expand_to_text_length = true - value_field.text_changed.connect(_on_expression_changed) - add_child(value_field) - move_child(value_field, 1) - - -func _on_bool_toggled(value:bool) -> void: - current_value = value - value_changed.emit() - - -func _on_str_text_changed(value:String) -> void: - current_value = value - value_changed.emit() - - -func _on_expression_changed(value:String) -> void: - current_value = '@'+value - value_changed.emit() - - -func _on_number_value_changed(prop:String, value:float, int := false) -> void: - if int: - current_value = int(value) - else: - current_value = value - value_changed.emit() diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_flex_value.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/field_flex_value.gd.uid deleted file mode 100644 index 2bc636d..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_flex_value.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bl8pqdbnw005y diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_flex_value.tscn b/godot/addons/dialogic/Editor/Events/Fields/field_flex_value.tscn deleted file mode 100644 index 18799bb..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_flex_value.tscn +++ /dev/null @@ -1,15 +0,0 @@ -[gd_scene load_steps=3 format=3 uid="uid://dl08ubinx6ugu"] - -[ext_resource type="Script" uid="uid://bl8pqdbnw005y" path="res://addons/dialogic/Editor/Events/Fields/field_flex_value.gd" id="1_m5nnp"] -[ext_resource type="PackedScene" uid="uid://d3bhehatwoio" path="res://addons/dialogic/Editor/Events/Fields/field_options_fixed.tscn" id="3_h10fc"] - -[node name="FlexValue" type="HBoxContainer"] -offset_right = 65.0 -offset_bottom = 22.0 -script = ExtResource("1_m5nnp") - -[node name="ValueType" parent="." instance=ExtResource("3_h10fc")] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Change type" -text = "" diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_image_preview.gd b/godot/addons/dialogic/Editor/Events/Fields/field_image_preview.gd deleted file mode 100644 index d5e93f4..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_image_preview.gd +++ /dev/null @@ -1,64 +0,0 @@ -@tool -extends DialogicVisualEditorField - - -var body: Control -var image_path: String - -func _ready() -> void: - body = find_parent('Body') as Control - body.visibility_changed.connect(_on_body_visibility_toggled) - - -func _enter_tree() -> void: - %HiddenLabel.add_theme_color_override( - 'font_color', - event_resource.event_color.lerp(get_theme_color("font_color", "Editor"), 0.8)) - - -#region OVERWRITES -################################################################################ - -## To be overwritten -func _set_value(value:Variant) -> void: - if ResourceLoader.exists(value): - image_path = value - - if is_preview_enabled(): - self.texture = load(value) - custom_minimum_size.y = get_preview_size() - else: - self.texture = null - - minimum_size_changed.emit() - -#endregion - - -#region SIGNAL METHODS -################################################################################ - - -func _on_body_visibility_toggled() -> void: - custom_minimum_size.y = 0 - - if body.is_visible: - %HiddenLabel.visible = not is_preview_enabled() - - if is_preview_enabled() and ResourceLoader.exists(image_path): - self.texture = load(image_path) - custom_minimum_size.y = get_preview_size() - else: - self.texture = null - - minimum_size_changed.emit() - -#endregion - -func is_preview_enabled() -> bool: - return get_preview_size() != 0 - - -func get_preview_size() -> int: - return DialogicUtil.get_editor_setting( - "image_preview_height", 50) * DialogicUtil.get_editor_scale() diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_image_preview.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/field_image_preview.gd.uid deleted file mode 100644 index 4c45621..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_image_preview.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://u6evsmx7tynf diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_image_preview.tscn b/godot/addons/dialogic/Editor/Events/Fields/field_image_preview.tscn deleted file mode 100644 index e6007f0..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_image_preview.tscn +++ /dev/null @@ -1,23 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://bar0t74j5v4sa"] - -[ext_resource type="Script" uid="uid://u6evsmx7tynf" path="res://addons/dialogic/Editor/Events/Fields/field_image_preview.gd" id="1_e5vbc"] - -[node name="Field_Image_Preview" type="TextureRect"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 3 -size_flags_vertical = 0 -expand_mode = 2 -stretch_mode = 4 -script = ExtResource("1_e5vbc") - -[node name="HiddenLabel" type="Label" parent="."] -unique_name_in_owner = true -visible = false -layout_mode = 0 -tooltip_text = "Preview hidden because project setting 'dialogic/accessibility/image_preview_height' is 0." -mouse_filter = 1 -text = "(Hidden)" diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_number.gd b/godot/addons/dialogic/Editor/Events/Fields/field_number.gd deleted file mode 100644 index 27145d9..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_number.gd +++ /dev/null @@ -1,204 +0,0 @@ -@tool -class_name DialogicVisualEditorFieldNumber -extends DialogicVisualEditorField - -## Event block field for integers and floats. Improved version of the native spinbox. - -@export_enum("Float", "Int", "Decible") var mode := 0 : - set(new_mode): - mode = new_mode - match mode: - 0: use_float_mode() #FLOAT - 1: use_int_mode() #INT - 2: use_decibel_mode() #DECIBLE -@export var allow_string: bool = false -@export var step: float = 0.1 -@export var enforce_step: bool = true -@export var min_value: float = -INF -@export var max_value: float = INF -@export var value = 0.0 -@export var prefix: String = "" -@export var suffix: String = "" - -var _is_holding_button: bool = false #For handling incrementing while holding key or click - -#region MAIN METHODS -################################################################################ - -func _ready() -> void: - if %Value.text.is_empty(): - set_value(value) - - update_prefix(prefix) - update_suffix(suffix) - - -func _load_display_info(info: Dictionary) -> void: - - for option in info.keys(): - match option: - 'min': min_value = info[option] - 'max': max_value = info[option] - 'prefix': update_prefix(info[option]) - 'suffix': update_suffix(info[option]) - 'step': - enforce_step = true - step = info[option] - 'hide_step_button': %Spin.hide() - - mode = info.get('mode', mode) - -func _set_value(new_value: Variant) -> void: - _on_value_text_submitted(str(new_value), true) - %Value.tooltip_text = tooltip_text - - -func _autofocus() -> void: - %Value.grab_focus() - - -func get_value() -> float: - return value - - -func use_float_mode() -> void: - update_suffix("") - enforce_step = false - - -func use_int_mode() -> void: - update_suffix("") - enforce_step = true - - -func use_decibel_mode() -> void: - max_value = 6 - update_suffix("dB") - min_value = -80 - -#endregion - -#region UI FUNCTIONALITY -################################################################################ -var _stop_button_holding: Callable = func(button: BaseButton) -> void: - _is_holding_button = false - if button.button_up.get_connections().find(_stop_button_holding): - button.button_up.disconnect(_stop_button_holding) - if button.focus_exited.get_connections().find(_stop_button_holding): - button.focus_exited.disconnect(_stop_button_holding) - if button.mouse_exited.get_connections().find(_stop_button_holding): - button.mouse_exited.disconnect(_stop_button_holding) - - -func _holding_button(value_direction: int, button: BaseButton) -> void: - if _is_holding_button: - return - if _stop_button_holding.get_bound_arguments_count() > 0: - _stop_button_holding.unbind(0) - - _is_holding_button = true - - #Ensure removal of our value changing routine when it shouldn't run anymore - button.button_up.connect(_stop_button_holding.bind(button)) - button.focus_exited.connect(_stop_button_holding.bind(button)) - button.mouse_exited.connect(_stop_button_holding.bind(button)) - - var scene_tree: SceneTree = get_tree() - var delay_timer_ms: int = 600 - - #Instead of awaiting for the duration, await per-frame so we can catch any changes in _is_holding_button and exit completely - while(delay_timer_ms > 0): - if _is_holding_button == false: - return - var pre_time: int = Time.get_ticks_msec() - await scene_tree.process_frame - delay_timer_ms -= Time.get_ticks_msec() - pre_time - - var change_speed: float = 0.25 - - while(_is_holding_button == true): - await scene_tree.create_timer(change_speed).timeout - change_speed = maxf(0.05, change_speed - 0.01) - _on_value_text_submitted(str(value+(step * value_direction))) - - -func update_prefix(to_prefix: String) -> void: - prefix = to_prefix - %Prefix.visible = to_prefix != null and to_prefix != "" - %Prefix.text = prefix - - -func update_suffix(to_suffix: String) -> void: - suffix = to_suffix - %Suffix.visible = to_suffix != null and to_suffix != "" - %Suffix.text = suffix - -#endregion - -#region SIGNAL METHODS -################################################################################ -func _on_gui_input(event: InputEvent) -> void: - if event.is_action('ui_up') and event.get_action_strength('ui_up') > 0.5: - _on_value_text_submitted(str(value+step)) - elif event.is_action('ui_down') and event.get_action_strength('ui_down') > 0.5: - _on_value_text_submitted(str(value-step)) - - -func _on_increment_button_down(button: NodePath) -> void: - _on_value_text_submitted(str(value+step)) - _holding_button(1, get_node(button) as BaseButton) - - -func _on_decrement_button_down(button: NodePath) -> void: - _on_value_text_submitted(str(value-step)) - _holding_button(-1, get_node(button) as BaseButton) - - -func _on_value_text_submitted(new_text: String, no_signal:= false) -> void: - if new_text.is_empty() and not allow_string: - new_text = "0.0" - if new_text.is_valid_float(): - var temp: float = min(max(new_text.to_float(), min_value), max_value) - if not enforce_step: - value = temp - else: - value = snapped(temp, step) - elif allow_string: - value = new_text - - if int(step) == step and step != 0: - %Value.text = str(int(value)) - else: - %Value.text = str(value).pad_decimals( - max( - len(str(float(step)-floorf(step)))-2, - len(str(float(value)-floorf(value)))-2,)) - if not no_signal: - value_changed.emit(property_name, value) - # Visually disable Up or Down arrow when limit is reached to better indicate a limit has been hit - %Spin/Decrement.disabled = value <= min_value - %Spin/Increment.disabled = value >= max_value - - -# If prefix or suffix was clicked, select the actual value box instead and move the caret to the closest side. -func _on_sublabel_clicked(event: InputEvent) -> void: - if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT: - var mousePos: Vector2 = get_global_mouse_position() - mousePos.x -= get_minimum_size().x / 2 - if mousePos.x > global_position.x: - (%Value as LineEdit).caret_column = (%Value as LineEdit).text.length() - else: - (%Value as LineEdit).caret_column = 0 - (%Value as LineEdit).grab_focus() - - -func _on_value_focus_exited() -> void: - _on_value_text_submitted(%Value.text) - $Value_Panel.add_theme_stylebox_override('panel', get_theme_stylebox('panel', 'DialogicEventEdit')) - - -func _on_value_focus_entered() -> void: - $Value_Panel.add_theme_stylebox_override('panel', get_theme_stylebox('focus', 'DialogicEventEdit')) - %Value.select_all.call_deferred() - -#endregion diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_number.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/field_number.gd.uid deleted file mode 100644 index 57cc0b5..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_number.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dbegwhxegm271 diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_number.tscn b/godot/addons/dialogic/Editor/Events/Fields/field_number.tscn deleted file mode 100644 index 0e125d5..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_number.tscn +++ /dev/null @@ -1,160 +0,0 @@ -[gd_scene load_steps=9 format=3 uid="uid://kdpp3mibml33"] - -[ext_resource type="Script" uid="uid://dbegwhxegm271" path="res://addons/dialogic/Editor/Events/Fields/field_number.gd" id="1_0jdnn"] -[ext_resource type="Texture2D" uid="uid://dh1ycbmw8anqh" path="res://addons/dialogic/Editor/Images/Interactable/increment_icon.svg" id="3_v5cne"] -[ext_resource type="Texture2D" uid="uid://brjikovneb63n" path="res://addons/dialogic/Editor/Images/Interactable/decrement_icon.svg" id="4_ph52o"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_sj3oj"] -content_margin_left = 3.0 -content_margin_right = 1.0 - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_8yqsu"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_smq50"] -content_margin_left = 2.0 -content_margin_right = 1.0 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_increment"] -content_margin_left = 2.0 -content_margin_top = 6.0 -content_margin_right = 2.0 -content_margin_bottom = 2.0 -bg_color = Color(0.94, 0.94, 0.94, 0) -border_color = Color(0, 0, 0, 0) - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_decrement"] -content_margin_left = 2.0 -content_margin_top = 2.0 -content_margin_right = 2.0 -content_margin_bottom = 6.0 -bg_color = Color(0.94, 0.94, 0.94, 0) -border_color = Color(0, 0, 0, 0) - -[node name="Field_Number" type="HBoxContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_right = -1011.0 -offset_bottom = -617.0 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_constants/separation = 0 -script = ExtResource("1_0jdnn") - -[node name="Value_Panel" type="PanelContainer" parent="."] -layout_mode = 2 -size_flags_horizontal = 3 -theme_type_variation = &"DialogicEventEdit" - -[node name="Layout" type="HBoxContainer" parent="Value_Panel"] -layout_mode = 2 -theme_override_constants/separation = 0 - -[node name="Prefix" type="RichTextLabel" parent="Value_Panel/Layout"] -unique_name_in_owner = true -visible = false -clip_contents = false -layout_direction = 2 -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 4 -mouse_filter = 1 -mouse_default_cursor_shape = 1 -theme_override_colors/default_color = Color(0.54099, 0.540991, 0.54099, 1) -theme_override_styles/normal = SubResource("StyleBoxEmpty_sj3oj") -theme_override_styles/focus = SubResource("StyleBoxEmpty_sj3oj") -bbcode_enabled = true -fit_content = true -scroll_active = false -autowrap_mode = 0 -tab_size = 2 -shortcut_keys_enabled = false -drag_and_drop_selection_enabled = false -text_direction = 1 - -[node name="Value" type="LineEdit" parent="Value_Panel/Layout"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -focus_mode = 1 -theme_override_constants/minimum_character_width = 0 -theme_override_styles/normal = SubResource("StyleBoxEmpty_8yqsu") -theme_override_styles/read_only = SubResource("StyleBoxEmpty_8yqsu") -theme_override_styles/focus = SubResource("StyleBoxEmpty_8yqsu") -text = "0" -expand_to_text_length = true -virtual_keyboard_type = 3 - -[node name="Suffix" type="RichTextLabel" parent="Value_Panel/Layout"] -unique_name_in_owner = true -visible = false -clip_contents = false -layout_direction = 2 -layout_mode = 2 -size_flags_horizontal = 8 -size_flags_vertical = 4 -mouse_default_cursor_shape = 1 -theme_override_colors/default_color = Color(0.435192, 0.435192, 0.435192, 1) -theme_override_styles/normal = SubResource("StyleBoxEmpty_smq50") -theme_override_styles/focus = SubResource("StyleBoxEmpty_smq50") -bbcode_enabled = true -fit_content = true -scroll_active = false -autowrap_mode = 0 -tab_size = 2 -shortcut_keys_enabled = false -drag_and_drop_selection_enabled = false -text_direction = 1 - -[node name="Spin" type="VBoxContainer" parent="Value_Panel/Layout"] -unique_name_in_owner = true -layout_mode = 2 -theme_override_constants/separation = 0 -alignment = 1 - -[node name="Increment" type="Button" parent="Value_Panel/Layout/Spin"] -auto_translate_mode = 2 -layout_mode = 2 -size_flags_vertical = 3 -focus_neighbor_left = NodePath("../../Value") -focus_neighbor_top = NodePath(".") -focus_neighbor_bottom = NodePath("../Decrement") -theme_override_colors/icon_focus_color = Color(0.412738, 0.550094, 0.760917, 1) -theme_override_colors/icon_hover_color = Color(0.412738, 0.550094, 0.760917, 1) -theme_override_styles/normal = SubResource("StyleBoxFlat_increment") -theme_override_styles/pressed = SubResource("StyleBoxFlat_increment") -theme_override_styles/hover = SubResource("StyleBoxFlat_increment") -theme_override_styles/disabled = SubResource("StyleBoxFlat_increment") -theme_override_styles/focus = SubResource("StyleBoxFlat_increment") -icon = ExtResource("3_v5cne") -flat = true -vertical_icon_alignment = 2 - -[node name="Decrement" type="Button" parent="Value_Panel/Layout/Spin"] -auto_translate_mode = 2 -layout_mode = 2 -size_flags_vertical = 3 -focus_neighbor_left = NodePath("../../Value") -focus_neighbor_top = NodePath("../Increment") -focus_neighbor_bottom = NodePath(".") -theme_override_colors/icon_focus_color = Color(0.412738, 0.550094, 0.760917, 1) -theme_override_colors/icon_hover_color = Color(0.412738, 0.550094, 0.760917, 1) -theme_override_styles/normal = SubResource("StyleBoxFlat_decrement") -theme_override_styles/pressed = SubResource("StyleBoxFlat_decrement") -theme_override_styles/hover = SubResource("StyleBoxFlat_decrement") -theme_override_styles/disabled = SubResource("StyleBoxFlat_decrement") -theme_override_styles/focus = SubResource("StyleBoxFlat_decrement") -icon = ExtResource("4_ph52o") -flat = true -vertical_icon_alignment = 2 - -[connection signal="gui_input" from="Value_Panel/Layout/Prefix" to="." method="_on_sublabel_clicked"] -[connection signal="focus_entered" from="Value_Panel/Layout/Value" to="." method="_on_value_focus_entered"] -[connection signal="focus_exited" from="Value_Panel/Layout/Value" to="." method="_on_value_focus_exited"] -[connection signal="gui_input" from="Value_Panel/Layout/Value" to="." method="_on_gui_input"] -[connection signal="text_submitted" from="Value_Panel/Layout/Value" to="." method="_on_value_text_submitted"] -[connection signal="gui_input" from="Value_Panel/Layout/Suffix" to="." method="_on_sublabel_clicked"] -[connection signal="button_down" from="Value_Panel/Layout/Spin/Increment" to="." method="_on_increment_button_down" binds= [NodePath("%Spin/Increment")]] -[connection signal="gui_input" from="Value_Panel/Layout/Spin/Increment" to="." method="_on_gui_input"] -[connection signal="button_down" from="Value_Panel/Layout/Spin/Decrement" to="." method="_on_decrement_button_down" binds= [NodePath("%Spin/Decrement")]] -[connection signal="gui_input" from="Value_Panel/Layout/Spin/Decrement" to="." method="_on_gui_input"] diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_options_dynamic.gd b/godot/addons/dialogic/Editor/Events/Fields/field_options_dynamic.gd deleted file mode 100644 index 8e1ee7a..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_options_dynamic.gd +++ /dev/null @@ -1,369 +0,0 @@ -@tool -extends DialogicVisualEditorField -## Event block field for strings. Options are determined by a function. - - -## SETTINGS -@export var placeholder_text := "Select Resource" -@export var empty_text := "" -enum Modes {PURE_STRING, PRETTY_PATH, IDENTIFIER, ANY_VALID_STRING} -@export var mode := Modes.PURE_STRING -@export var fit_text_length := true -var collapse_when_empty := false -var valid_file_drop_extension := "" -var suggestions_func: Callable -var validation_func: Callable - -var resource_icon: Texture = null: - get: - return resource_icon - set(new_icon): - resource_icon = new_icon - %Icon.texture = new_icon - -## STATE -var current_value: String: - set(value): - if current_value != value: - current_value = value - current_value_updated = true -var current_selected := 0 -var current_value_updated := false - -## SUGGESTIONS ITEM LIST -var _v_separation := 0 -var _h_separation := 0 -var _icon_margin := 0 -var _line_height := 24 -var _max_height := 200 * DialogicUtil.get_editor_scale() - - -#region FIELD METHODS -################################################################################ - -func _set_value(value:Variant) -> void: - if value == null or value.is_empty(): - %Search.text = empty_text - update_error_tooltip('') - else: - match mode: - Modes.PRETTY_PATH: - %Search.text = DialogicUtil.pretty_name(value) - Modes.IDENTIFIER when value.begins_with("res://"): - %Search.text = DialogicResourceUtil.get_unique_identifier_by_path(value) - Modes.ANY_VALID_STRING when validation_func: - %Search.text = validation_func.call(value).get('valid_text', value) - _: - %Search.text = str(value) - - %Search.visible = not collapse_when_empty or value - current_value = str(value) - - -func _load_display_info(info:Dictionary) -> void: - valid_file_drop_extension = info.get('file_extension', '') - collapse_when_empty = info.get('collapse_when_empty', false) - suggestions_func = info.get('suggestions_func', suggestions_func) - validation_func = info.get('validation_func', validation_func) - empty_text = info.get('empty_text', '') - placeholder_text = info.get('placeholder', 'Select Resource') - mode = info.get("mode", 0) - resource_icon = info.get('icon', null) - %Search.tooltip_text = info.get('tooltip_text', '') - await ready - if resource_icon == null and info.has('editor_icon'): - resource_icon = callv('get_theme_icon', info.editor_icon) - - -func _autofocus() -> void: - %Search.grab_focus() - -#endregion - - -#region BASIC -################################################################################ - -func _ready() -> void: - var focus := get_theme_stylebox("focus", "LineEdit") - if has_theme_stylebox("focus", "DialogicEventEdit"): - focus = get_theme_stylebox('focus', 'DialogicEventEdit') - %Focus.add_theme_stylebox_override('panel', focus) - - %Search.text_changed.connect(_on_Search_text_changed) - %Search.text_submitted.connect(_on_Search_text_entered) - %Search.placeholder_text = placeholder_text - %Search.expand_to_text_length = fit_text_length - - %SelectButton.icon = get_theme_icon("Collapse", "EditorIcons") - - %Suggestions.add_theme_stylebox_override('bg', load("res://addons/dialogic/Editor/Events/styles/ResourceMenuPanelBackground.tres")) - %Suggestions.hide() - %Suggestions.item_selected.connect(suggestion_selected) - %Suggestions.item_clicked.connect(suggestion_selected) - %Suggestions.fixed_icon_size = Vector2i(16, 16) * DialogicUtil.get_editor_scale() - - _v_separation = %Suggestions.get_theme_constant("v_separation") - _h_separation = %Suggestions.get_theme_constant("h_separation") - _icon_margin = %Suggestions.get_theme_constant("icon_margin") - - if resource_icon == null: - self.resource_icon = null - - var error_label_style := StyleBoxFlat.new() - error_label_style.bg_color = get_theme_color('background', 'Editor') - error_label_style.border_color = get_theme_color('error_color', 'Editor') - error_label_style.set_border_width_all(1) - error_label_style.set_corner_radius_all(4) - error_label_style.set_content_margin_all(6) - - %ErrorTooltip.add_theme_stylebox_override('normal', error_label_style) - - -func change_to_empty() -> void: - update_error_tooltip('') - value_changed.emit(property_name, "") - - -func validate() -> void: - if mode == Modes.ANY_VALID_STRING and validation_func: - var validation_result: Dictionary = validation_func.call(current_value) - current_value = validation_result.get('valid_text', current_value) - update_error_tooltip(validation_result.get('error_tooltip', '')) - - -func update_error_tooltip(text: String) -> void: - %ErrorTooltip.text = text - if text.is_empty(): - %ErrorTooltip.hide() - %Search.remove_theme_color_override("font_color") - else: - %ErrorTooltip.reset_size() - %ErrorTooltip.global_position = global_position - Vector2(0, %ErrorTooltip.size.y + 4) - %ErrorTooltip.show() - %Search.add_theme_color_override("font_color", get_theme_color('error_color', 'Editor')) - -#endregion - - -#region SEARCH & SUGGESTION POPUP -################################################################################ - -func _on_Search_text_entered(new_text:String) -> void: - if mode == Modes.ANY_VALID_STRING: - if validation_func: - var validation_result: Dictionary = validation_func.call(new_text) - new_text = validation_result.get('valid_text', new_text) - update_error_tooltip(validation_result.get('error_tooltip', '')) - - set_value(new_text) - - value_changed.emit(property_name, current_value) - current_value_updated = false - hide_suggestions() - return - - if %Suggestions.get_item_count(): - if %Suggestions.is_anything_selected(): - suggestion_selected(%Suggestions.get_selected_items()[0]) - else: - suggestion_selected(0) - else: - change_to_empty() - - -func _on_Search_text_changed(new_text:String, just_update:bool = false) -> void: - %Suggestions.clear() - - if new_text == "" and not just_update: - change_to_empty() - else: - %Search.show() - - if mode == Modes.ANY_VALID_STRING and !just_update: - if validation_func: - var validation_result: Dictionary = validation_func.call(new_text) - new_text = validation_result.get('valid_text', new_text) - update_error_tooltip(validation_result.get('error_tooltip', '')) - - current_value = new_text - - if just_update and new_text.is_empty() and %Search.text.ends_with("."): - new_text = %Search.text - - var suggestions: Dictionary = suggestions_func.call(new_text) - - var line_length := 0 - var idx := 0 - - if new_text and mode == Modes.ANY_VALID_STRING and not new_text in suggestions.keys(): - %Suggestions.add_item(new_text, get_theme_icon('GuiScrollArrowRight', 'EditorIcons')) - %Suggestions.set_item_metadata(idx, new_text) - line_length = get_theme_font('font', 'Label').get_string_size( - new_text, HORIZONTAL_ALIGNMENT_LEFT, -1, get_theme_font_size("font_size", 'Label') - ).x + %Suggestions.fixed_icon_size.x * %Suggestions.get_icon_scale() + _icon_margin * 2 + _h_separation - idx += 1 - - for element in suggestions: - if new_text.is_empty() or new_text.to_lower() in element.to_lower() or new_text.to_lower() in str(suggestions[element].value).to_lower() or new_text.to_lower() in suggestions[element].get('tooltip', '').to_lower(): - var curr_line_length: int = 0 - curr_line_length = int(get_theme_font('font', 'Label').get_string_size( - element, HORIZONTAL_ALIGNMENT_LEFT, -1, get_theme_font_size("font_size", 'Label') - ).x) - - %Suggestions.add_item(element) - if suggestions[element].has('icon'): - %Suggestions.set_item_icon(idx, suggestions[element].icon) - curr_line_length += %Suggestions.fixed_icon_size.x * %Suggestions.get_icon_scale() + _icon_margin * 2 + _h_separation - elif suggestions[element].has('editor_icon'): - %Suggestions.set_item_icon(idx, get_theme_icon(suggestions[element].editor_icon[0],suggestions[element].editor_icon[1])) - curr_line_length += %Suggestions.fixed_icon_size.x * %Suggestions.get_icon_scale() + _icon_margin * 2 + _h_separation - - line_length = max(line_length, curr_line_length) - - %Suggestions.set_item_tooltip(idx, suggestions[element].get('tooltip', '')) - %Suggestions.set_item_metadata(idx, suggestions[element].value) - idx += 1 - - if not %Suggestions.visible: - %Suggestions.show() - %Suggestions.global_position = $PanelContainer.global_position+Vector2(0,1)*$PanelContainer.size.y - - if %Suggestions.item_count: - %Suggestions.select(0) - current_selected = 0 - else: - current_selected = -1 - %Search.grab_focus() - - var total_height: int = 0 - for item in %Suggestions.item_count: - total_height += int(_line_height * DialogicUtil.get_editor_scale() + _v_separation) - total_height += _v_separation * 2 - if total_height > _max_height: - line_length += %Suggestions.get_v_scroll_bar().get_minimum_size().x - - %Suggestions.size.x = max(%PanelContainer.size.x, line_length) - %Suggestions.size.y = min(total_height, _max_height) - - # Defer setting width to give PanelContainer - # time to update it's size - await get_tree().process_frame - await get_tree().process_frame - - %Suggestions.size.x = max(%PanelContainer.size.x, line_length) - - -func suggestion_selected(index: int, _position := Vector2(), button_index := MOUSE_BUTTON_LEFT) -> void: - if button_index != MOUSE_BUTTON_LEFT: - return - if %Suggestions.is_item_disabled(index): - return - - %Search.text = %Suggestions.get_item_text(index) - - if %Suggestions.get_item_metadata(index) == null: - current_value = "" - - else: - current_value = %Suggestions.get_item_metadata(index) - - update_error_tooltip('') - hide_suggestions() - - grab_focus() - value_changed.emit(property_name, current_value) - current_value_updated = false - - -func _input(event:InputEvent) -> void: - if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT: - if %Suggestions.visible: - if !%Suggestions.get_global_rect().has_point(get_global_mouse_position()) and \ - !%SelectButton.get_global_rect().has_point(get_global_mouse_position()): - hide_suggestions() - - -func hide_suggestions() -> void: - %SelectButton.set_pressed_no_signal(false) - %Suggestions.hide() - if !current_value and collapse_when_empty: - %Search.hide() - - -func _on_SelectButton_toggled(button_pressed:bool) -> void: - if button_pressed: - _on_Search_text_changed('', true) - else: - hide_suggestions() - - -func _on_focus_entered() -> void: - %Search.grab_focus() - - -func _on_search_gui_input(event: InputEvent) -> void: - if event is InputEventKey and (event.keycode == KEY_DOWN or event.keycode == KEY_UP) and event.pressed: - if !%Suggestions.visible: - _on_Search_text_changed('', true) - current_selected = -1 - if event.keycode == KEY_DOWN: - current_selected = wrapi(current_selected+1, 0, %Suggestions.item_count) - if event.keycode == KEY_UP: - current_selected = wrapi(current_selected-1, 0, %Suggestions.item_count) - %Suggestions.select(current_selected) - %Suggestions.ensure_current_is_visible() - - if Input.is_key_pressed(KEY_CTRL): - if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT: - if valid_file_drop_extension in [".dch", ".dtl"] and not current_value.is_empty(): - EditorInterface.edit_resource(DialogicResourceUtil.get_resource_from_identifier(current_value, valid_file_drop_extension)) - - if valid_file_drop_extension in [".dch", ".dtl"] and not current_value.is_empty(): - %Search.mouse_default_cursor_shape = CURSOR_POINTING_HAND - else: - %Search.mouse_default_cursor_shape = CURSOR_IBEAM - - -func _on_search_focus_entered() -> void: - if %Search.text == "": - _on_Search_text_changed("") - %Search.call_deferred('select_all') - %Focus.show() - validate() - - -func _on_search_focus_exited() -> void: - %Focus.hide() - if !%Suggestions.get_global_rect().has_point(get_global_mouse_position()): - hide_suggestions() - validate() - if current_value_updated: - value_changed.emit(property_name, current_value) - current_value_updated = false - -#endregion - - -#region DRAG AND DROP -################################################################################ - -func _can_drop_data(_position:Vector2, data:Variant) -> bool: - if typeof(data) == TYPE_DICTIONARY and data.has('files') and len(data.files) == 1: - if valid_file_drop_extension: - if data.files[0].ends_with(valid_file_drop_extension): - return true - else: - return false - return false - - -func _drop_data(_position:Vector2, data:Variant) -> void: - var path := str(data.files[0]) - if mode == Modes.IDENTIFIER: - path = DialogicResourceUtil.get_unique_identifier_by_path(path) - _set_value(path) - value_changed.emit(property_name, path) - current_value_updated = false - -#endregion diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_options_dynamic.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/field_options_dynamic.gd.uid deleted file mode 100644 index 1e6f222..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_options_dynamic.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cowk63wwk126v diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_options_dynamic.tscn b/godot/addons/dialogic/Editor/Events/Fields/field_options_dynamic.tscn deleted file mode 100644 index c2c898e..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_options_dynamic.tscn +++ /dev/null @@ -1,144 +0,0 @@ -[gd_scene load_steps=7 format=3 uid="uid://dpwhshre1n4t6"] - -[ext_resource type="Script" uid="uid://cowk63wwk126v" path="res://addons/dialogic/Editor/Events/Fields/field_options_dynamic.gd" id="1_b07gq"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_tmt5n"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_vennf"] - -[sub_resource type="Image" id="Image_qw5e6"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_g63da"] -image = SubResource("Image_qw5e6") - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_g74jb"] -content_margin_left = 4.0 -content_margin_top = 4.0 -content_margin_right = 4.0 -content_margin_bottom = 4.0 -bg_color = Color(1, 0.365, 0.365, 1) -draw_center = false -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -corner_detail = 1 - -[node name="Field_DynamicStringOptions" type="HBoxContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = -2.0 -offset_top = -2.0 -offset_right = -1005.0 -offset_bottom = -622.0 -grow_horizontal = 2 -grow_vertical = 2 -focus_mode = 2 -script = ExtResource("1_b07gq") -placeholder_text = "" - -[node name="PanelContainer" type="MarginContainer" parent="."] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -theme_override_constants/margin_left = 0 -theme_override_constants/margin_top = 0 -theme_override_constants/margin_right = 0 -theme_override_constants/margin_bottom = 0 - -[node name="BG" type="Panel" parent="PanelContainer"] -unique_name_in_owner = true -layout_mode = 2 -mouse_filter = 2 -theme_type_variation = &"DialogicEventEdit" -metadata/_edit_use_anchors_ = true - -[node name="MarginContainer" type="MarginContainer" parent="PanelContainer"] -layout_mode = 2 -theme_override_constants/margin_left = 2 -theme_override_constants/margin_top = 2 -theme_override_constants/margin_right = 2 -theme_override_constants/margin_bottom = 2 - -[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/MarginContainer"] -layout_mode = 2 - -[node name="Icon" type="TextureRect" parent="PanelContainer/MarginContainer/HBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 4 -mouse_filter = 2 -stretch_mode = 5 - -[node name="Search" type="LineEdit" parent="PanelContainer/MarginContainer/HBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 4 -focus_neighbor_bottom = NodePath("Suggestions") -focus_mode = 1 -mouse_filter = 1 -theme_override_styles/normal = SubResource("StyleBoxEmpty_tmt5n") -theme_override_styles/focus = SubResource("StyleBoxEmpty_vennf") -expand_to_text_length = true -flat = true -caret_blink = true - -[node name="Suggestions" type="ItemList" parent="PanelContainer/MarginContainer/HBoxContainer/Search"] -unique_name_in_owner = true -visible = false -top_level = true -custom_minimum_size = Vector2(-1086, 0) -layout_mode = 0 -offset_left = -5.0 -offset_top = 36.0 -offset_right = 195.0 -offset_bottom = 71.0 -size_flags_vertical = 0 -auto_translate = false -focus_neighbor_top = NodePath("..") -max_text_lines = 3 -item_count = 1 -fixed_icon_size = Vector2i(16, 16) -item_0/text = "Hello" - -[node name="SelectButton" type="Button" parent="PanelContainer/MarginContainer/HBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -focus_mode = 0 -toggle_mode = true -shortcut_in_tooltip = false -icon = SubResource("ImageTexture_g63da") -flat = true - -[node name="Focus" type="Panel" parent="PanelContainer"] -unique_name_in_owner = true -visible = false -layout_mode = 2 -mouse_filter = 2 -theme_override_styles/panel = SubResource("StyleBoxFlat_g74jb") -metadata/_edit_use_anchors_ = true - -[node name="ErrorTooltip" type="Label" parent="PanelContainer/Focus"] -unique_name_in_owner = true -visible = false -top_level = true -layout_mode = 0 -offset_left = -2.0 -offset_top = -44.5 -offset_right = 11.0 -offset_bottom = -9.5 - -[connection signal="focus_entered" from="." to="." method="_on_focus_entered"] -[connection signal="focus_entered" from="PanelContainer/MarginContainer/HBoxContainer/Search" to="." method="_on_search_focus_entered"] -[connection signal="focus_exited" from="PanelContainer/MarginContainer/HBoxContainer/Search" to="." method="_on_search_focus_exited"] -[connection signal="gui_input" from="PanelContainer/MarginContainer/HBoxContainer/Search" to="." method="_on_search_gui_input"] -[connection signal="toggled" from="PanelContainer/MarginContainer/HBoxContainer/SelectButton" to="." method="_on_SelectButton_toggled"] diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_options_fixed.gd b/godot/addons/dialogic/Editor/Events/Fields/field_options_fixed.gd deleted file mode 100644 index b899b0b..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_options_fixed.gd +++ /dev/null @@ -1,67 +0,0 @@ -@tool -extends DialogicVisualEditorField - -## Event block field for constant options. For varying options use ComplexPicker. - -var options: Array = []: - set(o): - options = o - if current_value != -1: - set_value(current_value) - -## if true, only the symbol will be displayed. In the dropdown text will be visible. -## Useful for making UI simpler -var symbol_only := false: - set(value): - symbol_only = value - if value: self.text = "" - -var current_value: Variant = -1 - - -func _ready() -> void: - add_theme_color_override("font_disabled_color", get_theme_color("font_color", "MenuButton")) - self.about_to_popup.connect(insert_options) - call("get_popup").index_pressed.connect(index_pressed) - - - -func _load_display_info(info:Dictionary) -> void: - options = info.get('options', []) - self.disabled = info.get('disabled', false) - symbol_only = info.get('symbol_only', false) - - -func _set_value(value:Variant) -> void: - for option in options: - if option['value'] == value: - if typeof(option.get('icon')) == TYPE_ARRAY: - option.icon = callv('get_theme_icon', option.get('icon')) - if !symbol_only: - self.text = option['label'] - self.icon = option.get('icon', null) - current_value = value - - -func get_value() -> Variant: - return current_value - - -func insert_options() -> void: - call("get_popup").clear() - - var idx := 0 - for option in options: - if typeof(option.get('icon')) == TYPE_ARRAY: - option.icon = callv('get_theme_icon', option.get('icon')) - call("get_popup").add_icon_item(option.get('icon', null), option['label']) - call("get_popup").set_item_metadata(idx, option['value']) - idx += 1 - - -func index_pressed(idx:int) -> void: - current_value = idx - if !symbol_only: - self.text = call("get_popup").get_item_text(idx) - self.icon =call("get_popup").get_item_icon(idx) - value_changed.emit(property_name, call("get_popup").get_item_metadata(idx)) diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_options_fixed.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/field_options_fixed.gd.uid deleted file mode 100644 index 15187ec..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_options_fixed.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://l6jbshj3y66l diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_options_fixed.tscn b/godot/addons/dialogic/Editor/Events/Fields/field_options_fixed.tscn deleted file mode 100644 index ad909ee..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_options_fixed.tscn +++ /dev/null @@ -1,13 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://d3bhehatwoio"] - -[ext_resource type="Script" uid="uid://l6jbshj3y66l" path="res://addons/dialogic/Editor/Events/Fields/field_options_fixed.gd" id="1"] - -[node name="Field_FixedOptions" type="MenuButton"] -offset_right = 137.0 -offset_bottom = 43.0 -focus_mode = 2 -theme_type_variation = &"DialogicEventEdit" -theme_override_colors/font_disabled_color = Color(0.875, 0.875, 0.875, 1) -text = "Placeholder Text" -flat = false -script = ExtResource("1") diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_text_multiline.gd b/godot/addons/dialogic/Editor/Events/Fields/field_text_multiline.gd deleted file mode 100644 index db46b51..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_text_multiline.gd +++ /dev/null @@ -1,74 +0,0 @@ -@tool -extends DialogicVisualEditorField - -## Event block field that allows entering multiline text (mainly text event). - -@onready var code_completion_helper: Node = find_parent('EditorsManager').get_node('CodeCompletionHelper') - - -#region MAIN METHODS -################################################################################ - -func _ready() -> void: - self.text_changed.connect(_on_text_changed) - self.syntax_highlighter = code_completion_helper.text_syntax_highlighter - - -func _load_display_info(info:Dictionary) -> void: - pass - - -func _set_value(value:Variant) -> void: - self.text = str(value) - - -func _autofocus() -> void: - grab_focus() - -#endregion - - -#region SIGNAL METHODS -################################################################################ - -func _on_text_changed(_value := "") -> void: - value_changed.emit(property_name, self.text) - -#endregion - - -#region AUTO COMPLETION -################################################################################ - -## Called if something was typed -func _request_code_completion(force:bool): - code_completion_helper.request_code_completion(force, self, 0) - - -## Filters the list of all possible options, depending on what was typed -## Purpose of the different Kinds is explained in [_request_code_completion] -func _filter_code_completion_candidates(candidates:Array) -> Array: - return code_completion_helper.filter_code_completion_candidates(candidates, self) - - -## Called when code completion was activated -## Inserts the selected item -func _confirm_code_completion(replace:bool) -> void: - code_completion_helper.confirm_code_completion(replace, self) - -#endregion - - -#region SYMBOL CLICKING -################################################################################ - -## Performs an action (like opening a link) when a valid symbol was clicked -func _on_symbol_lookup(symbol, line, column): - code_completion_helper.symbol_lookup(symbol, line, column) - - -## Called to test if a symbol can be clicked -func _on_symbol_validate(symbol:String) -> void: - code_completion_helper.symbol_validate(symbol, self) - -#endregion diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_text_multiline.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/field_text_multiline.gd.uid deleted file mode 100644 index d2745f7..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_text_multiline.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://do4y48h30412d diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_text_multiline.tscn b/godot/addons/dialogic/Editor/Events/Fields/field_text_multiline.tscn deleted file mode 100644 index 63e095c..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_text_multiline.tscn +++ /dev/null @@ -1,28 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://dyp7m2nvab1aj"] - -[ext_resource type="Script" uid="uid://bf2nivn8txcw5" path="res://addons/dialogic/Editor/TimelineEditor/TextEditor/syntax_highlighter.gd" id="2_ww6ga"] -[ext_resource type="Script" uid="uid://do4y48h30412d" path="res://addons/dialogic/Editor/Events/Fields/field_text_multiline.gd" id="3_q7600"] - -[sub_resource type="SyntaxHighlighter" id="SyntaxHighlighter_2q5dk"] -script = ExtResource("2_ww6ga") - -[node name="Field_Text_Multiline" type="CodeEdit"] -offset_right = 413.0 -offset_bottom = 15.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_type_variation = &"DialogicTextEventTextEdit" -wrap_mode = 1 -scroll_fit_content_height = true -syntax_highlighter = SubResource("SyntaxHighlighter_2q5dk") -symbol_lookup_on_click = true -delimiter_strings = Array[String]([]) -code_completion_enabled = true -code_completion_prefixes = Array[String](["[", "{"]) -indent_automatic_prefixes = Array[String]([":", "{", "[", ")"]) -auto_brace_completion_enabled = true -auto_brace_completion_pairs = { -"[": "]", -"{": "}" -} -script = ExtResource("3_q7600") diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_text_singleline.gd b/godot/addons/dialogic/Editor/Events/Fields/field_text_singleline.gd deleted file mode 100644 index 765f862..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_text_singleline.gd +++ /dev/null @@ -1,40 +0,0 @@ -@tool -extends DialogicVisualEditorField - -## Event block field for a single line of text. - - -var placeholder := "": - set(value): - placeholder = value - self.placeholder_text = placeholder - - -#region MAIN METHODS -################################################################################ - -func _ready() -> void: - self.text_changed.connect(_on_text_changed) - - -func _load_display_info(info:Dictionary) -> void: - self.placeholder = info.get('placeholder', '') - - -func _set_value(value:Variant) -> void: - self.text = str(value) - - -func _autofocus() -> void: - grab_focus() - -#endregion - - -#region SIGNAL METHODS -################################################################################ - -func _on_text_changed(value := "") -> void: - value_changed.emit(property_name, self.text) - -#endregion diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_text_singleline.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/field_text_singleline.gd.uid deleted file mode 100644 index 1a2799f..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_text_singleline.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cgx1rn8km87ya diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_text_singleline.tscn b/godot/addons/dialogic/Editor/Events/Fields/field_text_singleline.tscn deleted file mode 100644 index 374fcb5..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_text_singleline.tscn +++ /dev/null @@ -1,10 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://c0vkcehgjsjy"] - -[ext_resource type="Script" uid="uid://cgx1rn8km87ya" path="res://addons/dialogic/Editor/Events/Fields/field_text_singleline.gd" id="1_4vnxv"] - -[node name="Field_Text_Singleline" type="LineEdit"] -offset_right = 1152.0 -offset_bottom = 81.0 -theme_type_variation = &"DialogicEventEdit" -expand_to_text_length = true -script = ExtResource("1_4vnxv") diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_vector2.gd b/godot/addons/dialogic/Editor/Events/Fields/field_vector2.gd deleted file mode 100644 index 8977349..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_vector2.gd +++ /dev/null @@ -1,31 +0,0 @@ -@tool -extends DialogicVisualEditorFieldVector -## Event block field for a Vector2. - -var current_value := Vector2() - - -func _set_value(value: Variant) -> void: - current_value = value - super(value) - - -func get_value() -> Vector2: - return current_value - - -func _on_sub_value_changed(sub_component: String, value: float) -> void: - match sub_component: - 'X': current_value.x = value - 'Y': current_value.y = value - _on_value_changed(current_value) - - -func _update_sub_component_text(value: Variant) -> void: - $X._on_value_text_submitted(str(value.x), true) - $Y._on_value_text_submitted(str(value.y), true) - - -func _on_step_changed(new_step:float) -> void: - $X.step = new_step - $Y.step = new_step diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_vector2.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/field_vector2.gd.uid deleted file mode 100644 index 23b972e..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_vector2.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://2dk2fuatjwru diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_vector2.tscn b/godot/addons/dialogic/Editor/Events/Fields/field_vector2.tscn deleted file mode 100644 index cd70c10..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_vector2.tscn +++ /dev/null @@ -1,31 +0,0 @@ -[gd_scene load_steps=3 format=3 uid="uid://dtimnsj014cu"] - -[ext_resource type="Script" uid="uid://2dk2fuatjwru" path="res://addons/dialogic/Editor/Events/Fields/field_vector2.gd" id="1_v6lp0"] -[ext_resource type="PackedScene" uid="uid://kdpp3mibml33" path="res://addons/dialogic/Editor/Events/Fields/field_number.tscn" id="2_a0b6y"] - -[node name="Field_Vector2" type="HBoxContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_right = -1033.0 -offset_bottom = -617.0 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_constants/separation = 2 -script = ExtResource("1_v6lp0") - -[node name="X" parent="." instance=ExtResource("2_a0b6y")] -layout_mode = 2 -size_flags_horizontal = 3 -enforce_step = false -min = -9999.0 -max = 9999.0 -prefix = "x" - -[node name="Y" parent="." instance=ExtResource("2_a0b6y")] -layout_mode = 2 -size_flags_horizontal = 3 -enforce_step = false -min = -9999.0 -max = 9999.0 -prefix = "y" diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_vector3.gd b/godot/addons/dialogic/Editor/Events/Fields/field_vector3.gd deleted file mode 100644 index cc244a0..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_vector3.gd +++ /dev/null @@ -1,34 +0,0 @@ -@tool -extends DialogicVisualEditorFieldVector -## Event block field for a Vector3. - -var current_value := Vector3() - - -func _set_value(value: Variant) -> void: - current_value = value - super(value) - - -func get_value() -> Vector3: - return current_value - - -func _on_sub_value_changed(sub_component: String, value: float) -> void: - match sub_component: - 'X': current_value.x = value - 'Y': current_value.y = value - 'Z': current_value.z = value - _on_value_changed(current_value) - - -func _update_sub_component_text(value: Variant) -> void: - $X._on_value_text_submitted(str(value.x), true) - $Y._on_value_text_submitted(str(value.y), true) - $Z._on_value_text_submitted(str(value.z), true) - - -func _on_step_changed(new_step:float) -> void: - $X.step = new_step - $Y.step = new_step - $Z.step = new_step diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_vector3.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/field_vector3.gd.uid deleted file mode 100644 index c10644a..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_vector3.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://y01tg3q2homo diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_vector3.tscn b/godot/addons/dialogic/Editor/Events/Fields/field_vector3.tscn deleted file mode 100644 index 781509a..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_vector3.tscn +++ /dev/null @@ -1,17 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://cklkpfrcvopgw"] - -[ext_resource type="PackedScene" uid="uid://dtimnsj014cu" path="res://addons/dialogic/Editor/Events/Fields/field_vector2.tscn" id="1_l3y0o"] -[ext_resource type="Script" uid="uid://y01tg3q2homo" path="res://addons/dialogic/Editor/Events/Fields/field_vector3.gd" id="2_gktf1"] -[ext_resource type="PackedScene" uid="uid://kdpp3mibml33" path="res://addons/dialogic/Editor/Events/Fields/field_number.tscn" id="3_k0u0p"] - -[node name="Field_Vector3" instance=ExtResource("1_l3y0o")] -offset_right = -973.0 -script = ExtResource("2_gktf1") - -[node name="Z" parent="." index="2" instance=ExtResource("3_k0u0p")] -layout_mode = 2 -size_flags_horizontal = 3 -enforce_step = false -min = -9999.0 -max = 9999.0 -prefix = "z" diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_vector4.gd b/godot/addons/dialogic/Editor/Events/Fields/field_vector4.gd deleted file mode 100644 index e584b82..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_vector4.gd +++ /dev/null @@ -1,37 +0,0 @@ -@tool -extends DialogicVisualEditorFieldVector -## Event block field for a Vector4. - -var current_value := Vector4() - - -func _set_value(value: Variant) -> void: - current_value = value - super(value) - - -func get_value() -> Vector4: - return current_value - - -func _on_sub_value_changed(sub_component: String, value: float) -> void: - match sub_component: - 'X': current_value.x = value - 'Y': current_value.y = value - 'Z': current_value.z = value - 'W': current_value.w = value - _on_value_changed(current_value) - - -func _update_sub_component_text(value: Variant) -> void: - $X._on_value_text_submitted(str(value.x), true) - $Y._on_value_text_submitted(str(value.y), true) - $Z._on_value_text_submitted(str(value.z), true) - $W._on_value_text_submitted(str(value.w), true) - - -func _on_step_changed(new_step:float) -> void: - $X.step = new_step - $Y.step = new_step - $Z.step = new_step - $W.step = new_step diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_vector4.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/field_vector4.gd.uid deleted file mode 100644 index dd8716f..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_vector4.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://chr6fkvkjugep diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_vector4.tscn b/godot/addons/dialogic/Editor/Events/Fields/field_vector4.tscn deleted file mode 100644 index 86acc6f..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_vector4.tscn +++ /dev/null @@ -1,25 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://dykss037r2rsc"] - -[ext_resource type="PackedScene" uid="uid://cklkpfrcvopgw" path="res://addons/dialogic/Editor/Events/Fields/field_vector3.tscn" id="1_20tvl"] -[ext_resource type="Script" uid="uid://chr6fkvkjugep" path="res://addons/dialogic/Editor/Events/Fields/field_vector4.gd" id="2_yksrc"] -[ext_resource type="PackedScene" uid="uid://kdpp3mibml33" path="res://addons/dialogic/Editor/Events/Fields/field_number.tscn" id="3_1jogk"] - -[node name="Field_Vector4" instance=ExtResource("1_20tvl")] -offset_right = -908.0 -script = ExtResource("2_yksrc") - -[node name="X" parent="." index="0"] -size_flags_horizontal = 1 -prefix = "" - -[node name="Y" parent="." index="1"] -size_flags_horizontal = 1 -prefix = "" - -[node name="W" parent="." index="3" instance=ExtResource("3_1jogk")] -layout_mode = 2 -size_flags_horizontal = 3 -enforce_step = false -min = -9999.0 -max = 9999.0 -prefix = "w" diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_vector_base.gd b/godot/addons/dialogic/Editor/Events/Fields/field_vector_base.gd deleted file mode 100644 index c34b41c..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_vector_base.gd +++ /dev/null @@ -1,47 +0,0 @@ -@tool -class_name DialogicVisualEditorFieldVector -extends DialogicVisualEditorField -## Base type for Vector event blocks - -var step := 0.001 : - set(val): - step = val - _on_step_changed(step) - -func _ready() -> void: - for child in get_children(): - child.tooltip_text = tooltip_text - child.property_name = child.name #to identify the name of the changed sub-component - child.value_changed.connect(_on_sub_value_changed) - - -func _load_display_info(info: Dictionary) -> void: - for child in get_children(): - if child is DialogicVisualEditorFieldNumber: - if info.get('no_prefix', false): - child._load_display_info(info) - else: - var prefixed_info := info.duplicate() - prefixed_info.merge({'prefix':child.name.to_lower()}) - child._load_display_info(prefixed_info) - - -func _set_value(value: Variant) -> void: - _update_sub_component_text(value) - _on_value_changed(value) - - -func _on_value_changed(value: Variant) -> void: - value_changed.emit(property_name, value) - - -func _on_sub_value_changed(sub_component: String, value: float) -> void: - pass - - -func _update_sub_component_text(value: Variant) -> void: - pass - - -func _on_step_changed(step:float) -> void: - pass diff --git a/godot/addons/dialogic/Editor/Events/Fields/field_vector_base.gd.uid b/godot/addons/dialogic/Editor/Events/Fields/field_vector_base.gd.uid deleted file mode 100644 index 6273507..0000000 --- a/godot/addons/dialogic/Editor/Events/Fields/field_vector_base.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c25u8dv20exfr diff --git a/godot/addons/dialogic/Editor/Events/event_field.gd b/godot/addons/dialogic/Editor/Events/event_field.gd deleted file mode 100644 index 920758e..0000000 --- a/godot/addons/dialogic/Editor/Events/event_field.gd +++ /dev/null @@ -1,36 +0,0 @@ -@tool -class_name DialogicVisualEditorField -extends Control - -@warning_ignore("unused_signal") -signal value_changed(property_name:String, value:Variant) -var property_name := "" - -var event_resource: DialogicEvent = null - -#region OVERWRITES -################################################################################ - -## To be overwritten -func _load_display_info(_info:Dictionary) -> void: - pass - - -## To be overwritten -func _set_value(_value:Variant) -> void: - pass - - -## To be overwritten -func _autofocus() -> void: - pass - -#endregion - - -func set_value(value:Variant) -> void: - _set_value(value) - - -func take_autofocus() -> void: - _autofocus() diff --git a/godot/addons/dialogic/Editor/Events/event_field.gd.uid b/godot/addons/dialogic/Editor/Events/event_field.gd.uid deleted file mode 100644 index 47e9cfe..0000000 --- a/godot/addons/dialogic/Editor/Events/event_field.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cbwisirnxfqtm diff --git a/godot/addons/dialogic/Editor/Events/styles/InputFieldsStyle.tres b/godot/addons/dialogic/Editor/Events/styles/InputFieldsStyle.tres deleted file mode 100644 index fa952ee..0000000 --- a/godot/addons/dialogic/Editor/Events/styles/InputFieldsStyle.tres +++ /dev/null @@ -1,50 +0,0 @@ -[gd_resource type="Theme" load_steps=3 format=3 uid="uid://d3g4i4dshtdpu"] - -[sub_resource type="StyleBoxFlat" id="1"] -content_margin_left = 30.0 -content_margin_top = 5.0 -content_margin_right = 20.0 -content_margin_bottom = 5.0 -bg_color = Color(0.12549, 0.141176, 0.192157, 1) -border_width_left = 1 -border_width_top = 1 -border_width_right = 1 -border_width_bottom = 1 -border_color = Color(0.0980392, 0.113725, 0.152941, 1) -corner_radius_top_left = 3 -corner_radius_top_right = 3 -corner_radius_bottom_right = 3 -corner_radius_bottom_left = 3 - -[sub_resource type="StyleBoxFlat" id="2"] -content_margin_left = 11.0 -content_margin_top = 5.0 -content_margin_right = 20.0 -content_margin_bottom = 5.0 -bg_color = Color(0.12549, 0.141176, 0.192157, 1) -border_width_left = 1 -border_width_top = 1 -border_width_right = 1 -border_width_bottom = 1 -border_color = Color(0.0980392, 0.113725, 0.152941, 1) -corner_radius_top_left = 3 -corner_radius_top_right = 3 -corner_radius_bottom_right = 3 -corner_radius_bottom_left = 3 - -[resource] -LineEdit/colors/clear_button_color = Color(0, 0, 0, 1) -LineEdit/colors/clear_button_color_pressed = Color(0, 0, 0, 1) -LineEdit/colors/cursor_color = Color(1, 1, 1, 1) -LineEdit/colors/font_color = Color(1, 1, 1, 1) -LineEdit/colors/font_color_selected = Color(1, 1, 1, 1) -LineEdit/colors/font_color_uneditable = Color(1, 1, 1, 1) -LineEdit/colors/selection_color = Color(1, 1, 1, 0.235294) -LineEdit/constants/minimum_spaces = 10 -LineEdit/fonts/font = null -LineEdit/icons/clear = null -LineEdit/styles/focus = SubResource("1") -LineEdit/styles/normal = SubResource("2") -LineEdit/styles/read_only = SubResource("1") -LineEditWithIcon/base_type = &"LineEdit" -LineEditWithIcon/styles/normal = SubResource("1") diff --git a/godot/addons/dialogic/Editor/Events/styles/ResourceMenuHover.tres b/godot/addons/dialogic/Editor/Events/styles/ResourceMenuHover.tres deleted file mode 100644 index ecf8376..0000000 --- a/godot/addons/dialogic/Editor/Events/styles/ResourceMenuHover.tres +++ /dev/null @@ -1,11 +0,0 @@ -[gd_resource type="StyleBoxFlat" format=2] - -[resource] -content_margin_left = 25.0 -content_margin_right = 10.0 -content_margin_top = 4.0 -content_margin_bottom = 4.0 -bg_color = Color( 0.466667, 0.466667, 0.466667, 0.141176 ) -border_width_bottom = 2 -corner_radius_top_left = 4 -corner_radius_top_right = 4 diff --git a/godot/addons/dialogic/Editor/Events/styles/ResourceMenuNormal.tres b/godot/addons/dialogic/Editor/Events/styles/ResourceMenuNormal.tres deleted file mode 100644 index d14860a..0000000 --- a/godot/addons/dialogic/Editor/Events/styles/ResourceMenuNormal.tres +++ /dev/null @@ -1,13 +0,0 @@ -[gd_resource type="StyleBoxFlat" format=2] - -[resource] -content_margin_left = 25.0 -content_margin_right = 10.0 -content_margin_top = 4.0 -content_margin_bottom = 4.0 -bg_color = Color( 0.180392, 0.180392, 0.180392, 0.219608 ) -draw_center = false -border_width_bottom = 2 -border_color = Color( 0.8, 0.8, 0.8, 0.286275 ) -corner_radius_top_left = 4 -corner_radius_top_right = 4 diff --git a/godot/addons/dialogic/Editor/Events/styles/ResourceMenuPanelBackground.tres b/godot/addons/dialogic/Editor/Events/styles/ResourceMenuPanelBackground.tres deleted file mode 100644 index 314544b..0000000 --- a/godot/addons/dialogic/Editor/Events/styles/ResourceMenuPanelBackground.tres +++ /dev/null @@ -1,17 +0,0 @@ -[gd_resource type="StyleBoxFlat" format=3 uid="uid://c8k6tbipodsg"] - -[resource] -content_margin_left = 10.0 -content_margin_top = 10.0 -content_margin_right = 10.0 -content_margin_bottom = 10.0 -bg_color = Color(0, 0, 0, 1) -border_width_left = 1 -border_width_top = 1 -border_width_right = 1 -border_width_bottom = 1 -border_color = Color(0.8, 0.8, 0.8, 0.109804) -corner_radius_top_left = 4 -corner_radius_top_right = 4 -corner_radius_bottom_right = 4 -corner_radius_bottom_left = 4 diff --git a/godot/addons/dialogic/Editor/Events/styles/SectionPanel.tres b/godot/addons/dialogic/Editor/Events/styles/SectionPanel.tres deleted file mode 100644 index b886c6e..0000000 --- a/godot/addons/dialogic/Editor/Events/styles/SectionPanel.tres +++ /dev/null @@ -1,17 +0,0 @@ -[gd_resource type="StyleBoxFlat" format=2] - -[resource] -content_margin_left = 6.0 -content_margin_right = 6.0 -content_margin_top = 5.0 -content_margin_bottom = 4.0 -bg_color = Color( 0.6, 0.6, 0.6, 0 ) -border_width_left = 1 -border_width_top = 1 -border_width_right = 1 -border_width_bottom = 1 -border_color = Color( 0.2, 0.227451, 0.309804, 1 ) -corner_radius_top_left = 3 -corner_radius_top_right = 3 -corner_radius_bottom_right = 3 -corner_radius_bottom_left = 3 diff --git a/godot/addons/dialogic/Editor/Events/styles/SimpleButtonHover.tres b/godot/addons/dialogic/Editor/Events/styles/SimpleButtonHover.tres deleted file mode 100644 index 5be19d4..0000000 --- a/godot/addons/dialogic/Editor/Events/styles/SimpleButtonHover.tres +++ /dev/null @@ -1,17 +0,0 @@ -[gd_resource type="StyleBoxFlat" format=2] - -[resource] -content_margin_left = 3.0 -content_margin_right = 3.0 -content_margin_top = 3.0 -content_margin_bottom = 3.0 -bg_color = Color( 0.2, 0.231373, 0.309804, 0.317647 ) -border_width_left = 1 -border_width_top = 1 -border_width_right = 1 -border_width_bottom = 1 -border_color = Color( 0.8, 0.8, 0.8, 0.109804 ) -corner_radius_top_left = 4 -corner_radius_top_right = 4 -corner_radius_bottom_right = 4 -corner_radius_bottom_left = 4 diff --git a/godot/addons/dialogic/Editor/Events/styles/SimpleButtonNormal.tres b/godot/addons/dialogic/Editor/Events/styles/SimpleButtonNormal.tres deleted file mode 100644 index e5c06b4..0000000 --- a/godot/addons/dialogic/Editor/Events/styles/SimpleButtonNormal.tres +++ /dev/null @@ -1,17 +0,0 @@ -[gd_resource type="StyleBoxFlat" format=2] - -[resource] -content_margin_left = 3.0 -content_margin_right = 3.0 -content_margin_top = 3.0 -content_margin_bottom = 3.0 -bg_color = Color( 0.2, 0.231373, 0.309804, 0.235294 ) -border_width_left = 1 -border_width_top = 1 -border_width_right = 1 -border_width_bottom = 1 -border_color = Color( 0.8, 0.8, 0.8, 0.109804 ) -corner_radius_top_left = 4 -corner_radius_top_right = 4 -corner_radius_bottom_right = 4 -corner_radius_bottom_left = 4 diff --git a/godot/addons/dialogic/Editor/Events/styles/TextBackground.tres b/godot/addons/dialogic/Editor/Events/styles/TextBackground.tres deleted file mode 100644 index 0d74e3d..0000000 --- a/godot/addons/dialogic/Editor/Events/styles/TextBackground.tres +++ /dev/null @@ -1,12 +0,0 @@ -[gd_resource type="StyleBoxFlat" format=3 uid="uid://cu8otiwksn8ma"] - -[resource] -content_margin_left = 10.0 -content_margin_top = 13.0 -content_margin_bottom = 2.0 -bg_color = Color(1, 1, 1, 0.0784314) -border_color = Color(0.454902, 0.454902, 0.454902, 1) -corner_radius_top_left = 8 -corner_radius_top_right = 8 -corner_radius_bottom_right = 8 -corner_radius_bottom_left = 8 diff --git a/godot/addons/dialogic/Editor/Events/styles/selected_styleboxflat.tres b/godot/addons/dialogic/Editor/Events/styles/selected_styleboxflat.tres deleted file mode 100644 index c9312fb..0000000 --- a/godot/addons/dialogic/Editor/Events/styles/selected_styleboxflat.tres +++ /dev/null @@ -1,16 +0,0 @@ -[gd_resource type="StyleBoxFlat" format=3 uid="uid://obyrr26pqk2p"] - -[resource] -content_margin_left = 3.0 -content_margin_top = 1.0 -content_margin_right = 4.0 -content_margin_bottom = 1.0 -bg_color = Color(0.776471, 0.776471, 0.776471, 0.207843) -border_color = Color(1, 1, 1, 1) -corner_radius_top_left = 5 -corner_radius_top_right = 5 -corner_radius_bottom_right = 5 -corner_radius_bottom_left = 5 -expand_margin_left = 1.0 -expand_margin_top = 1.0 -expand_margin_bottom = 2.0 diff --git a/godot/addons/dialogic/Editor/Events/styles/unselected_stylebox.tres b/godot/addons/dialogic/Editor/Events/styles/unselected_stylebox.tres deleted file mode 100644 index 2fae3b3..0000000 --- a/godot/addons/dialogic/Editor/Events/styles/unselected_stylebox.tres +++ /dev/null @@ -1,7 +0,0 @@ -[gd_resource type="StyleBoxEmpty" format=3 uid="uid://cl75ikyq2is7c"] - -[resource] -content_margin_left = 3.0 -content_margin_top = 1.0 -content_margin_right = 4.0 -content_margin_bottom = 1.0 diff --git a/godot/addons/dialogic/Editor/HomePage/home_page.gd b/godot/addons/dialogic/Editor/HomePage/home_page.gd deleted file mode 100644 index 15aff25..0000000 --- a/godot/addons/dialogic/Editor/HomePage/home_page.gd +++ /dev/null @@ -1,86 +0,0 @@ -@tool -extends DialogicEditor - -## A Main page in the dialogic editor. - -var tips: Array = [] - - - -func _get_icon() -> Texture: - return load("res://addons/dialogic/Editor/Images/plugin-icon.svg") - - -func _ready() -> void: - self_modulate = get_theme_color("font_color", "Editor") - self_modulate.a = 0.2 - - var edit_scale := DialogicUtil.get_editor_scale() - %HomePageBox.custom_minimum_size = Vector2(600, 350)*edit_scale - %TopPanel.custom_minimum_size.y = 100*edit_scale - %VersionLabel.set('theme_override_font_sizes/font_size', 10 * edit_scale) - var plugin_cfg := ConfigFile.new() - plugin_cfg.load("res://addons/dialogic/plugin.cfg") - %VersionLabel.text = plugin_cfg.get_value('plugin', 'version', 'unknown version') - - %BottomPanel.self_modulate = get_theme_color("dark_color_3", "Editor") - - %RandomTipLabel.add_theme_color_override("font_color", get_theme_color("property_color_z", "Editor")) - %RandomTipMoreButton.icon = get_theme_icon("ExternalLink", "EditorIcons") - - - -func _register() -> void: - editors_manager.register_simple_editor(self) - - self.alternative_text = "Welcome to dialogic!" - - - -func _open(extra_info:Variant="") -> void: - if tips.is_empty(): - var file := FileAccess.open('res://addons/dialogic/Editor/HomePage/tips.txt', FileAccess.READ) - tips = file.get_as_text().split('\n') - tips = tips.filter(func(item): return !item.is_empty()) - - randomize() - var tip: String = tips[randi()%len(tips)] - var text := tip.get_slice(';',0).strip_edges() - var action := tip.get_slice(';',1).strip_edges() - if action == text: - action = "" - show_tip(text, action) - - -func show_tip(text:String='', action:String='') -> void: - if text.is_empty(): - %TipBox.hide() - %RandomTipLabel.hide() - return - - %TipBox.show() - %RandomTipLabel.show() - %RandomTip.text = '[i]'+text - - if action.is_empty(): - %RandomTipMoreButton.hide() - return - - %RandomTipMoreButton.show() - - if %RandomTipMoreButton.pressed.is_connected(_on_tip_action): - %RandomTipMoreButton.pressed.disconnect(_on_tip_action) - %RandomTipMoreButton.pressed.connect(_on_tip_action.bind(action)) - - -func _on_tip_action(action:String) -> void: - if action.begins_with('https://'): - OS.shell_open(action) - return - elif action.begins_with('editor://'): - var editor_name := action.trim_prefix('editor://').get_slice('->',0) - var extra_info := action.trim_prefix('editor://').get_slice('->',1) - if editor_name in editors_manager.editors: - editors_manager.open_editor(editors_manager.editors[editor_name].node, false, extra_info) - return - print("Tip button doesn't do anything (", action, ")") diff --git a/godot/addons/dialogic/Editor/HomePage/home_page.gd.uid b/godot/addons/dialogic/Editor/HomePage/home_page.gd.uid deleted file mode 100644 index 80bfac7..0000000 --- a/godot/addons/dialogic/Editor/HomePage/home_page.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bl3vudjf3wn2x diff --git a/godot/addons/dialogic/Editor/HomePage/home_page.tscn b/godot/addons/dialogic/Editor/HomePage/home_page.tscn deleted file mode 100644 index 5e91757..0000000 --- a/godot/addons/dialogic/Editor/HomePage/home_page.tscn +++ /dev/null @@ -1,373 +0,0 @@ -[gd_scene load_steps=23 format=3 uid="uid://cqy73hshqqgga"] - -[ext_resource type="Script" uid="uid://bl3vudjf3wn2x" path="res://addons/dialogic/Editor/HomePage/home_page.gd" id="1_6g38w"] -[ext_resource type="Texture2D" uid="uid://cvmlp5nxb2rer" path="res://addons/dialogic/Editor/HomePage/icon_bg.png" id="1_ed1g1"] -[ext_resource type="Texture2D" uid="uid://bt87p6qlso0ya" path="res://addons/dialogic/Editor/Images/dialogic-logo.svg" id="3_3leok"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_imi2d"] -draw_center = false -corner_radius_top_left = 15 -corner_radius_top_right = 15 -shadow_color = Color(0.796078, 0.572549, 0.933333, 0.0627451) -shadow_size = 24 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_n2afh"] -corner_radius_top_left = 15 -corner_radius_top_right = 15 - -[sub_resource type="Gradient" id="Gradient_lt7uf"] -colors = PackedColorArray(0.296484, 0.648457, 1, 1, 0.732014, 0.389374, 1, 1) - -[sub_resource type="GradientTexture2D" id="GradientTexture2D_2klx3"] -gradient = SubResource("Gradient_lt7uf") -fill_from = Vector2(0.151515, 0.272727) -fill_to = Vector2(1, 1) - -[sub_resource type="Gradient" id="Gradient_1gns2"] -offsets = PackedFloat32Array(0.302013, 0.872483) -colors = PackedColorArray(0.365323, 0.360806, 0.260695, 0, 0.615686, 0.615686, 0.615686, 0.592157) - -[sub_resource type="GradientTexture2D" id="GradientTexture2D_u0aw3"] -gradient = SubResource("Gradient_1gns2") -fill = 1 -fill_from = Vector2(0.497835, 0.493506) -fill_to = Vector2(1, 1) - -[sub_resource type="FontVariation" id="FontVariation_vepxx"] -variation_embolden = 2.0 - -[sub_resource type="LabelSettings" id="LabelSettings_w8q1h"] -font = SubResource("FontVariation_vepxx") -font_size = 40 -outline_size = 14 -outline_color = Color(0.0901961, 0.0901961, 0.0901961, 0.258824) - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_p7ka2"] -content_margin_left = 10.0 -content_margin_top = 10.0 -content_margin_right = 10.0 -content_margin_bottom = 10.0 -bg_color = Color(1, 1, 1, 1) -corner_radius_bottom_right = 15 -corner_radius_bottom_left = 15 - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_es88k"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ce6uo"] -content_margin_left = 7.0 -content_margin_top = 7.0 -content_margin_right = 7.0 -content_margin_bottom = 14.0 -bg_color = Color(0.803922, 0.352941, 1, 0.141176) -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 - -[sub_resource type="FontVariation" id="FontVariation_elu6e"] -variation_embolden = 1.1 - -[sub_resource type="FontVariation" id="FontVariation_5kbdj"] -variation_transform = Transform2D(1, 0.239, 0, 1, 0, 0) - -[sub_resource type="FontVariation" id="FontVariation_g0m61"] -variation_embolden = 1.43 -variation_transform = Transform2D(1, 0.343, 0, 1, 0, 0) - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_a8dvw"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ckyhx"] -content_margin_left = 4.0 -content_margin_top = 4.0 -content_margin_right = 4.0 -content_margin_bottom = 4.0 -bg_color = Color(0.470588, 0.196078, 0.6, 1) -corner_radius_top_left = 5 -corner_radius_top_right = 5 -corner_radius_bottom_right = 5 -corner_radius_bottom_left = 5 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_l1doy"] -content_margin_left = 4.0 -content_margin_top = 4.0 -content_margin_right = 4.0 -content_margin_bottom = 4.0 -bg_color = Color(0.470588, 0.196078, 0.6, 1) -border_width_left = 1 -border_width_top = 1 -border_width_right = 1 -border_width_bottom = 1 -corner_radius_top_left = 5 -corner_radius_top_right = 5 -corner_radius_bottom_right = 5 -corner_radius_bottom_left = 5 - -[sub_resource type="Image" id="Image_ipcwk"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_sr7s6"] -image = SubResource("Image_ipcwk") - -[node name="HomePage" type="TextureRect"] -self_modulate = Color(0, 0, 0, 0.2) -clip_contents = true -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_right = -2.0 -grow_horizontal = 2 -grow_vertical = 2 -texture = ExtResource("1_ed1g1") -expand_mode = 1 -stretch_mode = 3 -script = ExtResource("1_6g38w") - -[node name="CenterContainer" type="CenterContainer" parent="."] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="HomePageBox" type="VBoxContainer" parent="CenterContainer"] -unique_name_in_owner = true -custom_minimum_size = Vector2(600, 350) -layout_mode = 2 -theme_override_constants/separation = 0 - -[node name="TopPanel" type="Panel" parent="CenterContainer/HomePageBox"] -unique_name_in_owner = true -custom_minimum_size = Vector2(0, 100) -layout_mode = 2 -theme_override_styles/panel = SubResource("StyleBoxFlat_imi2d") - -[node name="Header2" type="Panel" parent="CenterContainer/HomePageBox/TopPanel"] -clip_children = 1 -clip_contents = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_vertical = 3 -size_flags_stretch_ratio = 0.4 -theme_override_styles/panel = SubResource("StyleBoxFlat_n2afh") - -[node name="BG" type="TextureRect" parent="CenterContainer/HomePageBox/TopPanel/Header2"] -modulate = Color(0.65098, 0.65098, 0.65098, 1) -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_vertical = 3 -size_flags_stretch_ratio = 0.3 -texture = SubResource("GradientTexture2D_2klx3") -expand_mode = 1 - -[node name="Vignette" type="TextureRect" parent="CenterContainer/HomePageBox/TopPanel/Header2"] -modulate = Color(0, 0, 0, 1) -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_top = -166.0 -offset_bottom = 166.0 -grow_horizontal = 2 -grow_vertical = 2 -texture = SubResource("GradientTexture2D_u0aw3") -expand_mode = 1 - -[node name="Logo" type="TextureRect" parent="CenterContainer/HomePageBox/TopPanel"] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = 19.0 -offset_top = 10.0 -offset_right = -23.0 -offset_bottom = -10.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_vertical = 3 -size_flags_stretch_ratio = 0.3 -texture = ExtResource("3_3leok") -expand_mode = 1 -stretch_mode = 5 - -[node name="Label" type="Label" parent="CenterContainer/HomePageBox/TopPanel/Logo"] -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = 155.0 -offset_top = -37.0 -offset_right = 185.0 -offset_bottom = 21.0 -grow_horizontal = 2 -grow_vertical = 2 -rotation = -0.201447 -text = "2" -label_settings = SubResource("LabelSettings_w8q1h") - -[node name="BottomPanel" type="PanelContainer" parent="CenterContainer/HomePageBox"] -unique_name_in_owner = true -self_modulate = Color(0, 0, 0, 1) -layout_mode = 2 -size_flags_vertical = 3 -theme_override_styles/panel = SubResource("StyleBoxFlat_p7ka2") - -[node name="VersionLabel" type="Label" parent="CenterContainer/HomePageBox/BottomPanel"] -unique_name_in_owner = true -modulate = Color(1, 1, 1, 0.501961) -layout_mode = 2 -size_flags_vertical = 8 -theme_override_font_sizes/font_size = 10 -text = "2.0-Alpha-15 WIP (Godot 4.2+)" -horizontal_alignment = 2 - -[node name="ScrollContainer" type="ScrollContainer" parent="CenterContainer/HomePageBox/BottomPanel"] -layout_mode = 2 - -[node name="HBoxContainer" type="HBoxContainer" parent="CenterContainer/HomePageBox/BottomPanel/ScrollContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_constants/separation = 50 - -[node name="CenterContainer" type="VBoxContainer" parent="CenterContainer/HomePageBox/BottomPanel/ScrollContainer/HBoxContainer"] -layout_mode = 2 -size_flags_stretch_ratio = 0.4 - -[node name="Label" type="Label" parent="CenterContainer/HomePageBox/BottomPanel/ScrollContainer/HBoxContainer/CenterContainer"] -layout_mode = 2 -theme_type_variation = &"DialogicSection" -theme_override_constants/line_spacing = 0 -text = "Documentation" - -[node name="WikiButton" type="LinkButton" parent="CenterContainer/HomePageBox/BottomPanel/ScrollContainer/HBoxContainer/CenterContainer"] -layout_mode = 2 -theme_type_variation = &"DialogicLink" -text = " Wiki" -underline = 2 -uri = "https://docs.dialogic.pro/" - -[node name="WikiGettingStartedButton" type="LinkButton" parent="CenterContainer/HomePageBox/BottomPanel/ScrollContainer/HBoxContainer/CenterContainer"] -layout_mode = 2 -theme_type_variation = &"DialogicLink" -text = " Getting Started" -underline = 2 -uri = "https://docs.dialogic.pro/getting-started.html" - -[node name="Separator" type="Control" parent="CenterContainer/HomePageBox/BottomPanel/ScrollContainer/HBoxContainer/CenterContainer"] -custom_minimum_size = Vector2(0, 10) -layout_mode = 2 - -[node name="Label2" type="Label" parent="CenterContainer/HomePageBox/BottomPanel/ScrollContainer/HBoxContainer/CenterContainer"] -layout_mode = 2 -theme_type_variation = &"DialogicSection" -text = "Get in touch" - -[node name="BugRequestButton" type="LinkButton" parent="CenterContainer/HomePageBox/BottomPanel/ScrollContainer/HBoxContainer/CenterContainer"] -layout_mode = 2 -theme_type_variation = &"DialogicLink" -text = " Bug / Request" -underline = 2 -uri = "https://github.com/dialogic-godot/dialogic/issues/new/choose" - -[node name="DiscordButton" type="LinkButton" parent="CenterContainer/HomePageBox/BottomPanel/ScrollContainer/HBoxContainer/CenterContainer"] -layout_mode = 2 -theme_type_variation = &"DialogicLink" -text = " Discord" -underline = 2 -uri = "https://discord.gg/2hHQzkf2pX" - -[node name="Website" type="LinkButton" parent="CenterContainer/HomePageBox/BottomPanel/ScrollContainer/HBoxContainer/CenterContainer"] -layout_mode = 2 -theme_type_variation = &"DialogicLink" -text = " Website" -underline = 2 -uri = "https://dialogic.pro/" - -[node name="DonateButton" type="LinkButton" parent="CenterContainer/HomePageBox/BottomPanel/ScrollContainer/HBoxContainer/CenterContainer"] -layout_mode = 2 -theme_type_variation = &"DialogicLink" -text = " Donate" -underline = 2 -uri = "https://www.patreon.com/JowanSpooner" - -[node name="CenterContainer2" type="VBoxContainer" parent="CenterContainer/HomePageBox/BottomPanel/ScrollContainer/HBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -theme_override_constants/separation = 15 - -[node name="Control" type="Control" parent="CenterContainer/HomePageBox/BottomPanel/ScrollContainer/HBoxContainer/CenterContainer2"] -layout_mode = 2 - -[node name="WelcomeText" type="RichTextLabel" parent="CenterContainer/HomePageBox/BottomPanel/ScrollContainer/HBoxContainer/CenterContainer2"] -layout_mode = 2 -theme_override_styles/normal = SubResource("StyleBoxEmpty_es88k") -bbcode_enabled = true -text = "[center]Welcome to dialogic, a plugin that lets you easily create stories and dialogs for your game!" -fit_content = true - -[node name="RandomTipSection" type="VBoxContainer" parent="CenterContainer/HomePageBox/BottomPanel/ScrollContainer/HBoxContainer/CenterContainer2"] -unique_name_in_owner = true -layout_mode = 2 -theme_override_constants/separation = -4 -alignment = 1 - -[node name="RandomTipLabel" type="Label" parent="CenterContainer/HomePageBox/BottomPanel/ScrollContainer/HBoxContainer/CenterContainer2/RandomTipSection"] -unique_name_in_owner = true -layout_mode = 2 -theme_type_variation = &"DialogicSection" -theme_override_colors/font_color = Color(0, 0, 0, 1) -text = "Random Tip" - -[node name="TipBox" type="PanelContainer" parent="CenterContainer/HomePageBox/BottomPanel/ScrollContainer/HBoxContainer/CenterContainer2/RandomTipSection"] -unique_name_in_owner = true -layout_mode = 2 -theme_override_styles/panel = SubResource("StyleBoxFlat_ce6uo") - -[node name="RandomTip" type="RichTextLabel" parent="CenterContainer/HomePageBox/BottomPanel/ScrollContainer/HBoxContainer/CenterContainer2/RandomTipSection/TipBox"] -unique_name_in_owner = true -clip_contents = false -layout_mode = 2 -theme_override_fonts/bold_font = SubResource("FontVariation_elu6e") -theme_override_fonts/italics_font = SubResource("FontVariation_5kbdj") -theme_override_fonts/bold_italics_font = SubResource("FontVariation_g0m61") -theme_override_styles/normal = SubResource("StyleBoxEmpty_a8dvw") -bbcode_enabled = true -text = "[i]You can[/i] [b]create custom[/b] events, [i][b]subsystems, text effects and even editors for[/b][i] [code]dialogic!" -fit_content = true - -[node name="RandomTipMoreButton" type="Button" parent="CenterContainer/HomePageBox/BottomPanel/ScrollContainer/HBoxContainer/CenterContainer2/RandomTipSection/TipBox/RandomTip"] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 3 -anchor_left = 1.0 -anchor_top = 1.0 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = -30.0 -offset_top = 1.0 -offset_right = -8.0 -offset_bottom = 23.0 -grow_horizontal = 0 -grow_vertical = 0 -tooltip_text = "Check it out!" -theme_override_styles/normal = SubResource("StyleBoxFlat_ckyhx") -theme_override_styles/hover = SubResource("StyleBoxFlat_l1doy") -icon = SubResource("ImageTexture_sr7s6") -expand_icon = true diff --git a/godot/addons/dialogic/Editor/HomePage/icon_bg.png b/godot/addons/dialogic/Editor/HomePage/icon_bg.png deleted file mode 100644 index 77f127d8e6683e4fa520d7e48df25435ab78d531..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150354 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ໟ#iWEi#phYP1Ct+w{7yRsJ1Q%+gd&N5^-s{jPC3( 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�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 diff --git a/godot/addons/dialogic/Editor/HomePage/icon_bg.png.import b/godot/addons/dialogic/Editor/HomePage/icon_bg.png.import deleted file mode 100644 index 2160d4d..0000000 --- a/godot/addons/dialogic/Editor/HomePage/icon_bg.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cvmlp5nxb2rer" -path="res://.godot/imported/icon_bg.png-5937ce0a857c4a8a9d624ea9ebf09a97.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/HomePage/icon_bg.png" -dest_files=["res://.godot/imported/icon_bg.png-5937ce0a857c4a8a9d624ea9ebf09a97.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/godot/addons/dialogic/Editor/HomePage/tips.txt b/godot/addons/dialogic/Editor/HomePage/tips.txt deleted file mode 100644 index 4ca5ec7..0000000 --- a/godot/addons/dialogic/Editor/HomePage/tips.txt +++ /dev/null @@ -1,11 +0,0 @@ -Dialogic variables can be changed from timelines [b]and[/b] scripts! They can be used in conditions and inside of texts!; editor://VariablesEditor -You can create [b]custom modules[/b] for dialogic, including events, subsystems, text effects, ui layouts and even editors!; editor://Settings->General -If there are events you never need, you can hide them from the list in the editor!; editor://Settings->Modules -Did you know that dialogic supports translations? It does!; editor://Settings->Translations -You can use [b]bbcode effects[/b] in text events! What are they though???; https://docs.godotengine.org/en/latest/tutorials/ui/bbcode_in_richtextlabel.html -Writing [/i]<Oh hi/Hello you/Well, well>[i] in a text event will pick a random one of the three strings! -There are a number of cool text effects like [pause=x], [speed=x] and [portrait=x]. Try them out!; -You can use scenes as portraits! This gives you basically limitless freedom.; https://dialogic-docs.coppolaemilio.com/custom-portraits.html -You can use scenes as backgrounds. This way they can be animated or whatever you want! -Dialogic has a built in save and load system! It's pretty powerful!; editor://Settings->Saving -You can add multiple glossary files, each containing words that can be hovered for information!; editor://GlossaryEditor diff --git a/godot/addons/dialogic/Editor/Images/Dropdown/default.svg b/godot/addons/dialogic/Editor/Images/Dropdown/default.svg deleted file mode 100644 index 1437dbc..0000000 --- a/godot/addons/dialogic/Editor/Images/Dropdown/default.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> -<circle cx="8" cy="8" r="3" fill="#2F80ED"/> -</svg> diff --git a/godot/addons/dialogic/Editor/Images/Dropdown/default.svg.import b/godot/addons/dialogic/Editor/Images/Dropdown/default.svg.import deleted file mode 100644 index 3106df7..0000000 --- a/godot/addons/dialogic/Editor/Images/Dropdown/default.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bsx8dtqf3vych" -path="res://.godot/imported/default.svg-3f34de5e45bef5de4d9c15ef78c00c6c.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Dropdown/default.svg" -dest_files=["res://.godot/imported/default.svg-3f34de5e45bef5de4d9c15ef78c00c6c.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Dropdown/divide.svg b/godot/addons/dialogic/Editor/Images/Dropdown/divide.svg deleted file mode 100644 index 7fb881f..0000000 --- a/godot/addons/dialogic/Editor/Images/Dropdown/divide.svg +++ /dev/null @@ -1,10 +0,0 @@ -<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> -<g clip-path="url(#clip0_3666_572)"> -<path d="M11.1812 7.46591V8.57955H4.81756V7.46591H11.1812ZM7.99938 11.483C7.7508 11.483 7.53868 11.3968 7.36301 11.2244C7.19067 11.0488 7.10449 10.8366 7.10449 10.5881C7.10449 10.3494 7.19067 10.1439 7.36301 9.97159C7.53868 9.79924 7.7508 9.71307 7.99938 9.71307C8.23802 9.71307 8.44351 9.79924 8.61586 9.97159C8.7882 10.1439 8.87438 10.3494 8.87438 10.5881C8.87438 10.8366 8.7882 11.0488 8.61586 11.2244C8.44351 11.3968 8.23802 11.483 7.99938 11.483ZM7.99938 6.33239C7.83366 6.33239 7.68285 6.29261 7.54696 6.21307C7.41107 6.13352 7.30336 6.0258 7.22381 5.88991C7.14427 5.75402 7.10449 5.60322 7.10449 5.4375C7.10449 5.19886 7.19067 4.99337 7.36301 4.82102C7.53868 4.64867 7.7508 4.5625 7.99938 4.5625C8.23802 4.5625 8.44351 4.64867 8.61586 4.82102C8.7882 4.99337 8.87438 5.19886 8.87438 5.4375C8.87438 5.68608 8.7882 5.8982 8.61586 6.07386C8.44351 6.24621 8.23802 6.33239 7.99938 6.33239Z" fill="#2F80ED"/> -</g> -<defs> -<clipPath id="clip0_3666_572"> -<rect width="16" height="16" fill="white"/> -</clipPath> -</defs> -</svg> diff --git a/godot/addons/dialogic/Editor/Images/Dropdown/divide.svg.import b/godot/addons/dialogic/Editor/Images/Dropdown/divide.svg.import deleted file mode 100644 index b9ee08d..0000000 --- a/godot/addons/dialogic/Editor/Images/Dropdown/divide.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c5laykjsxaxtl" -path="res://.godot/imported/divide.svg-4928f878a07ba93ebc44d8ae73ad4c1f.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Dropdown/divide.svg" -dest_files=["res://.godot/imported/divide.svg-4928f878a07ba93ebc44d8ae73ad4c1f.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Dropdown/join.svg b/godot/addons/dialogic/Editor/Images/Dropdown/join.svg deleted file mode 100644 index 9eb7aa9..0000000 --- a/godot/addons/dialogic/Editor/Images/Dropdown/join.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M4 7V9H7.5V12L11.5 8L7.5 4V7H4Z" fill="#A5EFAC"/> -</svg> diff --git a/godot/addons/dialogic/Editor/Images/Dropdown/join.svg.import b/godot/addons/dialogic/Editor/Images/Dropdown/join.svg.import deleted file mode 100644 index 9a91637..0000000 --- a/godot/addons/dialogic/Editor/Images/Dropdown/join.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://b7j220k0ewh35" -path="res://.godot/imported/join.svg-2f0d7b9e8e01cf0e62b8c3a85aff6213.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Dropdown/join.svg" -dest_files=["res://.godot/imported/join.svg-2f0d7b9e8e01cf0e62b8c3a85aff6213.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Dropdown/leave.svg b/godot/addons/dialogic/Editor/Images/Dropdown/leave.svg deleted file mode 100644 index e234619..0000000 --- a/godot/addons/dialogic/Editor/Images/Dropdown/leave.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M11.5 9L11.5 7L8 7L8 4L4 8L8 12L8 9L11.5 9Z" fill="#D14A4A"/> -</svg> diff --git a/godot/addons/dialogic/Editor/Images/Dropdown/leave.svg.import b/godot/addons/dialogic/Editor/Images/Dropdown/leave.svg.import deleted file mode 100644 index bf243da..0000000 --- a/godot/addons/dialogic/Editor/Images/Dropdown/leave.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cspjyvye6c0r6" -path="res://.godot/imported/leave.svg-c936f6e3d601b8c12c23f205a765084e.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Dropdown/leave.svg" -dest_files=["res://.godot/imported/leave.svg-c936f6e3d601b8c12c23f205a765084e.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Dropdown/minus.svg b/godot/addons/dialogic/Editor/Images/Dropdown/minus.svg deleted file mode 100644 index eb5d732..0000000 --- a/godot/addons/dialogic/Editor/Images/Dropdown/minus.svg +++ /dev/null @@ -1,10 +0,0 @@ -<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> -<g clip-path="url(#clip0_3666_568)"> -<path d="M10.2291 7.08807V8.18182H5.77459V7.08807H10.2291Z" fill="#2F80ED"/> -</g> -<defs> -<clipPath id="clip0_3666_568"> -<rect width="16" height="16" fill="white"/> -</clipPath> -</defs> -</svg> diff --git a/godot/addons/dialogic/Editor/Images/Dropdown/minus.svg.import b/godot/addons/dialogic/Editor/Images/Dropdown/minus.svg.import deleted file mode 100644 index 63d5e9a..0000000 --- a/godot/addons/dialogic/Editor/Images/Dropdown/minus.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dwy14qrkfoeb" -path="res://.godot/imported/minus.svg-29f22d1aa24635bae2c03057c07be8bc.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Dropdown/minus.svg" -dest_files=["res://.godot/imported/minus.svg-29f22d1aa24635bae2c03057c07be8bc.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Dropdown/multiply.svg b/godot/addons/dialogic/Editor/Images/Dropdown/multiply.svg deleted file mode 100644 index d4327d1..0000000 --- a/godot/addons/dialogic/Editor/Images/Dropdown/multiply.svg +++ /dev/null @@ -1,10 +0,0 @@ -<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> -<g clip-path="url(#clip0_3666_570)"> -<path d="M10.4255 11.2045L4.81756 5.59659L5.57324 4.84091L11.1812 10.4489L10.4255 11.2045ZM5.57324 11.2045L4.81756 10.4489L10.4255 4.84091L11.1812 5.59659L5.57324 11.2045Z" fill="#2F80ED"/> -</g> -<defs> -<clipPath id="clip0_3666_570"> -<rect width="16" height="16" fill="white"/> -</clipPath> -</defs> -</svg> diff --git a/godot/addons/dialogic/Editor/Images/Dropdown/multiply.svg.import b/godot/addons/dialogic/Editor/Images/Dropdown/multiply.svg.import deleted file mode 100644 index 93bb66a..0000000 --- a/godot/addons/dialogic/Editor/Images/Dropdown/multiply.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://ddmapfkunbtg7" -path="res://.godot/imported/multiply.svg-0e9db99aafb66d43ee14adcca26c5b47.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Dropdown/multiply.svg" -dest_files=["res://.godot/imported/multiply.svg-0e9db99aafb66d43ee14adcca26c5b47.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Dropdown/plus.svg b/godot/addons/dialogic/Editor/Images/Dropdown/plus.svg deleted file mode 100644 index adf5179..0000000 --- a/godot/addons/dialogic/Editor/Images/Dropdown/plus.svg +++ /dev/null @@ -1,10 +0,0 @@ -<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> -<g clip-path="url(#clip0_3666_566)"> -<path d="M7.44256 11.304V4.74148H8.5562V11.304H7.44256ZM4.71813 8.57955V7.46591H11.2806V8.57955H4.71813Z" fill="#2F80ED"/> -</g> -<defs> -<clipPath id="clip0_3666_566"> -<rect width="16" height="16" fill="white"/> -</clipPath> -</defs> -</svg> diff --git a/godot/addons/dialogic/Editor/Images/Dropdown/plus.svg.import b/godot/addons/dialogic/Editor/Images/Dropdown/plus.svg.import deleted file mode 100644 index 80d686d..0000000 --- a/godot/addons/dialogic/Editor/Images/Dropdown/plus.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cqqtygfbvgtag" -path="res://.godot/imported/plus.svg-e094b0b8505b5d910717883d06553532.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Dropdown/plus.svg" -dest_files=["res://.godot/imported/plus.svg-e094b0b8505b5d910717883d06553532.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Dropdown/set.svg b/godot/addons/dialogic/Editor/Images/Dropdown/set.svg deleted file mode 100644 index 16c6a8b..0000000 --- a/godot/addons/dialogic/Editor/Images/Dropdown/set.svg +++ /dev/null @@ -1,10 +0,0 @@ -<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> -<g clip-path="url(#clip0_3666_561)"> -<path d="M4.93688 7.08807V6.0142H11.0619V7.08807H4.93688ZM4.93688 10.0312V8.95739H11.0619V10.0312H4.93688Z" fill="#2F80ED"/> -</g> -<defs> -<clipPath id="clip0_3666_561"> -<rect width="16" height="16" fill="white"/> -</clipPath> -</defs> -</svg> diff --git a/godot/addons/dialogic/Editor/Images/Dropdown/set.svg.import b/godot/addons/dialogic/Editor/Images/Dropdown/set.svg.import deleted file mode 100644 index 948482b..0000000 --- a/godot/addons/dialogic/Editor/Images/Dropdown/set.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://ddcfl67v0r1lw" -path="res://.godot/imported/set.svg-f100fad003be2285d5d0da5c58417203.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Dropdown/set.svg" -dest_files=["res://.godot/imported/set.svg-f100fad003be2285d5d0da5c58417203.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Dropdown/update.svg b/godot/addons/dialogic/Editor/Images/Dropdown/update.svg deleted file mode 100644 index 44f1f3c..0000000 --- a/godot/addons/dialogic/Editor/Images/Dropdown/update.svg +++ /dev/null @@ -1,5 +0,0 @@ -<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path fill-rule="evenodd" clip-rule="evenodd" d="M3.45082 5.30639L4.73587 5.26497L4.79109 6.97825L6.50437 6.92302L6.54579 8.20807L3.54747 8.30471L3.45082 5.30639Z" fill="#2F80ED"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M13.3458 12H12.0601L12.0601 10.2858H10.3459L10.3459 9.00012L13.3458 9.00012L13.3458 12Z" fill="#2F80ED"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M8.35461 11.7143C9.76618 11.7143 10.9724 10.8651 11.4559 9.66667H12.8546C12.3227 11.5864 10.5095 13 8.35461 13C6.1997 13 4.38656 11.5864 3.85461 9.66667H5.25336C5.73678 10.8651 6.94305 11.7143 8.35461 11.7143ZM5.41117 7C5.96903 5.98047 7.07784 5.28571 8.35461 5.28571C9.63139 5.28571 10.7402 5.98047 11.2981 7H12.7476C12.1082 5.25221 10.3828 4 8.35461 4C6.32646 4 4.60105 5.25221 3.96159 7H5.41117Z" fill="#2F80ED"/> -</svg> diff --git a/godot/addons/dialogic/Editor/Images/Dropdown/update.svg.import b/godot/addons/dialogic/Editor/Images/Dropdown/update.svg.import deleted file mode 100644 index cd0064c..0000000 --- a/godot/addons/dialogic/Editor/Images/Dropdown/update.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://t1roknwygcf3" -path="res://.godot/imported/update.svg-cefa0fe6bfa50911bb9a77982288e485.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Dropdown/update.svg" -dest_files=["res://.godot/imported/update.svg-cefa0fe6bfa50911bb9a77982288e485.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Interactable/decrement_icon.svg b/godot/addons/dialogic/Editor/Images/Interactable/decrement_icon.svg deleted file mode 100644 index eb97691..0000000 --- a/godot/addons/dialogic/Editor/Images/Interactable/decrement_icon.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="14" height="6" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path d="m8.046 5.406 4.91-5.134C13.063.16 12.954 0 12.838 0h-2.432L7.303 3.244c-.173.181-.402.189-.582 0L3.618 0H1.166c-.159 0-.208.19-.13.272l4.942 5.134c.54.56 1.538.554 2.068 0z" fill="#e0e0e0" style="fill:#fff;fill-opacity:1;stroke-width:1.05736"/></svg> diff --git a/godot/addons/dialogic/Editor/Images/Interactable/decrement_icon.svg.import b/godot/addons/dialogic/Editor/Images/Interactable/decrement_icon.svg.import deleted file mode 100644 index 26aa135..0000000 --- a/godot/addons/dialogic/Editor/Images/Interactable/decrement_icon.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://brjikovneb63n" -path="res://.godot/imported/decrement_icon.svg-9556cf56db91e200fb946372e010fd5e.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Interactable/decrement_icon.svg" -dest_files=["res://.godot/imported/decrement_icon.svg-9556cf56db91e200fb946372e010fd5e.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Interactable/increment_icon.svg b/godot/addons/dialogic/Editor/Images/Interactable/increment_icon.svg deleted file mode 100644 index 0b72c07..0000000 --- a/godot/addons/dialogic/Editor/Images/Interactable/increment_icon.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="14" height="6" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path d="m5.954.418-4.91 5.135c-.107.112.002.271.118.271h2.432l3.103-3.243c.173-.182.402-.19.582 0l3.103 3.243h2.452c.159 0 .208-.19.13-.271L8.021.418c-.54-.56-1.538-.554-2.068 0z" fill="#e0e0e0" style="fill:#fff;fill-opacity:1;stroke-width:1.05736"/></svg> diff --git a/godot/addons/dialogic/Editor/Images/Interactable/increment_icon.svg.import b/godot/addons/dialogic/Editor/Images/Interactable/increment_icon.svg.import deleted file mode 100644 index f411bd0..0000000 --- a/godot/addons/dialogic/Editor/Images/Interactable/increment_icon.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dh1ycbmw8anqh" -path="res://.godot/imported/increment_icon.svg-081e6509e76349f0628c55a41e85fd65.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Interactable/increment_icon.svg" -dest_files=["res://.godot/imported/increment_icon.svg-081e6509e76349f0628c55a41e85fd65.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Pieces/add-folder.svg b/godot/addons/dialogic/Editor/Images/Pieces/add-folder.svg deleted file mode 100644 index 7331b61..0000000 --- a/godot/addons/dialogic/Editor/Images/Pieces/add-folder.svg +++ /dev/null @@ -1,4 +0,0 @@ -<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M13 10H16V12H13V15H11V12H8V10H11V7H13V10Z" fill="#A5EFAC"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M1.29289 2.29289C1.48043 2.10536 1.73478 2 2 2H8C8.26522 2 8.51957 2.10536 8.70711 2.29289C8.89464 2.48043 9 2.73478 9 3V4C9 4.26522 9.10536 4.51957 9.29289 4.70711C9.48043 4.89464 9.73478 5 10 5H14C14.2652 5 14.5196 5.10536 14.7071 5.29289C14.8946 5.48043 15 5.73478 15 6V9H14V6H10V9H7V9.5V13H10V14H2C1.73478 14 1.48043 13.8946 1.29289 13.7071C1.10536 13.5196 1 13.2652 1 13V11V5V3C1 2.73478 1.10536 2.48043 1.29289 2.29289ZM14 14C14.2652 14 14.5196 13.8946 14.7071 13.7071C14.8946 13.5196 15 13.2652 15 13H14V14Z" fill="#E0E0E0"/> -</svg> diff --git a/godot/addons/dialogic/Editor/Images/Pieces/add-folder.svg.import b/godot/addons/dialogic/Editor/Images/Pieces/add-folder.svg.import deleted file mode 100644 index cd569e7..0000000 --- a/godot/addons/dialogic/Editor/Images/Pieces/add-folder.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://babwe22dqjta" -path="res://.godot/imported/add-folder.svg-41a970370f904038e63c13bddbdb6450.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Pieces/add-folder.svg" -dest_files=["res://.godot/imported/add-folder.svg-41a970370f904038e63c13bddbdb6450.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Pieces/close-icon.svg b/godot/addons/dialogic/Editor/Images/Pieces/close-icon.svg deleted file mode 100644 index 3e3f7af..0000000 --- a/godot/addons/dialogic/Editor/Images/Pieces/close-icon.svg +++ /dev/null @@ -1 +0,0 @@ -<svg viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><path d="m14 17-6-6 6-6" fill="none" stroke="#fff" stroke-width="2"/></svg> \ No newline at end of file diff --git a/godot/addons/dialogic/Editor/Images/Pieces/close-icon.svg.import b/godot/addons/dialogic/Editor/Images/Pieces/close-icon.svg.import deleted file mode 100644 index bc57609..0000000 --- a/godot/addons/dialogic/Editor/Images/Pieces/close-icon.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bff65e82555qr" -path="res://.godot/imported/close-icon.svg-c630c93ada599b08938f4854f5376f2f.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Pieces/close-icon.svg" -dest_files=["res://.godot/imported/close-icon.svg-c630c93ada599b08938f4854f5376f2f.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Pieces/closed-icon.svg b/godot/addons/dialogic/Editor/Images/Pieces/closed-icon.svg deleted file mode 100644 index 4032eab..0000000 --- a/godot/addons/dialogic/Editor/Images/Pieces/closed-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M8 5L14 11L8 17" stroke="white" stroke-width="2"/> -</svg> diff --git a/godot/addons/dialogic/Editor/Images/Pieces/closed-icon.svg.import b/godot/addons/dialogic/Editor/Images/Pieces/closed-icon.svg.import deleted file mode 100644 index 17fd504..0000000 --- a/godot/addons/dialogic/Editor/Images/Pieces/closed-icon.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dx3o2ild56i76" -path="res://.godot/imported/closed-icon.svg-b4f16653b91d6792313a130565319b2f.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Pieces/closed-icon.svg" -dest_files=["res://.godot/imported/closed-icon.svg-b4f16653b91d6792313a130565319b2f.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Pieces/expand-icon.svg b/godot/addons/dialogic/Editor/Images/Pieces/expand-icon.svg deleted file mode 100644 index 3ec3def..0000000 --- a/godot/addons/dialogic/Editor/Images/Pieces/expand-icon.svg +++ /dev/null @@ -1,5 +0,0 @@ -<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg"> -<circle cx="10.5" cy="3.5" r="1.5" fill="white"/> -<circle cx="10.5" cy="11" r="1.5" fill="white"/> -<circle cx="10.5" cy="18.5" r="1.5" fill="white"/> -</svg> diff --git a/godot/addons/dialogic/Editor/Images/Pieces/expand-icon.svg.import b/godot/addons/dialogic/Editor/Images/Pieces/expand-icon.svg.import deleted file mode 100644 index 0d7d7e7..0000000 --- a/godot/addons/dialogic/Editor/Images/Pieces/expand-icon.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cl03vrbj5wsjk" -path="res://.godot/imported/expand-icon.svg-26099b197ab0f314e2253848fcc22962.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Pieces/expand-icon.svg" -dest_files=["res://.godot/imported/expand-icon.svg-26099b197ab0f314e2253848fcc22962.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Pieces/open-icon.svg b/godot/addons/dialogic/Editor/Images/Pieces/open-icon.svg deleted file mode 100644 index c66c422..0000000 --- a/godot/addons/dialogic/Editor/Images/Pieces/open-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M17 8L11 14L5 8" stroke="white" stroke-width="2"/> -</svg> diff --git a/godot/addons/dialogic/Editor/Images/Pieces/open-icon.svg.import b/godot/addons/dialogic/Editor/Images/Pieces/open-icon.svg.import deleted file mode 100644 index 1288c3a..0000000 --- a/godot/addons/dialogic/Editor/Images/Pieces/open-icon.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://mc7a24bcvjo3" -path="res://.godot/imported/open-icon.svg-1a2ae6d0121a79b624c0fb87cc9ceea2.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Pieces/open-icon.svg" -dest_files=["res://.godot/imported/open-icon.svg-1a2ae6d0121a79b624c0fb87cc9ceea2.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Pieces/variable.svg b/godot/addons/dialogic/Editor/Images/Pieces/variable.svg deleted file mode 100644 index 236ca35..0000000 --- a/godot/addons/dialogic/Editor/Images/Pieces/variable.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M13.9645 2.62927L12.8459 5.22444C12.6271 5.04546 12.3835 4.89134 12.1151 4.76208C11.8565 4.62287 11.5881 4.55327 11.3097 4.55327C11.0909 4.55327 10.8821 4.59802 10.6832 4.68751C10.4943 4.77699 10.3203 4.89631 10.1612 5.04546C10.0021 5.19461 9.86293 5.36364 9.74361 5.55256C9.6243 5.73154 9.52486 5.91052 9.44532 6.08949L9.14702 6.93964C9.35583 7.37714 9.55966 7.79475 9.75853 8.19248C9.92756 8.53055 10.1016 8.87359 10.2805 9.2216C10.4595 9.55966 10.6087 9.82813 10.728 10.027C10.9169 10.3153 11.1058 10.6136 11.2948 10.9219C11.4837 11.2202 11.6925 11.4936 11.9212 11.7422C12.0206 11.8516 12.1399 11.9261 12.2791 11.9659C12.4283 11.9957 12.5625 12.0107 12.6818 12.0107C12.8707 12.0107 13.0497 11.9858 13.2188 11.9361C13.3878 11.8864 13.5469 11.8217 13.696 11.7422L14.0689 12.2195C13.9297 12.4382 13.7607 12.657 13.5618 12.8757C13.3629 13.0945 13.1442 13.2933 12.9055 13.4723C12.6769 13.6513 12.4283 13.7955 12.1598 13.9048C11.9013 14.0242 11.6378 14.0838 11.3693 14.0838C11.1307 14.0838 10.9169 14.044 10.728 13.9645C10.549 13.8949 10.3849 13.8004 10.2358 13.6811C10.0867 13.5519 9.94745 13.4027 9.81819 13.2337C9.68893 13.0646 9.55469 12.8906 9.41549 12.7117C9.30611 12.5426 9.1868 12.3388 9.05753 12.1001C8.93822 11.8516 8.81393 11.598 8.68466 11.3395C8.5554 11.081 8.42614 10.8324 8.29688 10.5938C8.16762 10.3452 8.04333 10.1364 7.92401 9.96734C7.8743 10.1364 7.82955 10.3054 7.78978 10.4744C7.75001 10.6136 7.70526 10.7578 7.65555 10.907C7.60583 11.0561 7.56109 11.1705 7.52131 11.25C7.37216 11.5682 7.18324 11.8963 6.95455 12.2344C6.72586 12.5724 6.46236 12.8807 6.16407 13.1591C5.87572 13.4276 5.55753 13.6513 5.20952 13.8303C4.86151 13.9993 4.49361 14.0838 4.10583 14.0838C3.75782 14.0838 3.41975 14.0142 3.09162 13.875C2.7635 13.7457 2.46023 13.5717 2.18182 13.353L3.12145 10.8771C3.43964 11.076 3.78765 11.255 4.16549 11.4141C4.54333 11.5632 4.92117 11.6378 5.29901 11.6378C5.41833 11.6378 5.54262 11.6278 5.67188 11.608C5.80114 11.5781 5.92543 11.5384 6.04475 11.4886C6.17401 11.429 6.28836 11.3594 6.38779 11.2798C6.48722 11.1903 6.5618 11.0859 6.61151 10.9666C6.68111 10.8374 6.75569 10.6683 6.83523 10.4595C6.91478 10.2507 6.99432 10.0419 7.07387 9.8331C7.16336 9.59447 7.25285 9.34091 7.34234 9.07245L4.53836 4.5831C4.4091 4.43395 4.25001 4.31464 4.06109 4.22515C3.88211 4.12572 3.69319 4.076 3.49432 4.076C3.32529 4.076 3.1662 4.1108 3.01705 4.1804C2.8679 4.24006 2.72373 4.32458 2.58452 4.43395L2.18182 3.91194C2.32103 3.70313 2.48509 3.4993 2.67401 3.30043C2.87287 3.09162 3.08665 2.90768 3.31535 2.74859C3.54404 2.57955 3.78765 2.44532 4.04617 2.34589C4.30469 2.23651 4.56819 2.18182 4.83665 2.18182C5.16478 2.18182 5.46805 2.26634 5.74645 2.43537C6.02486 2.59447 6.28339 2.79333 6.52202 3.03197C6.76066 3.2706 6.97941 3.52912 7.17827 3.80753C7.37714 4.08594 7.55611 4.34447 7.7152 4.5831C7.79475 4.69248 7.87927 4.83168 7.96876 5.00072C8.06819 5.15981 8.16265 5.3189 8.25214 5.47799C8.36151 5.65697 8.46591 5.85086 8.56535 6.05966C8.66478 5.82103 8.76918 5.58239 8.87856 5.34376C8.96805 5.14489 9.05753 4.94106 9.14702 4.73225C9.24645 4.5135 9.33594 4.32458 9.41549 4.16549C9.56464 3.88708 9.73367 3.62856 9.92259 3.38992C10.1115 3.15128 10.3203 2.94248 10.549 2.7635C10.7876 2.58452 11.0462 2.44532 11.3246 2.34589C11.603 2.23651 11.9063 2.18182 12.2344 2.18182C12.5426 2.18182 12.8409 2.2216 13.1293 2.30114C13.4176 2.38069 13.696 2.49006 13.9645 2.62927Z" fill="white"/> -</svg> diff --git a/godot/addons/dialogic/Editor/Images/Pieces/variable.svg.import b/godot/addons/dialogic/Editor/Images/Pieces/variable.svg.import deleted file mode 100644 index f3eddb1..0000000 --- a/godot/addons/dialogic/Editor/Images/Pieces/variable.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dih1coellhwm8" -path="res://.godot/imported/variable.svg-50a50248b9d47e5556571e4111e8d5b4.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Pieces/variable.svg" -dest_files=["res://.godot/imported/variable.svg-50a50248b9d47e5556571e4111e8d5b4.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Pieces/variable_icon.png b/godot/addons/dialogic/Editor/Images/Pieces/variable_icon.png deleted file mode 100644 index 779e80f04b53c193feea0e0782266087d9bd1e5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 639 zcmV-_0)YLAP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00009a7bBm000&x z000&x0ZCFM@Bjb+0drDELIAGL9O(c600d`2O+f$vv5yP<VFdsH0u)I^K~#7F?b(5G zf-n>Y;O7P%A>F_c=mw7926Y43KsV409Dxz)25|%2;BRsXB~b7MwFTn)?sC0?yh}oO z34urmA%qY@2qA<J;z0m1Qwmc`IA5l$=?><)H&eEzXw+=H)4ehOjH!_F4ew(stp>#V z3_7vTo~FQ5WEoLe_&fO)5pRn)ipB<a=VKaQDVTWcXT<q8aL?pWyPjCKGj(K)6-@!$ z9V_6HpF*7kIax=nBjRY9I#bC#*9Zjpz;|A#^f7D)Z_peWYnnQ^DU8bvdGP!2?jO;S zEK!d(MRVZq97p-zYX3i%B-vSHQo!ef0?o{?C?$xSCad!YN|9+;jyOw75nMvlOyf&R z8Ql7SGp__U6!^74PALPwHYi_V6mV;UoKlC|YlD{<1zbYRDP@Rz=U0>}#O)!RC`EAF zXFo%o>4c0@gXU|mofdDc4K(JG5KTo_+;fZOmRI4AachGe%|XzxLsv)mhMt0kt%Gx; zJqinY0$;)QM#kBciz!!A>@d#!U+c11EZ&3b?QtEPZ?kbe%r%$RHDr!mX>5q!%&e%6 z7~Ck(egqv*e|Z}J@xbrROitbtCuR?^ZTt-s#DB=Jj!dkWJ;aK}6lMs-e;7GN#^YX@ ztuv;wQiK};nyK(+V9Z;cYCC9JYXi7EQ0>`Qw6Cn9JNS52N0dHxMnVW7gb+dqA%qYQ Z`UX0hjmKjP#Bcxr002ovPDHLkV1lEG4<`Ts diff --git a/godot/addons/dialogic/Editor/Images/Pieces/variable_icon.png.import b/godot/addons/dialogic/Editor/Images/Pieces/variable_icon.png.import deleted file mode 100644 index 5aed468..0000000 --- a/godot/addons/dialogic/Editor/Images/Pieces/variable_icon.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://ikdhcat2nq2r" -path="res://.godot/imported/variable_icon.png-df9d711980209a7752dc8762037e39ad.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Pieces/variable_icon.png" -dest_files=["res://.godot/imported/variable_icon.png-df9d711980209a7752dc8762037e39ad.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/godot/addons/dialogic/Editor/Images/Pieces/warning.svg b/godot/addons/dialogic/Editor/Images/Pieces/warning.svg deleted file mode 100644 index a252bde..0000000 --- a/godot/addons/dialogic/Editor/Images/Pieces/warning.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path fill-rule="evenodd" clip-rule="evenodd" d="M12.366 4.5C11.9811 3.83333 11.0189 3.83333 10.634 4.5L3.27276 17.25C2.88786 17.9167 3.36898 18.75 4.13878 18.75H18.8612C19.631 18.75 20.1121 17.9167 19.7272 17.25L12.366 4.5ZM10.6668 14.3809H12.073L12.2723 8.46875H10.4676L10.6668 14.3809ZM12.0555 15.5586C11.8836 15.3906 11.6551 15.3066 11.3699 15.3066C11.0887 15.3066 10.8602 15.3926 10.6844 15.5645C10.5125 15.7324 10.4266 15.9453 10.4266 16.2031C10.4266 16.4609 10.5125 16.6738 10.6844 16.8418C10.8602 17.0098 11.0887 17.0937 11.3699 17.0937C11.6551 17.0937 11.8836 17.0098 12.0555 16.8418C12.2312 16.6738 12.3191 16.4609 12.3191 16.2031C12.3191 15.9414 12.2312 15.7266 12.0555 15.5586Z" fill="#FCFF73"/> -</svg> diff --git a/godot/addons/dialogic/Editor/Images/Pieces/warning.svg.import b/godot/addons/dialogic/Editor/Images/Pieces/warning.svg.import deleted file mode 100644 index 06a13ac..0000000 --- a/godot/addons/dialogic/Editor/Images/Pieces/warning.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://d4n3j4lvatwxb" -path="res://.godot/imported/warning.svg-a48ae93c4663637f2aca88d055604495.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Pieces/warning.svg" -dest_files=["res://.godot/imported/warning.svg-a48ae93c4663637f2aca88d055604495.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Resources/character.svg b/godot/addons/dialogic/Editor/Images/Resources/character.svg deleted file mode 100644 index 8871f5e..0000000 --- a/godot/addons/dialogic/Editor/Images/Resources/character.svg +++ /dev/null @@ -1,4 +0,0 @@ -<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M11.6364 4.36363C11.6364 6.37194 10.0083 7.99999 8 7.99999C5.99169 7.99999 4.36363 6.37194 4.36363 4.36363C4.36363 2.35532 5.99169 0.727264 8 0.727264C10.0083 0.727264 11.6364 2.35532 11.6364 4.36363Z" fill="white"/> -<path d="M12.3636 13.3904C12.3636 15.2727 10.41 15.2727 8 15.2727C5.59003 15.2727 3.63636 15.2727 3.63636 13.3904C3.63636 10.0117 5.59003 7.27272 8 7.27272C10.41 7.27272 12.3636 10.0117 12.3636 13.3904Z" fill="white"/> -</svg> diff --git a/godot/addons/dialogic/Editor/Images/Resources/character.svg.import b/godot/addons/dialogic/Editor/Images/Resources/character.svg.import deleted file mode 100644 index 79b6082..0000000 --- a/godot/addons/dialogic/Editor/Images/Resources/character.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bbea0efx0ybu7" -path="res://.godot/imported/character.svg-48bc1c93fa13733a935ca2c669d933a7.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Resources/character.svg" -dest_files=["res://.godot/imported/character.svg-48bc1c93fa13733a935ca2c669d933a7.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Resources/icon_character.png b/godot/addons/dialogic/Editor/Images/Resources/icon_character.png deleted file mode 100644 index 5858854742aa5e2f19debcb1c6310581a24ded7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 569 zcmV-90>=G`P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00009a7bBm000&x z000&x0ZCFM@Bjb+0drDELIAGL9O(c600d`2O+f$vv5yP<VFdsH0nSN8K~#7F?b+dN z!Y~j8;Fm4{BY1;$gJy%W0c=o4U<0}V-2gfPbb_*hVFKC-u1;e_g;13y@2nW^ldSwe z0{h`4XB#la7-NhvMwN&RLz{-S49&~QA+&Y;%;6e^fj!58HnF&xAmYEimjCmiJs@Xs z@Lt+GWF122{Ht{5CCA$#bb2B@OXNnnP5nzsD7gb!?5qRV2ukPyK&P`$P@)mQJ@{Oh zSwkq$2tdot2cSYDfG;R0ied)^8Ubv<r}3RXGy>Rw?;Sajb_<}tIOL=%hJ<H<9LX&& zhAL7ohd-pfL$-rIiXpU_2|oM5|0ebF*f$*fOq9yrOHx&W12ivX$51MJlZ&^&LfV-k zcVQ4)=_cP0Lg(kgQ6e|O-4pbZ@S)gQ=&Td|p5Pq05Z=^3S3&{xH7IrQqP2lJh5~jS zP=dcBd^8e;X8}6^m47L!20sBAEr2-vOX#9+k27aLii1r0Z!iNWp|2{fsUa`}&^Qpe zq_+X2s@5Ecm;pGXK@B>`8885m9gTr!hcxyeVg~SrG&blX(OCwcdqJPY5LUuhoe|8S zpnw87EsGyfza3n>HhEL*;<Y*v-pA`I9FKp(7-Nhv#u%D!yG$Z$N_vVx00000NkvXX Hu0mjf8hqyp diff --git a/godot/addons/dialogic/Editor/Images/Resources/icon_character.png.import b/godot/addons/dialogic/Editor/Images/Resources/icon_character.png.import deleted file mode 100644 index a03e360..0000000 --- a/godot/addons/dialogic/Editor/Images/Resources/icon_character.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bmwrsq48ywc50" -path="res://.godot/imported/icon_character.png-97a1851bbafe2b302ea88c25a87ee2c1.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Resources/icon_character.png" -dest_files=["res://.godot/imported/icon_character.png-97a1851bbafe2b302ea88c25a87ee2c1.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/godot/addons/dialogic/Editor/Images/Resources/portrait.svg b/godot/addons/dialogic/Editor/Images/Resources/portrait.svg deleted file mode 100644 index 006807a..0000000 --- a/godot/addons/dialogic/Editor/Images/Resources/portrait.svg +++ /dev/null @@ -1,9 +0,0 @@ -<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" version="1.1"> - <g> - <title>Layer 1 - - - - - - \ No newline at end of file diff --git a/godot/addons/dialogic/Editor/Images/Resources/portrait.svg.import b/godot/addons/dialogic/Editor/Images/Resources/portrait.svg.import deleted file mode 100644 index d12dd14..0000000 --- a/godot/addons/dialogic/Editor/Images/Resources/portrait.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dfi7fhfc4dbc3" -path="res://.godot/imported/portrait.svg-7d29c7cfe3e086d65dce33c3d66c48cd.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Resources/portrait.svg" -dest_files=["res://.godot/imported/portrait.svg-7d29c7cfe3e086d65dce33c3d66c48cd.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Resources/timeline.svg b/godot/addons/dialogic/Editor/Images/Resources/timeline.svg deleted file mode 100644 index fd0a48a..0000000 --- a/godot/addons/dialogic/Editor/Images/Resources/timeline.svg +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/godot/addons/dialogic/Editor/Images/Resources/timeline.svg.import b/godot/addons/dialogic/Editor/Images/Resources/timeline.svg.import deleted file mode 100644 index aaa5521..0000000 --- a/godot/addons/dialogic/Editor/Images/Resources/timeline.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://j7ym07anlusi" -path="res://.godot/imported/timeline.svg-4b0b3233c6ce249f8277502cd9b13eaf.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Resources/timeline.svg" -dest_files=["res://.godot/imported/timeline.svg-4b0b3233c6ce249f8277502cd9b13eaf.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/godot/addons/dialogic/Editor/Images/Toolbar/add-character.svg b/godot/addons/dialogic/Editor/Images/Toolbar/add-character.svg deleted file mode 100644 index 9a42063..0000000 --- a/godot/addons/dialogic/Editor/Images/Toolbar/add-character.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/godot/addons/dialogic/Editor/Images/Toolbar/add-character.svg.import b/godot/addons/dialogic/Editor/Images/Toolbar/add-character.svg.import deleted file mode 100644 index 3ad3985..0000000 --- a/godot/addons/dialogic/Editor/Images/Toolbar/add-character.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://my600mb32ydt" -path="res://.godot/imported/add-character.svg-a658b65c1225b02657a50d5c965e0d5e.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Toolbar/add-character.svg" -dest_files=["res://.godot/imported/add-character.svg-a658b65c1225b02657a50d5c965e0d5e.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Toolbar/add-timeline.svg b/godot/addons/dialogic/Editor/Images/Toolbar/add-timeline.svg deleted file mode 100644 index 6f09e2e..0000000 --- a/godot/addons/dialogic/Editor/Images/Toolbar/add-timeline.svg +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - diff --git a/godot/addons/dialogic/Editor/Images/Toolbar/add-timeline.svg.import b/godot/addons/dialogic/Editor/Images/Toolbar/add-timeline.svg.import deleted file mode 100644 index 9f497f9..0000000 --- a/godot/addons/dialogic/Editor/Images/Toolbar/add-timeline.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bymlbr4o2m3jc" -path="res://.godot/imported/add-timeline.svg-86961b528ebdf01f585931a15fea1755.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Toolbar/add-timeline.svg" -dest_files=["res://.godot/imported/add-timeline.svg-86961b528ebdf01f585931a15fea1755.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/Unknown.png b/godot/addons/dialogic/Editor/Images/Unknown.png deleted file mode 100644 index 87ab9137a7d2ab521b1004222cb7070decd02141..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3331 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 N002ovPDHLkV1mh%7zY3V diff --git a/godot/addons/dialogic/Editor/Images/Unknown.png.import b/godot/addons/dialogic/Editor/Images/Unknown.png.import deleted file mode 100644 index d05ffc3..0000000 --- a/godot/addons/dialogic/Editor/Images/Unknown.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bbf2dlmbn12h0" -path="res://.godot/imported/Unknown.png-1cc7645f56036e8d378a70ac1dd772bb.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/Unknown.png" -dest_files=["res://.godot/imported/Unknown.png-1cc7645f56036e8d378a70ac1dd772bb.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/godot/addons/dialogic/Editor/Images/dialogic-logo.svg b/godot/addons/dialogic/Editor/Images/dialogic-logo.svg deleted file mode 100644 index d6e5b69..0000000 --- a/godot/addons/dialogic/Editor/Images/dialogic-logo.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/godot/addons/dialogic/Editor/Images/dialogic-logo.svg.import b/godot/addons/dialogic/Editor/Images/dialogic-logo.svg.import deleted file mode 100644 index 7003395..0000000 --- a/godot/addons/dialogic/Editor/Images/dialogic-logo.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bt87p6qlso0ya" -path="res://.godot/imported/dialogic-logo.svg-e43201cabc9573eeb3f78fd91ea9d909.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/dialogic-logo.svg" -dest_files=["res://.godot/imported/dialogic-logo.svg-e43201cabc9573eeb3f78fd91ea9d909.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/godot/addons/dialogic/Editor/Images/plugin-icon.svg b/godot/addons/dialogic/Editor/Images/plugin-icon.svg deleted file mode 100644 index 6f542b6..0000000 --- a/godot/addons/dialogic/Editor/Images/plugin-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/godot/addons/dialogic/Editor/Images/plugin-icon.svg.import b/godot/addons/dialogic/Editor/Images/plugin-icon.svg.import deleted file mode 100644 index a6315d5..0000000 --- a/godot/addons/dialogic/Editor/Images/plugin-icon.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dybg3l5pwetne" -path="res://.godot/imported/plugin-icon.svg-aa6701e8ed73f5fe5d177dfddce3a0e3.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/plugin-icon.svg" -dest_files=["res://.godot/imported/plugin-icon.svg-aa6701e8ed73f5fe5d177dfddce3a0e3.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=true -editor/convert_colors_with_editor_theme=true diff --git a/godot/addons/dialogic/Editor/Images/preview_character.png b/godot/addons/dialogic/Editor/Images/preview_character.png deleted file mode 100644 index 0ef6e853644a7d2bb7a1bf98e487c5f15847c3f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63720 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๝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 diff --git a/godot/addons/dialogic/Editor/Images/preview_character.png.import b/godot/addons/dialogic/Editor/Images/preview_character.png.import deleted file mode 100644 index 95b3c15..0000000 --- a/godot/addons/dialogic/Editor/Images/preview_character.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://41634vnjwsfw" -path="res://.godot/imported/preview_character.png-54f0625ad8281c635fea35a4930d95b6.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/preview_character.png" -dest_files=["res://.godot/imported/preview_character.png-54f0625ad8281c635fea35a4930d95b6.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/godot/addons/dialogic/Editor/Images/preview_character_speaker.png b/godot/addons/dialogic/Editor/Images/preview_character_speaker.png deleted file mode 100644 index 1e1562663021c908e055e76ae398a52d9c051b32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40709 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 n)H4^ml#% diff --git a/godot/addons/dialogic/Editor/Images/preview_character_speaker.png.import b/godot/addons/dialogic/Editor/Images/preview_character_speaker.png.import deleted file mode 100644 index 80a5a2f..0000000 --- a/godot/addons/dialogic/Editor/Images/preview_character_speaker.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dp7np6b4ipm0a" -path="res://.godot/imported/preview_character_speaker.png-c0667c648e2901adcbe8bf93ddda7f06.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Editor/Images/preview_character_speaker.png" -dest_files=["res://.godot/imported/preview_character_speaker.png-c0667c648e2901adcbe8bf93ddda7f06.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/godot/addons/dialogic/Editor/Inspector/inspector_plugin.gd b/godot/addons/dialogic/Editor/Inspector/inspector_plugin.gd deleted file mode 100644 index 0a40bc3..0000000 --- a/godot/addons/dialogic/Editor/Inspector/inspector_plugin.gd +++ /dev/null @@ -1,15 +0,0 @@ -@tool -extends EditorInspectorPlugin - - -func _can_handle(object: Object) -> bool: - return true - - -func _parse_property(object: Object, type: Variant.Type, name: String, hint_type: PropertyHint, hint_string: String, usage_flags: int, wide: bool) -> bool: - if type == TYPE_OBJECT and hint_type == PROPERTY_HINT_RESOURCE_TYPE: - if hint_string == "DialogicTimeline": - var editor: EditorProperty = load("res://addons/dialogic/Editor/Inspector/timeline_inspector_field.gd").new() - add_property_editor(name, editor) - return true - return false diff --git a/godot/addons/dialogic/Editor/Inspector/inspector_plugin.gd.uid b/godot/addons/dialogic/Editor/Inspector/inspector_plugin.gd.uid deleted file mode 100644 index b44f0e5..0000000 --- a/godot/addons/dialogic/Editor/Inspector/inspector_plugin.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bok1je25mskp7 diff --git a/godot/addons/dialogic/Editor/Inspector/timeline_inspector_field.gd b/godot/addons/dialogic/Editor/Inspector/timeline_inspector_field.gd deleted file mode 100644 index 78274d1..0000000 --- a/godot/addons/dialogic/Editor/Inspector/timeline_inspector_field.gd +++ /dev/null @@ -1,82 +0,0 @@ -@tool -extends EditorProperty - -var field: Control = null -var button: Button = null -# An internal value of the property. -var current_value: DialogicTimeline = null -# A guard against internal changes when the property is updated. -var updating = false - - -func _init() -> void: - var hbox := HBoxContainer.new() - add_child(hbox) - - field = load("res://addons/dialogic/Editor/Events/Fields/field_options_dynamic.tscn").instantiate() - hbox.add_child(field) - field.placeholder_text = "No Timeline" - field.size_flags_horizontal = Control.SIZE_EXPAND_FILL - field.size_flags_vertical = Control.SIZE_SHRINK_CENTER - field.mode = field.Modes.IDENTIFIER - field.fit_text_length = false - field.valid_file_drop_extension = ".dtl" - field.value_changed.connect(_on_field_value_changed) - field.suggestions_func = get_timeline_suggestions - - button = Button.new() - hbox.add_child(button) - button.hide() - button.pressed.connect(_on_button_pressed, CONNECT_DEFERRED) - - -func _on_field_value_changed(property:String, value:Variant) -> void: - # Ignore the signal if the property is currently being updated. - if updating: - return - - var new_value: DialogicTimeline = null - if value: - new_value = DialogicResourceUtil.get_timeline_resource(value) - - if current_value != new_value: - current_value = new_value - if current_value: - button.show() - else: - button.hide() - emit_changed(get_edited_property(), current_value) - - -func _update_property() -> void: - field.resource_icon = load("res://addons/dialogic/Editor/Images/Resources/timeline.svg") - button.icon = get_theme_icon("ExternalLink", "EditorIcons") - - # Read the current value from the property. - var new_value = get_edited_object()[get_edited_property()] - if (new_value == current_value): - return - - # Update the control with the new value. - updating = true - current_value = new_value - if current_value: - field.set_value(current_value.get_identifier()) - button.show() - else: - button.hide() - field.set_value("") - updating = false - - -func get_timeline_suggestions(filter:String) -> Dictionary: - var suggestions := {} - var timeline_directory := DialogicResourceUtil.get_timeline_directory() - for identifier in timeline_directory.keys(): - suggestions[identifier] = {'value': identifier, 'tooltip':timeline_directory[identifier], 'editor_icon': ["TripleBar", "EditorIcons"]} - return suggestions - - -func _on_button_pressed() -> void: - if current_value: - EditorInterface.edit_resource(current_value) diff --git a/godot/addons/dialogic/Editor/Inspector/timeline_inspector_field.gd.uid b/godot/addons/dialogic/Editor/Inspector/timeline_inspector_field.gd.uid deleted file mode 100644 index 47a91e0..0000000 --- a/godot/addons/dialogic/Editor/Inspector/timeline_inspector_field.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://58xvx63rw20a diff --git a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/csv_file.gd b/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/csv_file.gd deleted file mode 100644 index 3f8fb3a..0000000 --- a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/csv_file.gd +++ /dev/null @@ -1,356 +0,0 @@ -class_name DialogicCsvFile -extends RefCounted -## Handles translation of a [class DialogicTimeline] to a CSV file. - -var lines: Array[PackedStringArray] = [] -## Dictionary of lines from the original file. -## Key: String, Value: PackedStringArray -var old_lines: Dictionary = {} - -## The amount of columns the CSV file has after loading it. -## Used to add trailing commas to new lines. -var column_count := 0 - -## Whether this CSV file was able to be loaded a defined -## file path. -var is_new_file: bool = false - -## The underlying file used to read and write the CSV file. -var file: FileAccess - -## File path used to load the CSV file. -var used_file_path: String - -## The amount of events that were updated in the CSV file. -var updated_rows: int = 0 - -## The amount of events that were added to the CSV file. -var new_rows: int = 0 - -## Whether this CSV handler should add newlines as a separator between sections. -## A section may be a new character, new timeline, or new glossary item inside -## a per-project file. -var add_separator: bool = false - -enum PropertyType { - String = 0, - Array = 1, - Other = 2, -} - -## The translation property used for the glossary item translation. -const TRANSLATION_ID := DialogicGlossary.TRANSLATION_PROPERTY - -## Attempts to load the CSV file from [param file_path]. -## If the file does not exist, a single entry is added to the [member lines] -## array. -## The [param separator_enabled] enables adding newlines as a separator to -## per-project files. This is useful for readability. -func _init(file_path: String, original_locale: String, separator_enabled: bool) -> void: - used_file_path = file_path - add_separator = separator_enabled - - # The first entry must be the locale row. - # [method collect_lines_from_timeline] will add the other locales, if any. - var locale_array_line := PackedStringArray(["keys", original_locale]) - lines.append(locale_array_line) - - if not ResourceLoader.exists(file_path): - is_new_file = true - - # The "keys" and original locale are the only columns in a new file. - # For example: "keys, en" - column_count = 2 - return - - file = FileAccess.open(file_path, FileAccess.READ) - - var locale_csv_row := file.get_csv_line() - column_count = locale_csv_row.size() - var locale_key := locale_csv_row[0] - - old_lines[locale_key] = locale_csv_row - - _read_file_into_lines() - - -## Private function to read the CSV file into the [member lines] array. -## Cannot be called on a new file. -func _read_file_into_lines() -> void: - while not file.eof_reached(): - var line := file.get_csv_line() - var row_key := line[0] - - old_lines[row_key] = line - - -## Collects names from the given [param characters] and adds them to the -## [member lines]. -## -## If this is the character name CSV file, use this method to -## take previously collected characters from other [class DialogicCsvFile]s. -func collect_lines_from_characters(characters: Dictionary) -> void: - for character: DialogicCharacter in characters.values(): - # Add row for display names. - var name_property := DialogicCharacter.TranslatedProperties.NAME - var display_name_key: String = character.get_property_translation_key(name_property) - var line_value: String = character.display_name - var array_line := PackedStringArray([display_name_key, line_value]) - lines.append(array_line) - - var nicknames: Array = character.nicknames - - if not nicknames.is_empty(): - var nick_name_property := DialogicCharacter.TranslatedProperties.NICKNAMES - var nickname_string: String = ",".join(nicknames) - var nickname_name_line_key: String = character.get_property_translation_key(nick_name_property) - var nick_array_line := PackedStringArray([nickname_name_line_key, nickname_string]) - lines.append(nick_array_line) - - # New character item, if needed, add a separator. - if add_separator: - _append_empty() - - -## Appends an empty line to the [member lines] array. -func _append_empty() -> void: - var empty_line := PackedStringArray(["", ""]) - lines.append(empty_line) - - -## Returns the property type for the given [param key]. -func _get_key_type(key: String) -> PropertyType: - if key.ends_with(DialogicGlossary.NAME_PROPERTY): - return PropertyType.String - - if key.ends_with(DialogicGlossary.ALTERNATIVE_PROPERTY): - return PropertyType.Array - - return PropertyType.Other - - -func _process_line_into_array(csv_values: PackedStringArray, property_type: PropertyType) -> Array[String]: - const KEY_VALUE_INDEX := 0 - var values_as_array: Array[String] = [] - - for i in csv_values.size(): - - if i == KEY_VALUE_INDEX: - continue - - var csv_value := csv_values[i] - - if csv_value.is_empty(): - continue - - match property_type: - PropertyType.String: - values_as_array = [csv_value] - - PropertyType.Array: - var split_values := csv_value.split(",") - - for value in split_values: - values_as_array.append(value) - - return values_as_array - - -func _add_keys_to_glossary(glossary: DialogicGlossary, names: Array) -> void: - var glossary_prefix_key := glossary._get_glossary_translation_id_prefix() - var glossary_translation_id_prefix := _get_glossary_translation_key_prefix(glossary) - - for glossary_line: PackedStringArray in names: - - if glossary_line.is_empty(): - continue - - var csv_key := glossary_line[0] - - # CSV line separators will be empty. - if not csv_key.begins_with(glossary_prefix_key): - continue - - var value_type := _get_key_type(csv_key) - - # String and Array are the only valid types. - if (value_type == PropertyType.Other - or not csv_key.begins_with(glossary_translation_id_prefix)): - continue - - var new_line_to_add := _process_line_into_array(glossary_line, value_type) - - for name_to_add: String in new_line_to_add: - glossary._translation_keys[name_to_add.strip_edges()] = csv_key - - - -## Reads all [member lines] and adds them to the given [param glossary]'s -## internal collection of words-to-translation-key mappings. -## -## Populate the CSV's lines with the method [method collect_lines_from_glossary] -## before. -func add_translation_keys_to_glossary(glossary: DialogicGlossary) -> void: - glossary._translation_keys.clear() - _add_keys_to_glossary(glossary, lines) - _add_keys_to_glossary(glossary, old_lines.values()) - - -## Returns the translation key prefix for the given [param glossary_translation_id]. -## The resulting format will look like this: Glossary/a2/ -## You can use this to find entries in [member lines] that to a glossary. -func _get_glossary_translation_key_prefix(glossary: DialogicGlossary) -> String: - return ( - DialogicGlossary.RESOURCE_NAME - .path_join(glossary._translation_id) - ) - - -## Returns whether [param value_b] is greater than [param value_a]. -## -## This method helps to sort glossary entry properties by their importance -## matching the order in the editor. -## -## TODO: Allow Dialogic users to define their own order. -func _sort_glossary_entry_property_keys(property_key_a: String, property_key_b: String) -> bool: - const GLOSSARY_CSV_LINE_ORDER := { - DialogicGlossary.NAME_PROPERTY: 0, - DialogicGlossary.ALTERNATIVE_PROPERTY: 1, - DialogicGlossary.TEXT_PROPERTY: 2, - DialogicGlossary.EXTRA_PROPERTY: 3, - } - const UNKNOWN_PROPERTY_ORDER := 100 - - var value_a: int = GLOSSARY_CSV_LINE_ORDER.get(property_key_a, UNKNOWN_PROPERTY_ORDER) - var value_b: int = GLOSSARY_CSV_LINE_ORDER.get(property_key_b, UNKNOWN_PROPERTY_ORDER) - - return value_a < value_b - - -## Collects properties from glossary entries from the given [param glossary] and -## adds them to the [member lines]. -func collect_lines_from_glossary(glossary: DialogicGlossary) -> void: - - for glossary_value: Variant in glossary.entries.values(): - - if glossary_value is String: - continue - - var glossary_entry: Dictionary = glossary_value - var glossary_entry_name: String = glossary_entry[DialogicGlossary.NAME_PROPERTY] - - var _glossary_translation_id := glossary.get_set_glossary_translation_id() - var entry_translation_id := glossary.get_set_glossary_entry_translation_id(glossary_entry_name) - - var entry_property_keys := glossary_entry.keys().duplicate() - entry_property_keys.sort_custom(_sort_glossary_entry_property_keys) - - var entry_name_property: String = glossary_entry[DialogicGlossary.NAME_PROPERTY] - - for entry_key: String in entry_property_keys: - # Ignore private keys. - if entry_key.begins_with(DialogicGlossary.PRIVATE_PROPERTY_PREFIX): - continue - - var item_value: Variant = glossary_entry[entry_key] - var item_value_str := "" - - if item_value is Array: - var item_array := item_value as Array - # We use a space after the comma to make it easier to read. - item_value_str = " ,".join(item_array) - - elif not item_value is String or item_value.is_empty(): - continue - - else: - item_value_str = item_value - - var glossary_csv_key := glossary._get_glossary_translation_key(entry_translation_id, entry_key) - - if (entry_key == DialogicGlossary.NAME_PROPERTY - or entry_key == DialogicGlossary.ALTERNATIVE_PROPERTY): - glossary.entries[glossary_csv_key] = entry_name_property - - var glossary_line := PackedStringArray([glossary_csv_key, item_value_str]) - - lines.append(glossary_line) - - # New glossary item, if needed, add a separator. - if add_separator: - _append_empty() - - - -## Collects translatable events from the given [param timeline] and adds -## them to the [member lines]. -func collect_lines_from_timeline(timeline: DialogicTimeline) -> void: - for event: DialogicEvent in timeline.events: - - if event.can_be_translated(): - - if event._translation_id.is_empty(): - event.add_translation_id() - event.update_text_version() - - var properties: Array = event._get_translatable_properties() - - for property: String in properties: - var line_key: String = event.get_property_translation_key(property) - var line_value: String = event._get_property_original_translation(property) - var array_line := PackedStringArray([line_key, line_value]) - lines.append(array_line) - - # End of timeline, if needed, add a separator. - if add_separator: - _append_empty() - - -## Clears the CSV file on disk and writes the current [member lines] array to it. -## Uses the [member old_lines] dictionary to update existing translations. -## If a translation row misses a column, a trailing comma will be added to -## conform to the CSV file format. -## -## If the locale CSV line was collected only, a new file won't be created and -## already existing translations won't be updated. -func update_csv_file_on_disk() -> void: - # None or locale row only. - if lines.size() < 2: - print_rich("[color=yellow]No lines for the CSV file, skipping: " + used_file_path) - - return - - # Clear the current CSV file. - file = FileAccess.open(used_file_path, FileAccess.WRITE) - - for line in lines: - var row_key := line[0] - - # In case there might be translations for this line already, - # add them at the end again (orig locale text is replaced). - if row_key in old_lines: - var old_line: PackedStringArray = old_lines[row_key] - var updated_line: PackedStringArray = line + old_line.slice(2) - - var line_columns: int = updated_line.size() - var line_columns_to_add := column_count - line_columns - - # Add trailing commas to match the amount of columns. - for _i in range(line_columns_to_add): - updated_line.append("") - - file.store_csv_line(updated_line) - updated_rows += 1 - - else: - var line_columns: int = line.size() - var line_columns_to_add := column_count - line_columns - - # Add trailing commas to match the amount of columns. - for _i in range(line_columns_to_add): - line.append("") - - file.store_csv_line(line) - new_rows += 1 - - file.close() diff --git a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/csv_file.gd.uid b/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/csv_file.gd.uid deleted file mode 100644 index 6b17b20..0000000 --- a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/csv_file.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ddof34f216ceq diff --git a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_editor.gd b/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_editor.gd deleted file mode 100644 index 5b85512..0000000 --- a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_editor.gd +++ /dev/null @@ -1,154 +0,0 @@ -@tool -extends DialogicSettingsPage - -## Settings tab that holds dialogic editor settings. - -const _SETTING_IMAGE_PREVIEW_HEIGHT = "image_preview_height" -const _SETTING_EVENT_BLOCK_MARGIN = "event_block_margin" -const _SETTING_SHOW_EVENT_NAMES = "show_event_names" - -const _SETTING_EVENT_COLOR_PALETTE = "color_palette" -const _SETTING_EVENT_SECTION_ODER = "event_section_order" - -var do_timeline_editor_refresh_on_close := false - -func _get_title() -> String: - return "Editor" - - -func _get_priority() -> int: - return 98 - - -func _refresh() -> void: - do_timeline_editor_refresh_on_close = false - %ImagePreviewHeight.value = DialogicUtil.get_editor_setting(_SETTING_IMAGE_PREVIEW_HEIGHT, 100) - %EventBlockMargin.value = DialogicUtil.get_editor_setting(_SETTING_EVENT_BLOCK_MARGIN, 0) - %ShowEventNames.set_pressed_no_signal(DialogicUtil.get_editor_setting(_SETTING_SHOW_EVENT_NAMES, false)) - - update_color_palette() - reload_section_list() - - -func _ready() -> void: - %ResetColorsButton.icon = get_theme_icon("Reload", "EditorIcons") - %ResetColorsButton.pressed.connect(_on_reset_colors_button) - - %ImagePreviewHeight.value_changed.connect(_on_ImagePreviewHeight_value_changed) - %EventBlockMargin.value_changed.connect(_on_EventBlockMargin_value_changed) - %ShowEventNames.toggled.connect(_on_ShowEventNames_toggled) - - -func _about_to_close(): - if do_timeline_editor_refresh_on_close: - refresh_visual_timeline_editor() - - -func refresh_visual_timeline_editor() -> void: - var timeline_node: DialogicEditor = settings_editor.editors_manager.editors["Timeline"]["node"] - timeline_node.get_node("%VisualEditor").load_event_buttons() - - # If the visual editor is open, close and reopen the timeline to have the colors reloaded. - if timeline_node.get_node("%VisualEditor").visible: - - var current_timeline := timeline_node.current_resource - settings_editor.editors_manager.clear_editor(timeline_node) - - settings_editor.editors_manager.edit_resource(current_timeline, true, true) - - - -#region SECTION ORDER -################################################################################ - -func reload_section_list(): - %SectionList.clear() - %SectionList.create_item() - var cached_events := DialogicResourceUtil.get_event_cache() - var sections := [] - var section_order: Array = DialogicUtil.get_editor_setting(_SETTING_EVENT_SECTION_ODER, ['Main', 'Logic', 'Flow', 'Audio', 'Visuals','Other', 'Helper']) - for ev in cached_events: - if !ev.event_category in sections: - sections.append(ev.event_category) - var item: TreeItem = %SectionList.create_item(null) - item.set_text(0, ev.event_category) - item.add_button(0, get_theme_icon("ArrowUp", "EditorIcons")) - item.add_button(0, get_theme_icon("ArrowDown", "EditorIcons")) - if ev.event_category in section_order: - - item.move_before(item.get_parent().get_child(min(section_order.find(ev.event_category),item.get_parent().get_child_count()-1))) - - %SectionList.get_root().get_child(0).set_button_disabled(0, 0, true) - %SectionList.get_root().get_child(-1).set_button_disabled(0, 1, true) - - -func _on_section_list_button_clicked(item:TreeItem, column, id, mouse_button_index): - if id == 0: - item.move_before(item.get_parent().get_child(item.get_index()-1)) - else: - item.move_after(item.get_parent().get_child(item.get_index()+1)) - - for child in %SectionList.get_root().get_children(): - child.set_button_disabled(0, 0, false) - child.set_button_disabled(0, 1, false) - - %SectionList.get_root().get_child(0).set_button_disabled(0, 0, true) - %SectionList.get_root().get_child(-1).set_button_disabled(0, 1, true) - - var sections := [] - for child in %SectionList.get_root().get_children(): - sections.append(child.get_text(0)) - - DialogicUtil.set_editor_setting(_SETTING_EVENT_SECTION_ODER, sections) - do_timeline_editor_refresh_on_close = true - -#endregion - - -#region COLOR PALETTE -################################################################################ - -## Completely reloads the color palette buttons -func update_color_palette() -> void: - for child in %Colors.get_children(): - child.queue_free() - for color in DialogicUtil.get_color_palette(): - var button := ColorPickerButton.new() - button.custom_minimum_size = Vector2(50 ,50) * DialogicUtil.get_editor_scale() - %Colors.add_child(button) - button.color = DialogicUtil.get_color(color) - button.popup_closed.connect(_on_palette_color_popup_closed) - - -func _on_palette_color_popup_closed() -> void: - var new_palette := {} - for i in %Colors.get_children(): - new_palette["Color"+str(i.get_index()+1)] = i.color - DialogicUtil.set_editor_setting(_SETTING_EVENT_COLOR_PALETTE, new_palette) - - do_timeline_editor_refresh_on_close = true - - -func _on_reset_colors_button() -> void: - DialogicUtil.set_editor_setting(_SETTING_EVENT_COLOR_PALETTE, null) - update_color_palette() - - do_timeline_editor_refresh_on_close = true - -#endregion - - - - -func _on_ImagePreviewHeight_value_changed(value:float) -> void: - DialogicUtil.set_editor_setting(_SETTING_IMAGE_PREVIEW_HEIGHT, value) - - -func _on_EventBlockMargin_value_changed(value:float) -> void: - DialogicUtil.set_editor_setting(_SETTING_EVENT_BLOCK_MARGIN, value) - do_timeline_editor_refresh_on_close = true - - -func _on_ShowEventNames_toggled(toggled:bool) -> void: - DialogicUtil.set_editor_setting(_SETTING_SHOW_EVENT_NAMES, toggled) - do_timeline_editor_refresh_on_close = true diff --git a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_editor.gd.uid b/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_editor.gd.uid deleted file mode 100644 index e273fb3..0000000 --- a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_editor.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://3akc4p71r5rn diff --git a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_editor.tscn b/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_editor.tscn deleted file mode 100644 index 4587e3f..0000000 --- a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_editor.tscn +++ /dev/null @@ -1,161 +0,0 @@ -[gd_scene load_steps=5 format=3 uid="uid://dbdmosh6v536s"] - -[ext_resource type="Script" uid="uid://3akc4p71r5rn" path="res://addons/dialogic/Editor/Settings/CoreSettingsPages/settings_editor.gd" id="1_kdw7t"] -[ext_resource type="PackedScene" uid="uid://dbpkta2tjsqim" path="res://addons/dialogic/Editor/Common/hint_tooltip_icon.tscn" id="2_ey6hj"] - -[sub_resource type="Image" id="Image_1n4qk"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_dfv70"] -image = SubResource("Image_1n4qk") - -[node name="EditorSettingsPage" type="VBoxContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("1_kdw7t") - -[node name="PaletteTitle" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="SectionPaletteTitle" type="Label" parent="PaletteTitle"] -layout_mode = 2 -theme_type_variation = &"DialogicSettingsSection" -text = "Color Palette" - -[node name="HintTooltip" parent="PaletteTitle" instance=ExtResource("2_ey6hj")] -layout_mode = 2 -tooltip_text = "These colors are used for the events." -texture = null -hint_text = "These colors are used for the events." - -[node name="ResetColorsButton" type="Button" parent="PaletteTitle"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 0 -tooltip_text = "Reset Colors to default" -icon = SubResource("ImageTexture_dfv70") -flat = true - -[node name="ScrollContainer" type="ScrollContainer" parent="."] -layout_mode = 2 -horizontal_scroll_mode = 3 -vertical_scroll_mode = 0 - -[node name="Colors" type="HBoxContainer" parent="ScrollContainer"] -unique_name_in_owner = true -layout_mode = 2 - -[node name="HSeparator" type="HSeparator" parent="."] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="TimelineTitle" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="SectionTimelineTitle" type="Label" parent="TimelineTitle"] -layout_mode = 2 -theme_type_variation = &"DialogicSettingsSection" -text = "Visual Events" - -[node name="HintTooltip" parent="TimelineTitle" instance=ExtResource("2_ey6hj")] -layout_mode = 2 -texture = null -hint_text = "These settings affect the visual timeline editor." - -[node name="HBoxContainer" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="Label" type="Label" parent="HBoxContainer"] -layout_mode = 2 -text = "Image preview height" - -[node name="HintTooltip" parent="HBoxContainer" instance=ExtResource("2_ey6hj")] -layout_mode = 2 -texture = null -hint_text = "If set to 0, image previews will be disabled." - -[node name="ImagePreviewHeight" type="SpinBox" parent="HBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -rounded = true -allow_greater = true -update_on_text_changed = true -suffix = "px" -select_all_on_focus = true - -[node name="HBoxContainer2" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="Label" type="Label" parent="HBoxContainer2"] -layout_mode = 2 -text = "Event block bottom margin" - -[node name="HintTooltip" parent="HBoxContainer2" instance=ExtResource("2_ey6hj")] -layout_mode = 2 -texture = null -hint_text = "This adds extra space at the bottom of event blocks." - -[node name="EventBlockMargin" type="SpinBox" parent="HBoxContainer2"] -unique_name_in_owner = true -layout_mode = 2 -rounded = true -allow_greater = true -update_on_text_changed = true -suffix = "px" -select_all_on_focus = true - -[node name="HBoxContainer3" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="Label" type="Label" parent="HBoxContainer3"] -layout_mode = 2 -text = "Show event names" - -[node name="HintTooltip" parent="HBoxContainer3" instance=ExtResource("2_ey6hj")] -layout_mode = 2 -texture = null -hint_text = "Enabling this prepends the event name at the beginning of event blocks." - -[node name="ShowEventNames" type="CheckButton" parent="HBoxContainer3"] -unique_name_in_owner = true -layout_mode = 2 - -[node name="HSeparator5" type="HSeparator" parent="."] -layout_mode = 2 - -[node name="HBoxContainer4" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="SectionSections" type="Label" parent="HBoxContainer4"] -layout_mode = 2 -theme_type_variation = &"DialogicSettingsSection" -text = "Section Order" - -[node name="HintTooltip" parent="HBoxContainer4" instance=ExtResource("2_ey6hj")] -layout_mode = 2 -tooltip_text = "You can change the order of the event sections here. " -texture = null -hint_text = "You can change the order of the event sections here. " - -[node name="SectionList" type="Tree" parent="."] -unique_name_in_owner = true -custom_minimum_size = Vector2(150, 150) -layout_mode = 2 -size_flags_horizontal = 3 -theme_override_constants/button_margin = 0 -allow_reselect = true -allow_rmb_select = true -hide_folding = true -hide_root = true -drop_mode_flags = 1 - -[connection signal="button_clicked" from="SectionList" to="." method="_on_section_list_button_clicked"] diff --git a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_general.gd b/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_general.gd deleted file mode 100644 index d44907d..0000000 --- a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_general.gd +++ /dev/null @@ -1,177 +0,0 @@ -@tool -extends DialogicSettingsPage - -## Settings tab that holds genreal dialogic settings. - - -func _get_title() -> String: - return "General" - - -func _get_priority() -> int: - return 99 - -func _ready() -> void: - var s := DCSS.inline({ - 'padding': 5, - 'background': Color(0.545098, 0.545098, 0.545098, 0.211765) - }) - %ExtensionsFolderPicker.resource_icon = get_theme_icon("Folder", "EditorIcons") - - # Signals - %ExtensionsFolderPicker.value_changed.connect(_on_ExtensionsFolder_value_changed) - %PhysicsTimerButton.toggled.connect(_on_physics_timer_button_toggled) - - - # Extension creator - %ExtensionCreator.hide() - - -func _refresh() -> void: - %PhysicsTimerButton.button_pressed = DialogicUtil.is_physics_timer() - %LayoutNodeEndBehaviour.select(ProjectSettings.get_setting('dialogic/layout/end_behaviour', 0)) - %ExtensionsFolderPicker.set_value(ProjectSettings.get_setting('dialogic/extensions_folder', 'res://addons/dialogic_additions')) - - - -func _on_physics_timer_button_toggled(is_toggled: bool) -> void: - ProjectSettings.set_setting('dialogic/timer/process_in_physics', is_toggled) - ProjectSettings.save() - - -func _on_ExtensionsFolder_value_changed(property:String, value:String) -> void: - if value == null or value.is_empty(): - value = 'res://addons/dialogic_additions' - ProjectSettings.set_setting('dialogic/extensions_folder', value) - ProjectSettings.save() - - -func _on_layout_node_end_behaviour_item_selected(index:int) -> void: - ProjectSettings.set_setting('dialogic/layout/end_behaviour', index) - ProjectSettings.save() - - -################################################################################ -## EXTENSION CREATOR -################################################################################ - -func _on_create_extension_button_pressed() -> void: - %CreateExtensionButton.hide() - %ExtensionCreator.show() - - %NameEdit.text = "" - %NameEdit.grab_focus() - - -func _on_submit_extension_button_pressed() -> void: - if %NameEdit.text.is_empty(): - return - - var extensions_folder: String = ProjectSettings.get_setting('dialogic/extensions_folder', 'res://addons/dialogic_additions') - - extensions_folder = extensions_folder.path_join(%NameEdit.text.to_pascal_case()) - DirAccess.make_dir_recursive_absolute(extensions_folder) - var mode: int = %ExtensionMode.selected - - var file: FileAccess - var indexer_content := "@tool\nextends DialogicIndexer\n\n" - if mode != 2: # don't add event in Subsystem Only mode - indexer_content += """func _get_events() -> Array: - return [this_folder.path_join('event_"""+%NameEdit.text.to_snake_case()+""".gd')]\n\n""" - file = FileAccess.open(extensions_folder.path_join('event_'+%NameEdit.text.to_snake_case()+'.gd'), FileAccess.WRITE) - file.store_string( - -#region EXTENDED EVENT SCRIPT -"""@tool -extends DialogicEvent -class_name Dialogic"""+%NameEdit.text.to_pascal_case()+"""Event - -# Define properties of the event here - -func _execute() -> void: - # This will execute when the event is reached - finish() # called to continue with the next event - - -#region INITIALIZE -################################################################################ -# Set fixed settings of this event -func _init() -> void: - event_name = \""""+%NameEdit.text.capitalize()+"""\" - event_category = "Other" - -\n -#endregion - -#region SAVING/LOADING -################################################################################ -func get_shortcode() -> String: - return \""""+%NameEdit.text.to_snake_case()+"""\" - -func get_shortcode_parameters() -> Dictionary: - return { - #param_name : property_info - #"my_parameter" : {"property": "property", "default": "Default"}, - } - -# You can alternatively overwrite these 3 functions: to_text(), from_text(), is_valid_event() -#endregion - - -#region EDITOR REPRESENTATION -################################################################################ - -func build_event_editor() -> void: - pass - -#endregion -""") - -#endregion - if mode != 0: # don't add subsystem in event only mode - indexer_content += """func _get_subsystems() -> Array: - return [{'name':'"""+%NameEdit.text.to_pascal_case()+"""', 'script':this_folder.path_join('subsystem_"""+%NameEdit.text.to_snake_case()+""".gd')}]""" - file = FileAccess.open(extensions_folder.path_join('subsystem_'+%NameEdit.text.to_snake_case()+'.gd'), FileAccess.WRITE) - file.store_string( - -# region EXTENDED SUBSYSTEM SCRIPT -"""extends DialogicSubsystem - -## Describe the subsystems purpose here. - - -#region STATE -#################################################################################################### - -func clear_game_state(clear_flag:=Dialogic.ClearFlags.FULL_CLEAR) -> void: - pass - -func load_game_state(load_flag:=LoadFlags.FULL_LOAD) -> void: - pass - -#endregion - - -#region MAIN METHODS -#################################################################################################### - -# Add some useful methods here. - -#endregion -""") - file = FileAccess.open(extensions_folder.path_join('index.gd'), FileAccess.WRITE) - file.store_string(indexer_content) - - %ExtensionCreator.hide() - %CreateExtensionButton.show() - - find_parent('EditorView').plugin_reference.get_editor_interface().get_resource_filesystem().scan_sources() - force_event_button_list_reload() - - -func force_event_button_list_reload() -> void: - find_parent('EditorsManager').editors['Timeline'].node.get_node('%VisualEditor').load_event_buttons() - - -func _on_reload_pressed() -> void: - DialogicUtil._update_autoload_subsystem_access() diff --git a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_general.gd.uid b/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_general.gd.uid deleted file mode 100644 index 7acfdfc..0000000 --- a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_general.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://chb81lvjh47jr diff --git a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_general.tscn b/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_general.tscn deleted file mode 100644 index 777d634..0000000 --- a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_general.tscn +++ /dev/null @@ -1,234 +0,0 @@ -[gd_scene load_steps=6 format=3 uid="uid://b873ho41sklv8"] - -[ext_resource type="Script" uid="uid://chb81lvjh47jr" path="res://addons/dialogic/Editor/Settings/CoreSettingsPages/settings_general.gd" id="2"] -[ext_resource type="Script" uid="uid://bo0dfmsyky1mm" path="res://addons/dialogic/Editor/Settings/CoreSettingsPages/settings_tools.gd" id="2_3xeuv"] -[ext_resource type="PackedScene" uid="uid://dbpkta2tjsqim" path="res://addons/dialogic/Editor/Common/hint_tooltip_icon.tscn" id="2_kqhx5"] -[ext_resource type="Script" uid="uid://vg4wbm0n64ws" path="res://addons/dialogic/Editor/Settings/CoreSettingsPages/tool_resave.gd" id="3_dbfvv"] -[ext_resource type="PackedScene" uid="uid://7mvxuaulctcq" path="res://addons/dialogic/Editor/Events/Fields/field_file.tscn" id="3_i7rug"] - -[node name="General" type="VBoxContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("2") - -[node name="HBoxContainer2" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="SectionToolsTitle" type="Label" parent="HBoxContainer2"] -layout_mode = 2 -theme_type_variation = &"DialogicSettingsSection" -text = "Tools" - -[node name="Tools" type="Node" parent="."] -script = ExtResource("2_3xeuv") - -[node name="ResaveTool" type="Node" parent="Tools"] -script = ExtResource("3_dbfvv") - -[node name="ToolButtons" type="VBoxContainer" parent="."] -unique_name_in_owner = true -layout_mode = 2 - -[node name="ToolProgress" type="ProgressBar" parent="."] -unique_name_in_owner = true -visible = false -layout_mode = 2 -max_value = 1.0 -value = 1.0 - -[node name="HSeparator5" type="HSeparator" parent="."] -layout_mode = 2 - -[node name="HBoxContainer5" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="SectionBehaviourTitle" type="Label" parent="HBoxContainer5"] -layout_mode = 2 -theme_type_variation = &"DialogicSettingsSection" -text = "Layout Node Behaviour" - -[node name="HintTooltip" parent="HBoxContainer5" instance=ExtResource("2_kqhx5")] -layout_mode = 2 -tooltip_text = "The layout scene configured in the Layout editor is automatically -instanced when calling Dialogic.start(). Depending on your game, -you might want it to be deleted after the dialogue, be hidden -(as reinstancing often is wasting resources) or kept visible. " -texture = null -hint_text = "The layout scene configured in the Layout editor is automatically -instanced when calling Dialogic.start(). Depending on your game, -you might want it to be deleted after the dialogue, be hidden -(as reinstancing often is wasting resources) or kept visible. " - -[node name="HBoxContainer3" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="Label" type="Label" parent="HBoxContainer3"] -layout_mode = 2 -text = "On timeline end" - -[node name="LayoutNodeEndBehaviour" type="OptionButton" parent="HBoxContainer3"] -unique_name_in_owner = true -layout_mode = 2 -selected = 0 -fit_to_longest_item = false -item_count = 3 -popup/item_0/text = "Delete Layout Node" -popup/item_1/text = "Hide Layout Node" -popup/item_1/id = 1 -popup/item_2/text = "Keep Layout Node" -popup/item_2/id = 2 - -[node name="HSeparator4" type="HSeparator" parent="."] -layout_mode = 2 - -[node name="HBoxContainer6" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="HBoxContainer4" type="VBoxContainer" parent="HBoxContainer6"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="HBoxContainer5" type="HBoxContainer" parent="HBoxContainer6/HBoxContainer4"] -layout_mode = 2 - -[node name="SectionExtensionsTitle" type="Label" parent="HBoxContainer6/HBoxContainer4/HBoxContainer5"] -layout_mode = 2 -theme_type_variation = &"DialogicSettingsSection" -text = "Extensions" - -[node name="HintTooltip" parent="HBoxContainer6/HBoxContainer4/HBoxContainer5" instance=ExtResource("2_kqhx5")] -layout_mode = 2 -tooltip_text = "Configure where dialogic looks for custom modules. - -You will have to restart the project to see the change take action." -texture = null -hint_text = "Configure where dialogic looks for custom modules. - -You will have to restart the project to see the change take action." - -[node name="Reload" type="Button" parent="HBoxContainer6/HBoxContainer4/HBoxContainer5"] -layout_mode = 2 -text = "Reload" -flat = true - -[node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer6/HBoxContainer4"] -layout_mode = 2 - -[node name="Label" type="Label" parent="HBoxContainer6/HBoxContainer4/HBoxContainer"] -layout_mode = 2 -text = "Extensions folder" - -[node name="ExtensionsFolderPicker" parent="HBoxContainer6/HBoxContainer4/HBoxContainer" instance=ExtResource("3_i7rug")] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -placeholder = "res://addons/dialogic_additions/Events" -file_mode = 2 - -[node name="VSeparator" type="VSeparator" parent="HBoxContainer6"] -layout_mode = 2 - -[node name="ExtensionsPanel" type="PanelContainer" parent="HBoxContainer6"] -layout_mode = 2 -size_flags_horizontal = 3 -theme_type_variation = &"DialogicPanelA" - -[node name="VBox" type="VBoxContainer" parent="HBoxContainer6/ExtensionsPanel"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="HBoxContainer6" type="HBoxContainer" parent="HBoxContainer6/ExtensionsPanel/VBox"] -layout_mode = 2 - -[node name="Label" type="Label" parent="HBoxContainer6/ExtensionsPanel/VBox/HBoxContainer6"] -layout_mode = 2 -theme_type_variation = &"DialogicSubTitle" -text = "Extension Creator " - -[node name="HintTooltip" parent="HBoxContainer6/ExtensionsPanel/VBox/HBoxContainer6" instance=ExtResource("2_kqhx5")] -layout_mode = 2 -tooltip_text = "Use the Exension Creator to quickly setup custom modules!" -texture = null -hint_text = "Use the Exension Creator to quickly setup custom modules!" - -[node name="CreateExtensionButton" type="Button" parent="HBoxContainer6/ExtensionsPanel/VBox"] -unique_name_in_owner = true -layout_mode = 2 -text = "Create New Extension" - -[node name="ExtensionCreator" type="VBoxContainer" parent="HBoxContainer6/ExtensionsPanel/VBox"] -unique_name_in_owner = true -visible = false -layout_mode = 2 - -[node name="ExtensionCreatorOptions" type="GridContainer" parent="HBoxContainer6/ExtensionsPanel/VBox/ExtensionCreator"] -layout_mode = 2 -columns = 2 - -[node name="NameLabel" type="Label" parent="HBoxContainer6/ExtensionsPanel/VBox/ExtensionCreator/ExtensionCreatorOptions"] -layout_mode = 2 -text = "Name:" - -[node name="NameEdit" type="LineEdit" parent="HBoxContainer6/ExtensionsPanel/VBox/ExtensionCreator/ExtensionCreatorOptions"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -placeholder_text = "e.g. \"Print\", \"Item\", \"Door\", \"Quest\"" - -[node name="ModeLabel" type="Label" parent="HBoxContainer6/ExtensionsPanel/VBox/ExtensionCreator/ExtensionCreatorOptions"] -layout_mode = 2 -text = "Setup mode:" - -[node name="ExtensionMode" type="OptionButton" parent="HBoxContainer6/ExtensionsPanel/VBox/ExtensionCreator/ExtensionCreatorOptions"] -unique_name_in_owner = true -layout_mode = 2 -selected = 0 -item_count = 4 -popup/item_0/text = "Event only" -popup/item_1/text = "Event+Subsystem" -popup/item_1/id = 1 -popup/item_2/text = "Subsystem only" -popup/item_2/id = 2 -popup/item_3/text = "Complex" -popup/item_3/id = 3 - -[node name="SubmitExtensionButton" type="Button" parent="HBoxContainer6/ExtensionsPanel/VBox/ExtensionCreator"] -unique_name_in_owner = true -layout_mode = 2 -text = "Create" - -[node name="HSeparator2" type="HSeparator" parent="."] -layout_mode = 2 - -[node name="HBoxContainer7" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="TimerTitle" type="Label" parent="HBoxContainer7"] -layout_mode = 2 -theme_type_variation = &"DialogicSettingsSection" -text = "Timer processing" - -[node name="HintTooltip" parent="HBoxContainer7" instance=ExtResource("2_kqhx5")] -layout_mode = 2 -tooltip_text = "Change whether dialogics timers process in physics_process (frame-rate independent) or process." -texture = null -hint_text = "Change whether dialogics timers process in physics_process (frame-rate independent) or process." - -[node name="HBoxContainer4" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="Label" type="Label" parent="HBoxContainer4"] -layout_mode = 2 -text = "Process timers in physics_process" - -[node name="PhysicsTimerButton" type="CheckBox" parent="HBoxContainer4"] -unique_name_in_owner = true -layout_mode = 2 - -[connection signal="item_selected" from="HBoxContainer3/LayoutNodeEndBehaviour" to="." method="_on_layout_node_end_behaviour_item_selected"] -[connection signal="pressed" from="HBoxContainer6/HBoxContainer4/HBoxContainer5/Reload" to="." method="_on_reload_pressed"] -[connection signal="pressed" from="HBoxContainer6/ExtensionsPanel/VBox/CreateExtensionButton" to="." method="_on_create_extension_button_pressed"] -[connection signal="pressed" from="HBoxContainer6/ExtensionsPanel/VBox/ExtensionCreator/SubmitExtensionButton" to="." method="_on_submit_extension_button_pressed"] diff --git a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_modules.gd b/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_modules.gd deleted file mode 100644 index a9f159d..0000000 --- a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_modules.gd +++ /dev/null @@ -1,442 +0,0 @@ -@tool -extends DialogicSettingsPage - - -func _get_title() -> String: - return "Modules" - -func _get_priority() -> int: - return 0 - -func _is_feature_tab() -> bool: - return true - - -func _ready() -> void: - if get_parent() is SubViewport: - return - %Refresh.icon = get_theme_icon("Loop", "EditorIcons") - %Search.right_icon = get_theme_icon("Search", "EditorIcons") - - %Filter_Events.icon = get_theme_icon("Favorites", "EditorIcons") - %Filter_Subsystems.icon = get_theme_icon("Callable", "EditorIcons") - %Filter_Styles.icon = get_theme_icon("PopupMenu", "EditorIcons") - %Filter_EffectsAndModifiers.icon = get_theme_icon("RichTextEffect", "EditorIcons") - %Filter_Editors.icon = get_theme_icon("ConfirmationDialog", "EditorIcons") - %Filter_Settings.icon = get_theme_icon("PluginScript", "EditorIcons") - %Collapse.icon = get_theme_icon("CollapseTree", "EditorIcons") - - %EventDefaultsPanel.add_theme_stylebox_override('panel', get_theme_stylebox("Background", "EditorStyles")) - - %ExternalLink.icon = get_theme_icon("Help", "EditorIcons") - - -func _refresh() -> void: - %EventDefaultsPanel.hide() - load_modules_tree() - - -func _on_refresh_pressed() -> void: - DialogicUtil.get_indexers(true, true) - DialogicResourceUtil.update_event_cache() - load_modules_tree() - - -func filters_updated(fake_arg:Variant) -> void: - load_modules_tree() - - -func _on_collapse_toggled(button_pressed:bool) -> void: - for item in %Tree.get_root().get_children(): - item.collapsed = button_pressed - - if button_pressed: - %Collapse.icon = get_theme_icon("ExpandTree", "EditorIcons") - %Collapse.tooltip_text = "Expand All" - else: - %Collapse.icon = get_theme_icon("CollapseTree", "EditorIcons") - %Collapse.tooltip_text = "Collapse All" - - -func _on_search_text_changed(new_text:String) -> void: - for filter in [%Filter_Events, %Filter_Subsystems, %Filter_Editors, %Filter_EffectsAndModifiers, %Filter_Settings, %Filter_Styles]: - filter.text = "" - filter.set_meta("counter", 0) - - var hidden_events: Array = DialogicUtil.get_editor_setting('hidden_event_buttons', []) - - for child in %Tree.get_root().get_children(): - if new_text.to_lower() in child.get_text(0).to_lower() or new_text.is_empty(): - for sub_child in child.get_children(): - sub_child.visible = sub_child.get_meta('filter_button').button_pressed - sub_child.get_meta('filter_button').set_meta('counter', sub_child.get_meta('filter_button').get_meta('counter')+1) - sub_child.get_meta('filter_button').text = str(sub_child.get_meta('filter_button').get_meta('counter')) - child.visible = true - else: - for sub_child in child.get_children(): - sub_child.visible = sub_child.get_meta('filter_button').button_pressed and new_text.to_lower() in sub_child.get_text(0).to_lower() - - if new_text.to_lower() in sub_child.get_text(0).to_lower(): - sub_child.get_meta('filter_button').set_meta('counter', sub_child.get_meta('filter_button').get_meta('counter')+1) - sub_child.get_meta('filter_button').text = str(sub_child.get_meta('filter_button').get_meta('counter')) - - for i in range(child.get_button_count(0)): - child.erase_button(0, child.get_button_count(0)-1) - var any_visible := false - var counter := 0 - for sub_child in child.get_children(): - if sub_child.visible: - child.add_button(0, sub_child.get_icon(0), counter, false, sub_child.get_text(0)) - if sub_child.get_metadata(0) and sub_child.get_metadata(0)['type'] == 'Event' and sub_child.get_metadata(0)['hidden']: - var color: Color = sub_child.get_icon_modulate(0) - color.a = 0.5 - child.set_button_color(0, counter, color) - else: - child.set_button_color(0, counter, sub_child.get_icon_modulate(0)) - counter += 1 - any_visible = true - child.visible = any_visible - - - -func load_modules_tree() -> void: - %Tree.clear() - var root: TreeItem = %Tree.create_item() - var cached_events := DialogicResourceUtil.get_event_cache() - var hidden_events: Array = DialogicUtil.get_editor_setting('hidden_event_buttons', []) - var indexers := DialogicUtil.get_indexers() - for i in indexers: - var module_item: TreeItem = %Tree.create_item(root) - module_item.set_text(0, i.get_script().resource_path.trim_suffix('/index.gd').get_file()) - module_item.set_metadata(0, {'type':'Module'}) - - # Events - for ev in i._get_events(): - if not ResourceLoader.exists(ev): - continue - var event_item: TreeItem = %Tree.create_item(module_item) - event_item.set_icon(0, get_theme_icon("Favorites", "EditorIcons")) - for cached_event in cached_events: - if cached_event.get_script().resource_path == ev: - event_item.set_text(0, cached_event.event_name + " Event") - event_item.set_icon_modulate(0, cached_event.event_color) - var hidden: bool = cached_event.event_name in hidden_events - event_item.set_metadata(0, {'type':'Event', 'event':cached_event, 'hidden':hidden}) - event_item.add_button(0, get_theme_icon("GuiVisibilityVisible", "EditorIcons"), 0, false, "Toggle Event Button Visibility") - if hidden: - event_item.set_button(0, 0, get_theme_icon("GuiVisibilityHidden", "EditorIcons")) - event_item.set_meta('filter_button', %Filter_Events) - event_item.visible = %Filter_Events.button_pressed - - # Subsystems - for subsys in i._get_subsystems(): - var subsys_item: TreeItem = %Tree.create_item(module_item) - subsys_item.set_icon(0, get_theme_icon("Callable", "EditorIcons")) - subsys_item.set_text(0, subsys.name + " Subsystem") - subsys_item.set_icon_modulate(0, get_theme_color("readonly_color", "Editor")) - subsys_item.set_metadata(0, {'type':'Subsystem', 'info':subsys}) - subsys_item.set_meta('filter_button', %Filter_Subsystems) - subsys_item.visible = %Filter_Subsystems.button_pressed - - # Style scenes - for style in i._get_layout_parts(): - var style_item: TreeItem = %Tree.create_item(module_item) - style_item.set_icon(0, get_theme_icon("PopupMenu", "EditorIcons")) - style_item.set_text(0, style.name) - style_item.set_icon_modulate(0, get_theme_color("property_color_x", "Editor")) - style_item.set_metadata(0, {'type':'Style', 'info':style}) - style_item.set_meta('filter_button', %Filter_Styles) - style_item.visible = %Filter_Styles.button_pressed - - # Text Effects - for effect in i._get_text_effects(): - var effect_item: TreeItem = %Tree.create_item(module_item) - effect_item.set_icon(0, get_theme_icon("RichTextEffect", "EditorIcons")) - effect_item.set_text(0, "Text effect ["+effect.command+"]") - effect_item.set_icon_modulate(0, get_theme_color("property_color_z", "Editor")) - effect_item.set_metadata(0, {'type':'Effect', 'info':effect}) - effect_item.set_meta('filter_button', %Filter_EffectsAndModifiers) - effect_item.visible = %Filter_EffectsAndModifiers.button_pressed - - # Text Modifiers - for mod in i._get_text_modifiers(): - var mod_item: TreeItem = %Tree.create_item(module_item) - mod_item.set_icon(0, get_theme_icon("RichTextEffect", "EditorIcons")) - mod_item.set_text(0, mod.method.capitalize()) - mod_item.set_icon_modulate(0, get_theme_color("property_color_z", "Editor")) - mod_item.set_metadata(0, {'type':'Modifier', 'info':mod}) - mod_item.set_meta('filter_button', %Filter_EffectsAndModifiers) - mod_item.visible = %Filter_EffectsAndModifiers.button_pressed - - # Settings - for settings in i._get_settings_pages(): - var settings_item: TreeItem = %Tree.create_item(module_item) - settings_item.set_icon(0, get_theme_icon("PluginScript", "EditorIcons")) - settings_item.set_text(0, module_item.get_text(0) + " Settings") - settings_item.set_icon_modulate(0, get_theme_color("readonly_color", "Editor")) - settings_item.set_metadata(0, {'type':'Settings', 'info':settings}) - settings_item.set_meta('filter_button', %Filter_Settings) - settings_item.visible = %Filter_Settings.button_pressed - - # Editors - for editor in i._get_editors(): - var editor_item: TreeItem = %Tree.create_item(module_item) - editor_item.set_icon(0, get_theme_icon("ConfirmationDialog", "EditorIcons")) - editor_item.set_text(0, editor.get_file().trim_suffix('.tscn').capitalize()) - editor_item.set_icon_modulate(0, get_theme_color("readonly_color", "Editor")) - editor_item.set_metadata(0, {'type':'Editor', 'info':editor}) - editor_item.set_meta('filter_button', %Filter_Editors) - editor_item.visible = %Filter_Editors.button_pressed - - module_item.collapsed = %Collapse.button_pressed - - _on_search_text_changed(%Search.text) - if %Tree.get_root().get_child_count(): %Tree.set_selected(%Tree.get_root().get_child(0), 0) - - -func _on_tree_button_clicked(item:TreeItem, column:int, id:int, mouse_button_index:int) -> void: - match item.get_metadata(0)['type']: - 'Module': - item.collapsed = false - %Tree.set_selected(item.get_child(id), 0) - 'Event': - # Visibility item clicked - if id == 0: - var meta: Dictionary= item.get_metadata(0) - if meta['hidden']: - item.set_button(0, 0, get_theme_icon("GuiVisibilityVisible", "EditorIcons")) - item.get_parent().set_button_color(0, item.get_index(), item.get_icon_modulate(0)) - if item == %Tree.get_selected(): - %VisibilityToggle.button_pressed = true - else: - item.set_button(0, 0, get_theme_icon("GuiVisibilityHidden", "EditorIcons")) - var color: Color = item.get_icon_modulate(0) - color.a = 0.5 - item.get_parent().set_button_color(0, item.get_index(), color) - if item == %Tree.get_selected(): - %VisibilityToggle.button_pressed = false - meta['hidden'] = !meta['hidden'] - item.set_metadata(0, meta) - change_event_visibility(meta['event'], !meta['hidden']) - - -func _on_tree_item_selected() -> void: - var selected_item: TreeItem = %Tree.get_selected() - - var metadata: Variant = selected_item.get_metadata(0) - - %Title.text = selected_item.get_text(0) - %EventDefaultsPanel.hide() - %Icon.texture = null - %ExternalLink.hide() - %VisibilityToggle.hide() - - if metadata is Dictionary: - match metadata.type: - 'Event': - %GeneralInfo.text = "Events can be used in timelines and do all kinds of things. They often interact with subsystems and dialogic nodes." - - load_event_settings(metadata.event) - if %EventDefaults.get_child_count(): - %EventDefaultsPanel.show() - - if metadata.event.help_page_path: - %ExternalLink.show() - %ExternalLink.set_meta('url', metadata.event.help_page_path) - %Icon.texture = metadata.event._get_icon() - if !metadata.event.disable_editor_button: - %VisibilityToggle.show() - %VisibilityToggle.button_pressed = !metadata.event.event_name in DialogicUtil.get_editor_setting('hidden_event_buttons', []) - if %VisibilityToggle.button_pressed: - %VisibilityToggle.icon = get_theme_icon("GuiVisibilityVisible", "EditorIcons") - else: - %VisibilityToggle.icon = get_theme_icon("GuiVisibilityHidden", "EditorIcons") - # ------------------------------------------------- - 'Subsystem': - %GeneralInfo.text = "Subsystems hold specialized functionality. They mostly manage communication between events and dialogic nodes. Often they provide handy methods that can be accessed by the user like this: Dialogic.Subsystem.a_method()." - # ------------------------------------------------- - 'Effect': - %GeneralInfo.text = "Text effects can be used in text events. They will be executed once reached and can take a single argument." - # ------------------------------------------------- - 'Modifier': - %GeneralInfo.text = "Modifiers can modify text from text events before it is shown." - # ------------------------------------------------- - 'Style': - %GeneralInfo.text = "Style presets can be activated and modified in the Styles editor. They provide the design of the dialog interface in your game." - # ------------------------------------------------- - 'Editor': - %GeneralInfo.text = "Editors provide a user interface for editing dialogic data." - # ------------------------------------------------- - 'Settings': - %GeneralInfo.text = "Settings pages provide settings that are usually used by subsystems, events and dialogic nodes." - # ------------------------------------------------- - '_': - %GeneralInfo.text = "" - - -func _on_external_link_pressed() -> void: - if %ExternalLink.has_meta('url'): - OS.shell_open(%ExternalLink.get_meta('url')) - - -func change_event_visibility(event:DialogicEvent, visibility:bool) -> void: - if event: - var list: Array= DialogicUtil.get_editor_setting('hidden_event_buttons', []) - if visibility: - list.erase(event.event_name) - else: - list.append(event.event_name) - DialogicUtil.set_editor_setting('hidden_event_buttons', list) - force_event_button_list_update() - - -func _on_visibility_toggle_toggled(button_pressed:bool) -> void: - change_event_visibility(%Tree.get_selected().get_metadata(0).event, button_pressed) - - if button_pressed: - %VisibilityToggle.icon = get_theme_icon("GuiVisibilityVisible", "EditorIcons") - %Tree.get_selected().set_button(0, 0, get_theme_icon("GuiVisibilityVisible", "EditorIcons")) - %Tree.get_selected().get_parent().set_button_color(0, %Tree.get_selected().get_index(), %Tree.get_selected().get_icon_modulate(0)) - else: - %VisibilityToggle.icon = get_theme_icon("GuiVisibilityHidden", "EditorIcons") - %Tree.get_selected().set_button(0, 0, get_theme_icon("GuiVisibilityHidden", "EditorIcons")) - var color: Color = %Tree.get_selected().get_icon_modulate(0) - color.a = 0.5 - %Tree.get_selected().get_parent().set_button_color(0, %Tree.get_selected().get_index(), color) - - - -func force_event_button_list_update() -> void: - find_parent('EditorsManager').editors['Timeline'].node.get_node('%VisualEditor').load_event_buttons() - -################################################################################ -## EVENT DEFAULT SETTINGS -################################################################################ -func load_event_settings(event:DialogicEvent) -> void: - for child in %EventDefaults.get_children(): - child.queue_free() - - var event_default_overrides: Dictionary = ProjectSettings.get_setting('dialogic/event_default_overrides', {}) - - var params := event.get_shortcode_parameters() - for prop in params: - var current_value: Variant = params[prop].default - if event_default_overrides.get(event.event_name, {}).has(params[prop].property): - current_value = event_default_overrides.get(event.event_name, {}).get(params[prop].property) - - # Label - var label := Label.new() - label.text = prop.capitalize() - %EventDefaults.add_child(label) - - var reset := Button.new() - reset.icon = get_theme_icon("Clear", "EditorIcons") - reset.flat = true - - %EventDefaults.add_child(reset) - - # Editing field - var editor_node: Node = null - match typeof(event.get(params[prop].property)): - TYPE_STRING: - editor_node = LineEdit.new() - editor_node.custom_minimum_size.x = 150 - editor_node.text = str(current_value) - editor_node.text_changed.connect(_on_event_default_string_submitted.bind(params[prop].property)) - TYPE_INT, TYPE_FLOAT: - if params[prop].has('suggestions'): - editor_node = OptionButton.new() - for i in params[prop].suggestions.call(): - editor_node.add_item(i, int(params[prop].suggestions.call()[i].value)) - editor_node.select(int(current_value)) - editor_node.item_selected.connect(_on_event_default_option_selected.bind(editor_node, params[prop].property)) - else: - editor_node = SpinBox.new() - - editor_node.allow_greater = true - editor_node.allow_lesser = true - if typeof(event.get(params[prop].property)) == TYPE_INT: - editor_node.step = 1 - else: - editor_node.step = 0.001 - - editor_node.value = float(current_value) - editor_node.value_changed.connect(_on_event_default_number_changed.bind(params[prop].property)) - - TYPE_VECTOR2: - editor_node = load("res://addons/dialogic/Editor/Events/Fields/field_vector2.tscn").instantiate() - editor_node.set_value(current_value) - editor_node.property_name = params[prop].property - editor_node.value_changed.connect(_on_event_default_value_changed) - - TYPE_BOOL: - editor_node = CheckBox.new() - editor_node.button_pressed = bool(current_value) - editor_node.toggled.connect(_on_event_default_bool_toggled.bind(params[prop].property)) - - TYPE_ARRAY: - editor_node = load("res://addons/dialogic/Editor/Events/Fields/field_array.tscn").instantiate() - editor_node.set_value(current_value) - editor_node.property_name = params[prop].property - editor_node.value_changed.connect(_on_event_default_value_changed) - - TYPE_DICTIONARY: - editor_node = load("res://addons/dialogic/Editor/Events/Fields/field_dictionary.tscn").instantiate() - editor_node.set_value(current_value) - editor_node.property_name = params[prop].property - editor_node.value_changed.connect(_on_event_default_value_changed) - %EventDefaults.add_child(editor_node) - reset.pressed.connect(reset_event_default_override.bind(prop, editor_node, params[prop].default)) - - -func set_event_default_override(prop:String, value:Variant) -> void: - var event_default_overrides: Dictionary = ProjectSettings.get_setting('dialogic/event_default_overrides', {}) - var event: DialogicEvent = %Tree.get_selected().get_metadata(0).event - - if not event_default_overrides.has(event.event_name): - event_default_overrides[event.event_name] = {} - - event_default_overrides[event.event_name][prop] = value - - ProjectSettings.set_setting('dialogic/event_default_overrides', event_default_overrides) - - -func reset_event_default_override(prop:String, node:Node, default:Variant) -> void: - var event_default_overrides: Dictionary = ProjectSettings.get_setting('dialogic/event_default_overrides', {}) - var event: DialogicEvent = %Tree.get_selected().get_metadata(0).event - - if not event_default_overrides.has(event.event_name): - return - - event_default_overrides[event.event_name].erase(prop) - - ProjectSettings.set_setting('dialogic/event_default_overrides', event_default_overrides) - - if node is CheckBox: - node.button_pressed = default - elif node is LineEdit: - node.text = default - elif node.has_method('set_value'): - node.set_value(default) - elif node is ColorPickerButton: - node.color = default - elif node is OptionButton: - node.select(default) - elif node is SpinBox: - node.value = default - - -func _on_event_default_string_submitted(text:String, prop:String) -> void: - set_event_default_override(prop, text) - -func _on_event_default_option_selected(index:int, option_button:OptionButton, prop:String) -> void: - set_event_default_override(prop, option_button.get_item_id(index)) - -func _on_event_default_number_changed(value:float, prop:String) -> void: - set_event_default_override(prop, value) - -func _on_event_default_value_changed(prop:String, value:Variant) -> void: - set_event_default_override(prop, value) - -func _on_event_default_bool_toggled(value:bool, prop:String) -> void: - set_event_default_override(prop, value) diff --git a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_modules.gd.uid b/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_modules.gd.uid deleted file mode 100644 index 1ad4804..0000000 --- a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_modules.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bcu347pvraog6 diff --git a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_modules.tscn b/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_modules.tscn deleted file mode 100644 index db242b8..0000000 --- a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_modules.tscn +++ /dev/null @@ -1,236 +0,0 @@ -[gd_scene load_steps=7 format=3 uid="uid://o7ljiritpgap"] - -[ext_resource type="Script" uid="uid://bcu347pvraog6" path="res://addons/dialogic/Editor/Settings/CoreSettingsPages/settings_modules.gd" id="1_l2hk0"] - -[sub_resource type="Image" id="Image_1yyxk"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_lce2m"] -image = SubResource("Image_1yyxk") - -[sub_resource type="Image" id="Image_bclq7"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 128, 128, 4, 255, 128, 128, 4, 255, 128, 128, 4, 255, 128, 128, 4, 255, 128, 128, 4, 255, 128, 128, 4, 255, 128, 128, 4, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 131, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 131, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 131, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 252, 255, 93, 93, 252, 255, 93, 93, 252, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 128, 128, 4, 255, 128, 128, 4, 255, 128, 128, 4, 255, 128, 128, 4, 255, 128, 128, 4, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 93, 93, 55, 255, 97, 97, 58, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 97, 97, 42, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 98, 98, 47, 255, 97, 97, 42, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 93, 93, 233, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 94, 94, 46, 255, 93, 93, 236, 255, 93, 93, 233, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 252, 255, 93, 93, 252, 255, 93, 93, 252, 255, 93, 93, 252, 255, 93, 93, 252, 255, 93, 93, 252, 255, 93, 93, 252, 255, 93, 93, 252, 255, 93, 93, 252, 255, 93, 93, 252, 255, 93, 93, 252, 255, 93, 93, 252, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_137g7"] -image = SubResource("Image_bclq7") - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_315cl"] -content_margin_left = 4.0 -content_margin_top = 4.0 -content_margin_right = 4.0 -content_margin_bottom = 4.0 -bg_color = Color(1, 0.365, 0.365, 1) -draw_center = false -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -corner_detail = 1 - -[node name="ModuleManagement" type="HSplitContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_bottom = -157.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_vertical = 3 -theme_override_constants/separation = 0 -script = ExtResource("1_l2hk0") -short_info = "Here you can manage modules: -- change event defaults -- hide events from the event list" - -[node name="Overview" type="VBoxContainer" parent="."] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="ScrollContainer" type="ScrollContainer" parent="Overview"] -layout_mode = 2 -size_flags_horizontal = 3 -follow_focus = true -horizontal_scroll_mode = 3 -vertical_scroll_mode = 0 - -[node name="HBox" type="HBoxContainer" parent="Overview/ScrollContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 8 -alignment = 2 - -[node name="Filter_Events" type="Button" parent="Overview/ScrollContainer/HBox"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Include Events" -toggle_mode = true -button_pressed = true -text = "0" -flat = true -icon_alignment = 2 - -[node name="Filter_Subsystems" type="Button" parent="Overview/ScrollContainer/HBox"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Include Subsystems" -toggle_mode = true -button_pressed = true -text = "0" -flat = true -icon_alignment = 2 - -[node name="Filter_EffectsAndModifiers" type="Button" parent="Overview/ScrollContainer/HBox"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Include Text Effects and Modifiers" -toggle_mode = true -button_pressed = true -text = "0" -flat = true -icon_alignment = 2 - -[node name="Filter_Styles" type="Button" parent="Overview/ScrollContainer/HBox"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Include Preset Style Scenes" -toggle_mode = true -button_pressed = true -text = "0" -flat = true -icon_alignment = 2 - -[node name="Filter_Settings" type="Button" parent="Overview/ScrollContainer/HBox"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Include Settings Pages" -toggle_mode = true -text = "0" -flat = true -icon_alignment = 2 - -[node name="Filter_Editors" type="Button" parent="Overview/ScrollContainer/HBox"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Include Editors" -toggle_mode = true -text = "0" -flat = true -icon_alignment = 2 - -[node name="Search" type="LineEdit" parent="Overview/ScrollContainer/HBox"] -unique_name_in_owner = true -custom_minimum_size = Vector2(100, 0) -layout_mode = 2 -placeholder_text = "Search" -clear_button_enabled = true - -[node name="Refresh" type="Button" parent="Overview/ScrollContainer/HBox"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Refresh" - -[node name="Collapse" type="Button" parent="Overview/ScrollContainer/HBox"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Collapse All" -toggle_mode = true - -[node name="Tree" type="Tree" parent="Overview"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 3 -allow_reselect = true -hide_root = true - -[node name="Scroll" type="ScrollContainer" parent="."] -show_behind_parent = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 0 -size_flags_stretch_ratio = 0.75 -horizontal_scroll_mode = 3 -vertical_scroll_mode = 0 - -[node name="Settings" type="VBoxContainer" parent="Scroll"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="HBox" type="HBoxContainer" parent="Scroll/Settings"] -layout_mode = 2 - -[node name="Icon" type="TextureRect" parent="Scroll/Settings/HBox"] -unique_name_in_owner = true -layout_mode = 2 -expand_mode = 3 - -[node name="Title" type="Label" parent="Scroll/Settings/HBox"] -unique_name_in_owner = true -layout_mode = 2 -theme_type_variation = &"DialogicSubTitle" - -[node name="ExternalLink" type="Button" parent="Scroll/Settings/HBox"] -unique_name_in_owner = true -visible = false -layout_mode = 2 -icon = SubResource("ImageTexture_lce2m") -flat = true - -[node name="VisibilityToggle" type="Button" parent="Scroll/Settings/HBox"] -unique_name_in_owner = true -visible = false -layout_mode = 2 -toggle_mode = true -button_pressed = true -icon = SubResource("ImageTexture_137g7") -flat = true - -[node name="EventDefaultsPanel" type="PanelContainer" parent="Scroll/Settings"] -unique_name_in_owner = true -visible = false -layout_mode = 2 -theme_override_styles/panel = SubResource("StyleBoxFlat_315cl") - -[node name="VBox" type="VBoxContainer" parent="Scroll/Settings/EventDefaultsPanel"] -layout_mode = 2 - -[node name="Title" type="Label" parent="Scroll/Settings/EventDefaultsPanel/VBox"] -layout_mode = 2 -text = "Edit event defaults:" - -[node name="EventDefaults" type="GridContainer" parent="Scroll/Settings/EventDefaultsPanel/VBox"] -unique_name_in_owner = true -layout_mode = 2 -columns = 3 - -[node name="GeneralInfo" type="Label" parent="Scroll/Settings"] -unique_name_in_owner = true -layout_mode = 2 -theme_type_variation = &"DialogicHintText2" -autowrap_mode = 3 - -[connection signal="toggled" from="Overview/ScrollContainer/HBox/Filter_Events" to="." method="filters_updated"] -[connection signal="toggled" from="Overview/ScrollContainer/HBox/Filter_Subsystems" to="." method="filters_updated"] -[connection signal="toggled" from="Overview/ScrollContainer/HBox/Filter_EffectsAndModifiers" to="." method="filters_updated"] -[connection signal="toggled" from="Overview/ScrollContainer/HBox/Filter_Styles" to="." method="filters_updated"] -[connection signal="toggled" from="Overview/ScrollContainer/HBox/Filter_Settings" to="." method="filters_updated"] -[connection signal="toggled" from="Overview/ScrollContainer/HBox/Filter_Editors" to="." method="filters_updated"] -[connection signal="text_changed" from="Overview/ScrollContainer/HBox/Search" to="." method="_on_search_text_changed"] -[connection signal="pressed" from="Overview/ScrollContainer/HBox/Refresh" to="." method="_on_refresh_pressed"] -[connection signal="toggled" from="Overview/ScrollContainer/HBox/Collapse" to="." method="_on_collapse_toggled"] -[connection signal="button_clicked" from="Overview/Tree" to="." method="_on_tree_button_clicked"] -[connection signal="item_selected" from="Overview/Tree" to="." method="_on_tree_item_selected"] -[connection signal="pressed" from="Scroll/Settings/HBox/ExternalLink" to="." method="_on_external_link_pressed"] -[connection signal="toggled" from="Scroll/Settings/HBox/VisibilityToggle" to="." method="_on_visibility_toggle_toggled"] diff --git a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_tools.gd b/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_tools.gd deleted file mode 100644 index 6b84a79..0000000 --- a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_tools.gd +++ /dev/null @@ -1,80 +0,0 @@ -@tool -extends Node - -var tool_thread : Thread -var tool_progress := 1.0 -var tool_progress_mutex : Mutex -signal tool_finished_signal - - -func _ready() -> void: - for button in %ToolButtons.get_children(): - button.queue_free() - - for i in get_children(): - var button := Button.new() - button.text = i.button_text - button.tooltip_text = i.tooltip - button.pressed.connect(execute_tool.bind(i.method)) - %ToolButtons.add_child(button) - - -func execute_tool(method:Callable) -> void: - for button in %ToolButtons.get_children(): - button.disabled = true - - var prev_timeline := close_active_timeline() - await get_tree().process_frame - if tool_thread and tool_thread.is_alive(): - tool_thread.wait_to_finish() - - tool_thread = Thread.new() - tool_progress_mutex = Mutex.new() - tool_thread.start(method) - - await tool_finished_signal - silently_open_timeline(prev_timeline) - for button in %ToolButtons.get_children(): - button.disabled = false - - -func _process(_delta: float) -> void: - if (tool_thread and tool_thread.is_alive()) or %ToolProgress.value < 1: - if tool_progress_mutex: tool_progress_mutex.lock() - %ToolProgress.value = tool_progress - if tool_progress_mutex: tool_progress_mutex.unlock() - %ToolProgress.show() - if %ToolProgress.value == 1: - tool_finished_signal.emit() - %ToolProgress.hide() - - -func _exit_tree() -> void: - if tool_thread: - tool_thread.wait_to_finish() - - - -#region HELPERS - -## Closes the current timeline in the Dialogic Editor and returns the timeline -## as a resource. -## If no timeline has been opened, returns null. -func close_active_timeline() -> Resource: - var timeline_node: DialogicEditor = get_parent().settings_editor.editors_manager.editors['Timeline']['node'] - # We will close this timeline to ensure it will properly update. - # By saving this reference, we can open it again. - var current_timeline := timeline_node.current_resource - # Clean the current editor, this will also close the timeline. - get_parent().settings_editor.editors_manager.clear_editor(timeline_node, true) - - return current_timeline - - -## Opens the timeline resource into the Dialogic Editor. -## If the timeline is null, does nothing. -func silently_open_timeline(timeline_to_open: Resource) -> void: - if timeline_to_open != null: - get_parent().settings_editor.editors_manager.edit_resource(timeline_to_open, true, true) - -#endregion diff --git a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_tools.gd.uid b/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_tools.gd.uid deleted file mode 100644 index f01f974..0000000 --- a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_tools.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bo0dfmsyky1mm diff --git a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_translation.gd b/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_translation.gd deleted file mode 100644 index d882ec7..0000000 --- a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_translation.gd +++ /dev/null @@ -1,659 +0,0 @@ -@tool -extends DialogicSettingsPage - -## Settings tab that allows enabeling and updating translation csv-files. - - -enum TranslationModes {PER_PROJECT, PER_TIMELINE, NONE} -enum SaveLocationModes {INSIDE_TRANSLATION_FOLDER, NEXT_TO_TIMELINE, NONE} - -var loading := false - -## The default CSV filename that contains the translations for character -## properties. -const DEFAULT_CHARACTER_CSV_NAME := "dialogic_character_translations.csv" -## The default CSV filename that contains the translations for timelines. -## Only used when all timelines are supposed to be translated in one file. -const DEFAULT_TIMELINE_CSV_NAME := "dialogic_timeline_translations.csv" - -const DEFAULT_GLOSSARY_CSV_NAME := "dialogic_glossary_translations.csv" - -const _USED_LOCALES_SETTING := "dialogic/translation/locales" - -## Contains translation changes that were made during the last update. - -## Unique locales that will be set after updating the CSV files. -var _unique_locales := [] - -func _get_icon() -> Texture2D: - return get_theme_icon("Translation", "EditorIcons") - - -func _is_feature_tab() -> bool: - return true - - -func _ready() -> void: - %TransEnabled.toggled.connect(store_changes) - %OrigLocale.suggestions_func = get_locales - %OrigLocale.resource_icon = get_theme_icon("Translation", "EditorIcons") - %OrigLocale.value_changed.connect(store_changes) - %TestingLocale.suggestions_func = get_locales - %TestingLocale.resource_icon = get_theme_icon("Translation", "EditorIcons") - %TestingLocale.value_changed.connect(store_changes) - %TransFolderPicker.value_changed.connect(store_changes) - %AddSeparatorEnabled.toggled.connect(store_changes) - - %SaveLocationMode.item_selected.connect(store_changes) - %TransMode.item_selected.connect(store_changes) - - %UpdateCsvFiles.pressed.connect(_on_update_translations_pressed) - %UpdateCsvFiles.icon = get_theme_icon("Add", "EditorIcons") - - %CollectTranslations.pressed.connect(collect_translations) - %CollectTranslations.icon = get_theme_icon("File", "EditorIcons") - - %TransRemove.pressed.connect(_on_erase_translations_pressed) - %TransRemove.icon = get_theme_icon("Remove", "EditorIcons") - - %UpdateConfirmationDialog.add_button("Keep old & Generate new", false, "generate_new") - - %UpdateConfirmationDialog.custom_action.connect(_on_custom_action) - - _verify_translation_file() - - -func _on_custom_action(action: String) -> void: - if action == "generate_new": - update_csv_files() - - -func _refresh() -> void: - loading = true - - %TransEnabled.button_pressed = ProjectSettings.get_setting('dialogic/translation/enabled', false) - %TranslationSettings.visible = %TransEnabled.button_pressed - %OrigLocale.set_value(ProjectSettings.get_setting('dialogic/translation/original_locale', TranslationServer.get_tool_locale())) - %TransMode.select(ProjectSettings.get_setting('dialogic/translation/file_mode', 1)) - %TransFolderPicker.set_value(ProjectSettings.get_setting('dialogic/translation/translation_folder', '')) - %TestingLocale.set_value(ProjectSettings.get_setting('internationalization/locale/test', '')) - %AddSeparatorEnabled.button_pressed = ProjectSettings.get_setting('dialogic/translation/add_separator', false) - - _verify_translation_file() - - loading = false - - -func store_changes(_fake_arg: Variant = null, _fake_arg2: Variant = null) -> void: - if loading: - return - - _verify_translation_file() - - ProjectSettings.set_setting('dialogic/translation/enabled', %TransEnabled.button_pressed) - %TranslationSettings.visible = %TransEnabled.button_pressed - ProjectSettings.set_setting('dialogic/translation/original_locale', %OrigLocale.current_value) - ProjectSettings.set_setting('dialogic/translation/file_mode', %TransMode.selected) - ProjectSettings.set_setting('dialogic/translation/translation_folder', %TransFolderPicker.current_value) - ProjectSettings.set_setting('internationalization/locale/test', %TestingLocale.current_value) - ProjectSettings.set_setting('dialogic/translation/save_mode', %SaveLocationMode.selected) - ProjectSettings.set_setting('dialogic/translation/add_separator', %AddSeparatorEnabled.button_pressed) - ProjectSettings.save() - - -## Checks whether the translation folder path is required. -## If it is, disables the "Update CSV files" button and shows a warning. -## -## The translation folder path is required when either of the following is true: -## - The translation mode is set to "Per Project". -## - The save location mode is set to "Inside Translation Folder". -func _verify_translation_file() -> void: - var translation_folder: String = %TransFolderPicker.current_value - var file_mode: TranslationModes = %TransMode.selected - - if file_mode == TranslationModes.PER_PROJECT: - %SaveLocationMode.disabled = true - else: - %SaveLocationMode.disabled = false - - var valid_translation_folder := (!translation_folder.is_empty() - and DirAccess.dir_exists_absolute(translation_folder)) - - %UpdateCsvFiles.disabled = not valid_translation_folder - - var status_message := "" - - if not valid_translation_folder: - status_message += "⛔ Requires valid translation folder to translate character names" - - if file_mode == TranslationModes.PER_PROJECT: - status_message += " and the project CSV file." - else: - status_message += "." - - %StatusMessage.text = status_message - - -func get_locales(_filter: String) -> Dictionary: - var suggestions := {} - suggestions['Default'] = {'value':'', 'tooltip':"Will use the fallback locale set in the project settings."} - suggestions[TranslationServer.get_tool_locale()] = {'value':TranslationServer.get_tool_locale()} - - var used_locales: Array = ProjectSettings.get_setting(_USED_LOCALES_SETTING, TranslationServer.get_all_languages()) - - for locale: String in used_locales: - var language_name := TranslationServer.get_language_name(locale) - - # Invalid locales return an empty String. - if language_name.is_empty(): - continue - - suggestions[locale] = { 'value': locale, 'tooltip': language_name } - - return suggestions - - -func _on_update_translations_pressed() -> void: - var save_mode: SaveLocationModes = %SaveLocationMode.selected - var file_mode: TranslationModes = %TransMode.selected - var translation_folder: String = %TransFolderPicker.current_value - - var old_save_mode: SaveLocationModes = ProjectSettings.get_setting('dialogic/translation/intern/save_mode', save_mode) - var old_file_mode: TranslationModes = ProjectSettings.get_setting('dialogic/translation/intern/file_mode', file_mode) - var old_translation_folder: String = ProjectSettings.get_setting('dialogic/translation/intern/translation_folder', translation_folder) - - if (old_save_mode == save_mode - and old_file_mode == file_mode - and old_translation_folder == translation_folder): - update_csv_files() - return - - %UpdateConfirmationDialog.popup_centered() - - -## Used by the dialog to inform that the settings were changed. -func _delete_and_update() -> void: - erase_translations() - update_csv_files() - - -## Creates or updates the glossary CSV files. -func _handle_glossary_translation( - csv_data: CsvUpdateData, - save_location_mode: SaveLocationModes, - translation_mode: TranslationModes, - translation_folder_path: String, - orig_locale: String) -> void: - - var glossary_csv: DialogicCsvFile = null - var glossary_paths: Array = ProjectSettings.get_setting('dialogic/glossary/glossary_files', []) - var add_separator_lines: bool = ProjectSettings.get_setting('dialogic/translation/add_separator', false) - - for glossary_path: String in glossary_paths: - - if glossary_csv == null: - var csv_name := "" - - # Get glossary CSV file name. - match translation_mode: - TranslationModes.PER_PROJECT: - csv_name = DEFAULT_GLOSSARY_CSV_NAME - - TranslationModes.PER_TIMELINE: - var glossary_name: String = glossary_path.trim_suffix('.tres') - var path_parts := glossary_name.split("/") - var file_name := path_parts[-1] - csv_name = "dialogic_" + file_name + '_translation.csv' - - var glossary_csv_path := "" - # Get glossary CSV file path. - match save_location_mode: - SaveLocationModes.INSIDE_TRANSLATION_FOLDER: - glossary_csv_path = translation_folder_path.path_join(csv_name) - - SaveLocationModes.NEXT_TO_TIMELINE: - glossary_csv_path = glossary_path.get_base_dir().path_join(csv_name) - - # Create or update glossary CSV file. - glossary_csv = DialogicCsvFile.new(glossary_csv_path, orig_locale, add_separator_lines) - - if (glossary_csv.is_new_file): - csv_data.new_glossaries += 1 - else: - csv_data.updated_glossaries += 1 - - var glossary: DialogicGlossary = load(glossary_path) - glossary_csv.collect_lines_from_glossary(glossary) - glossary_csv.add_translation_keys_to_glossary(glossary) - ResourceSaver.save(glossary) - - #If per-file mode is used, save this csv and begin a new one - if translation_mode == TranslationModes.PER_TIMELINE: - glossary_csv.update_csv_file_on_disk() - glossary_csv = null - - # If a Per-Project glossary is still open, we need to save it. - if glossary_csv != null: - glossary_csv.update_csv_file_on_disk() - glossary_csv = null - - -## Keeps information about the amount of new and updated CSV rows and what -## resources were populated with translation IDs. -## The final data can be used to display a status message. -class CsvUpdateData: - var new_events := 0 - var updated_events := 0 - - var new_timelines := 0 - var updated_timelines := 0 - - var new_names := 0 - var updated_names := 0 - - var new_glossaries := 0 - var updated_glossaries := 0 - - var new_glossary_entries := 0 - var updated_glossary_entries := 0 - - -func update_csv_files() -> void: - _unique_locales = [] - var orig_locale: String = ProjectSettings.get_setting('dialogic/translation/original_locale', '').strip_edges() - var save_location_mode: SaveLocationModes = ProjectSettings.get_setting('dialogic/translation/save_mode', SaveLocationModes.NEXT_TO_TIMELINE) - var translation_mode: TranslationModes = ProjectSettings.get_setting('dialogic/translation/file_mode', TranslationModes.PER_PROJECT) - var translation_folder_path: String = ProjectSettings.get_setting('dialogic/translation/translation_folder', 'res://') - var add_separator_lines: bool = ProjectSettings.get_setting('dialogic/translation/add_separator', false) - - var csv_data := CsvUpdateData.new() - - if orig_locale.is_empty(): - orig_locale = ProjectSettings.get_setting('internationalization/locale/fallback') - - ProjectSettings.set_setting('dialogic/translation/intern/save_mode', save_location_mode) - ProjectSettings.set_setting('dialogic/translation/intern/file_mode', translation_mode) - ProjectSettings.set_setting('dialogic/translation/intern/translation_folder', translation_folder_path) - - var current_timeline := _close_active_timeline() - - var csv_per_project: DialogicCsvFile = null - var per_project_csv_path := translation_folder_path.path_join(DEFAULT_TIMELINE_CSV_NAME) - - if translation_mode == TranslationModes.PER_PROJECT: - csv_per_project = DialogicCsvFile.new(per_project_csv_path, orig_locale, add_separator_lines) - - if (csv_per_project.is_new_file): - csv_data.new_timelines += 1 - else: - csv_data.updated_timelines += 1 - - # Iterate over all timelines. - # Create or update CSV files. - # Transform the timeline into translatable lines and collect into the CSV file. - for timeline_path: String in DialogicResourceUtil.list_resources_of_type('.dtl'): - var csv_file: DialogicCsvFile = csv_per_project - - # Swap the CSV file to the Per Timeline one. - if translation_mode == TranslationModes.PER_TIMELINE: - var per_timeline_path: String = timeline_path.trim_suffix('.dtl') - var path_parts := per_timeline_path.split("/") - var timeline_name: String = path_parts[-1] - - # Adjust the file path to the translation location mode. - if save_location_mode == SaveLocationModes.INSIDE_TRANSLATION_FOLDER: - var prefixed_timeline_name := "dialogic_" + timeline_name - per_timeline_path = translation_folder_path.path_join(prefixed_timeline_name) - - - per_timeline_path += '_translation.csv' - csv_file = DialogicCsvFile.new(per_timeline_path, orig_locale, false) - csv_data.new_timelines += 1 - - # Load and process timeline, turn events into resources. - var timeline: DialogicTimeline = load(timeline_path) - - if timeline.events.size() == 0: - print_rich("[color=yellow]Empty timeline, skipping: " + timeline_path + "[/color]") - continue - - timeline.process() - - # Collect timeline into CSV. - csv_file.collect_lines_from_timeline(timeline) - - # in case new translation_id's were added, we save the timeline again - timeline.set_meta("timeline_not_saved", true) - ResourceSaver.save(timeline, timeline_path) - - if translation_mode == TranslationModes.PER_TIMELINE: - csv_file.update_csv_file_on_disk() - - csv_data.new_events += csv_file.new_rows - csv_data.updated_events += csv_file.updated_rows - - _handle_glossary_translation( - csv_data, - save_location_mode, - translation_mode, - translation_folder_path, - orig_locale - ) - - _handle_character_names( - csv_data, - orig_locale, - translation_folder_path, - add_separator_lines - ) - - if translation_mode == TranslationModes.PER_PROJECT: - csv_per_project.update_csv_file_on_disk() - - _silently_open_timeline(current_timeline) - - # Trigger reimport. - find_parent('EditorView').plugin_reference.get_editor_interface().get_resource_filesystem().scan_sources() - - var status_message := "Events created {new_events} found {updated_events} - Names created {new_names} found {updated_names} - CSVs created {new_timelines} found {updated_timelines} - Glossary created {new_glossaries} found {updated_glossaries} - Entries created {new_glossary_entries} found {updated_glossary_entries}" - - var status_message_args := { - 'new_events': csv_data.new_events, - 'updated_events': csv_data.updated_events, - 'new_timelines': csv_data.new_timelines, - 'updated_timelines': csv_data.updated_timelines, - 'new_glossaries': csv_data.new_glossaries, - 'updated_glossaries': csv_data.updated_glossaries, - 'new_names': csv_data.new_names, - 'updated_names': csv_data.updated_names, - 'new_glossary_entries': csv_data.new_glossary_entries, - 'updated_glossary_entries': csv_data.updated_glossary_entries, - } - - %StatusMessage.text = status_message.format(status_message_args) - ProjectSettings.set_setting(_USED_LOCALES_SETTING, _unique_locales) - - -## Iterates over all character resource files and creates or updates CSV files -## that contain the translations for character properties. -## This will save each character resource file to disk. -func _handle_character_names( - csv_data: CsvUpdateData, - original_locale: String, - translation_folder_path: String, - add_separator_lines: bool) -> void: - var names_csv_path := translation_folder_path.path_join(DEFAULT_CHARACTER_CSV_NAME) - var character_name_csv: DialogicCsvFile = DialogicCsvFile.new(names_csv_path, - original_locale, - add_separator_lines - ) - - var all_characters := {} - - for character_path: String in DialogicResourceUtil.list_resources_of_type('.dch'): - var character: DialogicCharacter = load(character_path) - - if character._translation_id.is_empty(): - csv_data.new_names += 1 - - else: - csv_data.updated_names += 1 - - var translation_id := character.get_set_translation_id() - all_characters[translation_id] = character - - ResourceSaver.save(character) - - character_name_csv.collect_lines_from_characters(all_characters) - character_name_csv.update_csv_file_on_disk() - - -func collect_translations() -> void: - var translation_files := [] - var translation_mode: TranslationModes = ProjectSettings.get_setting('dialogic/translation/file_mode', TranslationModes.PER_PROJECT) - - if translation_mode == TranslationModes.PER_TIMELINE: - - for timeline_path: String in DialogicResourceUtil.list_resources_of_type('.translation'): - - for file: String in DialogicUtil.listdir(timeline_path.get_base_dir()): - file = timeline_path.get_base_dir().path_join(file) - - if file.ends_with('.translation'): - - if not file in translation_files: - translation_files.append(file) - - if translation_mode == TranslationModes.PER_PROJECT: - var translation_folder: String = ProjectSettings.get_setting('dialogic/translation/translation_folder', 'res://') - - for file: String in DialogicUtil.listdir(translation_folder): - file = translation_folder.path_join(file) - - if file.ends_with('.translation'): - - if not file in translation_files: - translation_files.append(file) - - var all_translation_files: Array = ProjectSettings.get_setting('internationalization/locale/translations', []) - var orig_file_amount := len(all_translation_files) - - # This array keeps track of valid translation file paths. - var found_file_paths := [] - var removed_translation_files := 0 - - for file_path: String in translation_files: - # If the file path is not valid, we must clean it up. - if ResourceLoader.exists(file_path): - found_file_paths.append(file_path) - else: - removed_translation_files += 1 - continue - - if not file_path in all_translation_files: - all_translation_files.append(file_path) - - var path_without_suffix := file_path.trim_suffix('.translation') - var locale_part := path_without_suffix.split(".")[-1] - _collect_locale(locale_part) - - - var valid_translation_files := PackedStringArray(all_translation_files) - ProjectSettings.set_setting('internationalization/locale/translations', valid_translation_files) - ProjectSettings.save() - - %StatusMessage.text = ( - "Added translation files: " + str(len(all_translation_files)-orig_file_amount) - + "\nRemoved translation files: " + str(removed_translation_files) - + "\nTotal translation files: " + str(len(all_translation_files))) - - -func _on_erase_translations_pressed() -> void: - %EraseConfirmationDialog.popup_centered() - - -## Deletes translation files generated by [param csv_name]. -## The [param csv_name] may not contain the file extension (.csv). -## -## Returns a vector, value 1 is amount of deleted translation files. -## Value -func delete_translations_files(translation_files: Array, csv_name: String) -> int: - var deleted_files := 0 - - for file_path: String in DialogicResourceUtil.list_resources_of_type('.translation'): - var base_name: String = file_path.get_basename() - var path_parts := base_name.split("/") - var translation_name: String = path_parts[-1] - - if translation_name.begins_with(csv_name): - - if OK == DirAccess.remove_absolute(file_path): - var project_translation_file_index := translation_files.find(file_path) - - if project_translation_file_index > -1: - translation_files.remove_at(project_translation_file_index) - - deleted_files += 1 - print_rich("[color=green]Deleted translation file: " + file_path + "[/color]") - else: - print_rich("[color=yellow]Failed to delete translation file: " + file_path + "[/color]") - - - return deleted_files - - -## Iterates over all timelines and deletes their CSVs and timeline -## translation IDs. -## Deletes the Per-Project CSV file and the character name CSV file. -func erase_translations() -> void: - var files: PackedStringArray = ProjectSettings.get_setting('internationalization/locale/translations', []) - var translation_files := Array(files) - ProjectSettings.set_setting(_USED_LOCALES_SETTING, []) - - var deleted_csv_files := 0 - var deleted_translation_files := 0 - var cleaned_timelines := 0 - var cleaned_characters := 0 - var cleaned_events := 0 - var cleaned_glossaries := 0 - - var current_timeline := _close_active_timeline() - - # Delete all Dialogic CSV files and their translation files. - for csv_path: String in DialogicResourceUtil.list_resources_of_type(".csv"): - var csv_path_parts: PackedStringArray = csv_path.split("/") - var csv_name: String = csv_path_parts[-1].trim_suffix(".csv") - - # Handle Dialogic CSVs only. - if not csv_name.begins_with("dialogic_"): - continue - - # Delete the CSV file. - if OK == DirAccess.remove_absolute(csv_path): - deleted_csv_files += 1 - print_rich("[color=green]Deleted CSV file: " + csv_path + "[/color]") - - deleted_translation_files += delete_translations_files(translation_files, csv_name) - else: - print_rich("[color=yellow]Failed to delete CSV file: " + csv_path + "[/color]") - - # Clean timelines. - for timeline_path: String in DialogicResourceUtil.list_resources_of_type(".dtl"): - - # Process the timeline. - var timeline: DialogicTimeline = load(timeline_path) - timeline.process() - cleaned_timelines += 1 - - # Remove event translation IDs. - for event: DialogicEvent in timeline.events: - - if event._translation_id and not event._translation_id.is_empty(): - event.remove_translation_id() - event.update_text_version() - cleaned_events += 1 - - if "character" in event: - # Remove character translation IDs. - var character: DialogicCharacter = event.character - - if character != null and not character._translation_id.is_empty(): - character.remove_translation_id() - cleaned_characters += 1 - - timeline.set_meta("timeline_not_saved", true) - ResourceSaver.save(timeline, timeline_path) - - _erase_glossary_translation_ids() - _erase_character_name_translation_ids() - - ProjectSettings.set_setting('dialogic/translation/id_counter', 16) - ProjectSettings.set_setting('internationalization/locale/translations', PackedStringArray(translation_files)) - ProjectSettings.save() - - find_parent('EditorView').plugin_reference.get_editor_interface().get_resource_filesystem().scan_sources() - - var status_message := "Timelines cleaned {cleaned_timelines} - Events cleaned {cleaned_events} - Characters cleaned {cleaned_characters} - Glossaries cleaned {cleaned_glossaries} - - CSVs erased {erased_csv_files} - Translations erased {erased_translation_files}" - - var status_message_args := { - 'cleaned_timelines': cleaned_timelines, - 'cleaned_characters': cleaned_characters, - 'cleaned_events': cleaned_events, - 'cleaned_glossaries': cleaned_glossaries, - 'erased_csv_files': deleted_csv_files, - 'erased_translation_files': deleted_translation_files, - } - - _silently_open_timeline(current_timeline) - - # Trigger reimport. - find_parent('EditorView').plugin_reference.get_editor_interface().get_resource_filesystem().scan_sources() - - # Clear the internal settings. - ProjectSettings.clear('dialogic/translation/intern/save_mode') - ProjectSettings.clear('dialogic/translation/intern/file_mode') - ProjectSettings.clear('dialogic/translation/intern/translation_folder') - - _verify_translation_file() - %StatusMessage.text = status_message.format(status_message_args) - - -func _erase_glossary_translation_ids() -> void: - # Clean glossary. - var glossary_paths: Array = ProjectSettings.get_setting('dialogic/glossary/glossary_files', []) - - for glossary_path: String in glossary_paths: - var glossary: DialogicGlossary = load(glossary_path) - glossary.remove_translation_id() - glossary.remove_entry_translation_ids() - glossary.clear_translation_keys() - ResourceSaver.save(glossary, glossary_path) - print_rich("[color=green]Cleaned up glossary file: " + glossary_path + "[/color]") - - -func _erase_character_name_translation_ids() -> void: - for character_path: String in DialogicResourceUtil.list_resources_of_type('.dch'): - var character: DialogicCharacter = load(character_path) - - character.remove_translation_id() - ResourceSaver.save(character) - - -## Closes the current timeline in the Dialogic Editor and returns the timeline -## as a resource. -## If no timeline has been opened, returns null. -func _close_active_timeline() -> Resource: - var timeline_node: DialogicEditor = settings_editor.editors_manager.editors['Timeline']['node'] - # We will close this timeline to ensure it will properly update. - # By saving this reference, we can open it again. - var current_timeline := timeline_node.current_resource - # Clean the current editor, this will also close the timeline. - settings_editor.editors_manager.clear_editor(timeline_node) - - return current_timeline - - -## Opens the timeline resource into the Dialogic Editor. -## If the timeline is null, does nothing. -func _silently_open_timeline(timeline_to_open: Resource) -> void: - if timeline_to_open != null: - settings_editor.editors_manager.edit_resource(timeline_to_open, true, true) - - -## Checks [param locale] for unique locales that have not been added -## to the [_unique_locales] array yet. -func _collect_locale(locale: String) -> void: - if _unique_locales.has(locale): - return - - _unique_locales.append(locale) diff --git a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_translation.gd.uid b/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_translation.gd.uid deleted file mode 100644 index 76f5d8f..0000000 --- a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_translation.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b0bm772xo8n2j diff --git a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_translation.tscn b/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_translation.tscn deleted file mode 100644 index eadce4a..0000000 --- a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/settings_translation.tscn +++ /dev/null @@ -1,368 +0,0 @@ -[gd_scene load_steps=7 format=3 uid="uid://chpb1mj03xjxv"] - -[ext_resource type="Script" uid="uid://b0bm772xo8n2j" path="res://addons/dialogic/Editor/Settings/CoreSettingsPages/settings_translation.gd" id="1_dvmyi"] -[ext_resource type="PackedScene" uid="uid://dbpkta2tjsqim" path="res://addons/dialogic/Editor/Common/hint_tooltip_icon.tscn" id="2_k2lou"] -[ext_resource type="PackedScene" uid="uid://dpwhshre1n4t6" path="res://addons/dialogic/Editor/Events/Fields/field_options_dynamic.tscn" id="3_dq4j2"] -[ext_resource type="PackedScene" uid="uid://7mvxuaulctcq" path="res://addons/dialogic/Editor/Events/Fields/field_file.tscn" id="4_kvsma"] - -[sub_resource type="Image" id="Image_4jaem"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_xbph7"] -image = SubResource("Image_4jaem") - -[node name="Translations" type="VBoxContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_top = -101.0 -offset_bottom = 102.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("1_dvmyi") - -[node name="HBox" type="HBoxContainer" parent="."] -layout_mode = 2 - -[node name="Basics" type="VBoxContainer" parent="HBox"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="Title" type="Label" parent="HBox/Basics"] -layout_mode = 2 -theme_type_variation = &"DialogicSettingsSection" -text = "Basics" - -[node name="VBox4" type="HBoxContainer" parent="HBox/Basics"] -layout_mode = 2 - -[node name="Label" type="Label" parent="HBox/Basics/VBox4"] -layout_mode = 2 -text = "Enable translations" - -[node name="TransEnabled" type="CheckBox" parent="HBox/Basics/VBox4"] -unique_name_in_owner = true -layout_mode = 2 - -[node name="HSeparator5" type="VSeparator" parent="HBox"] -layout_mode = 2 - -[node name="Testing" type="VBoxContainer" parent="HBox"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="Title2" type="Label" parent="HBox/Testing"] -layout_mode = 2 -theme_type_variation = &"DialogicSettingsSection" -text = "Testing" - -[node name="VBox3" type="HBoxContainer" parent="HBox/Testing"] -layout_mode = 2 - -[node name="Label3" type="Label" parent="HBox/Testing/VBox3"] -layout_mode = 2 -text = "Testing locale" - -[node name="HintTooltip8" parent="HBox/Testing/VBox3" instance=ExtResource("2_k2lou")] -layout_mode = 2 -tooltip_text = "Change this locale to test your game in a different language (only in-editor). -Equivalent of the testing local project setting. " -texture = SubResource("ImageTexture_xbph7") -hint_text = "Change this locale to test your game in a different language (only in-editor). -Equivalent of the testing local project setting. - -Update dropdown list via \"Collect Translation\"." - -[node name="TestingLocale" parent="HBox/Testing/VBox3" instance=ExtResource("3_dq4j2")] -unique_name_in_owner = true -layout_mode = 2 - -[node name="HSeparator4" type="HSeparator" parent="."] -layout_mode = 2 - -[node name="TranslationSettings" type="HBoxContainer" parent="."] -unique_name_in_owner = true -layout_mode = 2 - -[node name="VBoxContainer" type="VBoxContainer" parent="TranslationSettings"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="SettingsTitle" type="Label" parent="TranslationSettings/VBoxContainer"] -layout_mode = 2 -theme_type_variation = &"DialogicSettingsSection" -text = "Settings" - -[node name="Grid" type="GridContainer" parent="TranslationSettings/VBoxContainer"] -layout_mode = 2 -columns = 2 - -[node name="VBox" type="HBoxContainer" parent="TranslationSettings/VBoxContainer/Grid"] -layout_mode = 2 - -[node name="Label3" type="Label" parent="TranslationSettings/VBoxContainer/Grid/VBox"] -layout_mode = 2 -text = "Default locale" - -[node name="HintTooltip" parent="TranslationSettings/VBoxContainer/Grid/VBox" instance=ExtResource("2_k2lou")] -layout_mode = 2 -tooltip_text = "The locale of the language your timelines are written in." -texture = SubResource("ImageTexture_xbph7") -hint_text = "The locale of the language your timelines are written in." - -[node name="OrigLocale" parent="TranslationSettings/VBoxContainer/Grid" instance=ExtResource("3_dq4j2")] -unique_name_in_owner = true -layout_mode = 2 - -[node name="TransFile" type="HBoxContainer" parent="TranslationSettings/VBoxContainer/Grid"] -layout_mode = 2 - -[node name="Label" type="Label" parent="TranslationSettings/VBoxContainer/Grid/TransFile"] -layout_mode = 2 -text = "Translation folder" - -[node name="HintTooltip3" parent="TranslationSettings/VBoxContainer/Grid/TransFile" instance=ExtResource("2_k2lou")] -layout_mode = 2 -tooltip_text = "Choose a folder to let Dialogic save CSV files in. -Also used when saving \"Inside Translation Folder\"" -texture = SubResource("ImageTexture_xbph7") -hint_text = "Choose a folder to let Dialogic save CSV files in. -Also used when saving \"Inside Translation Folder\"" - -[node name="TransFolderPicker" parent="TranslationSettings/VBoxContainer/Grid" instance=ExtResource("4_kvsma")] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -file_mode = 2 - -[node name="VBox2" type="HBoxContainer" parent="TranslationSettings/VBoxContainer/Grid"] -layout_mode = 2 - -[node name="OutputModeLabel" type="Label" parent="TranslationSettings/VBoxContainer/Grid/VBox2"] -layout_mode = 2 -text = "Output mode" - -[node name="OutputModeTooltip" parent="TranslationSettings/VBoxContainer/Grid/VBox2" instance=ExtResource("2_k2lou")] -layout_mode = 2 -tooltip_text = "Decides how many CSV files will be created. - -• \"Per Type\": Uses one CSV file for each type of resource: Timelines, characters, and glossaries. -For example, 10 timelines will be combined into 1 CSV file. - -• \"Per File\": Uses one CSV file for each resource file. -For example, 10 timelines will result in 10 CSV files. - -The \"Per File\" option utilises \"Output location\", in contrast, the \"Per Type\" will always use the Translation folder." -texture = SubResource("ImageTexture_xbph7") -hint_text = "Decides how many CSV files will be created. - -• \"Per Type\": Uses one CSV file for each type of resource: Timelines, characters, and glossaries. -For example, 10 timelines will be combined into 1 CSV file. - -• \"Per File\": Uses one CSV file for each resource file. -For example, 10 timelines will result in 10 CSV files. - -The \"Per File\" option utilises \"Output location\", in contrast, the \"Per Type\" will always use the Translation folder." - -[node name="TransMode" type="OptionButton" parent="TranslationSettings/VBoxContainer/Grid"] -unique_name_in_owner = true -layout_mode = 2 -item_count = 2 -selected = 0 -popup/item_0/text = "Per Type" -popup/item_0/id = 0 -popup/item_1/text = "Per File" -popup/item_1/id = 1 - -[node name="OutputLocation" type="HBoxContainer" parent="TranslationSettings/VBoxContainer/Grid"] -layout_mode = 2 - -[node name="OutputLocationLabel" type="Label" parent="TranslationSettings/VBoxContainer/Grid/OutputLocation"] -layout_mode = 2 -text = "Output location" - -[node name="OutputLocationTooltip" parent="TranslationSettings/VBoxContainer/Grid/OutputLocation" instance=ExtResource("2_k2lou")] -layout_mode = 2 -tooltip_text = "Decides where to save the generated CSV files. - -• \"Inside Translation Folder\": Uses the \"Translation folder\". - -• \"Next To Timeline\": Places them in the resource type's folder. - -This button requires the \"Per File\" Output mode. -A resource type can be: Timelines, characters, and glossaries." -texture = SubResource("ImageTexture_xbph7") -hint_text = "Decides where to save the generated CSV files. - -• \"Inside Translation Folder\": Uses the \"Translation folder\". - -• \"Next To Timeline\": Places them in the resource type's folder. - -This button requires the \"Per File\" Output mode. -A resource type can be: Timelines, characters, and glossaries." - -[node name="SaveLocationMode" type="OptionButton" parent="TranslationSettings/VBoxContainer/Grid"] -unique_name_in_owner = true -layout_mode = 2 -disabled = true -item_count = 2 -selected = 0 -popup/item_0/text = "Inside Translation Folder" -popup/item_0/id = 0 -popup/item_1/text = "Next to File" -popup/item_1/id = 1 - -[node name="Control" type="Control" parent="TranslationSettings/VBoxContainer/Grid"] -visible = false -layout_mode = 2 - -[node name="AddSeparatorHBox" type="HBoxContainer" parent="TranslationSettings/VBoxContainer/Grid"] -layout_mode = 2 - -[node name="AddSeparatorLabel" type="Label" parent="TranslationSettings/VBoxContainer/Grid/AddSeparatorHBox"] -layout_mode = 2 -text = "Add Separator Lines" - -[node name="HintAddSeparatorEnabled" parent="TranslationSettings/VBoxContainer/Grid/AddSeparatorHBox" instance=ExtResource("2_k2lou")] -layout_mode = 2 -tooltip_text = "Adds an empty line into per-project CSVs to differentiate between sections. - -For example, when a new glossary item or timeline starts, an empty line will be added." -texture = SubResource("ImageTexture_xbph7") -hint_text = "Adds an empty line into per-project CSVs to differentiate between sections. - -For example, when a new glossary item or timeline starts, an empty line will be added." - -[node name="AddSeparatorEnabled" type="CheckBox" parent="TranslationSettings/VBoxContainer/Grid"] -unique_name_in_owner = true -layout_mode = 2 - -[node name="HSeparator6" type="VSeparator" parent="TranslationSettings"] -layout_mode = 2 - -[node name="VBoxContainer2" type="VBoxContainer" parent="TranslationSettings"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="HBoxContainer" type="HBoxContainer" parent="TranslationSettings/VBoxContainer2"] -layout_mode = 2 - -[node name="Title3" type="Label" parent="TranslationSettings/VBoxContainer2/HBoxContainer"] -layout_mode = 2 -theme_type_variation = &"DialogicSettingsSection" -text = "Actions" - -[node name="Actions" type="GridContainer" parent="TranslationSettings/VBoxContainer2"] -layout_mode = 2 -columns = 2 - -[node name="UpdateCsvFiles" type="Button" parent="TranslationSettings/VBoxContainer2/Actions"] -unique_name_in_owner = true -layout_mode = 2 -disabled = true -text = "Update CSV files" -icon = SubResource("ImageTexture_xbph7") - -[node name="HintTooltip5" parent="TranslationSettings/VBoxContainer2/Actions" instance=ExtResource("2_k2lou")] -layout_mode = 2 -tooltip_text = "This button will scan all timelines and generate or update their CSV files. - -A Dialogic CSV file will be prefixed with \"dialogic_\". - -This action will be disabled if the \"Translation folder\" is missing or has an invalid path." -texture = SubResource("ImageTexture_xbph7") -hint_text = "This button will scan all timelines and generate or update their CSV files. - -A Dialogic CSV file will be prefixed with \"dialogic_\". - -This action will be disabled if the \"Translation folder\" is missing or has an invalid path." - -[node name="CollectTranslations" type="Button" parent="TranslationSettings/VBoxContainer2/Actions"] -unique_name_in_owner = true -layout_mode = 2 -text = "Collect translations" -icon = SubResource("ImageTexture_xbph7") - -[node name="HintTooltip6" parent="TranslationSettings/VBoxContainer2/Actions" instance=ExtResource("2_k2lou")] -layout_mode = 2 -tooltip_text = "Godot imports CSV files as \".translation\" files. -This buttons adds them to \"Project Settings -> Localization\". -" -texture = SubResource("ImageTexture_xbph7") -hint_text = "Godot imports CSV files as \".translation\" files. -This buttons adds them to \"Project Settings -> Localization\". -" - -[node name="AspectRatioContainer2" type="AspectRatioContainer" parent="TranslationSettings/VBoxContainer2/Actions"] -custom_minimum_size = Vector2(0, 31) -layout_mode = 2 - -[node name="AspectRatioContainer" type="AspectRatioContainer" parent="TranslationSettings/VBoxContainer2/Actions"] -custom_minimum_size = Vector2(0, 31) -layout_mode = 2 - -[node name="TransRemove" type="Button" parent="TranslationSettings/VBoxContainer2/Actions"] -unique_name_in_owner = true -layout_mode = 2 -text = "Remove translations" -icon = SubResource("ImageTexture_xbph7") - -[node name="HintTooltip7" parent="TranslationSettings/VBoxContainer2/Actions" instance=ExtResource("2_k2lou")] -layout_mode = 2 -tooltip_text = "Be very careful with this button! - -It will try to delete any \".csv\" and \".translation\" files that are related to Dialogic. -CSV and translation files prefixed with \"dialogic_\" are treated as Dialogic-related. - -Removes translation IDs (eg. #id:33) from timelines and characters." -texture = SubResource("ImageTexture_xbph7") -hint_text = "Be very careful with this button! - -It will try to delete any \".csv\" and \".translation\" files that are related to Dialogic. -CSV and translation files prefixed with \"dialogic_\" are treated as Dialogic-related. - -Removes translation IDs (eg. #id:33) from timelines and characters." - -[node name="StatusMessage" type="Label" parent="TranslationSettings/VBoxContainer2"] -unique_name_in_owner = true -layout_mode = 2 -text = "⛔ Requires valid translation folder to translate character names and the project CSV file." -autowrap_mode = 3 - -[node name="UpdateConfirmationDialog" type="ConfirmationDialog" parent="."] -unique_name_in_owner = true -title = "Please Decide..." -size = Vector2i(490, 200) -ok_button_text = "Delete old & Generate new" -dialog_text = "You have previously generated CSVs and translation files with different Translation Settings! - -Please consider to delete the old CSVs and then generate new changes." -dialog_autowrap = true - -[node name="EraseConfirmationDialog" type="ConfirmationDialog" parent="."] -unique_name_in_owner = true -position = Vector2i(0, 36) -size = Vector2i(500, 280) -min_size = Vector2i(300, 70) -ok_button_text = "DELETE ALL" -dialog_text = "You are about to: -- Delete all CSVs prefixed with \"dialogic_\". -- Delete the related CSV import files. -- Delete the related translation files. -- Remove translation IDs from timelines and characters. -- Remove all \"dialogic\" prefixed translations from \"Project Settings -> Localization\". -- Remove the \"_translation_keys\" and \"entries\" starting with \"Glossary/\"." -dialog_autowrap = true - -[node name="AspectRatioContainer" type="AspectRatioContainer" parent="."] -custom_minimum_size = Vector2(0, 31) -layout_mode = 2 - -[connection signal="confirmed" from="UpdateConfirmationDialog" to="." method="_delete_and_update"] -[connection signal="confirmed" from="EraseConfirmationDialog" to="." method="erase_translations"] diff --git a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/tool_resave.gd b/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/tool_resave.gd deleted file mode 100644 index 03200bb..0000000 --- a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/tool_resave.gd +++ /dev/null @@ -1,32 +0,0 @@ -@tool -extends Node - -@onready var ToolUtil := get_parent() - -var button_text := "Resave all timelines" -var tooltip := "Opens and resaves all timelines. This can be useful if an update introduced a syntax change." -var method := resave_tool - - -func resave_tool() -> void: - ToolUtil.tool_progress_mutex.lock() - ToolUtil.tool_progress = 0 - ToolUtil.tool_progress_mutex.unlock() - - var index := 0 - var timelines := DialogicResourceUtil.get_timeline_directory() - for timeline_identifier in timelines: - var timeline := DialogicResourceUtil.get_timeline_resource(timeline_identifier) - await timeline.process() - timeline.set_meta("timeline_not_saved", true) - ResourceSaver.save(timeline) - - ToolUtil.tool_progress_mutex.lock() - ToolUtil.tool_progress = 1.0/len(timelines)*index - ToolUtil.tool_progress_mutex.unlock() - - index += 1 - - ToolUtil.tool_progress_mutex.lock() - ToolUtil.tool_progress = 1 - ToolUtil.tool_progress_mutex.unlock() diff --git a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/tool_resave.gd.uid b/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/tool_resave.gd.uid deleted file mode 100644 index 738db88..0000000 --- a/godot/addons/dialogic/Editor/Settings/CoreSettingsPages/tool_resave.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://vg4wbm0n64ws diff --git a/godot/addons/dialogic/Editor/Settings/HintLabelStylingScript.gd b/godot/addons/dialogic/Editor/Settings/HintLabelStylingScript.gd deleted file mode 100644 index f5f11e3..0000000 --- a/godot/addons/dialogic/Editor/Settings/HintLabelStylingScript.gd +++ /dev/null @@ -1,13 +0,0 @@ -@tool -extends Label - -# Called when the node enters the scene tree for the first time. -func _ready() -> void: - # don't load the label settings when opening as a scene - # prevents HUGE diffs - if owner.get_parent() is SubViewport: - return - label_settings = LabelSettings.new() - label_settings.font = get_theme_font("doc_italic", "EditorFonts") - label_settings.font_size = get_theme_font_size('font_size', 'Label') - label_settings.font_color = get_theme_color("accent_color", "Editor") diff --git a/godot/addons/dialogic/Editor/Settings/HintLabelStylingScript.gd.uid b/godot/addons/dialogic/Editor/Settings/HintLabelStylingScript.gd.uid deleted file mode 100644 index 37185c9..0000000 --- a/godot/addons/dialogic/Editor/Settings/HintLabelStylingScript.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dhl3w5a4mujud diff --git a/godot/addons/dialogic/Editor/Settings/settings_editor.gd b/godot/addons/dialogic/Editor/Settings/settings_editor.gd deleted file mode 100644 index 0e01464..0000000 --- a/godot/addons/dialogic/Editor/Settings/settings_editor.gd +++ /dev/null @@ -1,169 +0,0 @@ -@tool -extends DialogicEditor - -## Editor that contains all settings - -var button_group := ButtonGroup.new() -var registered_sections: Array[DialogicSettingsPage] = [] - - -func _get_title() -> String: - return "Settings" - - -func _get_icon() -> Texture: - return get_theme_icon("PluginScript", "EditorIcons") - - -func _register() -> void: - editors_manager.register_simple_editor(self) - self.alternative_text = "Customize dialogic and it's behaviour" - - -func _ready() -> void: - if get_parent() is SubViewport: - return - - register_settings_section("res://addons/dialogic/Editor/Settings/CoreSettingsPages/settings_general.tscn") - register_settings_section("res://addons/dialogic/Editor/Settings/CoreSettingsPages/settings_editor.tscn") - register_settings_section("res://addons/dialogic/Editor/Settings/CoreSettingsPages/settings_translation.tscn") - register_settings_section("res://addons/dialogic/Editor/Settings/CoreSettingsPages/settings_modules.tscn") - - for indexer in DialogicUtil.get_indexers(): - for settings_page in indexer._get_settings_pages(): - register_settings_section(settings_page) - - add_registered_sections() - %SettingsTabs.get_child(0).button_pressed = true - %SettingsContent.get_child(0).show() - - -func register_settings_section(path:String) -> void: - var section: Control = load(path).instantiate() - registered_sections.append(section) - - -func add_registered_sections() -> void: - for i in %SettingsTabs.get_children(): - i.queue_free() - for i in %FeatureTabs.get_children(): - i.queue_free() - - for i in %SettingsContent.get_children(): - i.queue_free() - - - registered_sections.sort_custom(section_sort) - for section in registered_sections: - - section.name = section._get_title() - - var vbox := VBoxContainer.new() - vbox.set_meta('section', section) - vbox.size_flags_vertical = Control.SIZE_EXPAND_FILL - vbox.name = section.name - var hbox := HBoxContainer.new() - - var title := Label.new() - title.text = section.name - title.theme_type_variation = 'DialogicSectionBig' - hbox.add_child(title) - vbox.add_child(hbox) - - - if !section.short_info.is_empty(): - var tooltip_hint: Control = load("res://addons/dialogic/Editor/Common/hint_tooltip_icon.tscn").instantiate() - tooltip_hint.hint_text = section.short_info - hbox.add_child(tooltip_hint) - - - var scroll := ScrollContainer.new() - scroll.size_flags_horizontal = Control.SIZE_EXPAND_FILL - scroll.size_flags_vertical = Control.SIZE_EXPAND_FILL - var inner_vbox := VBoxContainer.new() - inner_vbox.size_flags_horizontal = Control.SIZE_EXPAND_FILL - inner_vbox.size_flags_vertical = Control.SIZE_EXPAND_FILL - scroll.add_child(inner_vbox) - var panel := PanelContainer.new() - panel.theme_type_variation = "DialogicPanelA" - panel.size_flags_horizontal = Control.SIZE_EXPAND_FILL - if section.size_flags_vertical == Control.SIZE_EXPAND_FILL: - panel.size_flags_vertical = Control.SIZE_EXPAND_FILL - inner_vbox.add_child(panel) - - - var info_section: Control = section._get_info_section() - if info_section != null: - inner_vbox.add_child(Control.new()) - inner_vbox.get_child(-1).custom_minimum_size.y = 50 - - inner_vbox.add_child(title.duplicate()) - inner_vbox.get_child(-1).text = "Information" - var info_panel := panel.duplicate() - info_panel.theme_type_variation = "DialogicPanelDarkA" - - inner_vbox.add_child(info_panel) - info_section.get_parent().remove_child(info_section) - info_panel.add_child(info_section) - - panel.add_child(section) - vbox.add_child(scroll) - - - var button := Button.new() - button.text = " "+section.name - button.tooltip_text = section.name - button.toggle_mode = true - button.button_group = button_group - button.expand_icon = true - button.alignment = HORIZONTAL_ALIGNMENT_LEFT - button.flat = true - button.add_theme_color_override('font_pressed_color', get_theme_color("property_color_z", "Editor")) - button.add_theme_color_override('font_hover_color', get_theme_color('warning_color', 'Editor')) - button.add_theme_color_override('font_focus_color', get_theme_color('warning_color', 'Editor')) - button.add_theme_stylebox_override('focus', StyleBoxEmpty.new()) - button.pressed.connect(open_tab.bind(vbox)) - if section._is_feature_tab(): - %FeatureTabs.add_child(button) - else: - %SettingsTabs.add_child(button) - - vbox.hide() -# if section.has_method('_get_icon'): -# icon.texture = section._get_icon() - %SettingsContent.add_child(vbox) - - -func open_tab(tab_to_show:Control) -> void: - for tab in %SettingsContent.get_children(): - tab.hide() - - tab_to_show.show() - - -func section_sort(item1:DialogicSettingsPage, item2:DialogicSettingsPage) -> bool: - if !item1._is_feature_tab() and item2._is_feature_tab(): - return true - if item1._get_priority() > item2._get_priority(): - return true - return false - - - -func _open(extra_information:Variant = null) -> void: - refresh() - if typeof(extra_information) == TYPE_STRING: - if %SettingsContent.has_node(extra_information): - open_tab(%SettingsContent.get_node(extra_information)) - - -func _close() -> void: - for child in %SettingsContent.get_children(): - if child.get_meta('section').has_method('_about_to_close'): - child.get_meta('section')._about_to_close() - - -func refresh() -> void: - for child in %SettingsContent.get_children(): - if child.get_meta('section').has_method('_refresh'): - child.get_meta('section')._refresh() diff --git a/godot/addons/dialogic/Editor/Settings/settings_editor.gd.uid b/godot/addons/dialogic/Editor/Settings/settings_editor.gd.uid deleted file mode 100644 index 69a43aa..0000000 --- a/godot/addons/dialogic/Editor/Settings/settings_editor.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c1virlyy8gl7 diff --git a/godot/addons/dialogic/Editor/Settings/settings_editor.tscn b/godot/addons/dialogic/Editor/Settings/settings_editor.tscn deleted file mode 100644 index c7ed7a3..0000000 --- a/godot/addons/dialogic/Editor/Settings/settings_editor.tscn +++ /dev/null @@ -1,59 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://dganirw26brfb"] - -[ext_resource type="Script" uid="uid://c1virlyy8gl7" path="res://addons/dialogic/Editor/Settings/settings_editor.gd" id="1"] - -[node name="Settings" type="HSplitContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -script = ExtResource("1") - -[node name="TabList" type="ScrollContainer" parent="."] -layout_mode = 2 -horizontal_scroll_mode = 0 - -[node name="Margin" type="MarginContainer" parent="TabList"] -layout_mode = 2 -theme_override_constants/margin_top = 3 - -[node name="VBox" type="VBoxContainer" parent="TabList/Margin"] -layout_mode = 2 -theme_override_constants/separation = 0 - -[node name="Title" type="Label" parent="TabList/Margin/VBox"] -layout_mode = 2 -theme_type_variation = &"DialogicSection" -text = "Settings" - -[node name="SettingsTabs" type="VBoxContainer" parent="TabList/Margin/VBox"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_constants/separation = 0 - -[node name="Control" type="Control" parent="TabList/Margin/VBox"] -custom_minimum_size = Vector2(0, 30) -layout_mode = 2 - -[node name="Title2" type="Label" parent="TabList/Margin/VBox"] -layout_mode = 2 -theme_type_variation = &"DialogicSection" -text = "Features" - -[node name="FeatureTabs" type="VBoxContainer" parent="TabList/Margin/VBox"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_constants/separation = 0 - -[node name="SettingsContent" type="VBoxContainer" parent="."] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 diff --git a/godot/addons/dialogic/Editor/Settings/settings_page.gd b/godot/addons/dialogic/Editor/Settings/settings_page.gd deleted file mode 100644 index 06c1b78..0000000 --- a/godot/addons/dialogic/Editor/Settings/settings_page.gd +++ /dev/null @@ -1,36 +0,0 @@ -@tool -extends Control -class_name DialogicSettingsPage - -@export_multiline var short_info := "" -@onready var settings_editor: Control = find_parent('Settings') - -## Called to get the title of the page -func _get_title() -> String: - return name - - -## Called to get the ordering of the page -func _get_priority() -> int: - return 0 - - -## Called to know whether to put this in the features section -func _is_feature_tab() -> bool: - return false - - -## Called when the settings editor is opened -func _refresh() -> void: - pass - - -## Called before the settings editor closes (another editor is opened) -## Can be used to safe stuff -func _about_to_close() -> void: - pass - - -## Return a section with information. -func _get_info_section() -> Control: - return null diff --git a/godot/addons/dialogic/Editor/Settings/settings_page.gd.uid b/godot/addons/dialogic/Editor/Settings/settings_page.gd.uid deleted file mode 100644 index cf365d6..0000000 --- a/godot/addons/dialogic/Editor/Settings/settings_page.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://be8xcha2jwdur diff --git a/godot/addons/dialogic/Editor/Theme/MainTheme.tres b/godot/addons/dialogic/Editor/Theme/MainTheme.tres deleted file mode 100644 index bd77e0f..0000000 --- a/godot/addons/dialogic/Editor/Theme/MainTheme.tres +++ /dev/null @@ -1,3 +0,0 @@ -[gd_resource type="Theme" format=3 uid="uid://cqst728xxipcw"] - -[resource] diff --git a/godot/addons/dialogic/Editor/Theme/PickerTheme.tres b/godot/addons/dialogic/Editor/Theme/PickerTheme.tres deleted file mode 100644 index 36b1955..0000000 --- a/godot/addons/dialogic/Editor/Theme/PickerTheme.tres +++ /dev/null @@ -1,7 +0,0 @@ -[gd_resource type="Theme" format=2] - -[resource] -Button/colors/font_color = Color( 1, 1, 1, 1 ) -Button/colors/font_color_disabled = Color( 0.901961, 0.901961, 0.901961, 0.2 ) -Button/colors/font_color_hover = Color( 0.870588, 0.870588, 0.870588, 1 ) -Button/colors/font_color_pressed = Color( 1, 1, 1, 1 ) diff --git a/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/CodeCompletionHelper.gd b/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/CodeCompletionHelper.gd deleted file mode 100644 index 2817951..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/CodeCompletionHelper.gd +++ /dev/null @@ -1,333 +0,0 @@ -@tool -extends Node - -enum Modes {TEXT_EVENT_ONLY, FULL_HIGHLIGHTING} - -var syntax_highlighter: SyntaxHighlighter = load("res://addons/dialogic/Editor/TimelineEditor/TextEditor/syntax_highlighter.gd").new() -var text_syntax_highlighter: SyntaxHighlighter = load("res://addons/dialogic/Editor/TimelineEditor/TextEditor/syntax_highlighter.gd").new() - - -# These RegEx's are used to deduce information from the current line for auto-completion - -# To find the currently typed word and the symbol before -var completion_word_regex := RegEx.new() -# To find the shortcode of the current shortcode event (basically the type) -var completion_shortcode_getter_regex := RegEx.new() -# To find the parameter name of the current if typing a value -var completion_shortcode_param_getter_regex := RegEx.new() -# To find the value of a paramater that is being typed -var completion_shortcode_value_regex := RegEx.new() - -# Stores references to all shortcode events for parameter and value suggestions -var shortcode_events := {} -var custom_syntax_events := [] -var text_event: DialogicTextEvent = null - - -func _ready() -> void: - # Compile RegEx's - completion_word_regex.compile(r"(?(\W)|^)(?[\w]*)\x{FFFF}") - completion_shortcode_getter_regex.compile("\\[(?\\w*)") - completion_shortcode_param_getter_regex.compile("(?\\w*)\\W*=\\s*\"?(\\w|\\s)*"+String.chr(0xFFFF)) - completion_shortcode_value_regex.compile(r'(\[|\s)[^\[\s=]*="(?[^"$]*)'+String.chr(0xFFFF)) - - text_syntax_highlighter.mode = text_syntax_highlighter.Modes.TEXT_EVENT_ONLY - -#region AUTO COMPLETION -################################################################################ - -# Helper that gets the current line with a special character where the caret is -func get_code_completion_line(text:CodeEdit) -> String: - return text.get_line(text.get_caret_line()).insert(text.get_caret_column(), String.chr(0xFFFF)).strip_edges() - - -# Helper that gets the currently typed word -func get_code_completion_word(text:CodeEdit) -> String: - var result := completion_word_regex.search(get_code_completion_line(text)) - return result.get_string('word') if result else "" - -# Helper that gets the currently typed parameter -func get_code_completion_parameter_value(text:CodeEdit) -> String: - var result := completion_shortcode_value_regex.search(get_code_completion_line(text)) - return result.get_string('value') if result else "" - - -# Helper that gets the symbol before the current word -func get_code_completion_prev_symbol(text:CodeEdit) -> String: - var result := completion_word_regex.search(get_code_completion_line(text)) - return result.get_string('s') if result else "" - - -func get_line_untill_caret(line:String) -> String: - return line.substr(0, line.find(String.chr(0xFFFF))) - - -# Called if something was typed -# Adds all kinds of options depending on the -# content of the current line, the last word and the symbol that came before -# Triggers opening of the popup -func request_code_completion(force:bool, text:CodeEdit, mode:=Modes.FULL_HIGHLIGHTING) -> void: - ## TODO remove this once https://github.com/godotengine/godot/issues/38560 is fixed - if mode != Modes.FULL_HIGHLIGHTING: - return - - # make sure shortcode event references are loaded - if mode == Modes.FULL_HIGHLIGHTING: - var hidden_events: Array = DialogicUtil.get_editor_setting('hidden_event_buttons', []) - if shortcode_events.is_empty(): - for event in DialogicResourceUtil.get_event_cache(): - if event.get_shortcode() != 'default_shortcode': - shortcode_events[event.get_shortcode()] = event - - else: - custom_syntax_events.append(event) - if event.event_name in hidden_events: - event.set_meta('hidden', true) - if event is DialogicTextEvent: - text_event = event - # this is done to force-load the text effects regex which is used below - event.load_text_effects() - - # fill helpers - var line := get_code_completion_line(text) - var word := get_code_completion_word(text) - var symbol := get_code_completion_prev_symbol(text) - var line_part := get_line_untill_caret(line) - - ## Note on use of KIND types for options. - # These types are mostly useless for us. - # However I decidede to assign some special cases for them: - # - KIND_PLAIN_TEXT is only shown if the beginnging of the option is already typed - # !word.is_empty() and option.begins_with(word) - # - KIND_CLASS is only shown if anything from the options is already typed - # !word.is_empty() and word in option - # - KIND_CONSTANT is shown and checked against the beginning - # option.begins_with(word) - # - KIND_MEMBER is shown and searched completely - # word in option - - ## Note on VALUE key - # The value key is used to store a potential closing string for the completion. - # The completion will check if the string is already present and add it otherwise. - - # Shortcode event suggestions - if mode == Modes.FULL_HIGHLIGHTING and syntax_highlighter.line_is_shortcode_event(text.get_caret_line()): - if symbol == '[': - # suggest shortcodes if a shortcode event has just begun - var shortcodes := shortcode_events.keys() - shortcodes.sort() - for shortcode in shortcodes: - if shortcode_events[shortcode].get_meta('hidden', false): - continue - if shortcode_events[shortcode].get_shortcode_parameters().is_empty(): - text.add_code_completion_option(CodeEdit.KIND_MEMBER, shortcode, shortcode, shortcode_events[shortcode].event_color.lerp(syntax_highlighter.normal_color, 0.3), shortcode_events[shortcode]._get_icon()) - else: - text.add_code_completion_option(CodeEdit.KIND_MEMBER, shortcode, shortcode+" ", shortcode_events[shortcode].event_color.lerp(syntax_highlighter.normal_color, 0.3), shortcode_events[shortcode]._get_icon()) - else: - var full_event_text: String = syntax_highlighter.get_full_event(text.get_caret_line()) - var current_shortcode := completion_shortcode_getter_regex.search(full_event_text) - if !current_shortcode: - text.update_code_completion_options(false) - return - - var code := current_shortcode.get_string('code') - if !code in shortcode_events.keys(): - text.update_code_completion_options(false) - return - - # suggest parameters - if symbol == ' ' and line.count('"')%2 == 0: - var parameters: Array = shortcode_events[code].get_shortcode_parameters().keys() - for param in parameters: - if !param+'=' in full_event_text: - text.add_code_completion_option(CodeEdit.KIND_MEMBER, param, param+'="' , shortcode_events[code].event_color.lerp(syntax_highlighter.normal_color, 0.3), text.get_theme_icon("MemberProperty", "EditorIcons")) - - # suggest values - elif symbol == '=' or symbol == '"': - suggest_shortcode_values(text, shortcode_events[code], line, word) - text.update_code_completion_options(true) - return - - # Force update and showing of the popup - text.update_code_completion_options(true) - return - - - for event in custom_syntax_events: - if mode == Modes.TEXT_EVENT_ONLY and !event is DialogicTextEvent: - continue - - if not ' ' in line_part: - event._get_start_code_completion(self, text) - - if event.is_valid_event(line): - event._get_code_completion(self, text, line, word, symbol) - break - - # Force update and showing of the popup - text.update_code_completion_options(true) - - # USEFUL FOR DEBUGGING - #print(text.get_code_completion_options().map(func(x):return "{display_text}".format(x))) - - - -# Helper that adds all characters as options -func suggest_characters(text:CodeEdit, type := CodeEdit.KIND_MEMBER, event:DialogicEvent=null) -> void: - for character in DialogicResourceUtil.get_character_directory(): - var result: String = character - if " " in character: - result = '"'+character+'"' - if event and event is DialogicTextEvent and load(DialogicResourceUtil.get_character_directory()[character]).portraits.is_empty(): - result += ': ' - elif event and event is DialogicCharacterEvent: - result += " " - text.add_code_completion_option(type, character, result, syntax_highlighter.character_name_color, load("res://addons/dialogic/Editor/Images/Resources/character.svg")) - -# Helper that adds all timelines as options -func suggest_timelines(text:CodeEdit, type := CodeEdit.KIND_MEMBER, color:=Color()) -> void: - for timeline in DialogicResourceUtil.get_timeline_directory(): - text.add_code_completion_option(type, timeline, timeline+'/', color, text.get_theme_icon("TripleBar", "EditorIcons")) - - -func suggest_labels(text:CodeEdit, timeline:String='', end:='', color:=Color()) -> void: - if timeline in DialogicResourceUtil.get_label_cache(): - for i in DialogicResourceUtil.get_label_cache()[timeline]: - text.add_code_completion_option(CodeEdit.KIND_MEMBER, i, i+end, color, load("res://addons/dialogic/Modules/Jump/icon_label.png")) - - -# Helper that adds all portraits of a given character as options -func suggest_portraits(text:CodeEdit, character_name:String, end_check:=')') -> void: - if not character_name in DialogicResourceUtil.get_character_directory(): - return - var character_resource: DialogicCharacter = load(DialogicResourceUtil.get_character_directory()[character_name]) - for portrait in character_resource.portraits: - text.add_code_completion_option(CodeEdit.KIND_MEMBER, portrait, portrait, syntax_highlighter.character_portrait_color, load("res://addons/dialogic/Editor/Images/Resources/character.svg"), end_check) - if character_resource.portraits.is_empty(): - text.add_code_completion_option(CodeEdit.KIND_MEMBER, 'Has no portraits!', '', syntax_highlighter.character_portrait_color, load("res://addons/dialogic/Editor/Images/Pieces/warning.svg")) - - -# Helper that adds all variable paths as options -func suggest_variables(text:CodeEdit): - for variable in DialogicUtil.list_variables(ProjectSettings.get_setting('dialogic/variables')): - text.add_code_completion_option(CodeEdit.KIND_MEMBER, variable, variable, syntax_highlighter.variable_color, text.get_theme_icon("MemberProperty", "EditorIcons"), '}') - - -# Helper that adds true and false as options -func suggest_bool(text:CodeEdit, color:Color): - text.add_code_completion_option(CodeEdit.KIND_VARIABLE, 'true', 'true', color, text.get_theme_icon("GuiChecked", "EditorIcons"), '" ') - text.add_code_completion_option(CodeEdit.KIND_VARIABLE, 'false', 'false', color, text.get_theme_icon("GuiUnchecked", "EditorIcons"), '" ') - - -func suggest_custom_suggestions(suggestions:Dictionary, text:CodeEdit, color:Color) -> void: - for key in suggestions.keys(): - if suggestions[key].has('text_alt'): - text.add_code_completion_option(CodeEdit.KIND_VARIABLE, key, suggestions[key].text_alt[0], color, suggestions[key].get('icon', null), '" ') - else: - text.add_code_completion_option(CodeEdit.KIND_VARIABLE, key, str(suggestions[key].value), color, suggestions[key].get('icon', null), '" ') - - -func suggest_shortcode_values(text:CodeEdit, event:DialogicEvent, line:String, word:String) -> void: - var current_parameter_gex := completion_shortcode_param_getter_regex.search(line) - if !current_parameter_gex: - return - - var current_parameter := current_parameter_gex.get_string('param') - if !event.get_shortcode_parameters().has(current_parameter): - return - if !event.get_shortcode_parameters()[current_parameter].has('suggestions'): - if typeof(event.get_shortcode_parameters()[current_parameter].default) == TYPE_BOOL: - suggest_bool(text, event.event_color.lerp(syntax_highlighter.normal_color, 0.3)) - elif len(word) > 0: - text.add_code_completion_option(CodeEdit.KIND_VARIABLE, word, word, event.event_color.lerp(syntax_highlighter.normal_color, 0.3), text.get_theme_icon("GuiScrollArrowRight", "EditorIcons"), '" ') - return - - var suggestions: Dictionary = event.get_shortcode_parameters()[current_parameter]['suggestions'].call() - suggest_custom_suggestions(suggestions, text, event.event_color.lerp(syntax_highlighter.normal_color, 0.3)) - - -## Filters the list of all possible options, depending on what was typed -## Purpose of the different Kinds is explained in [_request_code_completion] -func filter_code_completion_candidates(candidates:Array, text:CodeEdit) -> Array: - var valid_candidates := [] - - var current_word := get_code_completion_word(text) - for candidate in candidates: - if candidate.kind == text.KIND_PLAIN_TEXT: - if !current_word.is_empty() and candidate.insert_text.begins_with(current_word): - valid_candidates.append(candidate) - elif candidate.kind == text.KIND_MEMBER: - if current_word.is_empty() or current_word.to_lower() in candidate.insert_text.to_lower(): - valid_candidates.append(candidate) - elif candidate.kind == text.KIND_VARIABLE: - var current_param_value := get_code_completion_parameter_value(text) - if current_param_value.is_empty() or current_param_value.to_lower() in candidate.insert_text.to_lower(): - valid_candidates.append(candidate) - elif candidate.kind == text.KIND_CONSTANT: - if current_word.is_empty() or candidate.insert_text.begins_with(current_word): - valid_candidates.append(candidate) - elif candidate.kind == text.KIND_CLASS: - if !current_word.is_empty() and current_word.to_lower() in candidate.insert_text.to_lower(): - valid_candidates.append(candidate) - return valid_candidates - - -# Called when code completion was activated -# Inserts the selected item -func confirm_code_completion(replace:bool, text:CodeEdit) -> void: - # Note: I decided to ALWAYS use replace mode, as dialogic is supposed to be beginner friendly - - var code_completion := text.get_code_completion_option(text.get_code_completion_selected_index()) - - var word := get_code_completion_word(text) - if code_completion.kind == CodeEdit.KIND_VARIABLE: - word = get_code_completion_parameter_value(text) - - text.remove_text(text.get_caret_line(), text.get_caret_column()-len(word), text.get_caret_line(), text.get_caret_column()) - - # Something has changed between 4.2 and 4.3 - # Probably about how carets are reset when text is removed or idk. - # To keep compatibility with 4.2 for at least a while this should do the trick: - # TODO: Remove once compatibility for 4.2 is dropped. - if Engine.get_version_info().hex >= 0x040300: - text.set_caret_column(text.get_caret_column()) - else: - text.set_caret_column(text.get_caret_column()-len(word)) - - text.insert_text_at_caret(code_completion.insert_text) - - if code_completion.has('default_value') and typeof(code_completion['default_value']) == TYPE_STRING: - var next_letter := text.get_line(text.get_caret_line()).substr(text.get_caret_column(), len(code_completion['default_value'])) - if next_letter and (next_letter == code_completion['default_value'] or next_letter[0] == code_completion['default_value'][0]): - text.set_caret_column(text.get_caret_column()+1) - else: - text.insert_text_at_caret(code_completion['default_value']) - - -#endregion - -#region SYMBOL CLICKING -################################################################################ - -# Performs an action (like opening a link) when a valid symbol was clicked -func symbol_lookup(symbol:String, line:int, column:int) -> void: - if symbol in shortcode_events.keys(): - if !shortcode_events[symbol].help_page_path.is_empty(): - OS.shell_open(shortcode_events[symbol].help_page_path) - if symbol in DialogicResourceUtil.get_character_directory(): - EditorInterface.edit_resource(DialogicResourceUtil.get_resource_from_identifier(symbol, 'dch')) - if symbol in DialogicResourceUtil.get_timeline_directory(): - EditorInterface.edit_resource(DialogicResourceUtil.get_resource_from_identifier(symbol, 'dtl')) - - -# Called to test if a symbol can be clicked -func symbol_validate(symbol:String, text:CodeEdit) -> void: - if symbol in shortcode_events.keys(): - if !shortcode_events[symbol].help_page_path.is_empty(): - text.set_symbol_lookup_word_as_valid(true) - if symbol in DialogicResourceUtil.get_character_directory(): - text.set_symbol_lookup_word_as_valid(true) - if symbol in DialogicResourceUtil.get_timeline_directory(): - text.set_symbol_lookup_word_as_valid(true) - -#endregion diff --git a/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/CodeCompletionHelper.gd.uid b/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/CodeCompletionHelper.gd.uid deleted file mode 100644 index 9fd0176..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/CodeCompletionHelper.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://camdhr6iwaywr diff --git a/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/syntax_highlighter.gd b/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/syntax_highlighter.gd deleted file mode 100644 index 2e9ee90..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/syntax_highlighter.gd +++ /dev/null @@ -1,212 +0,0 @@ -@tool -extends SyntaxHighlighter - -## Syntax highlighter for the dialogic text timeline editor and text events in the visual editor. - -enum Modes {TEXT_EVENT_ONLY, FULL_HIGHLIGHTING} -var mode := Modes.FULL_HIGHLIGHTING - - -## RegEx's -var word_regex := RegEx.new() -var region_regex := RegEx.new() -var number_regex := RegEx.create_from_string(r"(\d|\.)+") -var shortcode_regex := RegEx.create_from_string(r'\W*\[(?\w*)(?([^\]"]|"[^"]*")*)?') -var shortcode_param_regex := RegEx.create_from_string(r'((?[^\s=]*)\s*=\s*"(?([^=]|\\=)*)(? void: - update_colors() - DialogicUtil.get_dialogic_plugin().get_editor_interface().get_base_control().theme_changed.connect(update_colors) - - -func update_colors() -> void: - if not DialogicUtil.get_dialogic_plugin(): - return - var editor_settings: EditorSettings = DialogicUtil.get_dialogic_plugin().get_editor_interface().get_editor_settings() - normal_color = editor_settings.get('text_editor/theme/highlighting/text_color') - translation_id_color = editor_settings.get('text_editor/theme/highlighting/comment_color') - - code_flow_color = editor_settings.get("text_editor/theme/highlighting/control_flow_keyword_color") - boolean_operator_color = code_flow_color.lightened(0.5) - variable_color = editor_settings.get('text_editor/theme/highlighting/engine_type_color') - string_color = editor_settings.get('text_editor/theme/highlighting/string_color') - character_name_color = editor_settings.get('text_editor/theme/highlighting/symbol_color').lerp(normal_color, 0.3) - character_portrait_color = character_name_color.lerp(normal_color, 0.5) - - -func _get_line_syntax_highlighting(line:int) -> Dictionary: - var str_line := get_text_edit().get_line(line) - - if shortcode_events.is_empty(): - for event in DialogicResourceUtil.get_event_cache(): - if event.get_shortcode() != 'default_shortcode': - shortcode_events[event.get_shortcode()] = event - else: - custom_syntax_events.append(event) - if event is DialogicTextEvent: - text_event = event - text_event.load_text_effects() - - var dict := {} - dict[0] = {'color':normal_color} - - dict = color_translation_id(dict, str_line) - - if mode == Modes.FULL_HIGHLIGHTING: - if line_is_shortcode_event(line): - var full_event := get_full_event(line) - var result := shortcode_regex.search(full_event) - if result: - if result.get_string('id') in shortcode_events: - if full_event.begins_with(str_line): - dict[result.get_start('id')] = {"color":shortcode_events[result.get_string('id')].event_color.lerp(normal_color, 0.4)} - dict[result.get_end('id')] = {"color":normal_color} - - if result.get_string('args'): - color_shortcode_content(dict, str_line, result.get_start('args'), result.get_end('args'), shortcode_events[result.get_string('id')].event_color) - else: - color_shortcode_content(dict, str_line, 0, 0, shortcode_events[result.get_string('id')].event_color) - return fix_dict(dict) - - else: - for event in custom_syntax_events: - if event.is_valid_event(str_line.strip_edges()): - dict = event._get_syntax_highlighting(self, dict, str_line) - return fix_dict(dict) - - else: - dict = text_event._get_syntax_highlighting(self, dict, str_line) - return fix_dict(dict) - - -func line_is_shortcode_event(line_idx:int) -> bool: - var str_line := get_text_edit().get_line(line_idx) - if text_event.text_effects_regex.search(str_line.get_slice(' ', 0)): - return false - - if str_line.strip_edges().begins_with("["): - return true - - if line_idx > 0 and get_text_edit().get_line(line_idx-1).ends_with('\\'): - return line_is_shortcode_event(line_idx-1) - - return false - - -func get_full_event(line_idx:int) -> String: - var str_line := get_text_edit().get_line(line_idx) - var offset := 1 - # Add previous lines - while get_text_edit().get_line(line_idx-offset).ends_with('\\'): - str_line = get_text_edit().get_line(line_idx-offset).trim_suffix('\\')+"\n"+str_line - offset += 1 - - # This is commented out, as it is not needed right now. - # However without it, this isn't actually the full event. - # Might need to be included some day. - #offset = 0 - ## Add following lines - #while get_text_edit().get_line(line_idx+offset).ends_with('\\'): - #str_line = str_line.trim_suffix('\\')+"\n"+get_text_edit().get_line(line_idx+offset) - #offset += 1 - - return str_line - -func fix_dict(dict:Dictionary) -> Dictionary: - var d := {} - var k := dict.keys() - k.sort() - for i in k: - d[i] = dict[i] - return d - - -func color_condition(dict:Dictionary, line:String, from:int = 0, to:int = 0) -> Dictionary: - dict = color_word(dict, code_flow_color, line, 'or', from, to) - dict = color_word(dict, code_flow_color, line, 'and', from, to) - dict = color_word(dict, code_flow_color, line, '==', from, to) - dict = color_word(dict, code_flow_color, line, '!=', from, to) - if !">=" in line: - dict = color_word(dict, code_flow_color, line, '>', from, to) - else: - dict = color_word(dict, code_flow_color, line, '>=', from, to) - if !"<=" in line: - dict = color_word(dict, code_flow_color, line, '<', from, to) - else: - dict = color_word(dict, code_flow_color, line, '<=', from, to) - dict = color_region(dict, variable_color, line, '{', '}', from, to) - dict = color_region(dict, string_color, line, '"', '"', from, to) - - - return dict - - -func color_translation_id(dict:Dictionary, line:String) -> Dictionary: - dict = color_region(dict, translation_id_color, line, '#id:', '') - return dict - - -func color_word(dict:Dictionary, color:Color, line:String, word:String, from:int= 0, to:int = 0) -> Dictionary: - word_regex.compile("\\W(?"+word+")\\W") - if to <= from: - to = len(line)-1 - for i in word_regex.search_all(line.substr(from, to-from+2)): - dict[i.get_start('word')+from] = {'color':color} - dict[i.get_end('word')+from] = {'color':normal_color} - return dict - - -func color_region(dict:Dictionary, color:Color, line:String, start:String, end:String, from:int = 0, to:int = 0, base_color:Color=normal_color) -> Dictionary: - if start in "()[].": - start = "\\"+start - if end in "()[].": - end = "\\"+end - - if end.is_empty(): - region_regex.compile(r"(? Dictionary: - if to <= from: - to = len(line)-1 - var args_result := shortcode_param_regex.search_all(line.substr(from, to-from+2)) - for x in args_result: - dict[x.get_start()+from] = {"color":base_color.lerp(normal_color, 0.5)} - dict[x.get_start('value')+from-1] = {"color":base_color.lerp(normal_color, 0.7)} - dict[x.get_end()+from] = {"color":normal_color} - return dict - - -func dict_get_color_at_column(dict:Dictionary, column:int) -> Color: - var prev_idx := -1 - for i in dict: - if i > prev_idx and i <= column: - prev_idx = i - if prev_idx != -1: - return dict[prev_idx].color - return normal_color diff --git a/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/syntax_highlighter.gd.uid b/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/syntax_highlighter.gd.uid deleted file mode 100644 index 158c9b9..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/syntax_highlighter.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bf2nivn8txcw5 diff --git a/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/timeline_editor_text.gd b/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/timeline_editor_text.gd deleted file mode 100644 index a49ed73..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/timeline_editor_text.gd +++ /dev/null @@ -1,362 +0,0 @@ -@tool -extends CodeEdit - -## Sub-Editor that allows editing timelines in a text format. - -@onready var timeline_editor := get_parent().get_parent() -@onready var code_completion_helper: Node = find_parent('EditorsManager').get_node('CodeCompletionHelper') - -var label_regex := RegEx.create_from_string('label +(?[^\n]+)') -var channel_regex := RegEx.create_from_string(r'audio +(?[\w-]{2,}|[\w]+)') - -func _ready() -> void: - await find_parent('EditorView').ready - syntax_highlighter = code_completion_helper.syntax_highlighter - timeline_editor.editors_manager.sidebar.content_item_activated.connect(_on_content_item_clicked) - - get_menu().add_icon_item(get_theme_icon("PlayStart", "EditorIcons"), "Play from here", 42) - get_menu().id_pressed.connect(_on_context_menu_id_pressed) - - -func _on_text_editor_text_changed() -> void: - timeline_editor.current_resource_state = DialogicEditor.ResourceStates.UNSAVED - request_code_completion(true) - $UpdateTimer.start() - - -func clear_timeline() -> void: - text = '' - update_content_list() - - -func load_timeline(timeline:DialogicTimeline) -> void: - clear_timeline() - - text = timeline.as_text() - - timeline_editor.current_resource.set_meta("timeline_not_saved", false) - clear_undo_history() - - await get_tree().process_frame - update_content_list() - - -func save_timeline() -> void: - if !timeline_editor.current_resource: - return - - var text_array: Array = text_timeline_to_array(text) - - timeline_editor.current_resource.events = text_array - timeline_editor.current_resource.events_processed = false - ResourceSaver.save(timeline_editor.current_resource, timeline_editor.current_resource.resource_path) - - timeline_editor.current_resource.set_meta("timeline_not_saved", false) - timeline_editor.current_resource_state = DialogicEditor.ResourceStates.SAVED - DialogicResourceUtil.update_directory('dtl') - - -func text_timeline_to_array(text:String) -> Array: - # Parse the lines down into an array - var events := [] - - var lines := text.split('\n', true) - var idx := -1 - - while idx < len(lines)-1: - idx += 1 - var line: String = lines[idx] - var line_stripped: String = line.strip_edges(true, true) - events.append(line) - - return events - - -################################################################################ -## HELPFUL EDITOR FUNCTIONALITY -################################################################################ - -func _on_context_menu_id_pressed(id:int) -> void: - if id == 42: - play_from_here() - - -func play_from_here() -> void: - timeline_editor.play_timeline(timeline_editor.current_resource.get_index_from_text_line(text, get_caret_line())) - - -func _gui_input(event): - if not event is InputEventKey: return - if not event.is_pressed(): return - match event.as_text(): - "Ctrl+K", "Ctrl+Slash": - toggle_comment() - # TODO clean this up when dropping 4.2 support - "Alt+Up": - if has_method("move_lines_up"): - call("move_lines_up") - "Alt+Down": - if has_method("move_lines_down"): - call("move_lines_down") - - "Ctrl+Shift+D", "Ctrl+D": - duplicate_lines() - - "Ctrl+F6" when OS.get_name() != "macOS": # Play from here - play_from_here() - "Ctrl+Shift+B" when OS.get_name() == "macOS": # Play from here - play_from_here() - "Enter": - if get_code_completion_options(): - return - for caret in range(get_caret_count()): - var line := get_line(get_caret_line(caret)).strip_edges() - var event_res := DialogicTimeline.event_from_string(line, DialogicResourceUtil.get_event_cache()) - var indent_format: String = timeline_editor.current_resource.indent_format - if event_res.can_contain_events: - insert_text_at_caret("\n"+indent_format.repeat(get_indent_level(get_caret_line(caret))/4+1), caret) - else: - insert_text_at_caret("\n"+indent_format.repeat(get_indent_level(get_caret_line(caret))/4), caret) - _: - return - get_viewport().set_input_as_handled() - - -# Toggle the selected lines as comments -func toggle_comment() -> void: - var cursor: Vector2 = Vector2(get_caret_column(), get_caret_line()) - var selection := Rect2i( - Vector2i(get_selection_line(), get_selection_column()), - # TODO When ditching godot 4.2, switch to this, the above methods have been deprecated in 4.3 - #Vector2i(get_selection_origin_line(), get_selection_origin_column()), - Vector2i(get_caret_line(), get_caret_column())) - var from: int = cursor.y - var to: int = cursor.y - if has_selection(): - from = get_selection_from_line() - to = get_selection_to_line() - - var lines: PackedStringArray = text.split("\n") - var will_comment: bool = false - for i in range(from, to+1): - if not lines[i].begins_with("#"): - will_comment = true - - for i in range(from, to + 1): - if will_comment: - lines[i] = "#" + lines[i] - else: - lines[i] = lines[i].trim_prefix("#") - - text = "\n".join(lines) - if will_comment: - cursor.x += 1 - selection.position.y += 1 - selection.size.y += 1 - else: - cursor.x -= 1 - selection.position.y -= 1 - selection.size.y -= 1 - select(selection.position.x, selection.position.y, selection.size.x, selection.size.y) - text_changed.emit() - - -## Allows dragging files into the editor -func _can_drop_data(at_position:Vector2, data:Variant) -> bool: - if typeof(data) == TYPE_DICTIONARY and 'files' in data.keys() and len(data.files) == 1: - return true - return false - - -## Allows dragging files into the editor -func _drop_data(at_position:Vector2, data:Variant) -> void: - if typeof(data) == TYPE_DICTIONARY and 'files' in data.keys() and len(data.files) == 1: - set_caret_column(get_line_column_at_pos(at_position).x) - set_caret_line(get_line_column_at_pos(at_position).y) - var result: String = data.files[0] - var line := get_line(get_caret_line()) - if line[get_caret_column()-1] != '"': - result = '"'+result - if line.length() == get_caret_column() or line[get_caret_column()] != '"': - result = result+'"' - - insert_text_at_caret(result) - grab_focus() - - -func _on_update_timer_timeout() -> void: - update_content_list() - - -func update_content_list() -> void: - var labels: PackedStringArray = [] - for i in label_regex.search_all(text): - labels.append(i.get_string('name')) - timeline_editor.editors_manager.sidebar.update_content_list(labels) - - var channels: PackedStringArray = [] - for i in channel_regex.search_all(text): - channels.append(i.get_string('channel')) - timeline_editor.update_audio_channel_cache(channels) - - -func _on_content_item_clicked(label:String) -> void: - if label == "~ Top": - set_caret_line(0) - set_caret_column(0) - adjust_viewport_to_caret() - return - - for i in label_regex.search_all(text): - if i.get_string('name') == label: - set_caret_column(0) - set_caret_line(text.count('\n', 0, i.get_start()+1)) - center_viewport_to_caret() - return - - -func _search_timeline(search_text:String, match_case := false, whole_words := false) -> bool: - var flags := 0 - if match_case: - flags = flags | SEARCH_MATCH_CASE - if whole_words: - flags = flags | SEARCH_WHOLE_WORDS - set_meta("current_search", search_text) - set_meta("current_search_flags", flags) - - set_search_text(search_text) - set_search_flags(flags) - queue_redraw() - - var result := search(search_text, flags, get_selection_from_line(), get_selection_from_column()) - if result.y != -1: - select.call_deferred(result.y, result.x, result.y, result.x + search_text.length()) - return result.y != -1 - - -func _search_navigate_down() -> void: - search_navigate(false) - - -func _search_navigate_up() -> void: - search_navigate(true) - - -func search_navigate(navigate_up := false) -> void: - var pos := get_next_search_position(navigate_up) - if pos.x == -1: - return - select(pos.y, pos.x, pos.y, pos.x+len(get_meta("current_search"))) - set_caret_line(pos.y) - center_viewport_to_caret() - queue_redraw() - - -func get_next_search_position(navigate_up := false) -> Vector2i: - if not has_meta("current_search"): - return Vector2i(-1, -1) - var pos: Vector2i - var search_from_line := 0 - var search_from_column := 0 - if has_selection(): - if navigate_up: - search_from_line = get_selection_from_line() - search_from_column = get_selection_from_column()-1 - if search_from_column == -1: - if search_from_line == 0: - search_from_line = get_line_count() - else: - search_from_line -= 1 - search_from_column = max(get_line(search_from_line).length()-1,0) - else: - search_from_line = get_selection_to_line() - search_from_column = get_selection_to_column() - else: - search_from_line = get_caret_line() - search_from_column = get_caret_column() - - var flags: int = get_meta("current_search_flags", 0) - if navigate_up: - flags = flags | SEARCH_BACKWARDS - - pos = search(get_meta("current_search"), flags, search_from_line, search_from_column) - return pos - - -func replace(replace_text:String) -> void: - if has_selection(): - set_caret_line(get_selection_from_line()) - set_caret_column(get_selection_from_column()) - - var pos := get_next_search_position() - if pos.x == -1: - return - - if not has_meta("current_search"): - return - - begin_complex_operation() - insert_text("@@", pos.y, pos.x) - if get_meta("current_search_flags") & SEARCH_MATCH_CASE: - text = text.replace("@@"+get_meta("current_search"), replace_text) - else: - text = text.replacen("@@"+get_meta("current_search"), replace_text) - end_complex_operation() - - set_caret_line(pos.y) - set_caret_column(pos.x) - - timeline_editor.replace_in_timeline() - - -func replace_all(replace_text:String) -> void: - begin_complex_operation() - var next_pos := get_next_search_position() - var counter := 0 - while next_pos.y != -1: - insert_text("@@", next_pos.y, next_pos.x) - if get_meta("current_search_flags") & SEARCH_MATCH_CASE: - text = text.replace("@@"+get_meta("current_search"), replace_text) - else: - text = text.replacen("@@"+get_meta("current_search"), replace_text) - next_pos = get_next_search_position() - set_caret_line(next_pos.y) - set_caret_column(next_pos.x) - end_complex_operation() - - timeline_editor.replace_in_timeline() - - -################################################################################ -## AUTO COMPLETION -################################################################################ - -## Called if something was typed -func _request_code_completion(force:bool): - code_completion_helper.request_code_completion(force, self) - - -## Filters the list of all possible options, depending on what was typed -## Purpose of the different Kinds is explained in [_request_code_completion] -func _filter_code_completion_candidates(candidates:Array) -> Array: - return code_completion_helper.filter_code_completion_candidates(candidates, self) - - -## Called when code completion was activated -## Inserts the selected item -func _confirm_code_completion(replace:bool) -> void: - code_completion_helper.confirm_code_completion(replace, self) - - -################################################################################ -## SYMBOL CLICKING -################################################################################ - -## Performs an action (like opening a link) when a valid symbol was clicked -func _on_symbol_lookup(symbol, line, column): - code_completion_helper.symbol_lookup(symbol, line, column) - - -## Called to test if a symbol can be clicked -func _on_symbol_validate(symbol:String) -> void: - code_completion_helper.symbol_validate(symbol, self) diff --git a/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/timeline_editor_text.gd.uid b/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/timeline_editor_text.gd.uid deleted file mode 100644 index 6daf3f5..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/timeline_editor_text.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dshp0vy2xrxv diff --git a/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/timeline_editor_text.tscn b/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/timeline_editor_text.tscn deleted file mode 100644 index 172a501..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/TextEditor/timeline_editor_text.tscn +++ /dev/null @@ -1,32 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://defdeav8rli6o"] - -[ext_resource type="Script" uid="uid://dshp0vy2xrxv" path="res://addons/dialogic/Editor/TimelineEditor/TextEditor/timeline_editor_text.gd" id="1_1kbx2"] - -[node name="TimelineTextEditor" type="CodeEdit"] -offset_top = 592.0 -offset_right = 1024.0 -offset_bottom = 600.0 -wrap_mode = 1 -minimap_draw = true -caret_blink = true -highlight_current_line = true -draw_tabs = true -symbol_lookup_on_click = true -line_folding = true -gutters_draw_line_numbers = true -gutters_draw_fold_gutter = true -code_completion_enabled = true -code_completion_prefixes = Array[String](["[", "{"]) -indent_automatic = true -auto_brace_completion_enabled = true -auto_brace_completion_highlight_matching = true -script = ExtResource("1_1kbx2") - -[node name="UpdateTimer" type="Timer" parent="."] -one_shot = true - -[connection signal="code_completion_requested" from="." to="." method="_on_code_completion_requested"] -[connection signal="symbol_lookup" from="." to="." method="_on_symbol_lookup"] -[connection signal="symbol_validate" from="." to="." method="_on_symbol_validate"] -[connection signal="text_changed" from="." to="." method="_on_text_editor_text_changed"] -[connection signal="timeout" from="UpdateTimer" to="." method="_on_update_timer_timeout"] diff --git a/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/AddEventButton.gd b/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/AddEventButton.gd deleted file mode 100644 index 7318bd4..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/AddEventButton.gd +++ /dev/null @@ -1,63 +0,0 @@ -@tool -extends Button - -@export var visible_name := "" -@export var event_id := "" -@export var event_icon: Texture: - get: - return event_icon - set(texture): - event_icon = texture - icon = event_icon -@export var event_sorting_index: int = 0 -@export var resource: DialogicEvent -@export var dialogic_color_name := "" - - -func _ready() -> void: - tooltip_text = visible_name - - custom_minimum_size = Vector2(get_theme_font("font", "Label").get_string_size(text).x+35,30) * DialogicUtil.get_editor_scale() - - add_theme_color_override("font_color", get_theme_color("font_color", "Editor")) - add_theme_color_override("font_color_hover", get_theme_color("accent_color", "Editor")) - apply_base_button_style() - - -func apply_base_button_style() -> void: - var nstyle: StyleBoxFlat = get_parent().get_theme_stylebox('normal', 'Button').duplicate() - nstyle.border_width_left = 5 * DialogicUtil.get_editor_scale() - add_theme_stylebox_override('normal', nstyle) - var hstyle: StyleBoxFlat = get_parent().get_theme_stylebox('hover', 'Button').duplicate() - hstyle.border_width_left = 5 * DialogicUtil.get_editor_scale() - add_theme_stylebox_override('hover', hstyle) - set_color(resource.event_color) - - -func set_color(color:Color) -> void: - var style := get_theme_stylebox('normal', 'Button') - style.border_color = color - add_theme_stylebox_override('normal', style) - style = get_theme_stylebox('hover', 'Button') - style.border_color = color - add_theme_stylebox_override('hover', style) - - -func toggle_name(on:= false) -> void: - if !on: - text = "" - custom_minimum_size = Vector2(40, 40) * DialogicUtil.get_editor_scale() - var style := get_theme_stylebox('normal', 'Button') - style.bg_color = style.border_color.darkened(0.2) - add_theme_stylebox_override('normal', style) - style = get_theme_stylebox('hover', 'Button') - style.bg_color = style.border_color - add_theme_stylebox_override('hover', style) - else: - text = visible_name - custom_minimum_size = Vector2(get_theme_font("font", 'Label').get_string_size(text).x+35,30) * DialogicUtil.get_editor_scale() - apply_base_button_style() - - -func _on_button_down() -> void: - find_parent('VisualEditor').get_node('%TimelineArea').start_dragging(1, resource) diff --git a/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/AddEventButton.gd.uid b/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/AddEventButton.gd.uid deleted file mode 100644 index 53cfcea..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/AddEventButton.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dofrrscd4c61l diff --git a/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/AddEventButton.tscn b/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/AddEventButton.tscn deleted file mode 100644 index 0aff01e..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/AddEventButton.tscn +++ /dev/null @@ -1,46 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://depcrpeh3f4rv"] - -[ext_resource type="Script" uid="uid://dofrrscd4c61l" path="res://addons/dialogic/Editor/TimelineEditor/VisualEditor/AddEventButton.gd" id="1_s43sc"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_qx31r"] -content_margin_left = 4.0 -content_margin_top = 4.0 -content_margin_right = 4.0 -content_margin_bottom = 4.0 -bg_color = Color(0.1, 0.1, 0.1, 0.6) -border_width_left = 3 -border_color = Color(0.231373, 0.545098, 0.94902, 1) -corner_radius_top_left = 3 -corner_radius_top_right = 3 -corner_radius_bottom_right = 3 -corner_radius_bottom_left = 3 -corner_detail = 5 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_n1o16"] -content_margin_left = 4.0 -content_margin_top = 4.0 -content_margin_right = 4.0 -content_margin_bottom = 4.0 -bg_color = Color(0.225, 0.225, 0.225, 0.6) -border_width_left = 3 -border_color = Color(0.231373, 0.545098, 0.94902, 1) -corner_radius_top_left = 3 -corner_radius_top_right = 3 -corner_radius_bottom_right = 3 -corner_radius_bottom_left = 3 -corner_detail = 5 - -[node name="AddEventButton" type="Button"] -custom_minimum_size = Vector2(44, 30) -offset_right = 97.0 -offset_bottom = 42.0 -tooltip_text = "S" -theme_override_colors/font_color = Color(0, 0, 0, 1) -theme_override_styles/normal = SubResource("StyleBoxFlat_qx31r") -theme_override_styles/hover = SubResource("StyleBoxFlat_n1o16") -alignment = 0 -expand_icon = true -script = ExtResource("1_s43sc") -visible_name = "S" - -[connection signal="button_down" from="." to="." method="_on_button_down"] diff --git a/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/TimelineArea.gd b/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/TimelineArea.gd deleted file mode 100644 index d95062a..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/TimelineArea.gd +++ /dev/null @@ -1,204 +0,0 @@ -@tool -extends ScrollContainer - -# Script of the TimelineArea (that contains the event blocks). -# Manages the drawing of the event lines and event dragging. - - -enum DragTypes {NOTHING, NEW_EVENT, EXISTING_EVENTS} - -var drag_type: DragTypes = DragTypes.NOTHING -var drag_data: Variant -var drag_to_position := 0: - set(value): - drag_to_position = value - drag_to_position_updated = true -var dragging := false -var drag_to_position_updated := false - - -signal drag_completed(type, index, data) -signal drag_canceled() - - -func _ready() -> void: - resized.connect(add_extra_scroll_area_to_timeline) - %Timeline.child_entered_tree.connect(add_extra_scroll_area_to_timeline) - - # This prevents the view to turn black if you are editing this scene in Godot - if find_parent('EditorView'): - %TimelineArea.get_theme_color("background_color", "CodeEdit") - - -#region EVENT DRAGGING -################################################################################ - -func start_dragging(type:DragTypes, data:Variant) -> void: - dragging = true - drag_type = type - drag_data = data - drag_to_position_updated = false - - -func _input(event:InputEvent) -> void: - if !dragging: - return - if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT: - if !event.is_pressed(): - finish_dragging() - - -func _process(delta:float) -> void: - if !dragging: - return - - for child in %Timeline.get_children(): - if (child.global_position.y < get_global_mouse_position().y) and \ - (child.global_position.y+child.size.y > get_global_mouse_position().y): - - if get_global_mouse_position().y > child.global_position.y+(child.size.y/2.0): - drag_to_position = child.get_index()+1 - queue_redraw() - else: - drag_to_position = child.get_index() - queue_redraw() - - -func finish_dragging() -> void: - dragging = false - if drag_to_position_updated and get_global_rect().has_point(get_global_mouse_position()): - drag_completed.emit(drag_type, drag_to_position, drag_data) - else: - drag_canceled.emit() - queue_redraw() - -#endregion - - -#region LINE DRAWING -################################################################################ - -func _draw() -> void: - var line_width := 5 * DialogicUtil.get_editor_scale() - var horizontal_line_length := 100 * DialogicUtil.get_editor_scale() - var color_multiplier := Color(1,1,1,0.25) - var selected_color_multiplier := Color(1,1,1,1) - - - ## Draw Event Lines - for idx in range($Timeline.get_child_count()): - var block: Control = $Timeline.get_child(idx) - - if not "resource" in block: - continue - - if not block.visible: - continue - - if block.resource is DialogicEndBranchEvent: - continue - - if not (block.has_any_enabled_body_content or block.resource.can_contain_events): - continue - - var icon_panel_height: int = block.get_node('%IconPanel').size.y - var rect_position: Vector2 = block.get_node('%IconPanel').global_position+Vector2(0,1)*block.get_node('%IconPanel').size+Vector2(0,-4) - var color: Color = block.resource.event_color - - if block.is_selected() or block.end_node and block.end_node.is_selected(): - color *= selected_color_multiplier - else: - color *= color_multiplier - - if block.expanded and not block.resource.can_contain_events: - draw_rect(Rect2(rect_position-global_position+Vector2(line_width, 0), Vector2(line_width, block.size.y-block.get_node('%IconPanel').size.y)), color) - - ## If the indentation has not changed, nothing else happens - if idx >= $Timeline.get_child_count()-1 or block.current_indent_level >= $Timeline.get_child(idx+1).current_indent_level: - continue - - ## Draw connection between opening and end branch events - if block.resource.can_contain_events: - var end_node: Node = block.end_node - - if end_node != null: - var v_length: float = end_node.global_position.y+end_node.size.y/2-rect_position.y - #var rect_size := Vector2(line_width, ) - var offset := Vector2(line_width, 0) - - # Draw vertical line - draw_rect(Rect2(rect_position-global_position+offset, Vector2(line_width, v_length)), color) - # Draw horizonal line (on END BRANCH event) - draw_rect(Rect2( - rect_position.x+line_width-global_position.x+offset.x, - rect_position.y+v_length-line_width-global_position.y, - horizontal_line_length-offset.x, - line_width), - color) - - if block.resource.wants_to_group: - var group_color: Color = block.resource.event_color*color_multiplier - var group_starter := true - if idx != 0: - var block_above := $Timeline.get_child(idx-1) - if block_above.resource.event_name == block.resource.event_name: - group_starter = false - if block_above.resource is DialogicEndBranchEvent and block_above.parent_node.resource.event_name == block.resource.event_name: - group_starter = false - - ## Draw small horizontal line on any event in group - draw_rect(Rect2( - rect_position.x-global_position.x-line_width, - rect_position.y-global_position.y-icon_panel_height/2, - line_width, - line_width), - group_color) - - if group_starter: - ## Find the last event in the group (or that events END BRANCH) - var sub_idx := idx - var group_end_idx := idx - while sub_idx < $Timeline.get_child_count()-1: - sub_idx += 1 - if $Timeline.get_child(sub_idx).current_indent_level == block.current_indent_level-1: - group_end_idx = sub_idx-1 - break - - var end_node := $Timeline.get_child(group_end_idx) - - var offset := Vector2(-2*line_width, -icon_panel_height/2) - var v_length: float = end_node.global_position.y - rect_position.y + icon_panel_height - - ## Draw vertical line - draw_rect(Rect2( - rect_position.x - global_position.x + offset.x, - rect_position.y - global_position.y + offset.y, - line_width, - v_length), - group_color) - - - ## Draw line that indicates the dragging position - if dragging and get_global_rect().has_point(get_global_mouse_position()): - var height: int = 0 - if drag_to_position == %Timeline.get_child_count(): - height = %Timeline.get_child(-1).global_position.y+%Timeline.get_child(-1).size.y-global_position.y-(line_width/2.0) - else: - height = %Timeline.get_child(drag_to_position).global_position.y-global_position.y-(line_width/2.0) - - draw_line(Vector2(0, height), Vector2(size.x*0.9, height), get_theme_color("accent_color", "Editor"), line_width*.3) - -#endregion - - -#region SPACE BELOW -################################################################################ - -func add_extra_scroll_area_to_timeline(fake_arg:Variant=null) -> void: - if %Timeline.get_children().size() > 4: - %Timeline.custom_minimum_size.y = 0 - %Timeline.size.y = 0 - if %Timeline.size.y + 200 > %TimelineArea.size.y: - %Timeline.custom_minimum_size = Vector2(0, %Timeline.size.y + 200) - -#endregion diff --git a/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/TimelineArea.gd.uid b/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/TimelineArea.gd.uid deleted file mode 100644 index d1141f6..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/TimelineArea.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b6ka2avnh1u55 diff --git a/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/timeline_editor_visual.gd b/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/timeline_editor_visual.gd deleted file mode 100644 index 9c71fb0..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/timeline_editor_visual.gd +++ /dev/null @@ -1,1438 +0,0 @@ -@tool -extends Container - -## Visual mode of the timeline editor. - - -################## EDITOR NODES ################################################ -################################################################################ -var TimelineUndoRedo := UndoRedo.new() -@onready var timeline_editor := get_parent().get_parent() -var event_node -var sidebar_collapsed := false - -################## SIGNALS ##################################################### -################################################################################ -signal selection_updated -signal batch_loaded -signal timeline_loaded - - -################## TIMELINE LOADING ############################################ -################################################################################ -var _batches := [] -var _building_timeline := false -var _cancel_loading := false -var _initialized := false - -################## TIMELINE EVENT MANAGEMENT ################################### -################################################################################ -var selected_items: Array = [] -var drag_allowed := false - - -#region CREATE/SAVE/LOAD -################################################################################ - -func something_changed() -> void: - timeline_editor.current_resource_state = DialogicEditor.ResourceStates.UNSAVED - - -func save_timeline() -> void: - if !is_inside_tree(): - return - - # return if resource is unchanged - if timeline_editor.current_resource_state != DialogicEditor.ResourceStates.UNSAVED: - return - - # create a list of text versions of all the events with the right indent - var new_events := [] - var indent := 0 - for event in %Timeline.get_children(): - if 'event_name' in event.resource: - event.resource.update_text_version() - new_events.append(event.resource) - - if !timeline_editor.current_resource: - return - - timeline_editor.current_resource.events = new_events - timeline_editor.current_resource.events_processed = true - var error: int = ResourceSaver.save(timeline_editor.current_resource, timeline_editor.current_resource.resource_path) - - if error != OK: - print('[Dialogic] Saving error: ', error) - - timeline_editor.current_resource.set_meta("unsaved", false) - timeline_editor.current_resource_state = DialogicEditor.ResourceStates.SAVED - DialogicResourceUtil.update_directory('dtl') - - -func _notification(what:int) -> void: - if what == NOTIFICATION_WM_CLOSE_REQUEST: - save_timeline() - - -func load_timeline(resource:DialogicTimeline) -> void: - # In case another timeline is still loading - cancel_loading() - - clear_timeline_nodes() - - if timeline_editor.current_resource.events.size() == 0: - pass - else: - await timeline_editor.current_resource.process() - - if timeline_editor.current_resource.events.size() == 0: - return - - var data := resource.events - var page := 1 - var batch_size := 10 - _batches = [] - _building_timeline = true - while batch_events(data, batch_size, page).size() != 0: - _batches.append(batch_events(data, batch_size, page)) - page += 1 - set_meta("batch_count", len(_batches)) - batch_loaded.emit() - # Reset the scroll position - %TimelineArea.scroll_vertical = 0 - - -func is_loading_timeline() -> bool: - return _building_timeline - -func cancel_loading() -> void: - timeline_editor.set_progress(1) - if _building_timeline: - _cancel_loading = true - await batch_loaded - _cancel_loading = false - _building_timeline = false - - -func batch_events(array: Array, size: int, batch_number: int) -> Array: - return array.slice((batch_number - 1) * size, batch_number * size) - - -# a list of all events like choice and condition events (so they get connected to their end events) -var opener_events_stack := [] - -func load_batch(data:Array) -> void: - # Don't try to cast it to Array immedietly, as the item may have become null and will throw a useless error - var current_batch = _batches.pop_front() - if current_batch: - var current_batch_items: Array = current_batch - for i in current_batch_items: - if i is DialogicEndBranchEvent: - create_end_branch_event(%Timeline.get_child_count(), opener_events_stack.pop_back()) - else: - var piece := add_event_node(i, %Timeline.get_child_count()) - if i.can_contain_events: - opener_events_stack.push_back(piece) - batch_loaded.emit() - - -func _on_batch_loaded() -> void: - if _cancel_loading: - return - - if _batches.size() > 0: - indent_events() - var progress: float = 1-(1.0/get_meta("batch_count")*len(_batches)) - timeline_editor.set_progress(progress) - await get_tree().process_frame - load_batch(_batches) - return - - # This hides the progress bar again - timeline_editor.set_progress(1) - - if opener_events_stack: - for ev in opener_events_stack: - if is_instance_valid(ev): - create_end_branch_event(%Timeline.get_child_count(), ev) - - timeline_loaded.emit() - - opener_events_stack = [] - indent_events() - update_content_list() - _building_timeline = false - - -func clear_timeline_nodes() -> void: - deselect_all_items() - for event in %Timeline.get_children(): - event.free() -#endregion - - -#region SETUP -################################################################################ - -func _ready() -> void: - event_node = load("res://addons/dialogic/Editor/Events/EventBlock/event_block.tscn") - - batch_loaded.connect(_on_batch_loaded) - - await find_parent('EditorView').ready - timeline_editor.editors_manager.sidebar.content_item_activated.connect(_on_content_item_clicked) - %Timeline.child_order_changed.connect(update_content_list) - - var editor_scale := DialogicUtil.get_editor_scale() - %RightSidebar.size.x = DialogicUtil.get_editor_setting("dialogic/editor/right_sidebar_width", 200 * editor_scale) - $View.split_offset = -DialogicUtil.get_editor_setting("dialogic/editor/right_sidebar_width", 200 * editor_scale) - sidebar_collapsed = DialogicUtil.get_editor_setting("dialogic/editor/right_sidebar_collapsed", false) - - load_event_buttons() - _on_right_sidebar_resized() - _initialized = true - - -func load_event_buttons() -> void: - sidebar_collapsed = DialogicUtil.get_editor_setting("dialogic/editor/right_sidebar_collapsed", false) - - # Clear previous event buttons - for child in %RightSidebar.get_child(0).get_children(): - - if child is FlowContainer: - - for button in child.get_children(): - button.queue_free() - - - for child in %RightSidebar.get_child(0).get_children(): - child.get_parent().remove_child(child) - child.queue_free() - - # Event buttons - var button_scene := load("res://addons/dialogic/Editor/TimelineEditor/VisualEditor/AddEventButton.tscn") - - var scripts := DialogicResourceUtil.get_event_cache() - var hidden_buttons: Array = DialogicUtil.get_editor_setting('hidden_event_buttons', []) - var sections := {} - - for event_script in scripts: - var event_resource: Variant - - if typeof(event_script) == TYPE_STRING: - event_resource = load(event_script).new() - else: - event_resource = event_script - - if event_resource.disable_editor_button == true: - continue - - if event_resource.event_name in hidden_buttons: - continue - - var button: Button = button_scene.instantiate() - button.resource = event_resource - button.visible_name = event_resource.event_name - button.event_icon = event_resource._get_icon() - button.set_color(event_resource.event_color) - button.dialogic_color_name = event_resource.dialogic_color_name - button.event_sorting_index = event_resource.event_sorting_index - - button.button_up.connect(_add_event_button_pressed.bind(event_resource)) - - if !event_resource.event_category in sections: - var section := VBoxContainer.new() - section.name = event_resource.event_category - - var section_header := HBoxContainer.new() - section_header.add_child(Label.new()) - section_header.get_child(0).text = event_resource.event_category - section_header.get_child(0).size_flags_horizontal = SIZE_SHRINK_BEGIN - section_header.get_child(0).theme_type_variation = "DialogicSection" - section_header.add_child(HSeparator.new()) - section_header.get_child(1).size_flags_horizontal = SIZE_EXPAND_FILL - section.add_child(section_header) - - var button_container := FlowContainer.new() - section.add_child(button_container) - - sections[event_resource.event_category] = button_container - %RightSidebar.get_child(0).add_child(section, true) - - sections[event_resource.event_category].add_child(button) - button.toggle_name(!sidebar_collapsed) - - # Sort event button - while event_resource.event_sorting_index < sections[event_resource.event_category].get_child(max(0, button.get_index()-1)).resource.event_sorting_index: - sections[event_resource.event_category].move_child(button, button.get_index()-1) - - # Sort event sections - var sections_order: Array = DialogicUtil.get_editor_setting('event_section_order', - ['Main', 'Flow', 'Logic', 'Audio', 'Visual','Other', 'Helper']) - - sections_order.reverse() - for section_name in sections_order: - if %RightSidebar.get_child(0).has_node(section_name): - %RightSidebar.get_child(0).move_child(%RightSidebar.get_child(0).get_node(section_name), 0) - - # Resize RightSidebar - %RightSidebar.custom_minimum_size.x = 50 * DialogicUtil.get_editor_scale() - - _on_right_sidebar_resized() -#endregion - - -#region CONTENT LIST -################################################################################ - -func _on_content_item_clicked(label:String) -> void: - if label == "~ Top": - %TimelineArea.scroll_vertical = 0 - return - - for event in %Timeline.get_children(): - if 'event_name' in event.resource and event.resource is DialogicLabelEvent: - if event.resource.name == label: - scroll_to_piece(event.get_index()) - return - - -func update_content_list() -> void: - if not is_inside_tree(): - return - - var channels: PackedStringArray = [] - var labels: PackedStringArray = [] - - for event in %Timeline.get_children(): - - if 'event_name' in event.resource and event.resource is DialogicLabelEvent: - labels.append(event.resource.name) - - if 'event_name' in event.resource and event.resource is DialogicAudioEvent: - if not event.resource.channel_name in channels: - channels.append(event.resource.channel_name) - - timeline_editor.editors_manager.sidebar.update_content_list(labels) - timeline_editor.update_audio_channel_cache(channels) - - -#endregion - - -#region DRAG & DROP + DRAGGING EVENTS -################################################################################# - -# SIGNAL handles input on the events mainly for selection and moving events -func _on_event_block_gui_input(event: InputEvent, item: Node) -> void: - if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT: - if event.is_pressed(): - if len(selected_items) > 1 and item in selected_items and !Input.is_key_pressed(KEY_CTRL): - pass - elif not _is_item_selected(item) and not len(selected_items) > 1: - select_item(item) - elif len(selected_items) > 1 or Input.is_key_pressed(KEY_CTRL): - select_item(item) - - drag_allowed = true - - if event.is_released() and not %TimelineArea.dragging and not Input.is_key_pressed(KEY_SHIFT): - if len(selected_items) > 1 and item in selected_items and not Input.is_key_pressed(KEY_CTRL): - deselect_all_items() - select_item(item) - - if len(selected_items) > 0 and event is InputEventMouseMotion: - if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT): - if !%TimelineArea.dragging and !get_viewport().gui_is_dragging() and drag_allowed: - sort_selection() - %TimelineArea.start_dragging(%TimelineArea.DragTypes.EXISTING_EVENTS, selected_items) - - -## Activated by TimelineArea drag_completed -func _on_timeline_area_drag_completed(type:int, index:int, data:Variant) -> void: - if type == %TimelineArea.DragTypes.NEW_EVENT: - var resource: DialogicEvent = data.duplicate() - resource._load_custom_defaults() - - add_event_undoable(resource, index) - - elif type == %TimelineArea.DragTypes.EXISTING_EVENTS: - if not (len(data) == 1 and data[0].get_index()+1 == index): - move_blocks_to_index(data, index) - - await get_tree().process_frame - something_changed() - scroll_to_piece(index) - indent_events() -#endregion - - -#region CREATING THE TIMELINE -################################################################################ -# Adding an event to the timeline -func add_event_node(event_resource:DialogicEvent, at_index:int = -1, auto_select: bool = false, indent: bool = false) -> Control: - if event_resource is DialogicEndBranchEvent: - return create_end_branch_event(at_index, %Timeline.get_child(0)) - - if event_resource['event_node_ready'] == false: - if event_resource['event_node_as_text'] != "": - event_resource._load_from_string(event_resource['event_node_as_text']) - - var block: Control = event_node.instantiate() - block.resource = event_resource - event_resource.editor_node = block - event_resource._enter_visual_editor(timeline_editor) - block.content_changed.connect(something_changed) - - if event_resource.event_name == "Label": - block.content_changed.connect(update_content_list) - if event_resource.event_name == "Audio": - block.content_changed.connect(update_content_list) - if at_index == -1: - if len(selected_items) != 0: - selected_items[0].add_sibling(block) - else: - %Timeline.add_child(block) - else: - %Timeline.add_child(block) - %Timeline.move_child(block, at_index) - - block.gui_input.connect(_on_event_block_gui_input.bind(block)) - - # Building editing part - block.build_editor(true, event_resource.expand_by_default) - - if auto_select: - select_item(block, false) - - # Indent on create - if indent: - indent_events() - - return block - - -func create_end_branch_event(at_index:int, parent_node:Node) -> Node: - var end_branch_event: Control = load("res://addons/dialogic/Editor/Events/BranchEnd.tscn").instantiate() - end_branch_event.resource = DialogicEndBranchEvent.new() - end_branch_event.gui_input.connect(_on_event_block_gui_input.bind(end_branch_event)) - parent_node.end_node = end_branch_event - end_branch_event.parent_node = parent_node - end_branch_event.add_end_control(parent_node.resource._get_end_branch_control()) - %Timeline.add_child(end_branch_event) - %Timeline.move_child(end_branch_event, at_index) - return end_branch_event - - -# combination of the above that establishes the correct connection between the event and it's end branch -func add_event_with_end_branch(resource, at_index:int=-1, auto_select:bool = false, indent:bool = false) -> void: - var event := add_event_node(resource, at_index, auto_select, indent) - create_end_branch_event(at_index+1, event) - - -## Adds an event (either single nodes or with end branches) to the timeline with UndoRedo support -func add_event_undoable(event_resource: DialogicEvent, at_index: int = -1) -> void: - TimelineUndoRedo.create_action("[D] Add "+event_resource.event_name+" event.") - if event_resource.can_contain_events: - TimelineUndoRedo.add_do_method(add_event_with_end_branch.bind(event_resource, at_index, true, true)) - TimelineUndoRedo.add_undo_method(delete_events_at_index.bind(at_index, 2)) - else: - TimelineUndoRedo.add_do_method(add_event_node.bind(event_resource, at_index, true, true)) - TimelineUndoRedo.add_undo_method(delete_events_at_index.bind(at_index, 1)) - TimelineUndoRedo.commit_action() -#endregion - - -#region DELETING, COPY, PASTE -################################################################################ - -## Lists the given events (as text) based on their indexes. -## This is used to store info for undo/redo. -## Based on the action you might want to include END_BRANCHES or not (see EndBranchMode) -func get_events_indexed(events:Array) -> Dictionary: - var indexed_dict := {} - for event in events: - # do not collect selected end branches (e.g. on delete, copy, etc.) - if event.resource is DialogicEndBranchEvent: - continue - - indexed_dict[event.get_index()] = event.resource._store_as_string() - - # store an end branch if it is selected or connected to a selected event - if 'end_node' in event and event.end_node: - event = event.end_node - indexed_dict[event.get_index()] = event.resource._store_as_string() - elif event.resource is DialogicEndBranchEvent: - if event.parent_node in events: # add local index - indexed_dict[event.get_index()] += str(events.find(event.parent_node)) - else: # add global index - indexed_dict[event.get_index()] += '#'+str(event.parent_node.get_index()) - return indexed_dict - - -## Returns an indexed dictionary of [amount] events at [index] -func get_events_at_index_indexed(index:int, amount:int) -> Dictionary: - var events := [] - - for i in range(amount): - events.append(%Timeline.get_child(index+i)) - - return get_events_indexed(events) - - -## Selects events based on an indexed dictionary -func select_events_indexed(indexed_events:Dictionary) -> void: - selected_items = [] - for event_index in indexed_events.keys(): - selected_items.append(%Timeline.get_child(event_index)) - - -## Adds events based on an indexed dictionary -func add_events_indexed(indexed_events:Dictionary) -> void: - # sort the dictionaries indexes just in case - var indexes := indexed_events.keys() - indexes.sort() - - var events := [] - for event_idx in indexes: - # first get a new resource from the text version - var event_resource: DialogicEvent - for i in DialogicResourceUtil.get_event_cache(): - if i._test_event_string(indexed_events[event_idx]): - event_resource = i.duplicate() - break - - event_resource._load_from_string(indexed_events[event_idx]) - - # now create the visual block. - deselect_all_items() - if event_resource is DialogicEndBranchEvent: - var idx: String = indexed_events[event_idx].trim_prefix('<>') - if idx.begins_with('#'): # a global index - events.append(create_end_branch_event(%Timeline.get_child_count(), %Timeline.get_child(int(idx.trim_prefix('#'))))) - else: # a local index (index in the added events list) - events.append(create_end_branch_event(%Timeline.get_child_count(), events[int(idx)])) - %Timeline.move_child(events[-1], event_idx) - else: - events.append(add_event_node(event_resource)) - %Timeline.move_child(events[-1], event_idx) - - selected_items = events - visual_update_selection() - indent_events() - something_changed() - - -## Deletes events based on an indexed dictionary -func delete_events_indexed(indexed_events:Dictionary) -> void: - if indexed_events.is_empty(): - return - - var idx_shift := 0 - for idx in indexed_events: - if 'end_node' in %Timeline.get_child(idx-idx_shift) and %Timeline.get_child(idx-idx_shift).end_node != null and is_instance_valid(%Timeline.get_child(idx-idx_shift).end_node): - %Timeline.get_child(idx-idx_shift).end_node.parent_node = null - if %Timeline.get_child(idx-idx_shift) != null and is_instance_valid(%Timeline.get_child(idx-idx_shift)): - if %Timeline.get_child(idx-idx_shift) in selected_items: - selected_items.erase(%Timeline.get_child(idx-idx_shift)) - %Timeline.get_child(idx-idx_shift).queue_free() - %Timeline.get_child(idx-idx_shift).get_parent().remove_child(%Timeline.get_child(idx-idx_shift)) - idx_shift += 1 - - indent_events() - something_changed() - - -func delete_selected_events() -> void: - # try to find which item to select afterwards - var next_node := %Timeline.get_child(mini(%Timeline.get_child_count() - 1, selected_items[-1].get_index() + 1)) - if _is_item_selected(next_node): - next_node = null - - delete_events_indexed(get_events_indexed(selected_items)) - - # select next - if next_node != null: - select_item(next_node, false) - elif %Timeline.get_child_count() > 0: - next_node = %Timeline.get_child(max(0, %Timeline.get_child_count() - 1)) - select_item(next_node, false) - else: - deselect_all_items() - - -func cut_events_indexed(indexed_events:Dictionary) -> void: - select_events_indexed(indexed_events) - copy_selected_events() - delete_events_indexed(indexed_events) - - -func copy_selected_events() -> void: - if len(selected_items) == 0: - return - - sort_selection() - var event_copy_array := [] - for item in selected_items: - event_copy_array.append(item.resource._store_as_string()) - if item.resource is DialogicEndBranchEvent: - if item.parent_node in selected_items: # add local index - event_copy_array[-1] += str(selected_items.find(item.parent_node)) - else: # add global index - event_copy_array[-1] += '#'+str(item.parent_node.get_index()) - - DisplayServer.clipboard_set(var_to_str({ - "events":event_copy_array, - "project_name": ProjectSettings.get_setting("application/config/name") - })) - - -func get_clipboard_data() -> Array: - var clipboard_parse: Variant = str_to_var(DisplayServer.clipboard_get()) - - if clipboard_parse is Dictionary: - if clipboard_parse.has("project_name"): - if clipboard_parse.project_name != ProjectSettings.get_setting("application/config/name"): - print("[Dialogic] Be careful when copying from another project!") - if clipboard_parse.has('events'): - return clipboard_parse.events - return [] - - -func add_events_at_index(event_list:Array, at_index:int) -> void: - var new_indexed_events := {} - - for i in range(len(event_list)): - new_indexed_events[at_index+i] = event_list[i] - - add_events_indexed(new_indexed_events) - - -func delete_events_at_index(at_index:int, amount:int = 1)-> void: - var new_indexed_events := {} - # delete_events_indexed actually only needs the keys, so we give trash as values - for i in range(amount): - new_indexed_events[at_index+i] = "" - delete_events_indexed(new_indexed_events) - indent_events() - -#endregion - - -#region BLOCK SELECTION -################################################################################ - -func _is_item_selected(item: Node) -> bool: - return item in selected_items - - -func select_item(item: Node, multi_possible:bool = true) -> void: - if item == null: - return - - if Input.is_key_pressed(KEY_CTRL) and multi_possible: - # deselect the item if it is selected - if _is_item_selected(item): - selected_items.erase(item) - else: - selected_items.append(item) - elif Input.is_key_pressed(KEY_SHIFT) and multi_possible: - if len(selected_items) == 0: - selected_items = [item] - else: - var index: int = selected_items[-1].get_index() - var goal_idx := item.get_index() - while true: - if index < goal_idx: index += 1 - else: index -= 1 - if not %Timeline.get_child(index) in selected_items: - selected_items.append(%Timeline.get_child(index)) - - if index == goal_idx: - break - else: - if len(selected_items) == 1: - if _is_item_selected(item): - selected_items.erase(item) - else: - selected_items = [item] - else: - selected_items = [item] - - sort_selection() - visual_update_selection() - - -# checks all the events and sets their styles (selected/deselected) -func visual_update_selection() -> void: - for item in %Timeline.get_children(): - item.visual_deselect() - if 'end_node' in item and item.end_node != null: - item.end_node.unhighlight() - for item in selected_items: - item.visual_select() - if 'end_node' in item and item.end_node != null: - item.end_node.highlight() - %TimelineArea.queue_redraw() - - -## Sorts the selection using 'custom_sort_selection' -func sort_selection() -> void: - selected_items.sort_custom(custom_sort_selection) - - -## Compares two event blocks based on their position in the timeline -func custom_sort_selection(item1, item2) -> bool: - return item1.get_index() < item2.get_index() - - -func select_all_items() -> void: - selected_items = [] - for event in %Timeline.get_children(): - selected_items.append(event) - visual_update_selection() - - -func deselect_all_items() -> void: - selected_items = [] - visual_update_selection() -#endregion - - -#region CREATING NEW EVENTS USING THE BUTTONS -################################################################################ - -# Event Creation signal for buttons -# If force_resource is true, the event will be added with the actual resource -func _add_event_button_pressed(event_resource:DialogicEvent, force_resource := false): - if %TimelineArea.get_global_rect().has_point(get_global_mouse_position()) and !force_resource: - return - - var at_index := -1 - if selected_items: - at_index = selected_items[-1].get_index()+1 - else: - at_index = %Timeline.get_child_count() - - var resource: DialogicEvent = null - if force_resource: - resource = event_resource - else: - resource = event_resource.duplicate() - resource._load_custom_defaults() - - resource.created_by_button = true - - add_event_undoable(resource, at_index) - - resource.created_by_button = false - - something_changed() - scroll_to_piece(at_index) - indent_events() -#endregion - - -#region BLOCK GETTERS -################################################################################ - -func get_block_above(block:Node) -> Node: - if block.get_index() > 0: - return %Timeline.get_child(block.get_index() - 1) - return null - - -func get_block_below(block:Node) -> Node: - if block.get_index() < %Timeline.get_child_count() - 1: - return %Timeline.get_child(block.get_index() + 1) - return null -#endregion - - -#region BLOCK MOVEMENT -################################################################################ - - -func move_blocks_to_index(blocks:Array, index:int): - # the amount of events that were BEFORE the new index (thus shifting the index) - var index_shift := 0 - for event in blocks: - if event.resource is DialogicEndBranchEvent: - if !event.parent_node in blocks: - if index <= event.parent_node.get_index(): - return - if "end_node" in event and event.end_node: - if !event.end_node in blocks: - if event.end_node.get_index() == event.get_index()+1: - blocks.append(event.end_node) - else: - return - index_shift += int(event.get_index() < index) - - var do_indexes := {} - var undo_indexes := {} - - var event_count := 0 - for event in blocks: - do_indexes[event.get_index()] = index + event_count - undo_indexes[index -index_shift+event_count] = event.get_index()+index_shift*int(index < event.get_index())#+int((index -index_shift+event_count) < event.get_index()) - event_count += 1 - - # complex check to avoid tangling conditions & choices - for idx in do_indexes: - var event := %Timeline.get_child(idx) - if !event.resource is DialogicEndBranchEvent and !event.resource.can_contain_events: - continue - - if event.resource is DialogicEndBranchEvent: - if !event.parent_node or event.parent_node.get_index() in do_indexes: - continue - elif event.resource.can_contain_events: - if !event.end_node or event.end_node.get_index() in do_indexes: - continue - - var check_from := 0 - var check_to := 0 - - if event.resource is DialogicEndBranchEvent: - check_from = event.parent_node.get_index()+1 - check_to = index - else: - check_from = index - check_to = event.end_node.get_index() - - for c_idx in range(check_from, check_to): - if c_idx in do_indexes: - continue - var c_event := %Timeline.get_child(c_idx) - if c_event.resource is DialogicEndBranchEvent and c_event.parent_node.get_index() < check_from: - return - if c_event.resource.can_contain_events and c_event.end_node.get_index() > check_to: - return - - TimelineUndoRedo.create_action('[D] Move events.') - TimelineUndoRedo.add_do_method(move_events_by_indexes.bind(do_indexes)) - TimelineUndoRedo.add_undo_method(move_events_by_indexes.bind(undo_indexes)) - TimelineUndoRedo.commit_action() - - -func move_events_by_indexes(index_dict:Dictionary) -> void: - var sorted_indexes := index_dict.keys() - sorted_indexes.sort() - - var evts := {} - var count := 0 - for idx in sorted_indexes: - evts[idx] =%Timeline.get_child(idx-count) - %Timeline.remove_child(%Timeline.get_child(idx-count)) - count += 1 - if idx < index_dict[idx]: - index_dict[idx] -= len(sorted_indexes.filter(func(x):return x<=index_dict[idx]-count-1)) - - for idx in sorted_indexes: - %Timeline.add_child(evts[idx]) - %Timeline.move_child(evts[idx], index_dict[idx]) - - indent_events() - visual_update_selection() - something_changed() - - -func offset_blocks_by_index(blocks:Array, offset:int): - var do_indexes := {} - var undo_indexes := {} - - for event in blocks: - if event.resource is DialogicEndBranchEvent: - if !event.parent_node in blocks: - if event.get_index()+offset+int(offset>0) <= event.parent_node.get_index(): - continue - if "end_node" in event and event.end_node: - if !event.end_node in blocks: - if event.get_index()+offset+int(offset>0) > event.end_node.get_index(): - if event.end_node.get_index() == event.get_index()+1: - blocks.append(event.end_node) - else: - return - do_indexes[event.get_index()] = event.get_index()+offset+int(offset>0) - undo_indexes[event.get_index()+offset] = event.get_index()+int(offset<0) - - - TimelineUndoRedo.create_action("[D] Move events.") - TimelineUndoRedo.add_do_method(move_events_by_indexes.bind(do_indexes)) - TimelineUndoRedo.add_undo_method(move_events_by_indexes.bind(undo_indexes)) - - TimelineUndoRedo.commit_action() -#endregion - - -#region VISIBILITY/VISUALS -################################################################################ - -func scroll_to_piece(piece_index:int) -> void: - await get_tree().process_frame - var height: float = %Timeline.get_child(min(piece_index, %Timeline.get_child_count()-1)).position.y - if height < %TimelineArea.scroll_vertical or height > %TimelineArea.scroll_vertical+%TimelineArea.size.y: - %TimelineArea.scroll_vertical = height - - -func indent_events() -> void: - var indent: int = 0 - var event_list: Array = %Timeline.get_children() - - if event_list.size() < 2: - return - - var currently_hidden := false - var hidden_count := 0 - var hidden_until: Control = null - - # will be applied to the indent after the current event - var delayed_indent: int = 0 - - for block in event_list: - if (not "resource" in block): - continue - - if (not currently_hidden) and block.resource.can_contain_events and block.end_node and block.collapsed: - currently_hidden = true - hidden_until = block.end_node - hidden_count = 0 - elif currently_hidden and block == hidden_until: - block.update_hidden_events_indicator(hidden_count) - currently_hidden = false - hidden_until = null - elif currently_hidden: - block.hide() - hidden_count += 1 - else: - block.show() - if block.resource is DialogicEndBranchEvent: - block.update_hidden_events_indicator(0) - - delayed_indent = 0 - - if block.resource.can_contain_events: - delayed_indent = 1 - - if block.resource.wants_to_group: - indent += 1 - - elif block.resource is DialogicEndBranchEvent: - block.parent_node_changed() - delayed_indent -= 1 - if block.parent_node.resource.wants_to_group: - delayed_indent -= 1 - - if indent >= 0: - block.set_indent(indent) - else: - block.set_indent(0) - indent += delayed_indent - - await get_tree().process_frame - await get_tree().process_frame - %TimelineArea.queue_redraw() - - -#region SPECIAL BLOCK OPERATIONS -################################################################################ - -func _on_event_popup_menu_id_pressed(id:int) -> void: - var item: Control = %EventPopupMenu.current_event - if id == 0: - if not item in selected_items: - selected_items = [item] - duplicate_selected() - - elif id == 1: - play_from_here(%EventPopupMenu.current_event.get_index()) - - elif id == 2: - if not item.resource.help_page_path.is_empty(): - OS.shell_open(item.resource.help_page_path) - - elif id == 3: - find_parent('EditorView').plugin_reference.get_editor_interface().set_main_screen_editor('Script') - find_parent('EditorView').plugin_reference.get_editor_interface().edit_script(item.resource.get_script(), 1, 1) - elif id == 4 or id == 5: - if id == 4: - offset_blocks_by_index(selected_items, -1) - else: - offset_blocks_by_index(selected_items, +1) - - elif id == 6: - var events_indexed : Dictionary - if item in selected_items: - events_indexed = get_events_indexed(selected_items) - else: - events_indexed = get_events_indexed([item]) - TimelineUndoRedo.create_action("[D] Deleting 1 event.") - TimelineUndoRedo.add_do_method(delete_events_indexed.bind(events_indexed)) - TimelineUndoRedo.add_undo_method(add_events_indexed.bind(events_indexed)) - TimelineUndoRedo.commit_action() - indent_events() - - -func play_from_here(index:=-1) -> void: - if index == -1: - if not selected_items.is_empty(): - index = selected_items[0].get_index() - timeline_editor.play_timeline(index) - -func _on_right_sidebar_resized() -> void: - var _scale := DialogicUtil.get_editor_scale() - - if %RightSidebar.size.x < 160 * _scale and (not sidebar_collapsed or not _initialized): - sidebar_collapsed = true - - for section in %RightSidebar.get_node('EventContainer').get_children(): - - for con in section.get_children(): - - if con.get_child_count() == 0: - continue - - if con.get_child(0) is Label: - con.get_child(0).hide() - - elif con.get_child(0) is Button: - - for button in con.get_children(): - button.toggle_name(false) - - - elif %RightSidebar.size.x > 160 * _scale and (sidebar_collapsed or not _initialized): - sidebar_collapsed = false - - for section in %RightSidebar.get_node('EventContainer').get_children(): - - for con in section.get_children(): - - if con.get_child_count() == 0: - continue - - if con.get_child(0) is Label: - con.get_child(0).show() - - elif con.get_child(0) is Button: - for button in con.get_children(): - button.toggle_name(true) - - if _initialized: - DialogicUtil.set_editor_setting("dialogic/editor/right_sidebar_width", %RightSidebar.size.x) - DialogicUtil.set_editor_setting("dialogic/editor/right_sidebar_collapsed", sidebar_collapsed) - -#endregion - - -#region SHORTCUTS -################################################################################ - -func duplicate_selected() -> void: - if len(selected_items) > 0: - var events := get_events_indexed(selected_items).values() - var at_index: int = selected_items[-1].get_index()+1 - TimelineUndoRedo.create_action("[D] Duplicate "+str(len(events))+" event(s).") - TimelineUndoRedo.add_do_method(add_events_at_index.bind(events, at_index)) - TimelineUndoRedo.add_undo_method(delete_events_at_index.bind(at_index, len(events))) - TimelineUndoRedo.commit_action() - - -func _input(event:InputEvent) -> void: - if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.pressed == false: - drag_allowed = false - - # we protect this with is_visible_in_tree to not - # invoke a shortcut by accident - if !((event is InputEventKey or !event is InputEventWithModifiers) and is_visible_in_tree()): - return - - - if "pressed" in event: - if !event.pressed: - return - - - ## Some shortcuts should always work - match event.as_text(): - "Ctrl+T": # Add text event - _add_event_button_pressed(DialogicTextEvent.new(), true) - get_viewport().set_input_as_handled() - - "Ctrl+Shift+T", "Ctrl+Alt+T", "Ctrl+Option+T": # Add text event with current or previous character - get_viewport().set_input_as_handled() - var ev := DialogicTextEvent.new() - ev.character = get_previous_character(event.as_text() == "Ctrl+Alt+T" or event.as_text() == "Ctrl+Option+T") - _add_event_button_pressed(ev, true) - - "Ctrl+E": # Add character join event - _add_event_button_pressed(DialogicCharacterEvent.new(), true) - get_viewport().set_input_as_handled() - - "Ctrl+Shift+E": # Add character update event - var ev := DialogicCharacterEvent.new() - ev.action = DialogicCharacterEvent.Actions.UPDATE - _add_event_button_pressed(ev, true) - get_viewport().set_input_as_handled() - - "Ctrl+Alt+E", "Ctrl+Option+E": # Add character leave event - var ev := DialogicCharacterEvent.new() - ev.action = DialogicCharacterEvent.Actions.LEAVE - _add_event_button_pressed(ev, true) - get_viewport().set_input_as_handled() - - "Ctrl+J": # Add jump event - _add_event_button_pressed(DialogicJumpEvent.new(), true) - get_viewport().set_input_as_handled() - "Ctrl+L": # Add label event - _add_event_button_pressed(DialogicLabelEvent.new(), true) - get_viewport().set_input_as_handled() - - "Ctrl+F6" when OS.get_name() != "macOS": # Play from here - play_from_here() - "Ctrl+Shift+B" when OS.get_name() == "macOS": # Play from here - play_from_here() - - ## Some shortcuts should be disabled when writing text. - var focus_owner: Control = get_viewport().gui_get_focus_owner() - if focus_owner is TextEdit or focus_owner is LineEdit or (focus_owner is Button and focus_owner.get_parent_control().name == "Spin"): - return - - match event.as_text(): - "Ctrl+Z": # UNDO - TimelineUndoRedo.undo() - indent_events() - get_viewport().set_input_as_handled() - - "Ctrl+Shift+Z", "Ctrl+Y": # REDO - TimelineUndoRedo.redo() - indent_events() - get_viewport().set_input_as_handled() - - "Up": #select previous - if (len(selected_items) == 1): - var prev := maxi(0, selected_items[0].get_index() - 1) - var prev_node := %Timeline.get_child(prev) - if (prev_node != selected_items[0]): - selected_items = [] - select_item(prev_node) - get_viewport().set_input_as_handled() - - "Down": #select next - if (len(selected_items) == 1): - var next := mini(%Timeline.get_child_count() - 1, selected_items[0].get_index() + 1) - var next_node := %Timeline.get_child(next) - if (next_node != selected_items[0]): - selected_items = [] - select_item(next_node) - get_viewport().set_input_as_handled() - - "Delete": - if (len(selected_items) != 0): - var events_indexed := get_events_indexed(selected_items) - TimelineUndoRedo.create_action("[D] Deleting "+str(len(selected_items))+" event(s).") - TimelineUndoRedo.add_do_method(delete_events_indexed.bind(events_indexed)) - TimelineUndoRedo.add_undo_method(add_events_indexed.bind(events_indexed)) - TimelineUndoRedo.commit_action() - get_viewport().set_input_as_handled() - - "Ctrl+A": # select all - if (len(selected_items) != 0): - select_all_items() - get_viewport().set_input_as_handled() - - "Ctrl+Shift+A": # deselect all - if (len(selected_items) != 0): - deselect_all_items() - get_viewport().set_input_as_handled() - - "Ctrl+C": - select_events_indexed(get_events_indexed(selected_items)) - copy_selected_events() - get_viewport().set_input_as_handled() - - "Ctrl+V": - var events_list := get_clipboard_data() - var paste_position := 0 - if selected_items: - paste_position = selected_items[-1].get_index()+1 - else: - paste_position = %Timeline.get_child_count() - if events_list: - TimelineUndoRedo.create_action("[D] Pasting "+str(len(events_list))+" event(s).") - TimelineUndoRedo.add_do_method(add_events_at_index.bind(events_list, paste_position)) - TimelineUndoRedo.add_undo_method(delete_events_at_index.bind(paste_position, len(events_list))) - TimelineUndoRedo.commit_action() - get_viewport().set_input_as_handled() - - - "Ctrl+X": - var events_indexed := get_events_indexed(selected_items) - TimelineUndoRedo.create_action("[D] Cut "+str(len(selected_items))+" event(s).") - TimelineUndoRedo.add_do_method(cut_events_indexed.bind(events_indexed)) - TimelineUndoRedo.add_undo_method(add_events_indexed.bind(events_indexed)) - TimelineUndoRedo.commit_action() - get_viewport().set_input_as_handled() - - "Ctrl+D": - duplicate_selected() - get_viewport().set_input_as_handled() - - "Alt+Up", "Option+Up": - if len(selected_items) > 0: - offset_blocks_by_index(selected_items, -1) - - get_viewport().set_input_as_handled() - - "Alt+Down", "Option+Down": - if len(selected_items) > 0: - offset_blocks_by_index(selected_items, +1) - - get_viewport().set_input_as_handled() - - -func get_previous_character(double_previous := false) -> DialogicCharacter: - var character: DialogicCharacter = null - var idx: int = %Timeline.get_child_count() - if idx == 0: - return null - if len(selected_items): - idx = selected_items[0].get_index() - var one_skipped := false - idx += 1 - for i in range(selected_items[0].get_index()+1): - idx -= 1 - if !('resource' in %Timeline.get_child(idx) and 'character' in %Timeline.get_child(idx).resource): - continue - if %Timeline.get_child(idx).resource.character == null: - continue - if double_previous: - if %Timeline.get_child(idx).resource.character == character: - continue - if character != null: - if one_skipped: - one_skipped = false - else: - character = %Timeline.get_child(idx).resource.character - break - character = %Timeline.get_child(idx).resource.character - else: - character = %Timeline.get_child(idx).resource.character - break - return character - -#endregion - -#region SEARCH -################################################################################ - -var search_results := {} -func _search_timeline(search_text:String, match_case := false, whole_words := false) -> bool: - var flags := 0 - if match_case: - flags = flags | TextEdit.SEARCH_MATCH_CASE - if whole_words: - flags = flags | TextEdit.SEARCH_WHOLE_WORDS - - search_results.clear() - - # This checks all text events for whether they contain the text. - # If so, the text field is stored in search_results - # which is later used to navigate through only the relevant text fields. - - for block in %Timeline.get_children(): - if block.resource is DialogicTextEvent: - var text_field: TextEdit = block.get_field_node("text") - - text_field.deselect() - text_field.set_search_text(search_text) - text_field.set_search_flags(flags) - - if text_field.search(search_text, flags, 0, 0).x != -1: - search_results[block] = text_field - - text_field.queue_redraw() - - set_meta("current_search", search_text) - set_meta("current_search_flags", flags) - - search_navigate(false) - - return not search_results.is_empty() - - -func _search_navigate_down() -> void: - search_navigate(false) - - -func _search_navigate_up() -> void: - search_navigate(true) - - -func search_navigate(navigate_up := false) -> void: - var next_pos := get_next_search_position(navigate_up) - if next_pos: - var event: Node = next_pos[0] - var field: TextEdit = next_pos[1] - var result: Vector2i = next_pos[2] - if not event in selected_items: - select_item(next_pos[0], false) - %TimelineArea.ensure_control_visible(event) - event._on_ToggleBodyVisibility_toggled(true) - field.call_deferred("select", result.y, result.x, result.y, result.x+len(get_meta("current_search"))) - - -func get_next_search_position(navigate_up:= false, include_current := false) -> Array: - var search_text: String = get_meta("current_search", "") - var search_flags: int = get_meta("current_search_flags", 0) - - if search_results.is_empty() or %Timeline.get_child_count() == 0: - return [] - - # We start the search on the selected item, - # so these checks make sure something sensible is selected - - # Try to select the event that has focus - if get_viewport().gui_get_focus_owner() is TextEdit and get_viewport().gui_get_focus_owner() is DialogicVisualEditorField: - select_item(get_viewport().gui_get_focus_owner().event_resource.editor_node, false) - get_viewport().gui_get_focus_owner().deselect() - - # Select the first event if nothing is selected - if selected_items.is_empty(): - select_item(search_results.keys()[0], false) - - # Loop to the next event that where something was found - if not selected_items[0] in search_results: - var index: int = selected_items[0].get_index() - while not %Timeline.get_child(index) in search_results: - index = wrapi(index+1, 0, %Timeline.get_child_count()-1) - select_item(%Timeline.get_child(index), false) - - - var event: Node = selected_items[0] - var counter := 0 - var first := true - while true: - counter += 1 - var field: TextEdit = search_results[event] - field.queue_redraw() - - # First locates the next result in this field - var result := search_text_field(field, search_text, search_flags, navigate_up, first and include_current) - var current_line := field.get_selection_from_line() if field.has_selection() else -1 - var current_column := field.get_selection_from_column() if field.has_selection() else -1 - - first = false - - # Determines if the found result is valid or navigation should continue into the next event - var next_is_in_this_event := false - if result.y == -1: - next_is_in_this_event = false - elif navigate_up: - if current_line == -1: - current_line = field.get_line_count()-1 - current_column = field.get_line(current_line).length() - next_is_in_this_event = result.x < current_column or result.y < current_line - elif include_current: - next_is_in_this_event = true - else: - next_is_in_this_event = result.x > current_column or result.y > current_line - - # If the next result was found return it - if next_is_in_this_event: - return [event, field, result] - - # Otherwise deselct this field and continue in the next/previous - field.deselect() - var index := search_results.keys().find(event) - event = search_results.keys()[wrapi(index+(-1 if navigate_up else 1), 0, search_results.size())] - - if counter > 5: - print("[Dialogic] Search failed.") - break - return [] - - -func search_text_field(field:TextEdit, search_text := "", flags:= 0, navigate_up:= false, include_current := false) -> Vector2i: - var search_from_line: int = 0 - var search_from_column: int = 0 - if field.has_selection(): - if navigate_up: - search_from_line = field.get_selection_from_line() - search_from_column = field.get_selection_from_column()-1 - if search_from_column == -1: - search_from_line -= 1 - if search_from_line == -1: - return Vector2i(-1, -1) - search_from_column = field.get_line(search_from_line).length()-1 - elif include_current: - search_from_line = field.get_selection_from_line() - search_from_column = field.get_selection_from_column() - else: - search_from_line = field.get_selection_to_line() - search_from_column = field.get_selection_to_column() - else: - if navigate_up: - search_from_line = field.get_line_count()-1 - search_from_column = field.get_line(search_from_line).length()-1 - - if navigate_up: - flags = flags | TextEdit.SEARCH_BACKWARDS - - var search := field.search(search_text, flags, search_from_line, search_from_column) - return search - - -func replace(replace_text:String) -> void: - var next_pos := get_next_search_position(false, true) - var event: Node = next_pos[0] - var field: TextEdit = next_pos[1] - var result: Vector2i = next_pos[2] - - if field.has_selection(): - field.set_caret_column(field.get_selection_from_column()) - field.set_caret_line(field.get_selection_from_line()) - - field.begin_complex_operation() - field.insert_text("@@", result.y, result.x) - if get_meta("current_search_flags") & TextEdit.SEARCH_MATCH_CASE: - field.text = field.text.replace("@@"+get_meta("current_search"), replace_text) - else: - field.text = field.text.replacen("@@"+get_meta("current_search"), replace_text) - field.end_complex_operation() - - timeline_editor.replace_in_timeline() - - -func replace_all(replace_text:String) -> void: - var next_pos := get_next_search_position() - if not next_pos: - return - var event: Node = next_pos[0] - var field: TextEdit = next_pos[1] - var result: Vector2i = next_pos[2] - field.begin_complex_operation() - while next_pos: - event = next_pos[0] - if field != next_pos[1]: - field.end_complex_operation() - field = next_pos[1] - field.begin_complex_operation() - result = next_pos[2] - - if field.has_selection(): - field.set_caret_column(field.get_selection_from_column()) - field.set_caret_line(field.get_selection_from_line()) - - field.insert_text("@@", result.y, result.x) - if get_meta("current_search_flags") & TextEdit.SEARCH_MATCH_CASE: - field.text = field.text.replace("@@"+get_meta("current_search"), replace_text) - else: - field.text = field.text.replacen("@@"+get_meta("current_search"), replace_text) - - next_pos = get_next_search_position() - field.end_complex_operation() - timeline_editor.replace_in_timeline() - -#endregion diff --git a/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/timeline_editor_visual.gd.uid b/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/timeline_editor_visual.gd.uid deleted file mode 100644 index 2700172..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/timeline_editor_visual.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cvgok7bxva5e2 diff --git a/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/timeline_editor_visual.tscn b/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/timeline_editor_visual.tscn deleted file mode 100644 index 34f9b5c..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/VisualEditor/timeline_editor_visual.tscn +++ /dev/null @@ -1,116 +0,0 @@ -[gd_scene load_steps=10 format=3 uid="uid://ysqbusmy0qma"] - -[ext_resource type="Script" uid="uid://cvgok7bxva5e2" path="res://addons/dialogic/Editor/TimelineEditor/VisualEditor/timeline_editor_visual.gd" id="1_8smxc"] -[ext_resource type="Theme" uid="uid://cqst728xxipcw" path="res://addons/dialogic/Editor/Theme/MainTheme.tres" id="2_x0fhp"] -[ext_resource type="Script" uid="uid://b6ka2avnh1u55" path="res://addons/dialogic/Editor/TimelineEditor/VisualEditor/TimelineArea.gd" id="3_sap1x"] -[ext_resource type="Script" uid="uid://n1knm2ohcehu" path="res://addons/dialogic/Editor/Events/EventBlock/event_right_click_menu.gd" id="4_ugiq6"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_phyjj"] -content_margin_top = 10.0 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_6gqu8"] -bg_color = Color(0, 0, 0, 1) - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jujwh"] -content_margin_left = 4.0 -content_margin_top = 4.0 -content_margin_right = 4.0 -content_margin_bottom = 4.0 -bg_color = Color(1, 0.365, 0.365, 1) -draw_center = false -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -corner_detail = 1 - -[sub_resource type="Image" id="Image_3temo"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_xe7d2"] -image = SubResource("Image_3temo") - -[node name="TimelineVisualEditor" type="MarginContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_constants/margin_left = 5 -theme_override_constants/margin_right = 5 -theme_override_constants/margin_bottom = 5 -script = ExtResource("1_8smxc") - -[node name="View" type="HSplitContainer" parent="."] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme = ExtResource("2_x0fhp") - -[node name="TimelineArea" type="ScrollContainer" parent="View"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_styles/panel = SubResource("StyleBoxEmpty_phyjj") -script = ExtResource("3_sap1x") - -[node name="Timeline" type="VBoxContainer" parent="View/TimelineArea"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="EventPopupMenu" type="PopupMenu" parent="View/TimelineArea"] -unique_name_in_owner = true -size = Vector2i(165, 124) -theme_override_styles/panel = SubResource("StyleBoxFlat_6gqu8") -theme_override_styles/hover = SubResource("StyleBoxFlat_jujwh") -item_count = 9 -item_0/text = "Duplicate" -item_0/icon = SubResource("ImageTexture_xe7d2") -item_1/id = -1 -item_1/separator = true -item_2/text = "Documentation" -item_2/icon = SubResource("ImageTexture_xe7d2") -item_2/id = 2 -item_3/text = "Open Code" -item_3/icon = SubResource("ImageTexture_xe7d2") -item_3/id = 3 -item_4/id = -1 -item_4/separator = true -item_5/text = "Move up" -item_5/icon = SubResource("ImageTexture_xe7d2") -item_5/id = 5 -item_6/text = "Move down" -item_6/icon = SubResource("ImageTexture_xe7d2") -item_6/id = 6 -item_7/id = -1 -item_7/separator = true -item_8/text = "Delete" -item_8/icon = SubResource("ImageTexture_xe7d2") -item_8/id = 8 -script = ExtResource("4_ugiq6") - -[node name="RightSidebar" type="ScrollContainer" parent="View"] -unique_name_in_owner = true -custom_minimum_size = Vector2(50, 0) -layout_mode = 2 -size_flags_stretch_ratio = 0.2 -horizontal_scroll_mode = 0 - -[node name="EventContainer" type="VBoxContainer" parent="View/RightSidebar"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -size_flags_stretch_ratio = 0.2 - -[connection signal="drag_completed" from="View/TimelineArea" to="." method="_on_timeline_area_drag_completed"] -[connection signal="id_pressed" from="View/TimelineArea/EventPopupMenu" to="." method="_on_event_popup_menu_id_pressed"] -[connection signal="resized" from="View/RightSidebar" to="." method="_on_right_sidebar_resized"] diff --git a/godot/addons/dialogic/Editor/TimelineEditor/shortcut_popup.gd b/godot/addons/dialogic/Editor/TimelineEditor/shortcut_popup.gd deleted file mode 100644 index 5661d09..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/shortcut_popup.gd +++ /dev/null @@ -1,118 +0,0 @@ -@tool -extends PanelContainer - - -var shortcuts := [ - - {"shortcut":"Ctrl+T", "text":"Add Text event", "editor":"VisualEditor"}, - {"shortcut":"Ctrl+Shift+T", "text":"Add Text event with current character", "editor":"VisualEditor"}, - {"shortcut":"Ctrl+Alt/Opt+T", "text":"Add Text event with previous character", "editor":"VisualEditor"}, - {"shortcut":"Ctrl+E", "text":"Add Character join event", "editor":"VisualEditor"}, - {"shortcut":"Ctrl+Shift+E", "text":"Add Character update event", "editor":"VisualEditor"}, - {"shortcut":"Ctrl+Alt/Opt+E", "text":"Add Character leave event", "editor":"VisualEditor"}, - {"shortcut":"Ctrl+J", "text":"Add Jump event", "editor":"VisualEditor"}, - {"shortcut":"Ctrl+L", "text":"Add Label event", "editor":"VisualEditor"}, - {}, - {"shortcut":"Alt/Opt+Up", "text":"Move selected events/lines up"}, - {"shortcut":"Alt/Opt+Down", "text":"Move selected events/lines down"}, - {}, - {"shortcut":"Ctrl+F", "text":"Search"}, - {"shortcut":"Ctrl+R", "text":"Replace"}, - {}, - {"shortcut":"Ctrl+F5", "text":"Play timeline", "platform":"-macOS"}, - {"shortcut":"Ctrl+B", "text":"Play timeline", "platform":"macOS"}, - {"shortcut":"Ctrl+F6", "text":"Play timeline from here", "platform":"-macOS"}, - {"shortcut":"Ctrl+Shift+B", "text":"Play timeline from here", "platform":"macOS"}, - - {}, - {"shortcut":"Ctrl+C", "text":"Copy"}, - {"shortcut":"Ctrl+V", "text":"Paste"}, - {"shortcut":"Ctrl+D", "text":"Duplicate selected events/lines"}, - {"shortcut":"Ctrl+X", "text":"Cut selected events/lines"}, - {"shortcut":"Ctrl+K", "text":"Toggle Comment" , "editor":"TextEditor"}, - {"shortcut":"Delete", "text":"Delete events", "editor":"VisualEditor"}, - {}, - {"shortcut":"Ctrl+A", "text":"Select All"}, - {"shortcut":"Ctrl+Shift+A", "text":"Select Nothing", "editor":"VisualEditor"}, - {"shortcut":"Up", "text":"Select previous event", "editor":"VisualEditor"}, - {"shortcut":"Down", "text":"Select next event", "editor":"VisualEditor"}, - {}, - {"shortcut":"Ctrl+Z", "text":"Undo"}, - {"shortcut":"Ctrl+Shift+Z", "text":"Redo"}, - {}, -] - - -# Called when the node enters the scene tree for the first time. -func _ready() -> void: - %CloseShortcutPanel.icon = get_theme_icon("Close", "EditorIcons") - get_theme_stylebox("panel").bg_color = get_theme_color("dark_color_3", "Editor") - - -func reload_shortcuts() -> void: - for i in %ShortcutList.get_children(): - i.queue_free() - - var is_text_editor: bool = %TextEditor.visible - for i in shortcuts: - if i.is_empty(): - %ShortcutList.add_child(HSeparator.new()) - %ShortcutList.add_child(HSeparator.new()) - continue - - if "editor" in i and not get_node("%"+i.editor).visible: - continue - - if "platform" in i: - var platform := OS.get_name() - if not (platform == i.platform.trim_prefix("-") != i.platform.begins_with("-")): - continue - - var hbox := HBoxContainer.new() - hbox.add_theme_constant_override("separation", 0) - for key_text in i.shortcut.split("+"): - if hbox.get_child_count(): - var plus_l := Label.new() - plus_l.text = "+" - hbox.add_child(plus_l) - - var key := Button.new() - if key_text == "Up": - key.icon = get_theme_icon("ArrowUp", "EditorIcons") - elif key_text == "Down": - key.icon = get_theme_icon("ArrowDown", "EditorIcons") - else: - key_text = key_text.replace("Alt/Opt", "Opt" if OS.get_name() == "macOS" else "Alt") - key.text = key_text - key.disabled = true - key.theme_type_variation = "ShortcutKeyLabel" - key.add_theme_font_override("font", get_theme_font("source", "EditorFonts")) - hbox.add_child(key) - - %ShortcutList.add_child(hbox) - - var text := Label.new() - text.text = i.text.replace("events/lines", "lines" if is_text_editor else "events") - text.theme_type_variation = "DialogicHintText2" - %ShortcutList.add_child(text) - - -func open(): - if visible: - close() - return - reload_shortcuts() - - show() - await get_tree().process_frame - size = get_parent().size - Vector2(100, 100)*DialogicUtil.get_editor_scale() - size.x = %ShortcutList.get_minimum_size().x + 100 - size.y = min(size.y, %ShortcutList.get_minimum_size().y+100) - global_position = get_parent().global_position+get_parent().size/2-size/2 - - -func _on_close_shortcut_panel_pressed() -> void: - close() - -func close() -> void: - hide() diff --git a/godot/addons/dialogic/Editor/TimelineEditor/shortcut_popup.gd.uid b/godot/addons/dialogic/Editor/TimelineEditor/shortcut_popup.gd.uid deleted file mode 100644 index 1ab0805..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/shortcut_popup.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b35hvsvrvjjl4 diff --git a/godot/addons/dialogic/Editor/TimelineEditor/test_timeline_scene.gd b/godot/addons/dialogic/Editor/TimelineEditor/test_timeline_scene.gd deleted file mode 100644 index 2a907a1..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/test_timeline_scene.gd +++ /dev/null @@ -1,44 +0,0 @@ -extends Control - -func _ready() -> void: - print("[Dialogic] Testing scene was started.") - if not ProjectSettings.get_setting('internationalization/locale/test', "").is_empty(): - print("Testing locale is: ", ProjectSettings.get_setting('internationalization/locale/test')) - $PauseIndictator.hide() - - var scene: Node = DialogicUtil.autoload().Styles.load_style(DialogicUtil.get_editor_setting('current_test_style', '')) - if not scene is CanvasLayer: - if scene is Control: - scene.position = get_viewport_rect().size/2.0 - if scene is Node2D: - scene.position = get_viewport_rect().size/2.0 - - randomize() - var current_timeline: String = DialogicUtil.get_editor_setting("current_timeline_path", "") - var start_from_index: int = DialogicUtil.get_editor_setting("play_from_index", -1) - if not current_timeline: - get_tree().quit() - DialogicUtil.autoload().start(current_timeline, start_from_index) - DialogicUtil.autoload().timeline_ended.connect(get_tree().quit) - DialogicUtil.autoload().signal_event.connect(receive_event_signal) - DialogicUtil.autoload().text_signal.connect(receive_text_signal) - -func receive_event_signal(argument:Variant) -> void: - print("[Dialogic] Encountered a signal event: ", argument) - -func receive_text_signal(argument:String) -> void: - print("[Dialogic] Encountered a signal in text: ", argument) - -func _input(event:InputEvent) -> void: - if event is InputEventKey and event.pressed and event.keycode == KEY_ESCAPE: - DialogicUtil.autoload().paused = !DialogicUtil.autoload().paused - $PauseIndictator.visible = DialogicUtil.autoload().paused - - if (event is InputEventMouseButton - and event.is_pressed() - and event.button_index == MOUSE_BUTTON_MIDDLE): - var auto_skip: DialogicAutoSkip = DialogicUtil.autoload().Inputs.auto_skip - var is_auto_skip_enabled := auto_skip.enabled - - auto_skip.disable_on_unread_text = false - auto_skip.enabled = not is_auto_skip_enabled diff --git a/godot/addons/dialogic/Editor/TimelineEditor/test_timeline_scene.gd.uid b/godot/addons/dialogic/Editor/TimelineEditor/test_timeline_scene.gd.uid deleted file mode 100644 index 800625b..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/test_timeline_scene.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cbq0n68r4pwu7 diff --git a/godot/addons/dialogic/Editor/TimelineEditor/test_timeline_scene.tscn b/godot/addons/dialogic/Editor/TimelineEditor/test_timeline_scene.tscn deleted file mode 100644 index ed877d5..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/test_timeline_scene.tscn +++ /dev/null @@ -1,25 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://ud18ke1g2nw4"] - -[ext_resource type="Script" uid="uid://cbq0n68r4pwu7" path="res://addons/dialogic/Editor/TimelineEditor/test_timeline_scene.gd" id="1_bamud"] - -[node name="TestTimelineScene" type="Control"] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("1_bamud") - -[node name="PauseIndictator" type="Label" parent="."] -layout_mode = 1 -anchors_preset = 1 -anchor_left = 1.0 -anchor_right = 1.0 -offset_left = -65.0 -offset_top = 7.0 -offset_right = -8.0 -offset_bottom = 33.0 -grow_horizontal = 0 -text = "Paused" -metadata/_edit_layout_mode = 1 diff --git a/godot/addons/dialogic/Editor/TimelineEditor/timeline_editor.gd b/godot/addons/dialogic/Editor/TimelineEditor/timeline_editor.gd deleted file mode 100644 index fec801e..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/timeline_editor.gd +++ /dev/null @@ -1,321 +0,0 @@ -@tool -extends DialogicEditor - -## Editor that holds both the visual and the text timeline editors. - -# references -enum EditorMode {VISUAL, TEXT} - -var current_editor_mode := EditorMode.VISUAL -var play_timeline_button: Button = null - - -## Overwrite. Register to the editor manager in here. -func _register() -> void: - resource_unsaved.connect(_on_resource_unsaved) - resource_saved.connect(_on_resource_saved) - - # register editor - editors_manager.register_resource_editor('dtl', self) - # add timeline button - var add_timeline_button: Button = editors_manager.add_icon_button( - load("res://addons/dialogic/Editor/Images/Toolbar/add-timeline.svg"), - "Add Timeline", - self) - add_timeline_button.pressed.connect(_on_create_timeline_button_pressed) - add_timeline_button.shortcut = Shortcut.new() - add_timeline_button.shortcut.events.append(InputEventKey.new()) - add_timeline_button.shortcut.events[0].keycode = KEY_1 - add_timeline_button.shortcut.events[0].ctrl_pressed = true - # play timeline button - play_timeline_button = editors_manager.add_custom_button( - "Play Timeline", - get_theme_icon("PlayScene", "EditorIcons"), - self) - play_timeline_button.pressed.connect(play_timeline) - play_timeline_button.tooltip_text = "Play the current timeline (CTRL+F5)" - if OS.get_name() == "macOS": - play_timeline_button.tooltip_text = "Play the current timeline (CTRL+B)" - - %VisualEditor.load_event_buttons() - - current_editor_mode = DialogicUtil.get_editor_setting('timeline_editor_mode', 0) - - match current_editor_mode: - EditorMode.VISUAL: - %VisualEditor.show() - %TextEditor.hide() - %SwitchEditorMode.text = "Text Editor" - EditorMode.TEXT: - %VisualEditor.hide() - %TextEditor.show() - %SwitchEditorMode.text = "Visual Editor" - - $NoTimelineScreen.show() - play_timeline_button.disabled = true - - -func _get_title() -> String: - return "Timeline" - - -func _get_icon() -> Texture: - return get_theme_icon("TripleBar", "EditorIcons") - - -## If this editor supports editing resources, load them here (overwrite in subclass) -func _open_resource(resource:Resource) -> void: - current_resource = resource - current_resource_state = ResourceStates.SAVED - match current_editor_mode: - EditorMode.VISUAL: - %VisualEditor.load_timeline(current_resource) - EditorMode.TEXT: - %TextEditor.load_timeline(current_resource) - $NoTimelineScreen.hide() - %TimelineName.text = current_resource.get_identifier() - play_timeline_button.disabled = false - - -## If this editor supports editing resources, save them here (overwrite in subclass) -func _save() -> void: - match current_editor_mode: - EditorMode.VISUAL: - %VisualEditor.save_timeline() - EditorMode.TEXT: - %TextEditor.save_timeline() - - -func _input(event: InputEvent) -> void: - if event is InputEventKey: - var keycode := KEY_F5 - if OS.get_name() == "macOS": - keycode = KEY_B - if event.keycode == keycode and event.pressed: - if Input.is_key_pressed(KEY_CTRL): - play_timeline() - - if event.keycode == KEY_F and event.pressed: - if Input.is_key_pressed(KEY_CTRL): - if is_ancestor_of(get_viewport().gui_get_focus_owner()): - search_timeline() - - if event.keycode == KEY_R and event.pressed: - if Input.is_key_pressed(KEY_CTRL): - if is_ancestor_of(get_viewport().gui_get_focus_owner()): - replace_in_timeline(true) - -## Method to play the current timeline. Connected to the button in the sidebar. -func play_timeline(index := -1) -> void: - _save() - - var dialogic_plugin := DialogicUtil.get_dialogic_plugin() - - # Save the current opened timeline - DialogicUtil.set_editor_setting('current_timeline_path', current_resource.resource_path) - DialogicUtil.set_editor_setting('play_from_index', index) - DialogicUtil.get_dialogic_plugin().get_editor_interface().play_custom_scene("res://addons/dialogic/Editor/TimelineEditor/test_timeline_scene.tscn") - - -## Method to switch from visual to text editor (and vice versa). Connected to the button in the sidebar. -func toggle_editor_mode() -> void: - match current_editor_mode: - EditorMode.VISUAL: - current_editor_mode = EditorMode.TEXT - if %VisualEditor.is_loading_timeline(): - %VisualEditor.cancel_loading() - else: - %VisualEditor.save_timeline() - %VisualEditor.hide() - %TextEditor.show() - %TextEditor.load_timeline(current_resource) - %SwitchEditorMode.text = "Visual Editor" - _on_search_text_changed(%Search.text) - EditorMode.TEXT: - _on_search_text_changed.bind("") - current_editor_mode = EditorMode.VISUAL - %TextEditor.save_timeline() - %TextEditor.hide() - %VisualEditor.load_timeline(current_resource) - %VisualEditor.show() - %SwitchEditorMode.text = "Text Editor" - if not %VisualEditor.timeline_loaded.is_connected(_on_search_text_changed): - %VisualEditor.timeline_loaded.connect(_on_search_text_changed.bind(%Search.text), CONNECT_ONE_SHOT) - DialogicUtil.set_editor_setting('timeline_editor_mode', current_editor_mode) - - -func _on_resource_unsaved() -> void: - if current_resource: - current_resource.set_meta("timeline_not_saved", true) - - -func _on_resource_saved() -> void: - if current_resource: - current_resource.set_meta("timeline_not_saved", false) - - -func new_timeline(path:String) -> void: - _save() - var new_timeline := DialogicTimeline.new() - if not path.ends_with(".dtl"): - path = path.trim_suffix(".") - path += ".dtl" - new_timeline.resource_path = path - new_timeline.set_meta('timeline_not_saved', true) - var err := ResourceSaver.save(new_timeline) - EditorInterface.get_resource_filesystem().update_file(new_timeline.resource_path) - DialogicResourceUtil.update_directory('dtl') - editors_manager.edit_resource(new_timeline) - - -func update_audio_channel_cache(list:PackedStringArray) -> void: - var timeline_directory := DialogicResourceUtil.get_timeline_directory() - var channel_directory := DialogicResourceUtil.get_audio_channel_cache() - if current_resource != null: - for i in timeline_directory: - if timeline_directory[i] == current_resource.resource_path: - channel_directory[i] = list - - # also always store the current timelines channels for easy access - channel_directory[""] = list - - DialogicResourceUtil.set_audio_channel_cache(channel_directory) - - -func _ready() -> void: - $NoTimelineScreen.add_theme_stylebox_override("panel", get_theme_stylebox("Background", "EditorStyles")) - - # switch editor mode button - %SwitchEditorMode.text = "Text editor" - %SwitchEditorMode.icon = get_theme_icon("ArrowRight", "EditorIcons") - %SwitchEditorMode.pressed.connect(toggle_editor_mode) - %SwitchEditorMode.custom_minimum_size.x = 200 * DialogicUtil.get_editor_scale() - - %Shortcuts.icon = get_theme_icon("InputEventShortcut", "EditorIcons") - %Shortcuts.pressed.connect(%ShortcutsPanel.open) - - %SearchClose.icon = get_theme_icon("Close", "EditorIcons") - %SearchUp.icon = get_theme_icon("MoveUp", "EditorIcons") - %SearchDown.icon = get_theme_icon("MoveDown", "EditorIcons") - - %ReplaceGlobal.icon = get_theme_icon("ExternalLink", "EditorIcons") - - %ProgressSection.hide() - - %SearchReplaceSection.hide() - %SearchReplaceSection.add_theme_stylebox_override("panel", get_theme_stylebox("PanelForeground", "EditorStyles")) - - -func _on_create_timeline_button_pressed() -> void: - editors_manager.show_add_resource_dialog( - new_timeline, - '*.dtl; DialogicTimeline', - 'Create new timeline', - 'timeline', - ) - - -func _clear() -> void: - current_resource = null - current_resource_state = ResourceStates.SAVED - match current_editor_mode: - EditorMode.VISUAL: - %VisualEditor.clear_timeline_nodes() - EditorMode.TEXT: - %TextEditor.clear_timeline() - $NoTimelineScreen.show() - play_timeline_button.disabled = true - - -func get_current_editor() -> Node: - if current_editor_mode == 1: - return %TextEditor - return %VisualEditor - -#region SEARCH - -func search_timeline() -> void: - %SearchReplaceSection.show() - %SearchSection.show() - %ReplaceSection.hide() - if get_viewport().gui_get_focus_owner() is TextEdit: - if get_viewport().gui_get_focus_owner().get_selected_text(): - %Search.text = get_viewport().gui_get_focus_owner().get_selected_text() - _on_search_text_changed(%Search.text) - %Search.grab_focus() - - -func _on_close_search_pressed() -> void: - %SearchReplaceSection.hide() - %Search.text = "" - _on_search_text_changed('') - - -func _on_search_text_changed(new_text: String) -> void: - var editor: Node = null - var anything_found: bool = get_current_editor()._search_timeline(new_text, %MatchCase.button_pressed, %WholeWords.button_pressed) - if anything_found or new_text.is_empty(): - %SearchLabel.hide() - %Search.add_theme_color_override("font_color", get_theme_color("font_color", "Editor")) - else: - %SearchLabel.show() - %SearchLabel.add_theme_color_override("font_color", get_theme_color("error_color", "Editor")) - %Search.add_theme_color_override("font_color", get_theme_color("error_color", "Editor")) - %SearchLabel.text = "No Match" - - -func _on_search_down_pressed() -> void: - get_current_editor()._search_navigate_down() - - -func _on_search_up_pressed() -> void: - get_current_editor()._search_navigate_up() - - -func _on_match_case_toggled(toggled_on: bool) -> void: - _on_search_text_changed(%Search.text) - - -func _on_whole_words_toggled(toggled_on: bool) -> void: - _on_search_text_changed(%Search.text) - - -#endregion - - -#region REPLACE - -func replace_in_timeline(focus_grab:=false) -> void: - search_timeline() - %ReplaceSection.show() - if focus_grab: - %ReplaceText.grab_focus() - %ReplaceText.select_all() - - -func _on_replace_button_pressed() -> void: - get_current_editor().replace(%ReplaceText.text) - - -func _on_replace_all_button_pressed() -> void: - get_current_editor().replace_all(%ReplaceText.text) - - -func _on_replace_global_pressed() -> void: - editors_manager.reference_manager.add_ref_change(%Search.text, %ReplaceText.text, 0, 0, [], - %WholeWords.button_pressed, %MatchCase.button_pressed) - editors_manager.reference_manager.open() - -#endregion - - -#region PROGRESS - -func set_progress(percentage:float, text := "") -> void: - %ProgressSection.visible = percentage != 1 - - %ProgressBar.value = percentage - %ProgressLabel.text = text - %ProgressLabel.visible = not text.is_empty() - -#endregion diff --git a/godot/addons/dialogic/Editor/TimelineEditor/timeline_editor.gd.uid b/godot/addons/dialogic/Editor/TimelineEditor/timeline_editor.gd.uid deleted file mode 100644 index a8c04d2..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/timeline_editor.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://x21vral0xsxy diff --git a/godot/addons/dialogic/Editor/TimelineEditor/timeline_editor.tscn b/godot/addons/dialogic/Editor/TimelineEditor/timeline_editor.tscn deleted file mode 100644 index 1816c53..0000000 --- a/godot/addons/dialogic/Editor/TimelineEditor/timeline_editor.tscn +++ /dev/null @@ -1,315 +0,0 @@ -[gd_scene load_steps=12 format=3 uid="uid://crce0na84rhfd"] - -[ext_resource type="Script" uid="uid://x21vral0xsxy" path="res://addons/dialogic/Editor/TimelineEditor/timeline_editor.gd" id="1_4aceh"] -[ext_resource type="PackedScene" uid="uid://ysqbusmy0qma" path="res://addons/dialogic/Editor/TimelineEditor/VisualEditor/timeline_editor_visual.tscn" id="2_qs7vc"] -[ext_resource type="PackedScene" uid="uid://dbpkta2tjsqim" path="res://addons/dialogic/Editor/Common/hint_tooltip_icon.tscn" id="2_yqd26"] -[ext_resource type="PackedScene" uid="uid://defdeav8rli6o" path="res://addons/dialogic/Editor/TimelineEditor/TextEditor/timeline_editor_text.tscn" id="3_up2bn"] -[ext_resource type="Script" uid="uid://b35hvsvrvjjl4" path="res://addons/dialogic/Editor/TimelineEditor/shortcut_popup.gd" id="6_rfuk0"] - -[sub_resource type="Image" id="Image_6bv6r"] -data = { -"data": PackedByteArray(255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 92, 92, 0, 255, 92, 92, 0, 255, 92, 92, 0, 255, 92, 92, 0, 255, 92, 92, 0, 255, 92, 92, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 0, 255, 92, 92, 127, 255, 92, 92, 0, 255, 92, 92, 0, 255, 92, 92, 0, 255, 92, 92, 0, 255, 92, 92, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 0, 255, 93, 93, 255, 255, 92, 92, 127, 255, 92, 92, 0, 255, 92, 92, 0, 255, 92, 92, 0, 255, 92, 92, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 127, 255, 92, 92, 0, 255, 92, 92, 0, 255, 92, 92, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 127, 255, 92, 92, 0, 255, 92, 92, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 92, 92, 0, 255, 92, 92, 0, 255, 92, 92, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 231, 255, 90, 90, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 90, 90, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 0, 255, 93, 93, 0, 255, 91, 91, 0, 255, 91, 91, 0, 255, 91, 91, 42, 255, 90, 90, 0, 255, 94, 94, 0, 255, 91, 91, 42, 255, 93, 93, 233, 255, 92, 92, 232, 255, 93, 93, 41, 255, 90, 90, 0, 255, 94, 94, 0, 255, 91, 91, 42, 255, 93, 93, 233, 255, 92, 92, 232, 255, 92, 92, 0, 255, 92, 92, 0, 255, 91, 91, 0, 255, 91, 91, 0, 255, 91, 91, 0, 255, 91, 91, 45, 255, 93, 93, 44, 255, 91, 91, 0, 255, 91, 91, 42, 255, 91, 91, 42, 255, 93, 93, 0, 255, 91, 91, 45, 255, 93, 93, 44, 255, 91, 91, 0, 255, 91, 91, 42, 255, 91, 91, 42, 255, 91, 91, 0, 255, 91, 91, 0, 255, 91, 91, 0, 255, 91, 91, 0, 255, 91, 91, 45, 255, 92, 92, 235, 255, 92, 92, 234, 255, 89, 89, 43, 255, 91, 91, 0, 255, 91, 91, 0, 255, 91, 91, 45, 255, 92, 92, 235, 255, 92, 92, 234, 255, 89, 89, 43, 255, 91, 91, 0, 255, 91, 91, 0, 255, 91, 91, 0, 255, 91, 91, 0, 255, 92, 92, 0, 255, 92, 92, 0, 255, 92, 92, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 91, 91, 59, 255, 92, 92, 61, 255, 92, 92, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 91, 91, 59, 255, 92, 92, 61, 255, 92, 92, 0, 255, 92, 92, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0, 255, 93, 93, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_u2118"] -image = SubResource("Image_6bv6r") - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_boacm"] -content_margin_left = 4.0 -content_margin_top = 4.0 -content_margin_right = 4.0 -content_margin_bottom = 4.0 -bg_color = Color(1, 0.365, 0.365, 1) -draw_center = false -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -corner_detail = 1 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_4bvbc"] -content_margin_left = 0.0 -content_margin_top = 0.0 -content_margin_right = 0.0 -content_margin_bottom = 0.0 -bg_color = Color(0.458405, 0.458405, 0.458405, 1) -draw_center = false -border_width_left = 1 -border_width_top = 1 -border_width_right = 1 -border_width_bottom = 1 -border_color = Color(0.370364, 0.370365, 0.370364, 1) -corner_radius_top_left = 3 -corner_radius_top_right = 3 -corner_radius_bottom_right = 3 -corner_radius_bottom_left = 3 - -[sub_resource type="Theme" id="Theme_feml8"] -HSeparator/constants/separation = 10 -ShortcutKeyLabel/base_type = &"Button" -ShortcutKeyLabel/colors/font_disabled_color = Color(1, 1, 1, 1) -ShortcutKeyLabel/colors/icon_disabled_color = Color(1, 1, 1, 1) -ShortcutKeyLabel/font_sizes/font_size = 14 -ShortcutKeyLabel/styles/disabled = SubResource("StyleBoxFlat_4bvbc") -ShortcutKeyLabel/styles/normal = SubResource("StyleBoxFlat_4bvbc") - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_j85ew"] -content_margin_left = 20.0 -content_margin_top = 20.0 -content_margin_right = 20.0 -content_margin_bottom = 20.0 -bg_color = Color(0, 0, 0, 1) -corner_radius_top_left = 20 -corner_radius_top_right = 20 -corner_radius_bottom_right = 20 -corner_radius_bottom_left = 20 -shadow_color = Color(0, 0, 0, 0.407843) -shadow_size = 15 - -[node name="Timeline" type="Control"] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("1_4aceh") - -[node name="VBox" type="VBoxContainer" parent="."] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="HBox" type="HBoxContainer" parent="VBox"] -layout_mode = 2 - -[node name="TimelineName" type="Label" parent="VBox/HBox"] -unique_name_in_owner = true -layout_mode = 2 -theme_type_variation = &"DialogicTitle" -text = "Cool Name" - -[node name="NameTooltip" parent="VBox/HBox" instance=ExtResource("2_yqd26")] -layout_mode = 2 -tooltip_text = "This unique identifier is based on the file name. You can change it in the Reference Manager. -This is what you should use in a jump event to reference this timeline. - -You can also use this name in Dialogic.start()." -texture = null -hint_text = "This unique identifier is based on the file name. You can change it in the Reference Manager. -This is what you should use in a jump event to reference this timeline. - -You can also use this name in Dialogic.start()." - -[node name="SwitchEditorMode" type="Button" parent="VBox/HBox"] -unique_name_in_owner = true -custom_minimum_size = Vector2(200, 0) -layout_mode = 2 -size_flags_horizontal = 10 -size_flags_vertical = 4 -tooltip_text = "Switch between Text Editor and Visual Editor" -text = "Text editor" -icon = SubResource("ImageTexture_u2118") - -[node name="Shortcuts" type="Button" parent="VBox/HBox"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 8 -size_flags_vertical = 4 -tooltip_text = "Shortcuts" -icon = SubResource("ImageTexture_u2118") - -[node name="VisualEditor" parent="VBox" instance=ExtResource("2_qs7vc")] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 3 -theme_override_constants/margin_left = 0 -theme_override_constants/margin_top = 0 -theme_override_constants/margin_right = 0 -theme_override_constants/margin_bottom = 0 - -[node name="TextEditor" parent="VBox" instance=ExtResource("3_up2bn")] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 3 - -[node name="SearchReplaceSection" type="PanelContainer" parent="VBox"] -unique_name_in_owner = true -visible = false -layout_mode = 2 -theme_override_styles/panel = SubResource("StyleBoxFlat_boacm") - -[node name="VBox" type="VBoxContainer" parent="VBox/SearchReplaceSection"] -layout_mode = 2 - -[node name="SearchSection" type="HBoxContainer" parent="VBox/SearchReplaceSection/VBox"] -unique_name_in_owner = true -layout_mode = 2 - -[node name="Search" type="LineEdit" parent="VBox/SearchReplaceSection/VBox/SearchSection"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -placeholder_text = "Search" - -[node name="SearchLabel" type="Label" parent="VBox/SearchReplaceSection/VBox/SearchSection"] -unique_name_in_owner = true -visible = false -layout_mode = 2 - -[node name="SearchUp" type="Button" parent="VBox/SearchReplaceSection/VBox/SearchSection"] -unique_name_in_owner = true -layout_mode = 2 -icon = SubResource("ImageTexture_u2118") -flat = true - -[node name="SearchDown" type="Button" parent="VBox/SearchReplaceSection/VBox/SearchSection"] -unique_name_in_owner = true -layout_mode = 2 -icon = SubResource("ImageTexture_u2118") -flat = true - -[node name="MatchCase" type="CheckBox" parent="VBox/SearchReplaceSection/VBox/SearchSection"] -unique_name_in_owner = true -layout_mode = 2 -text = "Match Case" - -[node name="WholeWords" type="CheckBox" parent="VBox/SearchReplaceSection/VBox/SearchSection"] -unique_name_in_owner = true -layout_mode = 2 -text = "Whole Words" - -[node name="SearchClose" type="Button" parent="VBox/SearchReplaceSection/VBox/SearchSection"] -unique_name_in_owner = true -layout_mode = 2 -icon = SubResource("ImageTexture_u2118") -flat = true - -[node name="ReplaceSection" type="HBoxContainer" parent="VBox/SearchReplaceSection/VBox"] -unique_name_in_owner = true -layout_mode = 2 - -[node name="ReplaceText" type="LineEdit" parent="VBox/SearchReplaceSection/VBox/ReplaceSection"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -placeholder_text = "Replace" - -[node name="ReplaceButton" type="Button" parent="VBox/SearchReplaceSection/VBox/ReplaceSection"] -unique_name_in_owner = true -layout_mode = 2 -text = "Replace" - -[node name="ReplaceAllButton" type="Button" parent="VBox/SearchReplaceSection/VBox/ReplaceSection"] -unique_name_in_owner = true -layout_mode = 2 -text = "Replace All" - -[node name="ReplaceGlobal" type="Button" parent="VBox/SearchReplaceSection/VBox/ReplaceSection"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Replace in all timelines" -icon = SubResource("ImageTexture_u2118") - -[node name="ProgressSection" type="HBoxContainer" parent="VBox"] -unique_name_in_owner = true -visible = false -layout_mode = 2 - -[node name="ProgressBar" type="ProgressBar" parent="VBox/ProgressSection"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -max_value = 1.0 -step = 0.001 - -[node name="ProgressLabel" type="Label" parent="VBox/ProgressSection"] -unique_name_in_owner = true -layout_mode = 2 - -[node name="NoTimelineScreen" type="PanelContainer" parent="."] -visible = false -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_styles/panel = SubResource("StyleBoxFlat_boacm") - -[node name="CenterContainer" type="CenterContainer" parent="NoTimelineScreen"] -layout_mode = 2 - -[node name="VBoxContainer" type="VBoxContainer" parent="NoTimelineScreen/CenterContainer"] -custom_minimum_size = Vector2(250, 0) -layout_mode = 2 - -[node name="Label" type="Label" parent="NoTimelineScreen/CenterContainer/VBoxContainer"] -layout_mode = 2 -text = "No timeline opened. -Create a timeline or double-click one in the file system dock." -horizontal_alignment = 1 -autowrap_mode = 3 - -[node name="CreateTimelineButton" type="Button" parent="NoTimelineScreen/CenterContainer/VBoxContainer"] -layout_mode = 2 -text = "Create New Timeline" - -[node name="ShortcutsPanel" type="PanelContainer" parent="."] -unique_name_in_owner = true -visible = false -layout_mode = 0 -offset_left = 51.0 -offset_top = 57.0 -offset_right = 571.0 -offset_bottom = 416.0 -theme = SubResource("Theme_feml8") -theme_override_styles/panel = SubResource("StyleBoxFlat_j85ew") -script = ExtResource("6_rfuk0") - -[node name="VBoxContainer" type="VBoxContainer" parent="ShortcutsPanel"] -layout_mode = 2 - -[node name="HBoxContainer" type="HBoxContainer" parent="ShortcutsPanel/VBoxContainer"] -layout_mode = 2 - -[node name="Label" type="Label" parent="ShortcutsPanel/VBoxContainer/HBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -theme_type_variation = &"DialogicSectionBig" -text = "Shortcuts " - -[node name="CloseShortcutPanel" type="Button" parent="ShortcutsPanel/VBoxContainer/HBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -icon = SubResource("ImageTexture_u2118") -flat = true - -[node name="ScrollContainer" type="ScrollContainer" parent="ShortcutsPanel/VBoxContainer"] -layout_mode = 2 -size_flags_vertical = 3 - -[node name="ShortcutList" type="GridContainer" parent="ShortcutsPanel/VBoxContainer/ScrollContainer"] -unique_name_in_owner = true -layout_mode = 2 -theme_override_constants/h_separation = 11 -columns = 2 - -[connection signal="text_changed" from="VBox/SearchReplaceSection/VBox/SearchSection/Search" to="." method="_on_search_text_changed"] -[connection signal="pressed" from="VBox/SearchReplaceSection/VBox/SearchSection/SearchUp" to="." method="_on_search_up_pressed"] -[connection signal="pressed" from="VBox/SearchReplaceSection/VBox/SearchSection/SearchDown" to="." method="_on_search_down_pressed"] -[connection signal="toggled" from="VBox/SearchReplaceSection/VBox/SearchSection/MatchCase" to="." method="_on_match_case_toggled"] -[connection signal="toggled" from="VBox/SearchReplaceSection/VBox/SearchSection/WholeWords" to="." method="_on_whole_words_toggled"] -[connection signal="pressed" from="VBox/SearchReplaceSection/VBox/SearchSection/SearchClose" to="." method="_on_close_search_pressed"] -[connection signal="pressed" from="VBox/SearchReplaceSection/VBox/ReplaceSection/ReplaceButton" to="." method="_on_replace_button_pressed"] -[connection signal="pressed" from="VBox/SearchReplaceSection/VBox/ReplaceSection/ReplaceAllButton" to="." method="_on_replace_all_button_pressed"] -[connection signal="pressed" from="VBox/SearchReplaceSection/VBox/ReplaceSection/ReplaceGlobal" to="." method="_on_replace_global_pressed"] -[connection signal="pressed" from="NoTimelineScreen/CenterContainer/VBoxContainer/CreateTimelineButton" to="." method="_on_create_timeline_button_pressed"] -[connection signal="pressed" from="ShortcutsPanel/VBoxContainer/HBoxContainer/CloseShortcutPanel" to="ShortcutsPanel" method="_on_close_shortcut_panel_pressed"] diff --git a/godot/addons/dialogic/Editor/dialogic_editor.gd b/godot/addons/dialogic/Editor/dialogic_editor.gd deleted file mode 100644 index 4dfbe2a..0000000 --- a/godot/addons/dialogic/Editor/dialogic_editor.gd +++ /dev/null @@ -1,67 +0,0 @@ -@tool -class_name DialogicEditor -extends Control - -## Base class for all dialogic editors. - -# These signals will automatically be emitted if current_resource_state is changed. -signal resource_saved() -signal resource_unsaved() - -@warning_ignore("unused_signal")# This is emitted from the Editors Manager -signal opened - -var current_resource: Resource - -## State of the current resource -enum ResourceStates {SAVED, UNSAVED} -var current_resource_state: ResourceStates: - set(value): - current_resource_state = value - if value == ResourceStates.SAVED: - resource_saved.emit() - else: - resource_unsaved.emit() - -var editors_manager: Control -# text displayed on the current resource label on non-resource editors -var alternative_text: String = "" - -## Overwrite. Register to the editor manager in here. -func _register() -> void: - pass - - -## Used on the tab -func _get_icon() -> Texture: - return null - -## Used on the tab -func _get_title() -> String: - return "" - - -## If this editor supports editing resources, load them here (overwrite in subclass) -func _open_resource(_resource:Resource) -> void: - pass - - -## If this editor supports editing resources, save them here (overwrite in subclass) -func _save() -> void: - pass - - -## Overwrite. Called when this editor is shown. (show() doesn't have to be called) -func _open(_extra_info:Variant = null) -> void: - pass - - -## Overwrite. Called when another editor is opened. (hide() doesn't have to be called) -func _close() -> void: - pass - - -## Overwrite. Called to clear all current state and resource from the editor. -## Although rarely used, sometimes you just want NO timeline to be open. -func _clear() -> void: - pass diff --git a/godot/addons/dialogic/Editor/dialogic_editor.gd.uid b/godot/addons/dialogic/Editor/dialogic_editor.gd.uid deleted file mode 100644 index c28b30b..0000000 --- a/godot/addons/dialogic/Editor/dialogic_editor.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dorbh771j7fyf diff --git a/godot/addons/dialogic/Editor/editor_main.gd b/godot/addons/dialogic/Editor/editor_main.gd deleted file mode 100644 index 0e4a445..0000000 --- a/godot/addons/dialogic/Editor/editor_main.gd +++ /dev/null @@ -1,310 +0,0 @@ -@tool -extends Control - -## Editor root node. Most editor functionality is handled by EditorsManager node! - -var plugin_reference: EditorPlugin = null -var editors_manager: Control = null - -var editor_file_dialog: EditorFileDialog - -@onready var sidebar := %Sidebar as DialogicSidebar - -func _ready() -> void: - if get_parent() is SubViewport: - return - - ## CONNECTIONS - sidebar.show_sidebar.connect(_on_sidebar_toggled) - - ## REFERENCES - editors_manager = $EditorsManager - var button: Button = editors_manager.add_icon_button( - get_theme_icon("MakeFloating", "EditorIcons"), "Make floating" - ) - button.pressed.connect(toggle_floating_window) - - # File dialog - editor_file_dialog = EditorFileDialog.new() - add_child(editor_file_dialog) - - var info_message := Label.new() - info_message.add_theme_color_override("font_color", get_theme_color("warning_color", "Editor")) - editor_file_dialog.get_line_edit().get_parent().add_sibling(info_message) - info_message.get_parent().move_child(info_message, info_message.get_index() - 1) - editor_file_dialog.set_meta("info_message_label", info_message) - - $SaveConfirmationDialog.add_button("No Saving Please!", true, "nosave") - $SaveConfirmationDialog.hide() - update_theme_additions() - EditorInterface.get_base_control().theme_changed.connect(update_theme_additions) - - -func _on_sidebar_toggled(sidebar_shown: bool) -> void: - var h_split := (%HSplit as HSplitContainer) - if sidebar_shown: - h_split.dragger_visibility = SplitContainer.DRAGGER_VISIBLE - h_split.split_offset = 150 - h_split.collapsed = false - else: - h_split.dragger_visibility = SplitContainer.DRAGGER_HIDDEN_COLLAPSED - h_split.split_offset = 0 - h_split.collapsed = true - - -func update_theme_additions() -> void: - add_theme_stylebox_override("panel", DCSS.inline({ - "background": get_theme_color("base_color", "Editor"), - "padding": - [5 * DialogicUtil.get_editor_scale(), 5 * DialogicUtil.get_editor_scale()], - })) - var holder_panel := (DCSS.inline({ - "border-radius": 5, - "background": get_theme_color("dark_color_2", "Editor"), - "padding": - [5 * DialogicUtil.get_editor_scale(), 5 * DialogicUtil.get_editor_scale()], - })) - - holder_panel.border_width_top = 0 - holder_panel.corner_radius_top_left = 0 - editors_manager.editors_holder.add_theme_stylebox_override("panel", holder_panel) - - var new_theme := Theme.new() - - new_theme.set_type_variation("DialogicTitle", "Label") - new_theme.set_font("font", "DialogicTitle", get_theme_font("title", "EditorFonts")) - new_theme.set_color("font_color", "DialogicTitle", get_theme_color("warning_color", "Editor")) - new_theme.set_color( - "font_uneditable_color", "DialogicTitle", get_theme_color("warning_color", "Editor") - ) - new_theme.set_color( - "font_selected_color", "DialogicTitle", get_theme_color("warning_color", "Editor") - ) - new_theme.set_font_size( - "font_size", "DialogicTitle", get_theme_font_size("doc_size", "EditorFonts") - ) - - new_theme.set_type_variation("DialogicSubTitle", "Label") - new_theme.set_font("font", "DialogicSubTitle", get_theme_font("title", "EditorFonts")) - new_theme.set_font_size( - "font_size", "DialogicSubTitle", get_theme_font_size("doc_size", "EditorFonts") - ) - new_theme.set_color("font_color", "DialogicSubTitle", get_theme_color("accent_color", "Editor")) - - new_theme.set_type_variation("DialogicPanelA", "PanelContainer") - var panel_style := ( - DCSS - . inline( - { - "border-radius": 10, - "background": get_theme_color("base_color", "Editor"), - "padding": [5, 5], - } - ) - ) - new_theme.set_stylebox("panel", "DialogicPanelA", panel_style) - new_theme.set_stylebox("normal", "DialogicPanelA", panel_style) - - var dark_panel := panel_style.duplicate() - dark_panel.bg_color = get_theme_color("dark_color_3", "Editor") - new_theme.set_stylebox("panel", "DialogicPanelDarkA", dark_panel) - - var cornerless_panel := panel_style.duplicate() - cornerless_panel.corner_radius_top_left = 0 - new_theme.set_stylebox("panel", "DialogicPanelA_cornerless", cornerless_panel) - - # panel used for example for portrait previews in character editor - new_theme.set_type_variation("DialogicPanelB", "PanelContainer") - var side_panel: StyleBoxFlat = panel_style.duplicate() - side_panel.corner_radius_top_left = 0 - side_panel.corner_radius_bottom_left = 0 - side_panel.expand_margin_left = get_theme_constant("separation", "SplitContainer") - side_panel.bg_color = get_theme_color("dark_color_2", "Editor") - side_panel.set_border_width_all(1) - side_panel.border_width_left = 0 - side_panel.content_margin_left = 0 - side_panel.border_color = get_theme_color("contrast_color_2", "Editor") - new_theme.set_stylebox("panel", "DialogicPanelB", side_panel) - - new_theme.set_type_variation("DialogicEventEdit", "Control") - var edit_panel := StyleBoxFlat.new() - edit_panel.draw_center = true - edit_panel.bg_color = get_theme_color("accent_color", "Editor") - edit_panel.bg_color.a = 0.05 - edit_panel.border_width_bottom = 2 - edit_panel.border_color = get_theme_color("accent_color", "Editor").lerp( - get_theme_color("dark_color_2", "Editor"), 0.4 - ) - edit_panel.content_margin_left = 5 - edit_panel.content_margin_right = 5 - edit_panel.set_corner_radius_all(1) - new_theme.set_stylebox("panel", "DialogicEventEdit", edit_panel) - new_theme.set_stylebox("normal", "DialogicEventEdit", edit_panel) - - var focus_edit := edit_panel.duplicate() - focus_edit.border_color = get_theme_color("property_color_z", "Editor") - focus_edit.draw_center = false - new_theme.set_stylebox("focus", "DialogicEventEdit", focus_edit) - - var hover_edit := edit_panel.duplicate() - hover_edit.border_color = get_theme_color("warning_color", "Editor") - - new_theme.set_stylebox("hover", "DialogicEventEdit", hover_edit) - var disabled_edit := edit_panel.duplicate() - disabled_edit.border_color = get_theme_color("property_color", "Editor") - new_theme.set_stylebox("disabled", "DialogicEventEdit", disabled_edit) - - new_theme.set_type_variation("DialogicHintText", "Label") - new_theme.set_color("font_color", "DialogicHintText", get_theme_color("readonly_color", "Editor")) - new_theme.set_font("font", "DialogicHintText", get_theme_font("doc_italic", "EditorFonts")) - - new_theme.set_type_variation("DialogicHintText2", "Label") - new_theme.set_color( - "font_color", "DialogicHintText2", get_theme_color("property_color_w", "Editor") - ) - new_theme.set_font("font", "DialogicHintText2", get_theme_font("doc_italic", "EditorFonts")) - - new_theme.set_type_variation("DialogicSection", "Label") - new_theme.set_font("font", "DialogicSection", get_theme_font("main_msdf", "EditorFonts")) - new_theme.set_color("font_color", "DialogicSection", get_theme_color("property_color_z", "Editor")) - new_theme.set_font_size( - "font_size", "DialogicSection", get_theme_font_size("doc_size", "EditorFonts") - ) - - new_theme.set_type_variation("DialogicSettingsSection", "DialogicSection") - new_theme.set_font("font", "DialogicSettingsSection", get_theme_font("main_msdf", "EditorFonts")) - new_theme.set_color( - "font_color", "DialogicSettingsSection", get_theme_color("property_color_z", "Editor") - ) - new_theme.set_font_size( - "font_size", "DialogicSettingsSection", get_theme_font_size("doc_size", "EditorFonts") - ) - - new_theme.set_type_variation("DialogicSectionBig", "DialogicSection") - new_theme.set_color("font_color", "DialogicSectionBig", get_theme_color("accent_color", "Editor")) - new_theme.set_font_size( - "font_size", "DialogicSectionBig", get_theme_font_size("doc_title_size", "EditorFonts") - ) - - new_theme.set_type_variation("DialogicLink", "LinkButton") - new_theme.set_color("font_hover_color", "DialogicLink", get_theme_color("warning_color", "Editor")) - - new_theme.set_type_variation("DialogicMegaSeparator", "HSeparator") - new_theme.set_stylebox("separator", "DialogicMegaSeparator", - DCSS.inline({ - "border-radius": 10, - "border": 0, - "background": get_theme_color("accent_color", "Editor"), - "padding": [5, 5], - }) - ) - new_theme.set_constant("separation", "DialogicMegaSeparator", 50) - - new_theme.set_type_variation("DialogicTextEventTextEdit", "CodeEdit") - var editor_settings := plugin_reference.get_editor_interface().get_editor_settings() - var text_panel := DCSS.inline({ - "border-radius": 8, - "background": - editor_settings.get_setting("text_editor/theme/highlighting/background_color").lerp( - editor_settings.get_setting("text_editor/theme/highlighting/text_color"), 0.05 - ), - "padding": [8, 8], - }) - text_panel.content_margin_bottom = 5 - text_panel.content_margin_left = 13 - new_theme.set_stylebox("normal", "DialogicTextEventTextEdit", text_panel) - - var event_field_group_panel := DCSS.inline({ - 'border-radius': 8, - "border":1, - "padding":2, - "boder-color": get_theme_color("property_color", "Editor"), - "background":"none"}) - new_theme.set_type_variation("DialogicEventEditGroup", "PanelContainer") - new_theme.set_stylebox("panel", "DialogicEventEditGroup", event_field_group_panel) - - new_theme.set_icon('Plugin', 'Dialogic', load("res://addons/dialogic/Editor/Images/plugin-icon.svg")) - - theme = new_theme - - -## Switches from floating window mode to embedded mode based on current mode -func toggle_floating_window() -> void: - if get_parent() is Window: - swap_to_embedded_editor() - else: - swap_to_floating_window() - - -## Removes the main control from it's parent and adds it to a new Window node -func swap_to_floating_window() -> void: - if get_parent() is Window: - return - - var parent := get_parent() - get_parent().remove_child(self) - var window := Window.new() - parent.add_child(window) - window.add_child(self) - window.title = "Dialogic" - window.close_requested.connect(swap_to_embedded_editor) - window.content_scale_mode = Window.CONTENT_SCALE_MODE_CANVAS_ITEMS - window.content_scale_aspect = Window.CONTENT_SCALE_ASPECT_EXPAND - window.size = size - window.min_size = Vector2(500, 500) - set_anchors_preset(Control.PRESET_FULL_RECT) - window.disable_3d = true - window.wrap_controls = true - window.popup_centered() - plugin_reference.get_editor_interface().set_main_screen_editor("2D") - - -## Removes the main control from the window node and adds it to it's grandparent -## which is the original owner. -func swap_to_embedded_editor() -> void: - if not get_parent() is Window: - return - - var window := get_parent() - get_parent().remove_child(self) - plugin_reference.get_editor_interface().set_main_screen_editor("Dialogic") - window.get_parent().add_child(self) - window.queue_free() - - -func godot_file_dialog( - callable: Callable, filter: String, mode := EditorFileDialog.FILE_MODE_OPEN_FILE, - window_title := "Save", - current_file_name := "New_File", - saving_something := false, - extra_message: String = "" - ) -> EditorFileDialog: - - for connection in editor_file_dialog.file_selected.get_connections(): - editor_file_dialog.file_selected.disconnect(connection.callable) - for connection in editor_file_dialog.dir_selected.get_connections(): - editor_file_dialog.dir_selected.disconnect(connection.callable) - - if mode == EditorFileDialog.FILE_MODE_OPEN_FILE or mode == EditorFileDialog.FILE_MODE_SAVE_FILE: - editor_file_dialog.file_selected.connect(callable) - elif mode == EditorFileDialog.FILE_MODE_OPEN_DIR: - editor_file_dialog.dir_selected.connect(callable) - elif mode == EditorFileDialog.FILE_MODE_OPEN_ANY: - editor_file_dialog.dir_selected.connect(callable) - editor_file_dialog.file_selected.connect(callable) - - editor_file_dialog.file_mode = mode - editor_file_dialog.clear_filters() - editor_file_dialog.add_filter(filter) - editor_file_dialog.title = window_title - editor_file_dialog.current_file = current_file_name - editor_file_dialog.disable_overwrite_warning = !saving_something - if extra_message: - editor_file_dialog.get_meta("info_message_label").show() - editor_file_dialog.get_meta("info_message_label").text = extra_message - else: - editor_file_dialog.get_meta("info_message_label").hide() - editor_file_dialog.popup_centered_ratio(0.6) - - - return editor_file_dialog diff --git a/godot/addons/dialogic/Editor/editor_main.gd.uid b/godot/addons/dialogic/Editor/editor_main.gd.uid deleted file mode 100644 index 04b57ec..0000000 --- a/godot/addons/dialogic/Editor/editor_main.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://q24lthmavkvn diff --git a/godot/addons/dialogic/Editor/editor_main.tscn b/godot/addons/dialogic/Editor/editor_main.tscn deleted file mode 100644 index 6b8074c..0000000 --- a/godot/addons/dialogic/Editor/editor_main.tscn +++ /dev/null @@ -1,161 +0,0 @@ -[gd_scene load_steps=18 format=3 uid="uid://de6yhw4r8jqb3"] - -[ext_resource type="Script" uid="uid://q24lthmavkvn" path="res://addons/dialogic/Editor/editor_main.gd" id="1_x88ov"] -[ext_resource type="Script" uid="uid://cefv8yoo8q7k6" path="res://addons/dialogic/Editor/editors_manager.gd" id="2_pe2tl"] -[ext_resource type="Texture2D" uid="uid://dybg3l5pwetne" path="res://addons/dialogic/Editor/Images/plugin-icon.svg" id="2_scwcl"] -[ext_resource type="PackedScene" uid="uid://cwe3r2tbh2og1" path="res://addons/dialogic/Editor/Common/side_bar.tscn" id="3_lp6hj"] -[ext_resource type="Script" uid="uid://1m3sqaws1hin" path="res://addons/dialogic/Editor/Common/toolbar.gd" id="4_6cx8s"] -[ext_resource type="Texture2D" uid="uid://bbea0efx0ybu7" path="res://addons/dialogic/Editor/Images/Resources/character.svg" id="6_8yp76"] -[ext_resource type="Texture2D" uid="uid://b5xwnxdb7064n" path="res://addons/dialogic/Modules/Glossary/icon.svg" id="7_45ytg"] -[ext_resource type="Texture2D" uid="uid://1mccycya6eua" path="res://addons/dialogic/Modules/StyleEditor/styles_icon.svg" id="8_jj1i6"] -[ext_resource type="Texture2D" uid="uid://ckilxvwc34s84" path="res://addons/dialogic/Modules/Variable/variable.svg" id="9_k4reh"] -[ext_resource type="PackedScene" uid="uid://c7lmt5cp7bxcm" path="res://addons/dialogic/Editor/Common/reference_manager.tscn" id="10_l1rf8"] -[ext_resource type="Script" uid="uid://bxr2qomm7wm85" path="res://addons/dialogic/Editor/Common/reference_manager_window.gd" id="10_xbkrt"] -[ext_resource type="Script" uid="uid://camdhr6iwaywr" path="res://addons/dialogic/Editor/TimelineEditor/TextEditor/CodeCompletionHelper.gd" id="11_fyce4"] -[ext_resource type="Script" uid="uid://1tph6ios6ry2" path="res://addons/dialogic/Editor/Common/update_manager.gd" id="14_l6b1p"] -[ext_resource type="PackedScene" uid="uid://vv3m5m68fwg7" path="res://addons/dialogic/Editor/Common/update_install_window.tscn" id="15_cu4xj"] - -[sub_resource type="Image" id="Image_4esak"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 94, 94, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 231, 255, 94, 94, 54, 255, 94, 94, 57, 255, 93, 93, 233, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 93, 93, 41, 255, 255, 255, 0, 255, 255, 255, 0, 255, 97, 97, 42, 255, 93, 93, 233, 255, 93, 93, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 44, 255, 255, 255, 0, 255, 97, 97, 42, 255, 97, 97, 42, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 96, 96, 45, 255, 93, 93, 235, 255, 94, 94, 234, 255, 95, 95, 43, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 93, 93, 235, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 95, 95, 59, 255, 96, 96, 61, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_drcn6"] -image = SubResource("Image_4esak") - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5bs7k"] -content_margin_left = 8.0 -content_margin_top = 8.0 -content_margin_right = 8.0 -content_margin_bottom = 8.0 -bg_color = Color(0.1155, 0.132, 0.1595, 1) -corner_detail = 1 -anti_aliasing = false - -[node name="EditorView" type="ScrollContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -script = ExtResource("1_x88ov") - -[node name="EditorsManager" type="Control" parent="."] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -script = ExtResource("2_pe2tl") - -[node name="HSplit" type="HSplitContainer" parent="EditorsManager"] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_vertical = 3 -theme_override_constants/separation = 0 -split_offset = 150 - -[node name="Sidebar" parent="EditorsManager/HSplit" instance=ExtResource("3_lp6hj")] -unique_name_in_owner = true -custom_minimum_size = Vector2(20, 0) -layout_mode = 2 -split_offset = 0 - -[node name="VBox" type="VBoxContainer" parent="EditorsManager/HSplit"] -layout_mode = 2 -theme_override_constants/separation = 0 - -[node name="Toolbar" type="HBoxContainer" parent="EditorsManager/HSplit/VBox"] -layout_mode = 2 -size_flags_vertical = 0 -mouse_filter = 2 -alignment = 2 -script = ExtResource("4_6cx8s") - -[node name="EditorTabBar" type="TabBar" parent="EditorsManager/HSplit/VBox/Toolbar"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 8 -tab_count = 7 -tab_0/icon = ExtResource("2_scwcl") -tab_1/title = "Timeline" -tab_1/icon = SubResource("ImageTexture_drcn6") -tab_2/title = "Character" -tab_2/icon = ExtResource("6_8yp76") -tab_3/title = "Glossary" -tab_3/icon = ExtResource("7_45ytg") -tab_4/title = "Layouts" -tab_4/icon = ExtResource("8_jj1i6") -tab_5/title = "Variables" -tab_5/icon = ExtResource("9_k4reh") -tab_6/title = "Settings" -tab_6/icon = SubResource("ImageTexture_drcn6") - -[node name="CustomButtons" type="HBoxContainer" parent="EditorsManager/HSplit/VBox/Toolbar"] -unique_name_in_owner = true -layout_mode = 2 - -[node name="Editors" type="PanelContainer" parent="EditorsManager/HSplit/VBox"] -layout_mode = 2 -size_flags_vertical = 3 - -[node name="CodeCompletionHelper" type="Node" parent="EditorsManager"] -script = ExtResource("11_fyce4") - -[node name="SaveConfirmationDialog" type="AcceptDialog" parent="."] -size = Vector2i(207, 100) - -[node name="ResourceRenameWarning" type="AcceptDialog" parent="."] -title = "Dialogic resource renamed!" -initial_position = 5 -size = Vector2i(494, 135) -ok_button_text = "Show Unique Identifiers" -dialog_text = "You renamed a dialogic resource. This does NOT automatically rename the unique identifier for this resource. Consider checking in the Reference Manager if the identifiers are still the way you want them." -dialog_autowrap = true - -[node name="ReferenceManager" type="Window" parent="."] -disable_3d = true -title = "Reference Manager" -initial_position = 2 -size = Vector2i(858, 442) -visible = false -wrap_controls = true -content_scale_mode = 1 -content_scale_aspect = 4 -script = ExtResource("10_xbkrt") - -[node name="Manager" parent="ReferenceManager" instance=ExtResource("10_l1rf8")] -theme_override_styles/panel = SubResource("StyleBoxFlat_5bs7k") - -[node name="UpdateManager" type="Node" parent="."] -script = ExtResource("14_l6b1p") - -[node name="Window" type="Window" parent="UpdateManager"] -title = "Dialogic Update Checker" -initial_position = 2 -size = Vector2i(600, 400) -visible = false -wrap_controls = true - -[node name="UpdateInstallWindow" parent="UpdateManager/Window" instance=ExtResource("15_cu4xj")] - -[node name="UpdateCheckRequest" type="HTTPRequest" parent="UpdateManager"] -timeout = 5.0 - -[node name="DownloadRequest" type="HTTPRequest" parent="UpdateManager"] - -[connection signal="close_requested" from="ReferenceManager" to="ReferenceManager" method="_on_close_requested"] -[connection signal="downdload_completed" from="UpdateManager" to="UpdateManager/Window/UpdateInstallWindow" method="_on_update_manager_downdload_completed"] -[connection signal="update_check_completed" from="UpdateManager" to="UpdateManager" method="_on_update_check_completed"] -[connection signal="close_requested" from="UpdateManager/Window" to="UpdateManager/Window/UpdateInstallWindow" method="_on_window_close_requested"] -[connection signal="request_completed" from="UpdateManager/UpdateCheckRequest" to="UpdateManager" method="_on_UpdateCheck_request_completed"] -[connection signal="request_completed" from="UpdateManager/DownloadRequest" to="UpdateManager" method="_on_DownloadRequest_completed"] diff --git a/godot/addons/dialogic/Editor/editors_manager.gd b/godot/addons/dialogic/Editor/editors_manager.gd deleted file mode 100644 index 029a919..0000000 --- a/godot/addons/dialogic/Editor/editors_manager.gd +++ /dev/null @@ -1,284 +0,0 @@ -@tool -extends Control - -## Node that manages editors, the toolbar and the sidebar. - -signal resource_opened(resource) -signal editor_changed(previous, current) - -### References -@onready var hsplit := $HSplit -@onready var sidebar := $HSplit/Sidebar -@onready var editors_holder := $HSplit/VBox/Editors -@onready var toolbar := $HSplit/VBox/Toolbar -@onready var tabbar := $HSplit/VBox/Toolbar/EditorTabBar - -var reference_manager: Node: - get: - return get_node("../ReferenceManager") - -## Information on supported resource extensions and registered editors -var current_editor: DialogicEditor = null -var previous_editor: DialogicEditor = null -var editors := {} -var supported_file_extensions := [] -var used_resources_cache: Array = [] - - -################################################################################ -## REGISTERING EDITORS -################################################################################ - -## Asks all childs of the editor holder to register -func _ready() -> void: - if owner.get_parent() is SubViewport: - return - - tabbar.clear_tabs() - - # Load base editors - _add_editor("res://addons/dialogic/Editor/HomePage/home_page.tscn") - _add_editor("res://addons/dialogic/Editor/TimelineEditor/timeline_editor.tscn") - _add_editor("res://addons/dialogic/Editor/CharacterEditor/character_editor.tscn") - - # Load custom editors - for indexer in DialogicUtil.get_indexers(): - for editor_path in indexer._get_editors(): - _add_editor(editor_path) - _add_editor("res://addons/dialogic/Editor/Settings/settings_editor.tscn") - - tabbar.tab_clicked.connect(_on_editors_tab_changed) - - # Needs to be done here to make sure this node is ready when doing the register calls - for editor in editors_holder.get_children(): - editor.editors_manager = self - editor._register() - - DialogicResourceUtil.update() - - await get_parent().ready - await get_tree().process_frame - - load_saved_state() - used_resources_cache = DialogicUtil.get_editor_setting('last_resources', []) - sidebar.update_resource_list(used_resources_cache) - - find_parent('EditorView').plugin_reference.get_editor_interface().get_file_system_dock().files_moved.connect(_on_file_moved) - find_parent('EditorView').plugin_reference.get_editor_interface().get_file_system_dock().file_removed.connect(_on_file_removed) - - hsplit.set("theme_override_constants/separation", get_theme_constant("base_margin", "Editor") * DialogicUtil.get_editor_scale()) - - -func _add_editor(path:String) -> void: - var editor: DialogicEditor = load(path).instantiate() - editors_holder.add_child(editor) - editor.hide() - tabbar.add_tab(editor._get_title(), editor._get_icon()) - - -## Call to register an editor/tab that edits a resource with a custom ending. -func register_resource_editor(resource_extension:String, editor:DialogicEditor) -> void: - editors[editor.name] = {'node':editor, 'buttons':[], 'extension': resource_extension} - supported_file_extensions.append(resource_extension) - editor.resource_saved.connect(_on_resource_saved.bind(editor)) - editor.resource_unsaved.connect(_on_resource_unsaved.bind(editor)) - - -## Call to register an editor/tab that doesn't edit a resource -func register_simple_editor(editor:DialogicEditor) -> void: - editors[editor.name] = {'node': editor, 'buttons':[]} - - -## Call to add an icon button. These buttons are always visible. -func add_icon_button(icon:Texture, tooltip:String, editor:DialogicEditor=null) -> Node: - var button: Button = toolbar.add_icon_button(icon, tooltip) - if editor != null: - editors[editor.name]['buttons'].append(button) - return button - - -## Call to add a custom action button. Only visible if editor is visible. -func add_custom_button(label:String, icon:Texture, editor:DialogicEditor) -> Node: - var button: Button = toolbar.add_custom_button(label, icon) - editors[editor.name]['buttons'].append(button) - return button - - -func can_edit_resource(resource:Resource) -> bool: - return resource.resource_path.get_extension() in supported_file_extensions - - -################################################################################ -## OPENING/CLOSING -################################################################################ - - -func _on_editors_tab_changed(tab:int) -> void: - open_editor(editors_holder.get_child(tab)) - - -func edit_resource(resource:Resource, save_previous:bool = true, silent:= false) -> void: - if not resource: - # The resource doesn't exists, show an error - print("[Dialogic] The resource you are trying to edit doesn't exist any more.") - return - - if current_editor and save_previous: - current_editor._save() - - if !resource.resource_path in used_resources_cache: - used_resources_cache.append(resource.resource_path) - sidebar.update_resource_list(used_resources_cache) - - ## Open the correct editor - var extension: String = resource.resource_path.get_extension() - for editor in editors.values(): - if editor.get('extension', '') == extension: - editor['node']._open_resource(resource) - if !silent: - open_editor(editor['node'], false) - if !silent: - resource_opened.emit(resource) - - - -## Only works if there was a different editor opened previously -func toggle_editor(editor) -> void: - if editor.visible: - open_editor(previous_editor, true) - else: - open_editor(editor, true) - - -## Shows the given editor -func open_editor(editor:DialogicEditor, save_previous: bool = true, extra_info:Variant = null) -> void: - if current_editor and save_previous: - current_editor._save() - - if current_editor: - current_editor._close() - current_editor.hide() - - if current_editor != previous_editor: - previous_editor = current_editor - - editor._open(extra_info) - editor.opened.emit() - current_editor = editor - editor.show() - tabbar.current_tab = editor.get_index() - - if editor.current_resource: - var text: String = editor.current_resource.resource_path.get_file() - if editor.current_resource_state == DialogicEditor.ResourceStates.UNSAVED: - text += "(*)" - - ## This makes custom button editor-specific - ## I think it's better without. - - save_current_state() - editor_changed.emit(previous_editor, current_editor) - - -## Rarely used to completely clear an editor. -func clear_editor(editor:DialogicEditor, save:bool = false) -> void: - if save: - editor._save() - - editor._clear() - -## Shows a file selector. Calls [accept_callable] once accepted -func show_add_resource_dialog(accept_callable:Callable, filter:String = "*", title = "New resource", default_name = "new_character", mode = EditorFileDialog.FILE_MODE_SAVE_FILE) -> void: - find_parent('EditorView').godot_file_dialog( - _on_add_resource_dialog_accepted.bind(accept_callable), - filter, - mode, - title, - default_name, - true, - "Do not use \"'()!;:/\\*# in character or timeline names!" - ) - - -func _on_add_resource_dialog_accepted(path:String, callable:Callable) -> void: - var file_name: String = path.get_file().trim_suffix('.'+path.get_extension()) - for i in ['#','&','+',';','(',')','!','*','*','"',"'",'%', '$', ':','.',',']: - file_name = file_name.replace(i, '') - callable.call(path.trim_suffix(path.get_file()).path_join(file_name)+'.'+path.get_extension()) - - -## Called by the plugin.gd script on CTRL+S or Debug Game start -func save_current_resource() -> void: - if current_editor: - current_editor._save() - - -## Change the resource state -func _on_resource_saved(editor:DialogicEditor): - sidebar.set_unsaved_indicator(true) - - -## Change the resource state -func _on_resource_unsaved(editor:DialogicEditor): - sidebar.set_unsaved_indicator(false) - - -## Tries opening the last resource -func load_saved_state() -> void: - var current_resources: Dictionary = DialogicUtil.get_editor_setting('current_resources', {}) - for editor in current_resources.keys(): - editors[editor]['node']._open_resource(load(current_resources[editor])) - - var current_editor: String = DialogicUtil.get_editor_setting('current_editor', 'HomePage') - open_editor(editors[current_editor]['node']) - - -func save_current_state() -> void: - DialogicUtil.set_editor_setting('current_editor', current_editor.name) - var current_resources: Dictionary = {} - for editor in editors.values(): - if editor['node'].current_resource != null: - current_resources[editor['node'].name] = editor['node'].current_resource.resource_path - DialogicUtil.set_editor_setting('current_resources', current_resources) - - -func _on_file_moved(old_name:String, new_name:String) -> void: - if !old_name.get_extension() in supported_file_extensions: - return - - used_resources_cache = DialogicUtil.get_editor_setting('last_resources', []) - if old_name in used_resources_cache: - used_resources_cache.insert(used_resources_cache.find(old_name), new_name) - used_resources_cache.erase(old_name) - - sidebar.update_resource_list(used_resources_cache) - - for editor in editors: - if editors[editor].node.current_resource != null and editors[editor].node.current_resource.resource_path == old_name: - editors[editor].node.current_resource.take_over_path(new_name) - edit_resource(load(new_name), true, true) - - save_current_state() - - -func _on_file_removed(file_name:String) -> void: - var current_resources: Dictionary = DialogicUtil.get_editor_setting('current_resources', {}) - for editor_name in current_resources: - if current_resources[editor_name] == file_name: - clear_editor(editors[editor_name].node, false) - sidebar.update_resource_list() - save_current_state() - - - -################################################################################ -## HELPERS -################################################################################ - - -func get_current_editor() -> DialogicEditor: - return current_editor - - -func _exit_tree() -> void: - DialogicUtil.set_editor_setting('last_resources', used_resources_cache) diff --git a/godot/addons/dialogic/Editor/editors_manager.gd.uid b/godot/addons/dialogic/Editor/editors_manager.gd.uid deleted file mode 100644 index 4c21af9..0000000 --- a/godot/addons/dialogic/Editor/editors_manager.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cefv8yoo8q7k6 diff --git a/godot/addons/dialogic/Example Assets/Fonts/LICENSE.txt b/godot/addons/dialogic/Example Assets/Fonts/LICENSE.txt deleted file mode 100644 index 75b5248..0000000 --- a/godot/addons/dialogic/Example Assets/Fonts/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/godot/addons/dialogic/Example Assets/Fonts/Roboto-Bold.ttf b/godot/addons/dialogic/Example Assets/Fonts/Roboto-Bold.ttf deleted file mode 100644 index d998cf5b468413ca1c950096dc9d0f5dfdb1359f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170348 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: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 diff --git a/godot/addons/dialogic/Example Assets/Fonts/Roboto-Bold.ttf.import b/godot/addons/dialogic/Example Assets/Fonts/Roboto-Bold.ttf.import deleted file mode 100644 index 0a0d10a..0000000 --- a/godot/addons/dialogic/Example Assets/Fonts/Roboto-Bold.ttf.import +++ /dev/null @@ -1,36 +0,0 @@ -[remap] - -importer="font_data_dynamic" -type="FontFile" -uid="uid://cc4xli25271fd" -path="res://.godot/imported/Roboto-Bold.ttf-a0c3395776dbc11ee676c5f1ea9c0579.fontdata" - -[deps] - -source_file="res://addons/dialogic/Example Assets/Fonts/Roboto-Bold.ttf" -dest_files=["res://.godot/imported/Roboto-Bold.ttf-a0c3395776dbc11ee676c5f1ea9c0579.fontdata"] - -[params] - -Rendering=null -antialiasing=1 -generate_mipmaps=false -disable_embedded_bitmaps=true -multichannel_signed_distance_field=false -msdf_pixel_range=8 -msdf_size=48 -allow_system_fallback=true -force_autohinter=false -modulate_color_glyphs=false -hinting=1 -subpixel_positioning=1 -keep_rounding_remainders=true -oversampling=0.0 -Fallbacks=null -fallbacks=[] -Compress=null -compress=true -preload=[] -language_support={} -script_support={} -opentype_features={} diff --git a/godot/addons/dialogic/Example Assets/Fonts/Roboto-Italic.ttf b/godot/addons/dialogic/Example Assets/Fonts/Roboto-Italic.ttf deleted file mode 100644 index 5b390ff950e6539bdfd4d84265fdb01e0c35f291..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173516 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 z 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 z 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 diff --git a/godot/addons/dialogic/Example Assets/Fonts/Roboto-Regular.ttf.import b/godot/addons/dialogic/Example Assets/Fonts/Roboto-Regular.ttf.import deleted file mode 100644 index 32bcf9f..0000000 --- a/godot/addons/dialogic/Example Assets/Fonts/Roboto-Regular.ttf.import +++ /dev/null @@ -1,36 +0,0 @@ -[remap] - -importer="font_data_dynamic" -type="FontFile" -uid="uid://vrrmdx83skor" -path="res://.godot/imported/Roboto-Regular.ttf-d9ce0640effe9e93230b445b37d8e692.fontdata" - -[deps] - -source_file="res://addons/dialogic/Example Assets/Fonts/Roboto-Regular.ttf" -dest_files=["res://.godot/imported/Roboto-Regular.ttf-d9ce0640effe9e93230b445b37d8e692.fontdata"] - -[params] - -Rendering=null -antialiasing=1 -generate_mipmaps=false -disable_embedded_bitmaps=true -multichannel_signed_distance_field=false -msdf_pixel_range=8 -msdf_size=48 -allow_system_fallback=true -force_autohinter=false -modulate_color_glyphs=false -hinting=1 -subpixel_positioning=1 -keep_rounding_remainders=true -oversampling=0.0 -Fallbacks=null -fallbacks=[] -Compress=null -compress=true -preload=[] -language_support={} -script_support={} -opentype_features={} diff --git a/godot/addons/dialogic/Example Assets/already_read_indicator.gd b/godot/addons/dialogic/Example Assets/already_read_indicator.gd deleted file mode 100644 index 4dbf5d3..0000000 --- a/godot/addons/dialogic/Example Assets/already_read_indicator.gd +++ /dev/null @@ -1,12 +0,0 @@ -extends Control - -func _ready() -> void: - if DialogicUtil.autoload().has_subsystem('History'): - DialogicUtil.autoload().History.visited_event.connect(_on_visited_event) - DialogicUtil.autoload().History.unvisited_event.connect(_on_not_read_event) - -func _on_visited_event() -> void: - show() - -func _on_not_read_event() -> void: - hide() diff --git a/godot/addons/dialogic/Example Assets/already_read_indicator.gd.uid b/godot/addons/dialogic/Example Assets/already_read_indicator.gd.uid deleted file mode 100644 index 9909111..0000000 --- a/godot/addons/dialogic/Example Assets/already_read_indicator.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://qru8kj5n8hup diff --git a/godot/addons/dialogic/Example Assets/backgrounds/BubbleEnd.png b/godot/addons/dialogic/Example Assets/backgrounds/BubbleEnd.png deleted file mode 100644 index c0ff16161436f2bdeb104073c0143d26f7fcb017..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1619 zcmV-Z2CVssP)EX>4Tx04R}tkvmAkP!xv$rbk+gL!Qw&2_3_#Ib|~k`N)IhB7L!5T#us#YBqEV;=rN$DbsZOs+B* zITlcb3d!+<|H1FsnuW;;Hz^ncx?gPjV+0870?oQ@e;?a+^91le16NwxUu^)hpQP8@ zTI2}m-v%zO+nT%wT zj20<--Q(Roopby5PHTQYwkmSM*jm`400006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru<_8!JG7!^SCK&(#02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00b*ZL_t(|+U=ZAh*eb_$3I`01f7V=nnhH!liW!3hm0tR z(wHnFEYOn57TTtE5iMG^Y8L}S3qi05G0U=|KrjRwr!+^3##|VQlTI_0O*2zHb-pd; z6a$Upd+(li-@W&pFU;n>d+#~t`?KQIi8 z0Areclmbebq3sR8R^YPaV`fbNeZUq;r!IA{F7}1( z)xi6}qU32)ngX@}uS*)O_ax2trR~RnoxpN&`E5AY4plYIZ5eg`&5+7aVobv+v-{hU(Q zoH_*D5(`G%5i%=v?E~&j901q>Y?L$=^P+Xno+LR%$$tgj%fPzWFdB-GS&^~_Sku9^ z#X3nJwyJ?v>aL=iieIYPoR%88P|7zq`4Vf!0vzt!myz&H!^=Cx|u zZXhEChcO=NjIWD+*Te!cR^TyChRFD;3^_FxkXk{T4&AXC%Ev1r#G?EpPK|>ZzEo15_bpt!QIpJY6Li zu_ENoHdWy3CGDbO%DTy65ikmL=h){zfX5|$Mg^5MLLSH&#!tXQk_M@$vOYr|$+544 zz#UbFk#)Me!1ih9qwTi4lk4*XS(yWfzie+xZr2B7XNzGRw|!f3x;_{;+CJAJ5Yx8b zw0(IedfV(Q>v`fWOwQI1%&bX$o^Jd4qodpQSPPyNui0Ll9Bv%QtC3;swS9APwmBF* zw#OrZ7_hx6xta|~Ujz_GZ9f`*J0&RtjODg#89?l_-J3wffzf6Aa1#)wY;UuDdvY-@ zkXIT6am4luwy#R=#fPz?&Q$eXn7S@YuC)%vwYE=Q1i*yt4{UF?eN%F)#g%&a=hJTB zhVaoT;LGrL5I895?_^6vD$ow^W{m7Dkw`ionq6gi;C!j8c)uWLaMnI@?l838-5|0^uPJ z7;%Wpph5t%bpyfzz7|=Ez#?o$7KBYZ5Vl}I1;)TcXm`J_W*7th;h($7{qFDn&iS41 z-1B|+@MF1LJ8OW{C^j#J7nWuV04y{+NMJ{R*vLqpj)=BE)XBw)JQ6Y~lo~ZZnoUnj z|A21&7gz%g%@A-Eit|(nhq%d@_vT||3<#KIGysdWxzCoYy(BYF3_zeGk8rU{twC6T zaA<)>h2e7uQ^nar3Br1WcdAi>2#;gD$b#oFoP}fjP*im?KN6jdig5nUWuoZ@(GUv>zymsnARlBP2Mq+E zRf(89;3GSG3%v`j=OL8{sbnBV3J&Ce0))68uy25T(AcPLo^*E*P7&eE3ug0rGl11yfIj7hK1T--_7CD~HaKPzfMW?jPyYrdst4#T1E5W)glZxF z9xL=DN~Hix?Ev=a0M54nY>!y#hHRJ}TJ8WOqgus}05qHj@XbQ8GqyN4843QY+e>|( z)h{BR7qbV62#zc>g~Co^#*Ub3N<)~_lg620&hkm(_uq2o_^UGu2VE9CO@@Jt3SL;_F=;VXiFC&`}hURPS%`v+QEntd8(trp&}ktwGNgm$F@ zN?=^y#ps!&-zy4VC$Ck$oBKBLf@f{C(q}T6vE=u#|C()yHp=}{{V87cP)o1Vf zsByTFS#i#$AW@q5VgQ2zUTc*%&((TlTvq>ivp(<@mk?Poz`t-vWd;BM diff --git a/godot/addons/dialogic/Example Assets/backgrounds/rpg_box.webp.import b/godot/addons/dialogic/Example Assets/backgrounds/rpg_box.webp.import deleted file mode 100644 index 49d713f..0000000 --- a/godot/addons/dialogic/Example Assets/backgrounds/rpg_box.webp.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dch8fuekijffp" -path="res://.godot/imported/rpg_box.webp-6ea0804b52e01599dbc94ffacc31d433.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Example Assets/backgrounds/rpg_box.webp" -dest_files=["res://.godot/imported/rpg_box.webp-6ea0804b52e01599dbc94ffacc31d433.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/godot/addons/dialogic/Example Assets/bbcode_transitions/bbcode_transition_effect.gd b/godot/addons/dialogic/Example Assets/bbcode_transitions/bbcode_transition_effect.gd deleted file mode 100644 index 536d62a..0000000 --- a/godot/addons/dialogic/Example Assets/bbcode_transitions/bbcode_transition_effect.gd +++ /dev/null @@ -1,84 +0,0 @@ -@tool -class_name DialogicRichTextTransitionEffect -extends RichTextEffect - -var visible_characters := -1 - -@export var bbcode := "animate_in" -var cache := [] - -@export_range(0.0, 5.0, 0.01) var time := 0.2 -@export_group("Color", "color") -@export var color_modulate: Gradient = null -@export var color_replace: Gradient = null -@export_group("Scale", "scale") -@export var scale_enabled := false -@export var scale_curve := Curve.new() -@export var scale_pivot := Vector2() -@export_group("Position", "position") -@export var position_enabled := false -@export var position_x_curve := Curve.new() -@export var position_y_curve := Curve.new() - -@export_group("Test", "test") -@export_range(-0.1, 1.0, 0.1) var test_value := -0.1 - -var was_skipped := false -var was_reset := false - - -func reset() -> void: - was_reset = true - was_skipped = false - cache.clear() - - -func skip() -> void: - was_skipped = true - - -func _process_custom_fx(char_fx: CharFXTransform) -> bool: - var char_age :float = 0.0 - if test_value >= 0: - char_age = test_value - - else: - if visible_characters == 0: - cache.clear() - return false - if was_reset: - if visible_characters != -1: - was_reset = false - else: - return false - - if len(cache) < visible_characters or visible_characters == -1 or was_skipped: - if char_fx.range.x >= len(cache): - cache.append(char_fx.elapsed_time) - - if was_skipped: - for i in range(len(cache)): - cache[i] = char_fx.elapsed_time-time - - if len(cache) > char_fx.range.x: - char_age = char_fx.elapsed_time - cache[char_fx.range.x] - - var text_server := TextServerManager.get_primary_interface() - var trans: float = clamp(char_age, 0.0, time)/time - - if color_replace: - var c := color_replace.sample(trans) - c.a = 1 - char_fx.color = char_fx.color.lerp(c, color_replace.sample(trans).a) - if color_modulate: - char_fx.color *= color_modulate.sample(trans) - if char_fx.font.is_valid(): - var glyph_size := text_server.font_get_glyph_size(char_fx.font, Vector2i(16,1), char_fx.glyph_index) - if scale_enabled: - char_fx.transform = char_fx.transform.translated_local(scale_pivot*glyph_size*Vector2(1, -1)*(1-scale_curve.sample(trans))) - char_fx.transform = char_fx.transform.scaled_local(Vector2.ONE*scale_curve.sample(trans)) - - if position_enabled: - char_fx.transform = char_fx.transform.translated_local(Vector2(position_x_curve.sample(trans), position_y_curve.sample(trans))*glyph_size) - - return true diff --git a/godot/addons/dialogic/Example Assets/bbcode_transitions/bbcode_transition_effect.gd.uid b/godot/addons/dialogic/Example Assets/bbcode_transitions/bbcode_transition_effect.gd.uid deleted file mode 100644 index bcd0176..0000000 --- a/godot/addons/dialogic/Example Assets/bbcode_transitions/bbcode_transition_effect.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://wf7hpguw17ex diff --git a/godot/addons/dialogic/Example Assets/bbcode_transitions/fade_in.tres b/godot/addons/dialogic/Example Assets/bbcode_transitions/fade_in.tres deleted file mode 100644 index ac15024..0000000 --- a/godot/addons/dialogic/Example Assets/bbcode_transitions/fade_in.tres +++ /dev/null @@ -1,17 +0,0 @@ -[gd_resource type="RichTextEffect" script_class="DialogicRichTextTransitionEffect" load_steps=3 format=3 uid="uid://qegqrr4g2riu"] - -[ext_resource type="Script" uid="uid://wf7hpguw17ex" path="res://addons/dialogic/Example Assets/bbcode_transitions/bbcode_transition_effect.gd" id="1_5w3vn"] - -[sub_resource type="Gradient" id="Gradient_5w3vn"] -colors = PackedColorArray(1, 1, 1, 0, 1, 1, 1, 1) - -[resource] -script = ExtResource("1_5w3vn") -bbcode = "fade_in" -time = 0.2 -color_modulate = SubResource("Gradient_5w3vn") -scale_enabled = false -scale_pivot = Vector2(0, 0) -position_enabled = false -test_value = -0.1 -metadata/_custom_type_script = "uid://wf7hpguw17ex" diff --git a/godot/addons/dialogic/Example Assets/bbcode_transitions/fade_scale_in.tres b/godot/addons/dialogic/Example Assets/bbcode_transitions/fade_scale_in.tres deleted file mode 100644 index 0c91435..0000000 --- a/godot/addons/dialogic/Example Assets/bbcode_transitions/fade_scale_in.tres +++ /dev/null @@ -1,24 +0,0 @@ -[gd_resource type="RichTextEffect" script_class="DialogicRichTextTransitionEffect" load_steps=4 format=3 uid="uid://hx8qyt5ry3h0"] - -[ext_resource type="Script" uid="uid://wf7hpguw17ex" path="res://addons/dialogic/Example Assets/bbcode_transitions/bbcode_transition_effect.gd" id="1_rsak6"] - -[sub_resource type="Gradient" id="Gradient_rsak6"] -offsets = PackedFloat32Array(0, 0.6351706) -colors = PackedColorArray(1, 1, 1, 0, 1, 1, 1, 1) - -[sub_resource type="Curve" id="Curve_oitc5"] -_limits = [0.0, 2.0, 0.0, 1.0] -_data = [Vector2(0, 2), 0.0, 0.0, 0, 0, Vector2(0.40294844, 1.0066038), -0.13865282, 0.0, 0, 0] -point_count = 2 - -[resource] -script = ExtResource("1_rsak6") -bbcode = "fade_scale_in" -time = 0.30000000000000004 -color_modulate = SubResource("Gradient_rsak6") -scale_enabled = true -scale_curve = SubResource("Curve_oitc5") -scale_pivot = Vector2(0.5, 0.5) -position_enabled = false -test_value = -0.1 -metadata/_custom_type_script = "uid://wf7hpguw17ex" diff --git a/godot/addons/dialogic/Example Assets/bbcode_transitions/fancy_in.tres b/godot/addons/dialogic/Example Assets/bbcode_transitions/fancy_in.tres deleted file mode 100644 index 5f48cfc..0000000 --- a/godot/addons/dialogic/Example Assets/bbcode_transitions/fancy_in.tres +++ /dev/null @@ -1,35 +0,0 @@ -[gd_resource type="RichTextEffect" script_class="DialogicRichTextTransitionEffect" load_steps=6 format=3 uid="uid://c8b884puc720d"] - -[ext_resource type="Script" uid="uid://wf7hpguw17ex" path="res://addons/dialogic/Example Assets/bbcode_transitions/bbcode_transition_effect.gd" id="1_n3lqs"] - -[sub_resource type="Gradient" id="Gradient_n3lqs"] -offsets = PackedFloat32Array(0, 0.45292622) -colors = PackedColorArray(1, 1, 1, 0, 1, 1, 1, 1) - -[sub_resource type="Gradient" id="Gradient_lhhwu"] -interpolation_mode = 1 -offsets = PackedFloat32Array(0, 0.6666667, 0.86513996) -colors = PackedColorArray(0.5208, 0.76631993, 0.93, 0, 0.5242275, 0.76595265, 0.93170327, 1, 0.5208, 0.76631993, 0.93, 0) - -[sub_resource type="Curve" id="Curve_lhhwu"] -_data = [Vector2(0.002457004, 1), 0.0, -1.993977, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] -point_count = 2 - -[sub_resource type="Curve" id="Curve_4i73d"] -_limits = [0.0, 1.5, 0.0, 1.0] -_data = [Vector2(0, 0.6627359), 0.0, 1.7969435, 0, 0, Vector2(0.4987715, 1.0308962), -1.6188686, -1.6188686, 0, 0, Vector2(0.66093373, 1), -0.34929827, 0.0, 0, 0] -point_count = 3 - -[resource] -script = ExtResource("1_n3lqs") -bbcode = "fancy_in" -time = 0.4 -color_modulate = SubResource("Gradient_n3lqs") -color_replace = SubResource("Gradient_lhhwu") -scale_enabled = true -scale_curve = SubResource("Curve_4i73d") -scale_pivot = Vector2(0.5, 0) -position_enabled = true -position_x_curve = SubResource("Curve_lhhwu") -test_value = -0.1 -metadata/_custom_type_script = "uid://wf7hpguw17ex" diff --git a/godot/addons/dialogic/Example Assets/bbcode_transitions/shaky_in.tres b/godot/addons/dialogic/Example Assets/bbcode_transitions/shaky_in.tres deleted file mode 100644 index f781b31..0000000 --- a/godot/addons/dialogic/Example Assets/bbcode_transitions/shaky_in.tres +++ /dev/null @@ -1,35 +0,0 @@ -[gd_resource type="RichTextEffect" script_class="DialogicRichTextTransitionEffect" load_steps=6 format=3 uid="uid://dnxkgwncm1pt5"] - -[ext_resource type="Script" uid="uid://wf7hpguw17ex" path="res://addons/dialogic/Example Assets/bbcode_transitions/bbcode_transition_effect.gd" id="1_ur6c5"] - -[sub_resource type="Gradient" id="Gradient_ur6c5"] -offsets = PackedFloat32Array(0, 0.5089058) -colors = PackedColorArray(1, 1, 1, 0, 1, 1, 1, 1) - -[sub_resource type="Curve" id="Curve_5qe3f"] -_limits = [-0.5, 0.51556605, 0.0, 1.0] -_data = [Vector2(0, 0.0235914), 0.0, 0.0, 0, 0, Vector2(0.019656021, -0.2441923), 0.0, 0.0, 0, 0, Vector2(0.046683047, 0.17305207), 0.0, 0.0, 0, 0, Vector2(0.1081081, -0.23173726), 0.0, 0.0, 0, 0, Vector2(0.16216215, 0.12323183), 0.0, 0.0, 0, 0, Vector2(0.2997543, -0.16946197), 0.0, 0.0, 0, 0, Vector2(0.38329238, 0.042274), 0.0, 0.0, 0, 0, Vector2(0.46928746, -0.107186675), 0.0, 0.0, 0, 0, Vector2(0.5135135, 0.054729044), 0.0, 0.0, 0, 0, Vector2(0.66339064, -0.07604903), 0.0, 0.0, 0, 0, Vector2(0.86240786, 0.054729044), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] -point_count = 12 - -[sub_resource type="Curve" id="Curve_ur6c5"] -_limits = [-0.5, 0.51556605, 0.0, 1.0] -_data = [Vector2(0, 0.042274), 0.0, 0.0, 0, 0, Vector2(0.051597048, -0.13209677), 0.0, 0.0, 0, 0, Vector2(0.09336609, 0.21041724), 0.0, 0.0, 0, 0, Vector2(0.14742014, -0.25664735), 0.0, 0.0, 0, 0, Vector2(0.22850122, 0.098321736), 0.0, 0.0, 0, 0, Vector2(0.31203932, -0.107186675), 0.0, 0.0, 0, 0, Vector2(0.44717443, 0.054729044), 0.0, 0.0, 0, 0, Vector2(0.5995086, -0.08227658), 0.0, 0.0, 0, 0, Vector2(0.8132678, 0.042274), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] -point_count = 10 - -[sub_resource type="Curve" id="Curve_qelc7"] -_data = [Vector2(0, 0.57688683), 0.0, 0.0, 0, 0, Vector2(0.14250615, 0.77311325), 0.0, 0.0, 0, 0, Vector2(0.2850123, 0.6443397), 0.0, 0.0, 0, 0, Vector2(0.41769046, 0.7976416), 0.0, 0.0, 0, 0, Vector2(0.5503686, 0.74245286), 0.0, 0.0, 0, 0, Vector2(0.6781328, 0.8712265), 0.0, 0.0, 0, 0, Vector2(0.79606885, 0.8528303), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0] -point_count = 8 - -[resource] -script = ExtResource("1_ur6c5") -bbcode = "shaky_in" -time = 0.4 -color_modulate = SubResource("Gradient_ur6c5") -scale_enabled = true -scale_curve = SubResource("Curve_qelc7") -scale_pivot = Vector2(0.5, 0.5) -position_enabled = true -position_x_curve = SubResource("Curve_5qe3f") -position_y_curve = SubResource("Curve_ur6c5") -test_value = -0.1 -metadata/_custom_type_script = "uid://wf7hpguw17ex" diff --git a/godot/addons/dialogic/Example Assets/default_event.gd b/godot/addons/dialogic/Example Assets/default_event.gd deleted file mode 100644 index 6ffbc71..0000000 --- a/godot/addons/dialogic/Example Assets/default_event.gd +++ /dev/null @@ -1,51 +0,0 @@ -@tool -extends DialogicEvent - -# DEFINE ALL PROPERTIES OF THE EVENT -# var MySetting: String = "" - -func _execute() -> void: - # I have no idea how this event works ;) - finish() - - -#region INITIALIZE -################################################################################ - -# SET ALL VALUES THAT SHOULD NEVER CHANGE HERE -func _init() -> void: - event_name = "Default" - event_color = Color("#ffffff") - event_category = "Main" - event_sorting_index = 0 - -#endregion - - -#region SAVING/LOADING -################################################################################ -func get_shortcode() -> String: - return "default_shortcode" - - -func get_shortcode_parameters() -> Dictionary: - return { - #param_name : property_name - #"arg_name" : "NameOfProperty", - } - -# You can alternatively overwrite these 3 functions: -# - to_text(), -# - from_text(), -# - is_valid_event() - -#endregion - - -#region EDITOR REPRESENTATION -################################################################################ - -func build_event_editor() -> void: - pass - -#endregion diff --git a/godot/addons/dialogic/Example Assets/default_event.gd.uid b/godot/addons/dialogic/Example Assets/default_event.gd.uid deleted file mode 100644 index 46e302f..0000000 --- a/godot/addons/dialogic/Example Assets/default_event.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dgs7be3hh1crk diff --git a/godot/addons/dialogic/Example Assets/next-indicator/next-indicator-dialogic-1.png b/godot/addons/dialogic/Example Assets/next-indicator/next-indicator-dialogic-1.png deleted file mode 100644 index f26ed34293eca439250bbefdbcaf84bec370c10d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2825 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 bO`84>wo1V7cBIVo00000NkvXXu0mjfC_h_G diff --git a/godot/addons/dialogic/Example Assets/next-indicator/next-indicator-dialogic-1.png.import b/godot/addons/dialogic/Example Assets/next-indicator/next-indicator-dialogic-1.png.import deleted file mode 100644 index 623e114..0000000 --- a/godot/addons/dialogic/Example Assets/next-indicator/next-indicator-dialogic-1.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bgn2ci6nu85t5" -path="res://.godot/imported/next-indicator-dialogic-1.png-694f122eff55e969b54cc43e62eb4758.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Example Assets/next-indicator/next-indicator-dialogic-1.png" -dest_files=["res://.godot/imported/next-indicator-dialogic-1.png-694f122eff55e969b54cc43e62eb4758.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/godot/addons/dialogic/Example Assets/next-indicator/next-indicator.png b/godot/addons/dialogic/Example Assets/next-indicator/next-indicator.png deleted file mode 100644 index 896d3cfc0fc6426518645409ff223c15b9f67bc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4189 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 diff --git a/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 doubt.png.import b/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 doubt.png.import deleted file mode 100644 index 0200ee0..0000000 --- a/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 doubt.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bl38l2bv5ny4h" -path="res://.godot/imported/pl5 doubt.png-c657bfaf88fd5c06956ec703146704c8.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Example Assets/portraits/Antonio/pl5 doubt.png" -dest_files=["res://.godot/imported/pl5 doubt.png-c657bfaf88fd5c06956ec703146704c8.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 hate.png b/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 hate.png deleted file mode 100644 index a4eb434b9ce317f1f62d5f940c96d643b79ecb79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67008 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Ķ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 diff --git a/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 hate.png.import b/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 hate.png.import deleted file mode 100644 index feaa43a..0000000 --- a/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 hate.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://ch4hvrgmq3j7t" -path="res://.godot/imported/pl5 hate.png-004951da12b71d275d61f3fe7af6c760.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Example Assets/portraits/Antonio/pl5 hate.png" -dest_files=["res://.godot/imported/pl5 hate.png-004951da12b71d275d61f3fe7af6c760.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 plot.png b/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 plot.png deleted file mode 100644 index 4763b8236b106af13bd0f248d26645b4f124c4b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65154 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 Q5cs=r-blAZ8}so00D+4{tpET3 diff --git a/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 plot.png.import b/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 plot.png.import deleted file mode 100644 index dff98a8..0000000 --- a/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 plot.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://1k1be4cqjj4t" -path="res://.godot/imported/pl5 plot.png-7c5bbb51327eb4b7b1b78f4597ed6c60.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Example Assets/portraits/Antonio/pl5 plot.png" -dest_files=["res://.godot/imported/pl5 plot.png-7c5bbb51327eb4b7b1b78f4597ed6c60.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 sad.png b/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 sad.png deleted file mode 100644 index 97845b26de3074550b80633f0b2122b339043237..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66584 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�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

A7|xxePi|T%>kXOm&}yRNU_~^ISor+ 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 diff --git a/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 scoff.png.import b/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 scoff.png.import deleted file mode 100644 index 3a987f9..0000000 --- a/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 scoff.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://675isgfym2tw" -path="res://.godot/imported/pl5 scoff.png-f0b3e5d0a8895f55d2377978a0992a32.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Example Assets/portraits/Antonio/pl5 scoff.png" -dest_files=["res://.godot/imported/pl5 scoff.png-f0b3e5d0a8895f55d2377978a0992a32.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 shy.png b/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 shy.png deleted file mode 100644 index a131cfaf0511bc6c4eeb07be39a9d93c2d0e8c44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67080 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 diff --git a/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 surprise.png.import b/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 surprise.png.import deleted file mode 100644 index 765add5..0000000 --- a/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5 surprise.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dpvtdr1itkbd7" -path="res://.godot/imported/pl5 surprise.png-9f07d67f3c68589bb2cfec738d68b9a7.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/dialogic/Example Assets/portraits/Antonio/pl5 surprise.png" -dest_files=["res://.godot/imported/pl5 surprise.png-9f07d67f3c68589bb2cfec738d68b9a7.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5.png b/godot/addons/dialogic/Example Assets/portraits/Antonio/pl5.png deleted file mode 100644 index f676f779799e9a9e556416b5a3e9496700f14c6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65862 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 -YA7Kg!FvT5!5mK- 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 z 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