From 36c199a5f56757f1ba346599c201c027acb28fa6 Mon Sep 17 00:00:00 2001 From: Balloonpopper Date: Sun, 27 Nov 2022 00:01:51 +1100 Subject: [PATCH] Fix: Wizard - verify that inventory items are written to valid folders --- addons/escoria-wizard/CharacterCreator.tscn | 10 ++-- addons/escoria-wizard/ItemCreator.tscn | 56 ++++++++++++------- addons/escoria-wizard/RoomCreator.gd | 5 ++ addons/escoria-wizard/escoria_wizard.gd | 2 - addons/escoria-wizard/item_creator.gd | 59 +++++++++++++++------ 5 files changed, 92 insertions(+), 40 deletions(-) diff --git a/addons/escoria-wizard/CharacterCreator.tscn b/addons/escoria-wizard/CharacterCreator.tscn index c77b5bc4..86f7d4fd 100644 --- a/addons/escoria-wizard/CharacterCreator.tscn +++ b/addons/escoria-wizard/CharacterCreator.tscn @@ -218,7 +218,7 @@ margin_top = 56.0 margin_right = 295.0 margin_bottom = 80.0 rect_min_size = Vector2( 200, 0 ) -hint_tooltip = "The global id for the character to be used in ESC scripts." +hint_tooltip = "The directory on disk where the character scene will be saved." text = "res://game/characters" editable = false caret_blink = true @@ -1219,7 +1219,6 @@ window_title = "Open a Directory" mode = 2 [node name="InformationWindows" type="Control" parent="."] -visible = false margin_left = 50.0 margin_top = 50.0 margin_right = 1240.0 @@ -1317,7 +1316,6 @@ popup_exclusive = true dialog_text = "Please load a spritesheet to begin." [node name="export_progress" type="WindowDialog" parent="InformationWindows"] -visible = true anchor_left = 0.5 anchor_top = 0.5 anchor_right = 0.5 @@ -1372,8 +1370,10 @@ or below their feet. * The CollisionShape child node defines the bounds of the character. You may want to resize or change the shape assigned to this node. -* You may want to shift this node to a different directory in your codebase -(e.g. into a \"characters\" folder) to group it with other game characters." +* You should move the character's sprite and collision shape down so the +crosshairs are directly between their feet. This ensures that where you click +lines up with where the character walks to. +" [node name="help_window" parent="InformationWindows" instance=ExtResource( 38 )] diff --git a/addons/escoria-wizard/ItemCreator.tscn b/addons/escoria-wizard/ItemCreator.tscn index 8ec32bc4..324aa28e 100644 --- a/addons/escoria-wizard/ItemCreator.tscn +++ b/addons/escoria-wizard/ItemCreator.tscn @@ -91,11 +91,13 @@ uppercase = true [node name="Description" type="MarginContainer" parent="VBoxContainer"] margin_top = 116.0 margin_right = 500.0 -margin_bottom = 232.0 +margin_bottom = 249.0 [node name="ObjectDescription" type="Label" parent="VBoxContainer/Description"] +visible = false +margin_top = 8.0 margin_right = 500.0 -margin_bottom = 116.0 +margin_bottom = 124.0 text = "The object creator is used to create background objects that the player can interact with, but that will not become part of their inventory. @@ -106,22 +108,22 @@ is currently selected in the scene tree. align = 1 [node name="InventoryDescription" type="Label" parent="VBoxContainer/Description"] -visible = false margin_right = 500.0 -margin_bottom = 116.0 +margin_bottom = 133.0 text = "The inventory item creator is used to create objects that the player can pick up to add to their inventory. -NOTE: The node will be created in the inventory folder shown -below. You can change this in Godot's settings under: -\"Escoria/UI/Items autoregister path\"" +NOTE: The node will be created in the inventory +folder shown below. All inventory items for your +game must live in the same folder. +" align = 1 [node name="Content" type="MarginContainer" parent="VBoxContainer"] -margin_top = 236.0 +margin_top = 253.0 margin_right = 500.0 -margin_bottom = 736.0 +margin_bottom = 753.0 rect_min_size = Vector2( 0, 500 ) mouse_filter = 1 custom_constants/margin_right = 20 @@ -307,30 +309,36 @@ margin_bottom = 405.0 [node name="InventoryPathLabel" type="Label" parent="VBoxContainer/Content/GridContainer"] visible = false -margin_top = 409.0 +margin_top = 412.0 margin_right = 110.0 -margin_bottom = 423.0 +margin_bottom = 426.0 text = "Inventory path:" [node name="InventoryPath" type="Label" parent="VBoxContainer/Content/GridContainer"] visible = false margin_left = 114.0 -margin_top = 409.0 +margin_top = 412.0 margin_right = 354.0 -margin_bottom = 423.0 +margin_bottom = 426.0 text = "res://" +[node name="ChangePathButton" type="Button" parent="VBoxContainer/Content/GridContainer"] +visible = false +margin_top = 409.0 +margin_right = 110.0 +margin_bottom = 429.0 +text = "Change Path" + [node name="BlankItem7" type="Control" parent="VBoxContainer/Content/GridContainer"] visible = false -margin_left = 114.0 margin_top = 409.0 -margin_right = 354.0 -margin_bottom = 423.0 +margin_right = 110.0 +margin_bottom = 409.0 [node name="Buttons" type="MarginContainer" parent="VBoxContainer"] -margin_top = 740.0 +margin_top = 757.0 margin_right = 500.0 -margin_bottom = 770.0 +margin_bottom = 787.0 mouse_filter = 2 custom_constants/margin_bottom = 10 @@ -415,6 +423,16 @@ margin_top = 371.0 margin_right = 291.0 margin_bottom = 429.0 +[node name="FileDialog" type="FileDialog" parent="Windows"] +visible = true +margin_left = 50.0 +margin_top = 150.0 +margin_right = 450.0 +margin_bottom = 650.0 +rect_min_size = Vector2( 400, 500 ) +window_title = "Open a Directory" +mode = 2 + [connection signal="toggled" from="VBoxContainer/Control/CenterContainer/HBoxContainer/BackgroundObjectCheckBox" to="." method="_on_BackgroundObjectCheckBox_toggled"] [connection signal="toggled" from="VBoxContainer/Control/CenterContainer/HBoxContainer/InventoryItemCheckBox" to="." method="_on_InventoryItemCheckBox_toggled"] [connection signal="text_changed" from="VBoxContainer/Content/GridContainer/ItemName" to="." method="background_on_ItemName_text_changed"] @@ -422,9 +440,11 @@ margin_bottom = 429.0 [connection signal="pressed" from="VBoxContainer/Content/GridContainer/StartsInteractiveCheckBox" to="." method="_on_StartsInteractiveCheckBox_pressed"] [connection signal="item_selected" from="VBoxContainer/Content/GridContainer/DefaultActionOption" to="." method="_on_DefaultActionOption_item_selected"] [connection signal="pressed" from="VBoxContainer/Content/GridContainer/ChangeImageButton" to="." method="load_button_pressed"] +[connection signal="pressed" from="VBoxContainer/Content/GridContainer/ChangePathButton" to="." method="_on_ChangePathButton_pressed"] [connection signal="pressed" from="VBoxContainer/Buttons/CenterContainer/HBoxContainer/CreateButton" to="." method="_on_CreateButton_pressed"] [connection signal="pressed" from="VBoxContainer/Buttons/CenterContainer/HBoxContainer/ClearButton" to="." method="Item_on_ClearButton_pressed"] [connection signal="pressed" from="VBoxContainer/Buttons/CenterContainer/HBoxContainer/ExitButton" to="." method="Item_on_ExitButton_pressed"] [connection signal="file_selected" from="LoadObjectGraphic/LoadObjectFileDialog" to="." method="LoadObjectFileDialog_file_selected"] [connection signal="confirmed" from="Windows/ConfirmationDialog" to="." method="_on_ObjectConfirmationDialog_confirmed"] [connection signal="confirmed" from="Windows/CreateCompleteDialog" to="." method="_on_CreateCompleteDialog_confirmed"] +[connection signal="dir_selected" from="Windows/FileDialog" to="." method="_on_FileDialog_dir_selected"] diff --git a/addons/escoria-wizard/RoomCreator.gd b/addons/escoria-wizard/RoomCreator.gd index ae082e2e..a13bc41f 100644 --- a/addons/escoria-wizard/RoomCreator.gd +++ b/addons/escoria-wizard/RoomCreator.gd @@ -209,6 +209,11 @@ func _on_ChangeRoomFolderButton_pressed() -> void: func _on_RoomFolderDialog_dir_selected(dir: String) -> void: ProjectSettings.set_setting(ROOM_PATH_SETTING, dir) + var property_info = { + "name": ROOM_PATH_SETTING, + "type": TYPE_STRING + } + ProjectSettings.add_property_info(property_info) get_node(ROOM_FOLDER_PATH).text = dir diff --git a/addons/escoria-wizard/escoria_wizard.gd b/addons/escoria-wizard/escoria_wizard.gd index bb4b26b3..9779743d 100644 --- a/addons/escoria-wizard/escoria_wizard.gd +++ b/addons/escoria-wizard/escoria_wizard.gd @@ -41,5 +41,3 @@ func CharacterCreator_pressed() -> void: func InventoryItem_pressed() -> void: $Menu.visible = false $ItemCreator.visible = true - $ItemCreator.inventory_mode = false - $ItemCreator.item_creator_reset() diff --git a/addons/escoria-wizard/item_creator.gd b/addons/escoria-wizard/item_creator.gd index f342938e..a2bb1c0d 100644 --- a/addons/escoria-wizard/item_creator.gd +++ b/addons/escoria-wizard/item_creator.gd @@ -22,7 +22,8 @@ const CREATE_BUTTON_NODE = "VBoxContainer/Buttons/CenterContainer/HBoxContainer const ERROR_WINDOW_NODE = "Windows/ErrorDialog" const INVENTORY_PREV_NODE = "VBoxContainer/Content/GridContainer/Preview/InventoryPreview" const OBJECT_PREV_NODE = "VBoxContainer/Content/GridContainer/Preview/ObjectPreview" - +const BACKGROUND_OBJ_NODE = "VBoxContainer/Control/CenterContainer/HBoxContainer/BackgroundObjectCheckBox" +const CHANGE_PATH_NODE = "VBoxContainer/Content/GridContainer/ChangePathButton" var source_image:Image var image_stream_texture:StreamTexture @@ -39,7 +40,7 @@ func _ready() -> void: # Capture the size of the window before we update its contents so we have # the absolute size before it gets scaled contents applied to it preview_size = get_node(PREVIEW_NODE).rect_size - inventory_mode = false + inventory_mode = not get_node(BACKGROUND_OBJ_NODE).pressed item_creator_reset() @@ -68,13 +69,15 @@ func item_creator_reset() -> void: get_node(INVENTORY_PREV_NODE).visible = true get_node(OBJECT_PREV_NODE).visible = false - for loop in [INVENTORY_PATH_NODE, INVENTORY_PATH_LABEL_NODE, INVENTORY_PATH_SPACER_NODE]: + for loop in [INVENTORY_PATH_NODE, INVENTORY_PATH_LABEL_NODE, INVENTORY_PATH_SPACER_NODE, \ + CHANGE_PATH_NODE]: get_node(loop).visible = true else: get_node(CREATE_BUTTON_NODE).text = "Create Object" get_node(INVENTORY_PREV_NODE).visible = false get_node(OBJECT_PREV_NODE).visible = true - for loop in [INVENTORY_PATH_NODE, INVENTORY_PATH_LABEL_NODE, INVENTORY_PATH_SPACER_NODE]: + for loop in [INVENTORY_PATH_NODE, INVENTORY_PATH_LABEL_NODE, INVENTORY_PATH_SPACER_NODE, \ + CHANGE_PATH_NODE]: get_node(loop).visible = false for loop in [OBJECT_HEADING_NODE, OBJECT_DESC_NODE]: @@ -82,7 +85,7 @@ func item_creator_reset() -> void: for loop in [INVENTORY_HEADING_NODE, INVENTORY_DESC_NODE, INVENTORY_PATH_NODE]: get_node(loop).visible = inventory_mode - + $Windows/FileDialog.current_dir = ProjectSettings.get_setting("escoria/ui/inventory_items_path") func resize_image() -> void: # Calculate the scale to make the preview as big as possible in the preview window depending on @@ -123,6 +126,14 @@ func LoadObjectFileDialog_file_selected(path: String) -> void: func _on_CreateButton_pressed() -> void: + var inventory_path = ProjectSettings.get_setting("escoria/ui/inventory_items_path") + var directory_test = Directory.new(); + if not directory_test.dir_exists(inventory_path): + get_node(ERROR_WINDOW_NODE).dialog_text = \ + "Folder %s does not exist. Please create or change the destination" % inventory_path + get_node(ERROR_WINDOW_NODE).popup_centered() + return + if not image_has_been_loaded: get_node(ERROR_WINDOW_NODE).dialog_text = \ "No image has been loaded." @@ -201,19 +212,23 @@ func _on_CreateButton_pressed() -> void: var packed_scene = PackedScene.new() packed_scene.pack(get_tree().edited_scene_root.get_node(item.name)) - var inventory_path = ProjectSettings.get_setting("escoria/ui/inventory_items_path") - ResourceSaver.save("%s/%s.tscn" % [inventory_path, get_node(ITEM_NAME_NODE).text], packed_scene) # Flag suggestions from https://godotengine.org/qa/50437/how-to-turn-a-node-into-a-packedscene-via-gdscript - ResourceSaver.save("%s/%s.tscn" % [inventory_path, get_node(ITEM_NAME_NODE).text], packed_scene, \ + var err = ResourceSaver.save("%s/%s.tscn" % [inventory_path, get_node(ITEM_NAME_NODE).text], packed_scene, \ ResourceSaver.FLAG_CHANGE_PATH|ResourceSaver.FLAG_REPLACE_SUBRESOURCE_PATHS) - - item.queue_free() - get_tree().edited_scene_root.get_node(item.name).queue_free() - get_node("Windows/CreateCompleteDialog").dialog_text = \ - "Inventory item %s/%s.tscn created." % [inventory_path, get_node(ITEM_NAME_NODE).text] - print("Inventory item %s/%s.tscn created." % [inventory_path, get_node(ITEM_NAME_NODE).text]) - get_node("Windows/CreateCompleteDialog").popup_centered() + if err: + get_node(ERROR_WINDOW_NODE).dialog_text = \ + "Failed to save the item. Please make sure you can\n" + \ + "write to the destination folder" % inventory_path + get_node(ERROR_WINDOW_NODE).popup_centered() + return + else: + item.queue_free() + get_tree().edited_scene_root.get_node(item.name).queue_free() + get_node("Windows/CreateCompleteDialog").dialog_text = \ + "Inventory item %s/%s.tscn created." % [inventory_path, get_node(ITEM_NAME_NODE).text] + print("Inventory item %s/%s.tscn created." % [inventory_path, get_node(ITEM_NAME_NODE).text]) + get_node("Windows/CreateCompleteDialog").popup_centered() func Item_on_ClearButton_pressed() -> void: @@ -282,3 +297,17 @@ func _on_InventoryItemCheckBox_toggled(button_pressed: bool) -> void: inventory_mode = true item_creator_reset() + + +func _on_ChangePathButton_pressed(): + $"Windows/FileDialog".popup_centered() + + +func _on_FileDialog_dir_selected(dir: String) -> void: + ProjectSettings.set_setting("escoria/ui/inventory_items_path", dir) + var property_info = { + "name": "escoria/ui/inventory_items_path", + "type": TYPE_STRING + } + ProjectSettings.add_property_info(property_info) + get_node(INVENTORY_PATH_NODE).text = dir