Skip to content

Commit

Permalink
Fix: Wizard - verify that inventory items are written to valid folders
Browse files Browse the repository at this point in the history
  • Loading branch information
Balloonpopper committed Nov 28, 2022
1 parent 0377cab commit 36c199a
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 40 deletions.
10 changes: 5 additions & 5 deletions addons/escoria-wizard/CharacterCreator.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 )]

Expand Down
56 changes: 38 additions & 18 deletions addons/escoria-wizard/ItemCreator.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -415,16 +423,28 @@ 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"]
[connection signal="text_changed" from="VBoxContainer/Content/GridContainer/ItemGlobalID" to="." method="_on_ItemGlobalID_text_changed"]
[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"]
5 changes: 5 additions & 0 deletions addons/escoria-wizard/RoomCreator.gd
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down
2 changes: 0 additions & 2 deletions addons/escoria-wizard/escoria_wizard.gd
Original file line number Diff line number Diff line change
Expand Up @@ -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()
59 changes: 44 additions & 15 deletions addons/escoria-wizard/item_creator.gd
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()


Expand Down Expand Up @@ -68,21 +69,23 @@ 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]:
get_node(loop).visible = not inventory_mode

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
Expand Down Expand Up @@ -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."
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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

0 comments on commit 36c199a

Please sign in to comment.